{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":11932625,"sourceType":"datasetVersion","datasetId":6935042},{"sourceId":11945782,"sourceType":"datasetVersion","datasetId":7001755},{"sourceId":11946061,"sourceType":"datasetVersion","datasetId":6912357}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false},"papermill":{"default_parameters":{},"duration":27.447062,"end_time":"2025-03-12T14:13:11.647927","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-03-12T14:12:44.200865","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# BirdCLEF2025+:Sound Event Visualisations\n\nI will introduce sound event visualizations for train_soundscapes data. \n\nThis notebook uses [STEFAN KAHL](https://www.kaggle.com/stefankahl)'s [BirdCLEF+ 2025 Sample Submission](https://www.kaggle.com/code/stefankahl/birdclef-2025-sample-submission) as a starter. \n\n## Related Notebooks\n* Dataset Creation:[BirdCLEF2025-1 Crop audio 5s](https://www.kaggle.com/code/myso1987/birdclef2025-1-crop-audio-5s)\n* Training Notebook:[BirdCLEF2025-2 Train-baseline 5s](https://www.kaggle.com/code/myso1987/birdclef2025-2-train-baseline-5s)\n*  Inference Notebook:[BirdCLEF2025-3 Submit-baseline 5s](https://www.kaggle.com/code/myso1987/birdclef2025-3-submit-baseline-5s)\n\n## Reference\n[[Birdclef2022] Soundscape Visualisations](https://www.kaggle.com/code/shinmurashinmura/birdclef2022-soundscape-visualisations/notebook)","metadata":{}},{"cell_type":"markdown","source":"# Import","metadata":{}},{"cell_type":"code","source":"import os\nimport sys\nimport time\nimport torch\nimport torchaudio\nimport torchaudio.transforms as AT\nsys.path.append(\"/kaggle/input/birdclef2025-utils\")\nfrom birdclef2025_utils import get_results","metadata":{"_kg_hide-input":false,"papermill":{"duration":12.984639,"end_time":"2025-03-12T14:13:00.145177","exception":false,"start_time":"2025-03-12T14:12:47.160538","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T12:58:38.114538Z","iopub.execute_input":"2025-05-25T12:58:38.115033Z","iopub.status.idle":"2025-05-25T12:58:38.120620Z","shell.execute_reply.started":"2025-05-25T12:58:38.115000Z","shell.execute_reply":"2025-05-25T12:58:38.119028Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Predict(train_soundscapes data)","metadata":{}},{"cell_type":"code","source":"test_audio_dir = '../input/birdclef-2025/test_soundscapes/'\nfile_list = [f for f in sorted(os.listdir(test_audio_dir))]\nfile_list = [file.split('.')[0] for file in file_list if file.endswith('.ogg')]\nclass_labels = sorted(os.listdir('../input/birdclef-2025/train_audio/'))\n\ndebug = False\ndebug_st_num=0\ndebug_num=0\nif len(file_list) == 0:\n    debug = True\n    debug_st_num = 5\n    debug_num = 8\n    test_audio_dir = '../input/birdclef-2025/train_soundscapes/'\n    file_list = [f for f in sorted(os.listdir(test_audio_dir))]\n    file_list = [file.split('.')[0] for file in file_list if file.endswith('.ogg')]\n    file_list = file_list[debug_st_num:debug_st_num+debug_num]\n\nprint('Debug mode:', debug)\nprint('Number of test soundscapes:', len(file_list))","metadata":{"_kg_hide-input":false,"papermill":{"duration":0.105385,"end_time":"2025-03-12T14:13:00.253425","exception":false,"start_time":"2025-03-12T14:13:00.14804","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T12:58:38.122210Z","iopub.execute_input":"2025-05-25T12:58:38.122593Z","iopub.status.idle":"2025-05-25T12:58:38.160831Z","shell.execute_reply.started":"2025-05-25T12:58:38.122550Z","shell.execute_reply":"2025-05-25T12:58:38.159666Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"start = time.time()\nresults = get_results.get_results(test_audio_dir,file_list,debug,debug_num)\nresults.to_csv(\"submission.csv\", index=False)    \nend_t = time.time()\n\nif debug == True:\n    print('Estimated submission runtime(minutes):', 700*(end_t - start)/60/debug_num)","metadata":{"papermill":{"duration":0.097214,"end_time":"2025-03-12T14:13:09.519812","exception":false,"start_time":"2025-03-12T14:13:09.422598","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T12:58:38.162920Z","iopub.execute_input":"2025-05-25T12:58:38.163359Z","iopub.status.idle":"2025-05-25T12:59:33.388614Z","shell.execute_reply.started":"2025-05-25T12:58:38.163328Z","shell.execute_reply":"2025-05-25T12:59:33.387343Z"},"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Utilities for Sound Event Visualisations","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    import numpy as np\n    import pandas as pd\n    import matplotlib.pyplot as plt\n    \n    sample_rate = 32000\n    n_fft=1024\n    win_length=1024\n    hop_length=512\n    f_min=20\n    f_max=16000\n    n_mels=128\n    \n    mel_spectrogram = AT.MelSpectrogram(\n        sample_rate=sample_rate,\n        n_fft=n_fft,\n        win_length=win_length,\n        hop_length=hop_length,\n        center=True,\n        f_min=f_min,\n        f_max=f_max,\n        pad_mode=\"reflect\",\n        power=2.0,\n        norm='slaney',\n        n_mels=n_mels,\n        mel_scale=\"htk\",\n        # normalized=True\n    )\n    \n    def audio_to_mel_debug(filepath=None):\n        waveform, sample_rate = torchaudio.load(filepath,backend=\"soundfile\")\n        len_wav = waveform.shape[1]\n        waveform = waveform / torch.max(torch.abs(waveform))\n        melspec = mel_spectrogram(waveform)\n        melspec = 10*torch.log10(melspec)\n        return melspec\n    \n    def plot_results(results, file_name):\n        path = test_audio_dir + file_name + \".ogg\"\n        specgram = audio_to_mel_debug(path)\n        fig, axes = plt.subplots(2, 1, figsize=(10, 8))\n        axes[0].set_title(file_name)\n        im = axes[0].imshow((specgram[0]), origin=\"lower\", aspect=\"auto\")\n        axes[0].set_ylabel(\"mel bin\")\n        axes[0].set_xlabel(\"frame\")\n        fig.colorbar(im, ax=axes[0])\n        heatmap = axes[1].pcolor(results[results[\"row_id\"].str.contains(file_name)].iloc[:12,1:].values.T, edgecolors='k', linewidths=0.1, vmin=0, vmax=1, cmap='Blues')\n        fig.colorbar(heatmap, ax=axes[1])\n        axes[1].set_xticks(np.arange(0, 12, 1))\n        axes[1].set_xticklabels(np.arange(0,60,5))\n        axes[1].set_ylabel(\"species\")\n        axes[1].set_xlabel(\"sec\")\n        fig.tight_layout()\n        fig.show()\n\n    def load_plot_results(csv_path):\n        results_l = pd.read_csv(csv_path)\n        results_l = results_l.set_index('row_id').loc[results['row_id']]\n        results_l = results_l.reset_index()\n        display(results_l.head())\n    \n        for file_name in file_list:\n            plot_results(results_l, file_name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T12:59:33.390565Z","iopub.execute_input":"2025-05-25T12:59:33.391218Z","iopub.status.idle":"2025-05-25T12:59:33.405852Z","shell.execute_reply.started":"2025-05-25T12:59:33.391085Z","shell.execute_reply":"2025-05-25T12:59:33.404422Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sound Event Visualisations(LB latest)","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    display(results.head())\n    for file_name in file_list:\n        plot_results(results, file_name)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sound Event Visualisations(LB 0.903)","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    load_plot_results(\"/kaggle/input/birdclef-2025submission-csvtrain-soundscapes/submission_903.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sound Event Visualisations(LB 0.883)","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    load_plot_results(\"/kaggle/input/birdclef-2025submission-csvtrain-soundscapes/submission_883.csv\")","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sound Event Visualisations(LB 0.854)","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    load_plot_results(\"/kaggle/input/birdclef-2025submission-csvtrain-soundscapes/submission_854.csv\")","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sound Event Visualisations(LB 0.815)","metadata":{}},{"cell_type":"code","source":"if debug == True:\n    load_plot_results(\"/kaggle/input/birdclef-2025submission-csvtrain-soundscapes/submission_815.csv\")","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null}]}