{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"sourceType":"competition"},{"sourceId":11048751,"sourceType":"datasetVersion","datasetId":6869450},{"sourceId":11049372,"sourceType":"datasetVersion","datasetId":6883149}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Pytorch2OpenVINO：\n\n# - - - - Start - - - -\n# model = resnet34()\n# model.eval()\n\n# openvino_model = openvino.convert_model(model, example_input=torch.randn(1, 1, 128, 320))\n\n# openvino_model.reshape([-1, 1, 128, 320])\n# openvino.save_model(openvino_model, \"resnet34.xml\")\n\n# - - - - End - - - -","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:18:51.899888Z","iopub.execute_input":"2025-03-17T00:18:51.900249Z","iopub.status.idle":"2025-03-17T00:18:51.904833Z","shell.execute_reply.started":"2025-03-17T00:18:51.900217Z","shell.execute_reply":"2025-03-17T00:18:51.903553Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%capture\n!pip install -U openvino-telemetry  --no-index --find-links /kaggle/input/pip-hub\n!pip install -U openvino  --no-index --find-links /kaggle/input/pip-hub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:18:51.906962Z","iopub.execute_input":"2025-03-17T00:18:51.907815Z","iopub.status.idle":"2025-03-17T00:19:06.073181Z","shell.execute_reply.started":"2025-03-17T00:18:51.907762Z","shell.execute_reply":"2025-03-17T00:19:06.071778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nimport os\nimport timm\nimport librosa\nimport numpy as np\nimport pandas as pd\n\n# import random\nimport albumentations as A\n# # import audiomentations as Audio\n# from albumentations.pytorch import ToTensorV2\n\nimport gc\nimport dataclasses\nfrom concurrent.futures import ThreadPoolExecutor\n\nimport scipy\nimport openvino","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:06.075019Z","iopub.execute_input":"2025-03-17T00:19:06.075395Z","iopub.status.idle":"2025-03-17T00:19:52.881616Z","shell.execute_reply.started":"2025-03-17T00:19:06.075356Z","shell.execute_reply":"2025-03-17T00:19:52.879512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data_path = \"/kaggle/input/birdclef-2025/test_soundscapes\"\nsubmission_path = \"/kaggle/input/birdclef-2025/sample_submission.csv\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:52.884369Z","iopub.execute_input":"2025-03-17T00:19:52.886414Z","iopub.status.idle":"2025-03-17T00:19:52.892800Z","shell.execute_reply.started":"2025-03-17T00:19:52.886365Z","shell.execute_reply":"2025-03-17T00:19:52.891457Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform = A.Compose([\n    A.Resize(128, 320),\n    # ToTensorV2(),\n])\naudio_transform = None","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:52.894562Z","iopub.execute_input":"2025-03-17T00:19:52.895016Z","iopub.status.idle":"2025-03-17T00:19:52.936429Z","shell.execute_reply.started":"2025-03-17T00:19:52.894973Z","shell.execute_reply":"2025-03-17T00:19:52.935198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"@dataclasses.dataclass\nclass AudioParam:\n    SR: int=32_000\n    NFFT: int=2048\n    NMEL: int=128\n    FMAX: int=16_000\n    FMIN: int=20\n    HOP_LENGTH: int=NFFT // 4\n\naudio_param = AudioParam()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:52.940486Z","iopub.execute_input":"2025-03-17T00:19:52.940818Z","iopub.status.idle":"2025-03-17T00:19:52.963245Z","shell.execute_reply.started":"2025-03-17T00:19:52.940792Z","shell.execute_reply":"2025-03-17T00:19:52.962112Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_csv = pd.read_csv(submission_path)\nidx2cls = sub_csv.columns.drop(\"row_id\").tolist()\ncls2idx = {c: i for i, c in enumerate(idx2cls)}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:52.964901Z","iopub.execute_input":"2025-03-17T00:19:52.965264Z","iopub.status.idle":"2025-03-17T00:19:53.022280Z","shell.execute_reply.started":"2025-03-17T00:19:52.965225Z","shell.execute_reply":"2025-03-17T00:19:53.021161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DEBUG = False\nfile_names = [os.path.join(test_data_path, fp) for fp in os.listdir(test_data_path) if fp.endswith(\".ogg\")]\nif len(file_names) == 0:\n    file_names = [\n        \"/kaggle/input/birdclef-2025/train_soundscapes/H02_20230420_074000.ogg\",\n        \"/kaggle/input/birdclef-2025/train_soundscapes/H02_20230420_112000.ogg\",\n        \"/kaggle/input/birdclef-2025/train_soundscapes/H02_20230420_164000.ogg\",\n        \"/kaggle/input/birdclef-2025/train_soundscapes/H02_20230422_021500.ogg\",\n    ]\n    DEBUG = True","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:53.023624Z","iopub.execute_input":"2025-03-17T00:19:53.024134Z","iopub.status.idle":"2025-03-17T00:19:53.031921Z","shell.execute_reply.started":"2025-03-17T00:19:53.024090Z","shell.execute_reply":"2025-03-17T00:19:53.030811Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def pipeline(x):\n    if audio_transform is not None:\n        x = audio_transform(sample=x, sample_rate=audio_param.SR)\n    \n    mels = librosa.feature.melspectrogram(\n        y=x,\n        sr=audio_param.SR,\n        n_fft=audio_param.NFFT,\n        n_mels=audio_param.NMEL,\n        fmax=audio_param.FMAX,\n        fmin=audio_param.FMIN,\n        hop_length=audio_param.HOP_LENGTH,\n    )\n\n    # db_map = pcen(mels).astype(np.float32)\n\n    x = librosa.power_to_db(mels, ref=np.max)\n    x = (x + 80) / 80\n\n    if transform is not None:\n        x = np.stack([transform(image=img)[\"image\"] for img in x])\n\n    return x[:, None]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:53.033321Z","iopub.execute_input":"2025-03-17T00:19:53.033624Z","iopub.status.idle":"2025-03-17T00:19:53.053940Z","shell.execute_reply.started":"2025-03-17T00:19:53.033596Z","shell.execute_reply":"2025-03-17T00:19:53.052774Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict(fps):\n    ie = openvino.Core()\n    model = ie.read_model(model=\"/kaggle/input/efficientnetb3-openvino-ir/EfficientNetB3.xml\")\n    compiled_model  = ie.compile_model(model=model, device_name=\"CPU\")\n\n    input_layer = next(iter(compiled_model.inputs))\n    output_layer = next(iter(compiled_model.outputs))\n\n    row_ids = []\n    outputs = []\n    for fp in fps:\n        x, _ = librosa.load(fp, sr=audio_param.SR)\n        x = x.reshape(-1, audio_param.SR*5)\n    \n        x = pipeline(x).astype(np.float32)\n        output = compiled_model({input_layer: x})\n        out = output[output_layer]\n        out = scipy.special.softmax(out, axis=1)\n        outputs.append(out)\n    \n        fp_name = os.path.basename(fp).split(\".\")[0]\n        row_ids += [f\"{fp_name}_{(i+1)*5}\" for i in range(0, out.shape[0])]\n\n    del x, out, ie, model, compiled_model\n    gc.collect()\n\n    return np.concatenate(outputs, axis=0), row_ids","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:53.055154Z","iopub.execute_input":"2025-03-17T00:19:53.055466Z","iopub.status.idle":"2025-03-17T00:19:53.080231Z","shell.execute_reply.started":"2025-03-17T00:19:53.055426Z","shell.execute_reply":"2025-03-17T00:19:53.078889Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fold = len(file_names) // 4\nfile_names = [\n    file_names[0:fold],\n    file_names[fold:fold*2],\n    file_names[fold*2:fold*3],\n    file_names[fold*3:],\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:53.081271Z","iopub.execute_input":"2025-03-17T00:19:53.081612Z","iopub.status.idle":"2025-03-17T00:19:53.100547Z","shell.execute_reply.started":"2025-03-17T00:19:53.081582Z","shell.execute_reply":"2025-03-17T00:19:53.099274Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"row_id = []\nmatrix = []\nwith ThreadPoolExecutor(max_workers=4) as executor:\n    for out, rid in executor.map(predict, file_names):\n        row_id += rid\n        matrix.append(out)\nmatrix = np.concatenate(matrix)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:19:53.101689Z","iopub.execute_input":"2025-03-17T00:19:53.102113Z","iopub.status.idle":"2025-03-17T00:20:18.630128Z","shell.execute_reply.started":"2025-03-17T00:19:53.102047Z","shell.execute_reply":"2025-03-17T00:20:18.628727Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"matrix = np.concatenate([np.array(row_id).reshape(-1, 1), matrix], axis=1)\nsub_csv = pd.DataFrame(matrix, columns=[\"row_id\", *idx2cls])\nsub_csv.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:20:18.631638Z","iopub.execute_input":"2025-03-17T00:20:18.632424Z","iopub.status.idle":"2025-03-17T00:20:18.661936Z","shell.execute_reply.started":"2025-03-17T00:20:18.632375Z","shell.execute_reply":"2025-03-17T00:20:18.660651Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_csv.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T00:20:18.663308Z","iopub.execute_input":"2025-03-17T00:20:18.663637Z","iopub.status.idle":"2025-03-17T00:20:18.711595Z","shell.execute_reply.started":"2025-03-17T00:20:18.663609Z","shell.execute_reply":"2025-03-17T00:20:18.710197Z"}},"outputs":[],"execution_count":null}]}