{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":8116481,"sourceType":"datasetVersion","datasetId":4795363},{"sourceId":30446,"sourceType":"modelInstanceVersion","modelInstanceId":25575}],"dockerImageVersionId":30684,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pdb\nimport cv2\nimport time\nimport glob\nimport random\nimport pdb\nimport librosa\nfrom PIL import Image\nimport numpy as np\nimport pandas as pd\nfrom glob import glob\nfrom tqdm import tqdm\n\nimport torch # PyTorch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.cuda import amp # https://pytorch.org/docs/stable/notes/amp_examples.html\nimport torch.nn.functional as F \nimport torch.nn as nn\nfrom torch.optim import lr_scheduler\n\nfrom colorama import Fore, Style\nfrom sklearn.model_selection import StratifiedGroupKFold, KFold # Sklearn\nfrom sklearn.metrics import roc_auc_score, average_precision_score\nimport torchvision.transforms as transforms\nimport albumentations as A # Augmentations\nfrom albumentations.pytorch import ToTensorV2\nimport timm\nfrom timm.models.efficientnet import _cfg","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-14T12:56:45.900216Z","iopub.execute_input":"2024-04-14T12:56:45.900645Z","iopub.status.idle":"2024-04-14T12:56:58.972936Z","shell.execute_reply.started":"2024-04-14T12:56:45.900609Z","shell.execute_reply":"2024-04-14T12:56:58.971518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start_time = time.time()\n\n###############################################################\n##### >>>>>>> config <<<<<<\n###############################################################\nclass CFG:\n    device = torch.device(\"cpu\")\n    img_size = [128, 320]\n    # Horizontal melspectrogram resolution\n    MELSPEC_H = 128\n    # Maximum decibel to clip audio to\n    TOP_DB = 100\n    # Minimum rating\n    MIN_RATING = 3.0\n    # Sample rate as provided in competition description\n    SR = 32000\n    N_FFT = 2000\n    HOP_LENGTH = 500\n    # Duration\n    DURATION_S = 240\n    WINDOW_S = 5\n    N_TEST_CHUNKS = DURATION_S // WINDOW_S\n\n    valid_bs = 1\n    efficientnet_b0 = 'tf_efficientnet_b0_ns'  \n    num_classes = 182 # classes of birds\n#     base_dir = \"/home/zanzhuheng/Desktop/Working/BirdCLEF2024/\"\n#     test_path = \"/home/zanzhuheng/Desktop/Working/BirdCLEF2024/test_soundscapes/\"\n#     submission = \"/home/zanzhuheng/Desktop/Working/BirdCLEF2024/sample_submission.csv\"\n#     unlabeled_path = \"/home/zanzhuheng/Desktop/Working/BirdCLEF2024/unlabeled_soundscapes/\"\n\n    base_dir = \"/kaggle/input/birdclef-2024/\"\n    test_path = \"/kaggle/input/birdclef-2024/test_soundscapes/\"\n    submission = \"/kaggle/input/birdclef-2024/sample_submission.csv\"\n    unlabeled_path = \"/kaggle/input/birdclef-2024/unlabeled_soundscapes/\"","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:56:58.976535Z","iopub.execute_input":"2024-04-14T12:56:58.977406Z","iopub.status.idle":"2024-04-14T12:56:58.984819Z","shell.execute_reply.started":"2024-04-14T12:56:58.977367Z","shell.execute_reply":"2024-04-14T12:56:58.983551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission = pd.read_csv(CFG.submission)\ncolumn_names = sample_submission.columns.tolist()\nlabel_columns = column_names[1:]\n\n\ndef process_audio_to_image(train_audio_path):\n    audio, sr = librosa.load(train_audio_path, sr=CFG.SR)\n\n    audio = librosa.util.normalize(audio) # (5292000,)\n    spectrogram = librosa.feature.melspectrogram(\n        y=audio,\n        sr=CFG.SR, # sample rate\n        n_fft=CFG.N_FFT, # number of samples in window \n        hop_length=CFG.HOP_LENGTH, # step size of window\n        n_mels=CFG.MELSPEC_H, # horizontal resolution from fmin→fmax in log scale\n        fmin=40, # minimum frequency\n        fmax=15000, # maximum frequency\n        power=2.0, # intensity^power for log scale\n    )\n    spectrogram = librosa.power_to_db(spectrogram, ref=CFG.TOP_DB)\n    spectrogram = spectrogram - spectrogram.min()\n    spectrogram = (spectrogram / spectrogram.max() * 255).astype(np.uint8)\n    # (128, 10585)\n    return spectrogram","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:56:58.991625Z","iopub.execute_input":"2024-04-14T12:56:58.992367Z","iopub.status.idle":"2024-04-14T12:56:59.027957Z","shell.execute_reply.started":"2024-04-14T12:56:58.992324Z","shell.execute_reply":"2024-04-14T12:56:59.026701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"###############################################################\n##### >>>>>>> part2: build_model <<<<<<\n###############################################################\n# document: https://timm.fast.ai/create_model\n# cls model repos: timm.list_models()\ndef build_model(backbone:str):\n    model = timm.create_model(backbone, \n                              pretrained=False,\n                              num_classes=CFG.num_classes,\n                              )\n    model.to(CFG.device)\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:56:59.029476Z","iopub.execute_input":"2024-04-14T12:56:59.029967Z","iopub.status.idle":"2024-04-14T12:56:59.036788Z","shell.execute_reply.started":"2024-04-14T12:56:59.029933Z","shell.execute_reply":"2024-04-14T12:56:59.035596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# efficientnetb0\n\n# b0_ckpt_f0 = '/home/zanzhuheng/Desktop/Working/BirdCLEF2024/ckpt_birds/v1_tf_efficientnet_b0_ns_bs32_fold5_epoch20/fold0_epoch5_vl1.5323_vroc0.429500013589859.pth'\n# b0_ckpt_f1 = '/home/zanzhuheng/Desktop/Working/BirdCLEF2024/ckpt_birds/v1_tf_efficientnet_b0_ns_bs32_fold5_epoch20/fold1_epoch5_vl1.4853_vroc0.4189999997615814.pth'\n# b0_ckpt_f2 = '/home/zanzhuheng/Desktop/Working/BirdCLEF2024/ckpt_birds/v1_tf_efficientnet_b0_ns_bs32_fold5_epoch20/fold2_epoch5_vl1.4841_vroc0.43650001287460327.pth'\n# b0_ckpt_f3 = '/home/zanzhuheng/Desktop/Working/BirdCLEF2024/ckpt_birds/v1_tf_efficientnet_b0_ns_bs32_fold5_epoch20/fold3_epoch6_vl1.5354_vroc0.4207000136375427.pth'\n# b0_ckpt_f4 = '/home/zanzhuheng/Desktop/Working/BirdCLEF2024/ckpt_birds/v1_tf_efficientnet_b0_ns_bs32_fold5_epoch20/fold4_epoch4_vl1.6074_vroc0.44269999861717224.pth'\n\nb0_ckpt_f0 = '/kaggle/input/fold0-epoch1-vl2-8431-vroc0-867/fold0_epoch1_vl2.8431_vroc0.8671.pth'\n# b0_ckpt_f1 = '/kaggle/input/morefold/pytorch/aaa/1/fold1_epoch5_vl1.4853_vroc0.4189999997615814.pth'\n# b0_ckpt_f2 = '/kaggle/input/morefold/pytorch/aaa/1/fold2_epoch5_vl1.4841_vroc0.43650001287460327.pth'\n# b0_ckpt_f3 = '/kaggle/input/morefold/pytorch/aaa/1/fold3_epoch6_vl1.5354_vroc0.4207000136375427.pth'\n# b0_ckpt_f4 = '/kaggle/input/morefold/pytorch/aaa/1/fold4_epoch4_vl1.6074_vroc0.44269999861717224.pth'\n\n\nefficientnet_b0_f0 = build_model(CFG.efficientnet_b0)\nefficientnet_b0_f0.load_state_dict(torch.load(b0_ckpt_f0, map_location=CFG.device))\nefficientnet_b0_f0.eval()\n\n# efficientnet_b0_f1 = build_model(CFG.efficientnet_b0)\n# efficientnet_b0_f1.load_state_dict(torch.load(b0_ckpt_f1, map_location=CFG.device))\n# efficientnet_b0_f1.eval()\n\n# efficientnet_b0_f2 = build_model(CFG.efficientnet_b0)\n# efficientnet_b0_f2.load_state_dict(torch.load(b0_ckpt_f2, map_location=CFG.device))\n# efficientnet_b0_f2.eval()\n\n# efficientnet_b0_f3 = build_model(CFG.efficientnet_b0)\n# efficientnet_b0_f3.load_state_dict(torch.load(b0_ckpt_f3, map_location=CFG.device))\n# efficientnet_b0_f3.eval()\n\n# efficientnet_b0_f4 = build_model(CFG.efficientnet_b0)\n# efficientnet_b0_f4.load_state_dict(torch.load(b0_ckpt_f4, map_location=CFG.device))\n# efficientnet_b0_f4.eval()\n\n\n\n\n\n# List to save inference rows in\nINFERENCE_ROWS = []\n\n# Hidden test files\nif len(glob(f'{CFG.base_dir}/test_soundscapes/*.ogg')) > 0:\n    ogg_file_paths = glob(f'{CFG.base_dir}/test_soundscapes/*.ogg')\nelse:\n    ogg_file_paths = sorted(glob(f'{CFG.base_dir}/unlabeled_soundscapes/*.ogg'))[:10]\n\n# Iterate over OGG files\nfor i, file_path in enumerate(tqdm(ogg_file_paths)):\n    # Extract filename\n    row_id = file_path.split('/')[-1].replace('.ogg','')\n    # Read OGG file and convert to melspectrogram\n    spectrograms = process_audio_to_image(file_path)\n    # Pad spectogram to multiple of WIDTH\n    pad = CFG.img_size[1] - (spectrograms.shape[1] % CFG.img_size[1]) #! 计算需要补多少pad 0\n    if pad > 0:\n        spectrograms = np.pad(spectrograms, ((0,0), (0,pad)))\n        # Reshape to BxHxW\n    spectrograms = spectrograms.reshape(CFG.img_size[0],-1,CFG.img_size[1]).transpose([1,0,2])\n  \n    spectrograms = torch.Tensor(spectrograms)\n\n    spectrograms = spectrograms.unsqueeze(1).expand(-1, 3, -1, -1) #! RGB\n    spectrograms = spectrograms / 255.0\n    # Convert spec from Numpy array on CPU to Torch Tensor on GPU\n\n    # Predict\n","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:56:59.038712Z","iopub.execute_input":"2024-04-14T12:56:59.039087Z","iopub.status.idle":"2024-04-14T12:57:51.696497Z","shell.execute_reply.started":"2024-04-14T12:56:59.039058Z","shell.execute_reply":"2024-04-14T12:57:51.694854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    with torch.no_grad():\n        outputs_b0_f0 = efficientnet_b0_f0(spectrograms).softmax(dim=1)\n#         outputs_b0_f1 = efficientnet_b0_f1(spectrograms).softmax(dim=1)\n#         outputs_b0_f2 = efficientnet_b0_f2(spectrograms).softmax(dim=1)\n#         outputs_b0_f3 = efficientnet_b0_f3(spectrograms).softmax(dim=1)\n#         outputs_b0_f4 = efficientnet_b0_f4(spectrograms).softmax(dim=1)\n        \n#         outputs = (outputs_b0_f0 + outputs_b0_f1 +outputs_b0_f2 + outputs_b0_f3 + outputs_b0_f4) / 5\n        outputs = outputs_b0_f0\n        outputs = F.softmax(outputs,dim=1).numpy()\n\n#         del outputs_b0_f0, outputs_b0_f1, outputs_b0_f2, outputs_b0_f3, outputs_b0_f4\n#         del efficientnet_b0_f0, efficientnet_b0_f1, efficientnet_b0_f2, efficientnet_b0_f3, efficientnet_b0_f4\n        torch.cuda.empty_cache()\n        # pdb.set_trace()\n    # Add to inference rows and limit to 4 minutes\n    for t, o in zip(range(CFG.N_TEST_CHUNKS), outputs):\n        # Predictions for each bird\n        predictions = dict([ (l,p) for l, p in zip(label_columns, o) ])\n        # pdb.set_trace()\n        # Append to inference rows\n        INFERENCE_ROWS.append(\n            { 'row_id': f'{row_id}_{(t+1)*5}' } | predictions\n        )\n\nsubmission_df = pd.DataFrame(INFERENCE_ROWS)\nsubmission_df","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:57:51.697802Z","iopub.status.idle":"2024-04-14T12:57:51.69859Z","shell.execute_reply.started":"2024-04-14T12:57:51.698301Z","shell.execute_reply":"2024-04-14T12:57:51.698326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-04-14T12:57:51.700232Z","iopub.status.idle":"2024-04-14T12:57:51.70098Z","shell.execute_reply.started":"2024-04-14T12:57:51.700505Z","shell.execute_reply":"2024-04-14T12:57:51.700529Z"},"trusted":true},"execution_count":null,"outputs":[]}]}