{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":2},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython2","version":"2.7.6"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":8900,"databundleVersionId":862232,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Установка и импорт библиотек","metadata":{}},{"cell_type":"code","source":"pip install pandas numpy matplotlib torchsummary scikit-learn librosa torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 timm opencv-python","metadata":{"ExecuteTime":{"end_time":"2024-10-27T11:57:04.205186Z","start_time":"2024-10-27T11:56:01.645632Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n%matplotlib inline\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nimport librosa \nimport librosa.display\n\nimport torch\nimport torch.optim as optim\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data.dataset import Dataset\nfrom torch.utils.data import DataLoader\nimport torchvision\nimport torchsummary\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image\nfrom time import time \n\ndevice = 'cuda:0' if torch.cuda.is_available() else 'cpu'\nprint(device)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T07:39:02.527037Z","start_time":"2024-10-28T07:38:53.126648Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainPathWav = 'freesound-audio-tagging/audio_train/'\ntrainPathCsv = 'freesound-audio-tagging/train.csv'\n\ntestPathWav = 'freesound-audio-tagging/audio_test/'\ntestPathCsv = 'freesound-audio-tagging/sample_submission.csv'\n\ntrainData = pd.read_csv(trainPathCsv)\ntestData = pd.read_csv(testPathCsv)\ntrainData.head()","metadata":{"ExecuteTime":{"end_time":"2024-10-28T14:59:23.529402Z","start_time":"2024-10-28T14:59:23.497215Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_labels = trainData['label'].unique()\n\ntable = pd.DataFrame({\n    'Unique Labels': unique_labels\n})\n\nprint(f\"Number of unique labels: {len(unique_labels)}\")\nprint(table)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T14:59:24.750259Z","start_time":"2024-10-28T14:59:24.742411Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataLabels = np.unique(trainData.label.values)\ndataLabelsEncoder = {dataLabel:i for i, dataLabel in enumerate(dataLabels)}\n\nprint(dataLabelsEncoder['Tambourine'])\nprint(dataLabelsEncoder['Acoustic_guitar'])","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:30:30.983781Z","start_time":"2024-10-28T16:30:30.972407Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torchaudio.transforms as transforms\n\nprocessingImgSize = (224, 224)\n\n# SpecAugment transformations\nclass SpecAugment:\n    def __init__(self):\n        self.time_masking = transforms.TimeMasking(time_mask_param=10)\n        self.freq_masking = transforms.FrequencyMasking(freq_mask_param=10)\n\n    def __call__(self, spec):\n        spec = self.time_masking(spec)\n        spec = self.freq_masking(spec)\n        return spec\n\nspec_augment = SpecAugment()\n\nclass Dataset(torch.utils.data.Dataset):\n    def __init__(self, dataframe, test=False):\n        self.dataframe = dataframe\n        self.test = test\n\n    def __getitem__(self, index):\n        X = np.zeros(shape=(3, processingImgSize[0], processingImgSize[1]))\n        file = self.dataframe.fname.values[index]\n        label = self.dataframe.label.values[index]\n        path = (testPathWav if self.test else trainPathWav) + file\n\n        signal, _ = librosa.load(path, sr=22050)\n        mel_spec = librosa.feature.melspectrogram(y=signal, sr=22050, n_fft=2048, hop_length=512, n_mels=128)\n        mel_spec = librosa.power_to_db(mel_spec, ref=np.max)\n\n        resized = Image.fromarray(mel_spec)\n        resized = resized.resize(processingImgSize)\n        resized = np.array(resized)\n\n        for j in range(3):\n            X[j, :, :] = resized\n\n        # SpecAugment on training data\n        X = torch.tensor(X, dtype=torch.float).unsqueeze(0)  # Shape (1, 3, H, W)\n        if not self.test:\n            X = spec_augment(X)\n\n        if not self.test:\n            y = dataLabelsEncoder[label]\n            return X.squeeze(0), y\n        else:\n            return X.squeeze(0)\n\n    def __len__(self):\n        return len(self.dataframe)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:30:44.435677Z","start_time":"2024-10-28T16:30:44.425172Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\n\nxTrain, xVal, yTrain, yVal = train_test_split(trainData, trainData, test_size=0.2, shuffle=True, random_state=5)\n\ntrainSet = Dataset(xTrain)\nvalSet = Dataset(xVal)\ntrainLoader = DataLoader(trainSet, batch_size=batch_size, shuffle=True)\nvalLoader = DataLoader(valSet , batch_size=batch_size, shuffle=True)\n\nprint('Training set: {}, Validation set: {}'.format(xTrain.shape[0], xVal.shape[0]))","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:30:48.815469Z","start_time":"2024-10-28T16:30:48.803901Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for inputs, labels in trainLoader:\n    print(f\"Shape of inputs: {inputs.shape}\")\n    print(f\"Shape of labels: {labels.shape}\")\n    break  # Check only one batch","metadata":{"ExecuteTime":{"end_time":"2024-10-28T15:05:23.919354Z","start_time":"2024-10-28T15:05:21.876068Z"}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Тесты с CV2","metadata":{}},{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport matplotlib.pyplot as plt\n\none = trainPathWav + xTrain.fname.values[1]\nsignal, _ = librosa.load(one)\nsignal = librosa.feature.melspectrogram(y=signal)\nsignal = librosa.power_to_db(signal, ref=np.max)\n\n# Преобразуем спектрограмму в uint8 для OpenCV\nsignal_uint8 = cv2.normalize(signal, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')\n\n# Применим CLAHE\nclahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))\nenhanced_signal = clahe.apply(signal_uint8)\n\n# Применим GaussianBlur\nblurred_signal = cv2.GaussianBlur(enhanced_signal, (3, 3), 0)\n\n# Отображаем оригинальную и улучшенную спектрограммы\nfig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))\n\n# Оригинальная спектрограмма\nimg1 = librosa.display.specshow(signal, x_axis='time', y_axis='log', ax=ax1)\nax1.set(title='Original Spectrogram')\nfig.colorbar(img1, ax=ax1, format=\"%+2.f dB\")\n\n# Спектрограмма после CLAHE\nimg2 = ax2.imshow(enhanced_signal, aspect='auto', origin='lower', cmap='magma')\nax2.set(title='CLAHE Enhanced Spectrogram')\nfig.colorbar(img2, ax=ax2, format=\"%+2.f dB\")\n\n# Спектрограмма после GaussianBlur\nimg3 = ax3.imshow(blurred_signal, aspect='auto', origin='lower', cmap='magma')\nax3.set(title='CLAHE + GaussianBlur Spectrogram')\nfig.colorbar(img3, ax=ax3, format=\"%+2.f dB\")\nplt.show()","metadata":{"ExecuteTime":{"end_time":"2024-10-28T08:09:09.401987Z","start_time":"2024-10-28T08:09:08.483723Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:31:41.148043Z","start_time":"2024-10-28T16:31:41.142118Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torchvision.models.resnet18(pretrained=True)\ntorchsummary.summary(model.cuda(), (3, processingImgSize[0], processingImgSize[1]), device='cuda')\nmodel._fc = torch.nn.Linear(512, 41)\nmodel.to(device)\n\ncriterion = torch.nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:32:16.71945Z","start_time":"2024-10-28T16:32:16.39636Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mapk(preds, labels, k=3):\n    \"\"\" Calculate Mean Average Precision at K \"\"\"\n    map_total = 0.0\n    for i in range(len(preds)):\n        actual = labels[i]\n        predicted = preds[i][:k]\n        score = sum(1.0 if actual == p else 0.0 for p in predicted) / k\n        map_total += score\n    return map_total / len(preds)","metadata":{"ExecuteTime":{"end_time":"2024-10-28T16:32:21.034079Z","start_time":"2024-10-28T16:32:21.02881Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start_time = time()\n\nepochs = 10\n\nfor epoch in range(epochs):\n    train_loss = 0\n    val_loss = 0\n    train_correct = 0\n    val_correct = 0\n    train_mapk = 0.0\n    val_mapk = 0.0\n    \n    model.train()\n    for x, y in trainLoader:\n        optimizer.zero_grad()\n        x,y = x.to(device),y.to(device)\n        \n        pred = model(x)\n        loss = criterion(pred, y)\n        train_loss += criterion(pred, y).item()\n        \n        # Calculate accuracy and MAP@3\n        _, predicted = torch.topk(pred, k=3, dim=1)  # Get top-3 predictions\n        train_correct += (predicted[:, 0] == y).sum().item()\n        train_mapk += mapk(predicted.tolist(), y.tolist())\n        \n        loss.backward()\n        optimizer.step()\n    \n    model.eval()\n    with torch.no_grad():\n        for x, y in valLoader:\n            x,y = x.to(device),y.to(device)\n            \n            pred = model(x)\n            loss = criterion(pred, y)\n            val_loss += criterion(pred, y).item()\n            \n            # Calculate accuracy and MAP@3\n            _, predicted = torch.topk(pred, k=3, dim=1)\n            val_correct += (predicted[:, 0] == y).sum().item()\n            val_mapk += mapk(predicted.tolist(), y.tolist())\n            \n    train_loss = train_loss/len(trainLoader)\n    val_loss = val_loss/len(valLoader)\n    train_accuracy = train_correct / len(xTrain)\n    val_accuracy = val_correct / len(xVal)\n    train_mapk /= len(trainLoader)\n    val_mapk /= len(valLoader)\n    \n    print(f\"Epoch {epoch+1}, Train Loss: {train_loss:.5f}, Val Loss: {val_loss:.5f}, \"\n          f\"Train Accuracy: {train_accuracy:.5f}, Val Accuracy: {val_accuracy:.5f}, \"\n          f\"Train MAP@3: {train_mapk:.5f}, Val MAP@3: {val_mapk:.5f}\")\n\nend_time = time()\ntotal_time = end_time - start_time\nprint(f'Total Training Time: {total_time:.2f} seconds')","metadata":{"ExecuteTime":{"end_time":"2024-10-28T17:20:01.140959Z","start_time":"2024-10-28T16:32:21.905558Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = Dataset(testData, test=True)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)\npredictions = torch.tensor([])\nmodel.eval()\nfor x in test_loader:\n    x = x.to(device)\n    with torch.no_grad():\n        y_hat = model(x)\n    predictions = torch.cat([predictions, y_hat.cpu()])\n\npredictions = F.softmax(predictions, dim=1).detach().numpy()","metadata":{"ExecuteTime":{"end_time":"2024-10-28T18:54:05.629321Z","start_time":"2024-10-28T18:49:54.588971Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_top1 = testData.copy()\n\nN = len(testData)\nfor i in range(N):\n    p = predictions[i, :]\n    idx = np.argmax(p)\n    submission_top1.label[i] = dataLabels[idx]\n\nsubmission_top1.to_csv('predictions.csv', index=False, header=True)\n\nsubmission_top1.head()","metadata":{"ExecuteTime":{"end_time":"2024-10-28T18:54:07.729805Z","start_time":"2024-10-28T18:54:05.639327Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import Audio\nimport os\n\naudio_dir = \"freesound-audio-tagging/audio_test/\"\n\n# Проверяем первые пять файлов\nfor i in range(5):\n    file_path = os.path.join(audio_dir, submission_top1['fname'][i])\n    \n    if os.path.isfile(file_path):\n        audio_data, sr = librosa.load(file_path, sr=None)\n        print(f\"Playing file {i+1}: {submission_top1['fname'][i]}, Label: {submission_top1['label'][i]}\")\n        display(Audio(audio_data, rate=sr))\n    else:\n        print(f\"File not found: {file_path}\")","metadata":{"ExecuteTime":{"end_time":"2024-10-28T18:54:57.137223Z","start_time":"2024-10-28T18:54:57.08693Z"}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Тут тесты с трансформерами, копать в сторону AST","metadata":{}},{"cell_type":"code","source":"import timm\nimport torch.nn.functional as F","metadata":{"ExecuteTime":{"end_time":"2024-10-27T13:34:11.485885Z","start_time":"2024-10-27T13:34:10.54062Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_pretrained_models_available = timm.list_models(pretrained=True)\nall_pretrained_models_available","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torchvision.transforms as transforms\n\nclass AudioClassifier(nn.Module):\n    def __init__(self, num_classes):\n        super(AudioClassifier, self).__init__()\n        \n        # Используем предобученную ViT модель\n        self.model = timm.create_model('vit_base_patch16_224', pretrained=True)\n        self.model.head = nn.Linear(self.model.head.in_features, num_classes)\n        \n        # Преобразования для спектрограмм\n        self.transform = transforms.Compose([\n            transforms.ToPILImage(),           # Преобразуем тензор в изображение PIL\n            transforms.Resize((224, 224)),    # Изменение размера\n            transforms.ToTensor(),             # Преобразуем изображение обратно в тензор\n            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),  # Нормализация\n        ])\n    \n    def forward(self, x):\n        return self.model(x)","metadata":{"ExecuteTime":{"end_time":"2024-10-27T16:50:27.110541Z","start_time":"2024-10-27T16:50:27.103314Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_classes = len(unique_labels)\nmodel = AudioClassifier(num_classes)","metadata":{"ExecuteTime":{"end_time":"2024-10-27T16:50:38.219935Z","start_time":"2024-10-27T16:50:35.366346Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda')\nmodel = model.to(device)\noptimizer = optim.Adam(model.parameters(), lr=1e-4)\ncriterion = nn.CrossEntropyLoss().cuda()\nnum_epochs = 15\n\ntorchsummary.summary(model, input_size=(3, 224, 224))","metadata":{"ExecuteTime":{"end_time":"2024-10-27T16:50:53.475086Z","start_time":"2024-10-27T16:50:53.120636Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start_time = time()\n\nfor epoch in range(num_epochs):\n    train_loss = 0\n    val_loss = 0\n    train_correct = 0\n    val_correct = 0\n    train_mapk = 0.0\n    val_mapk = 0.0\n    \n    model.train()\n    for i, (inputs, labels) in enumerate(trainLoader):\n        inputs, labels = inputs.to(device), labels.to(device)\n\n        optimizer.zero_grad()\n\n        # Прямой проход\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n\n        # Обратный проход и оптимизация\n        loss.backward()\n        optimizer.step()\n\n        train_loss += loss.item()\n        \n        # Calculate accuracy and MAP@3\n        _, predicted = torch.topk(outputs, k=3, dim=1)  # Get top-3 predictions\n        train_correct += (predicted[:, 0] == labels).sum().item()\n        train_mapk += mapk(predicted.tolist(), labels.tolist())\n        \n    model.eval()\n    with torch.no_grad():\n        for i, (inputs, labels) in enumerate(valLoader):\n            inputs, labels = inputs.to(device), labels.to(device)\n            \n            outputs = model(inputs)\n            loss = criterion(outputs, labels)\n            \n            val_loss += loss.item()\n            \n            # Calculate accuracy and MAP@3\n            _, predicted = torch.topk(outputs, k=3, dim=1)\n            val_correct += (predicted[:, 0] == labels).sum().item()\n            val_mapk += mapk(predicted.tolist(), labels.tolist())\n    \n    train_loss = train_loss/len(trainLoader)\n    val_loss = val_loss/len(valLoader)\n    train_accuracy = train_correct / len(xTrain)\n    val_accuracy = val_correct / len(xVal)\n    train_mapk /= len(trainLoader)\n    val_mapk /= len(valLoader)\n    \n    print(f\"Epoch {epoch+1}, Train Loss: {train_loss:.5f}, Val Loss: {val_loss:.5f}, \"\n          f\"Train Accuracy: {train_accuracy:.5f}, Val Accuracy: {val_accuracy:.5f}, \"\n          f\"Train MAP@3: {train_mapk:.5f}, Val MAP@3: {val_mapk:.5f}\")\n\nend_time = time()\ntotal_time = end_time - start_time\nprint(f'Total Training Time: {total_time:.2f} seconds')","metadata":{"ExecuteTime":{"end_time":"2024-10-27T19:19:06.245781Z","start_time":"2024-10-27T16:52:15.213822Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = Dataset(testData, test=True)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)\npredictions = torch.tensor([])\nmodel.eval()\nfor x in test_loader:\n    x = x.to(device)\n    with torch.no_grad():\n        y_hat = model(x)\n    predictions = torch.cat([predictions, y_hat.cpu()])\n\npredictions = F.softmax(predictions, dim=1).detach().numpy()","metadata":{"ExecuteTime":{"end_time":"2024-10-27T15:21:35.089016Z","start_time":"2024-10-27T15:16:49.533619Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_top1 = testData.copy()\n\nN = len(testData)\nfor i in range(N):\n    p = predictions[i, :]\n    idx = np.argmax(p)\n    submission_top1.label[i] = dataLabels[idx]\n\nsubmission_top1.to_csv('predictions.csv', index=False, header=True)\n\nsubmission_top1.head()","metadata":{"ExecuteTime":{"end_time":"2024-10-27T15:21:37.119035Z","start_time":"2024-10-27T15:21:35.10029Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_dir = \"freesound-audio-tagging/audio_test/\"\n\n# Проверяем первые пять файлов\nfor i in range(5):\n    file_path = os.path.join(audio_dir, submission_top1['fname'][i])\n    \n    if os.path.isfile(file_path):\n        audio_data, sr = librosa.load(file_path, sr=None)\n        print(f\"Playing file {i+1}: {submission_top1['fname'][i]}, Label: {submission_top1['label'][i]}\")\n        display(Audio(audio_data, rate=sr))\n    else:\n        print(f\"File not found: {file_path}\")","metadata":{"ExecuteTime":{"end_time":"2024-10-27T15:22:28.584811Z","start_time":"2024-10-27T15:22:28.545915Z"}},"execution_count":null,"outputs":[]}]}