{"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":5658042,"sourceType":"datasetVersion","datasetId":3251852},{"sourceId":8108072,"sourceType":"datasetVersion","datasetId":4789213},{"sourceId":8125872,"sourceType":"datasetVersion","datasetId":4802245},{"sourceId":8141265,"sourceType":"datasetVersion","datasetId":4813359},{"sourceId":8146621,"sourceType":"datasetVersion","datasetId":4817535},{"sourceId":8146763,"sourceType":"datasetVersion","datasetId":4817596}],"dockerImageVersionId":30684,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install /kaggle/input/onnxruntime/humanfriendly-10.0-py2.py3-none-any.whl --no-index --find-links /kaggle/input/onnxruntime\n!pip install /kaggle/input/onnxruntime/coloredlogs-15.0.1-py2.py3-none-any.whl --no-index --find-links /kaggle/input/onnxruntime\n!pip install /kaggle/input/onnxruntime/onnxruntime-1.17.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl --no-index --find-links /kaggle/input/onnxruntime\n\n!pip install /kaggle/input/openvinowheelfile/openvino_telemetry-2024.1.0-py3-none-any.whl --no-index --find-links /kaggle/input/openvinowheelfile\n!pip install /kaggle/input/openvinowheelfile/openvino-2024.0.0-14509-cp310-cp310-manylinux2014_x86_64.whl --no-index --find-links /kaggle/input/openvinowheelfile","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:50:36.277237Z","iopub.execute_input":"2024-04-17T13:50:36.277727Z","iopub.status.idle":"2024-04-17T13:51:42.749383Z","shell.execute_reply.started":"2024-04-17T13:50:36.277686Z","shell.execute_reply":"2024-04-17T13:51:42.747814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, random\nimport cv2\nimport re\nimport gc\nimport math\nimport librosa\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom scipy import signal as sci_signal\nimport scipy\n\nfrom datetime import datetime\nimport concurrent.futures\n\nimport onnx\nimport onnxruntime\n\nfrom openvino.runtime import Core\n\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nfrom torchvision.models import efficientnet\n# from efficientnet_pytorch import EfficientNet\n\nfrom sklearn.model_selection import StratifiedKFold, StratifiedShuffleSplit, KFold\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.preprocessing import LabelEncoder\n\nfrom glob import glob\nfrom IPython.display import display, Audio\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-17T13:51:55.626994Z","iopub.execute_input":"2024-04-17T13:51:55.628008Z","iopub.status.idle":"2024-04-17T13:52:07.524209Z","shell.execute_reply.started":"2024-04-17T13:51:55.627940Z","shell.execute_reply":"2024-04-17T13:52:07.522704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH  = \"/kaggle/input/birdclef-2024\"\nLOAD_SPEC_DATA = True\nSEED = 24\nSAMPLE_RATE = 32000\nN_FFT = 1095\nWIN_SIZE = 412\nWIN_LAP = 100\nMIN_FREQ = 40\nMAX_FREQ = 15000\nFOLD = 5\nBATCHSIZE = 16\nN_WORKERS = 4","metadata":{"execution":{"iopub.status.busy":"2024-04-17T14:06:02.407580Z","iopub.execute_input":"2024-04-17T14:06:02.408088Z","iopub.status.idle":"2024-04-17T14:06:02.415306Z","shell.execute_reply.started":"2024-04-17T14:06:02.408051Z","shell.execute_reply":"2024-04-17T14:06:02.413835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def oog2spec_via_scipy(audio_data):\n    # handles NaNs\n    mean_signal = np.nanmean(audio_data)\n    audio_data = np.nan_to_num(audio_data, nan=mean_signal) if np.isnan(audio_data).mean() < 1 else np.zeros_like(audio_data)\n    \n    # to spec.\n    frequencies, times, spec_data = sci_signal.spectrogram(\n        audio_data, \n        fs=SAMPLE_RATE, \n        nfft=N_FFT, \n        nperseg=WIN_SIZE, \n        noverlap=WIN_LAP, \n        window='hann'\n    )\n    \n    # Filter frequency range\n    valid_freq = (frequencies >= MIN_FREQ) & (frequencies <= MAX_FREQ)\n    spec_data = spec_data[valid_freq, :]\n    \n    # Log\n    spec_data = np.log10(spec_data + 1e-20)\n    \n    # min/max normalize\n    spec_data = spec_data - spec_data.min()\n    spec_data = spec_data / spec_data.max()\n    \n    return spec_data","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:54:50.748882Z","iopub.execute_input":"2024-04-17T13:54:50.749318Z","iopub.status.idle":"2024-04-17T13:54:50.757626Z","shell.execute_reply.started":"2024-04-17T13:54:50.749283Z","shell.execute_reply":"2024-04-17T13:54:50.756321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data = pd.read_csv(f\"{DATA_PATH}/train_metadata.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:54:51.549890Z","iopub.execute_input":"2024-04-17T13:54:51.550372Z","iopub.status.idle":"2024-04-17T13:54:51.751521Z","shell.execute_reply.started":"2024-04-17T13:54:51.550334Z","shell.execute_reply":"2024-04-17T13:54:51.750368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data = meta_data[[\"primary_label\", \"filename\"]]\n\nlabel_list = sorted(meta_data[\"primary_label\"].unique())\nlabel_id_list = list(range(len(label_list)))\nlabel2id = dict(zip(label_list, label_id_list))\nid2label = dict(zip(label_id_list, label_list))","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:54:52.255190Z","iopub.execute_input":"2024-04-17T13:54:52.255611Z","iopub.status.idle":"2024-04-17T13:54:52.280341Z","shell.execute_reply.started":"2024-04-17T13:54:52.255580Z","shell.execute_reply":"2024-04-17T13:54:52.278861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_bird_data = dict()\n\n# https://www.kaggle.com/code/markwijkhuizen/birdclef-2024-efficientvit-inference\nif len(glob(f'{DATA_PATH}/test_soundscapes/*.ogg')) > 0:\n    ogg_file_paths = glob(f'{DATA_PATH}/test_soundscapes/*.ogg')\nelse:\n    ogg_file_paths = sorted(glob(f'{DATA_PATH}/unlabeled_soundscapes/*.ogg'))[:10]\n\nfor i, file_path in tqdm(enumerate(ogg_file_paths)):\n    row_id = re.search(r'/([^/]+)\\.ogg$', file_path).group(1)  # filename\n    audio_data, _ = librosa.load(file_path, sr=SAMPLE_RATE)\n    \n    # to spec.\n    spec = oog2spec_via_scipy(audio_data)\n    \n    # pad\n    pad = 512 - (spec.shape[1] % 512)\n    if pad > 0:\n        spec = np.pad(spec, ((0,0), (0,pad)))\n    \n    # reshape\n    spec = spec.reshape(512,-1,512).transpose([0, 2, 1])\n    spec = cv2.resize(spec, (256, 256), interpolation=cv2.INTER_AREA)\n    \n    try:\n        for j in range(48):\n            all_bird_data[f'{row_id}_{(j+1)*5}'] = spec[:, :, j]\n    except:\n        pass","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:54:52.893394Z","iopub.execute_input":"2024-04-17T13:54:52.893835Z","iopub.status.idle":"2024-04-17T13:55:21.041173Z","shell.execute_reply.started":"2024-04-17T13:54:52.893799Z","shell.execute_reply":"2024-04-17T13:55:21.039848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BirdCLEF_Dataset(torch.utils.data.Dataset):\n    def __init__(self,bird_data):\n        super().__init__()\n        self.bird_data = bird_data\n        self.keys_list = list(bird_data.keys())\n    \n    def __len__(self):\n        return len(self.bird_data)\n    \n    def __getitem__(self, index):\n        _spec = self.bird_data[self.keys_list[index]]\n        return torch.tensor(_spec, dtype=torch.float32)","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:55:21.043775Z","iopub.execute_input":"2024-04-17T13:55:21.044589Z","iopub.status.idle":"2024-04-17T13:55:21.051748Z","shell.execute_reply.started":"2024-04-17T13:55:21.044540Z","shell.execute_reply":"2024-04-17T13:55:21.050518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_weight_path = \"/kaggle/input/bird2024-v0-2\"\n\ninput_tensor = torch.randn(BATCHSIZE, 256, 256)  # input shape\ninput_names = ['x']\noutput_names = ['output']","metadata":{"execution":{"iopub.status.busy":"2024-04-17T13:55:21.053243Z","iopub.execute_input":"2024-04-17T13:55:21.053614Z","iopub.status.idle":"2024-04-17T13:55:21.098620Z","shell.execute_reply.started":"2024-04-17T13:55:21.053582Z","shell.execute_reply":"2024-04-17T13:55:21.097315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(data_loader, model):\n    pred = []\n    output_layer = model.output(0)\n    for batch in data_loader:\n        x = batch\n        result = model([x])[output_layer]\n        outputs = scipy.special.softmax(result, axis=1)\n        pred.append(outputs)\n    return np.concatenate(pred, axis=0)\n\ndef run_prediction(data_loader, fold):\n    ie = Core()\n    classification_model_xml = f\"/kaggle/input/bird2024-openvino/BaseModel_EfficientB0_Fold{fold}.xml\"\n    model = ie.read_model(model=classification_model_xml)\n    compiled_model = ie.compile_model(model=model, device_name=\"CPU\")\n    \n    predictions = predict(data_loader, compiled_model)\n    del ie, model, compiled_model \n    gc.collect()\n    \n    print(f\"Done fold {fold}\")\n    return predictions\n\ndef helper(numbers):\n    return run_prediction(numbers[0], numbers[1])","metadata":{"execution":{"iopub.status.busy":"2024-04-17T14:06:34.588419Z","iopub.execute_input":"2024-04-17T14:06:34.590136Z","iopub.status.idle":"2024-04-17T14:06:34.599379Z","shell.execute_reply.started":"2024-04-17T14:06:34.590082Z","shell.execute_reply":"2024-04-17T14:06:34.598148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = BirdCLEF_Dataset(all_bird_data)\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=BATCHSIZE, shuffle=False, drop_last=False)\naudios = [(test_loader, fold) for fold in range(FOLD)]","metadata":{"execution":{"iopub.status.busy":"2024-04-17T14:06:40.120718Z","iopub.execute_input":"2024-04-17T14:06:40.121204Z","iopub.status.idle":"2024-04-17T14:06:40.127620Z","shell.execute_reply.started":"2024-04-17T14:06:40.121168Z","shell.execute_reply":"2024-04-17T14:06:40.126404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start=datetime.now()\n\npredictions = []\nwith concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:\n    for result in executor.map(helper, audios):\n        predictions.append(result)\npredictions = np.mean(predictions, axis=0)\n\nprint (datetime.now()-start)","metadata":{"execution":{"iopub.status.busy":"2024-04-17T14:06:49.375931Z","iopub.execute_input":"2024-04-17T14:06:49.376413Z","iopub.status.idle":"2024-04-17T14:08:19.245702Z","shell.execute_reply.started":"2024-04-17T14:06:49.376377Z","shell.execute_reply":"2024-04-17T14:08:19.244701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_pred = pd.DataFrame(predictions, columns=label_list)\nsub_id = pd.DataFrame({'row_id': list(all_bird_data.keys())})\n\nsub = pd.concat([sub_id, sub_pred], axis=1)\n\nsub.to_csv('submission.csv',index=False)\nprint(f'Submissionn shape: {sub.shape}')\nsub.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-04-17T14:08:27.181629Z","iopub.execute_input":"2024-04-17T14:08:27.182106Z","iopub.status.idle":"2024-04-17T14:08:27.351583Z","shell.execute_reply.started":"2024-04-17T14:08:27.182068Z","shell.execute_reply":"2024-04-17T14:08:27.350330Z"},"trusted":true},"execution_count":null,"outputs":[]}]}