{"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":227357489,"sourceType":"kernelVersion"}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import time\nSTART = time.time()\n\n!pip install /kaggle/input/bc25-lib/wheel/resampy-*\n!pip install /kaggle/input/bc25-lib/wheel/watchdog-*\n!pip install /kaggle/input/bc25-lib/wheel/birdnetlib-*\n\nfrom birdnetlib import Recording\nfrom birdnetlib.analyzer import Analyzer\nfrom concurrent.futures import ThreadPoolExecutor\nimport glob\nimport librosa\nimport numpy as np\nimport os\nimport pandas as pd\nimport re\nfrom scipy.interpolate import CubicSpline\nimport sys\nimport torch\nimport torchaudio\n\nTERMINATE_TIME = START + 5300","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:39:25.343673Z","iopub.execute_input":"2025-03-13T09:39:25.344060Z","iopub.status.idle":"2025-03-13T09:39:37.902444Z","shell.execute_reply.started":"2025-03-13T09:39:25.344030Z","shell.execute_reply":"2025-03-13T09:39:37.901112Z"},"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Get the map from common bird name to dataframe index","metadata":{}},{"cell_type":"code","source":"primary_labels = pd.read_csv('/kaggle/input/birdclef-2025/sample_submission.csv').columns[1:].to_list()\nprimary_labels_indices = range(len(primary_labels))\n\nprimary_labels_map = dict(zip(primary_labels, primary_labels_indices))\n\ntaxonomy = pd.read_csv('/kaggle/input/birdclef-2025/taxonomy.csv', index_col='common_name')['primary_label']\ntaxonomy_map = taxonomy.map(primary_labels_map)\n\ncommon_names = taxonomy.index.to_list()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:39:37.904106Z","iopub.execute_input":"2025-03-13T09:39:37.904449Z","iopub.status.idle":"2025-03-13T09:39:37.923248Z","shell.execute_reply.started":"2025-03-13T09:39:37.904413Z","shell.execute_reply":"2025-03-13T09:39:37.922170Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Get all the data files","metadata":{}},{"cell_type":"code","source":"def get_oggs(max_oggs=10):\n    if len(glob.glob('/kaggle/input/birdclef-2025/test_soundscapes/*.ogg')) > 0:\n        oggs = glob.glob('/kaggle/input/birdclef-2025/test_soundscapes/*.ogg')\n    else:\n        oggs = sorted(glob.glob(f'/kaggle/input/birdclef-2025/train_soundscapes/*.ogg'))[:max_oggs]\n    return [(n, ogg, re.search(r'/([^/]+)\\.ogg$', ogg).group(1)) for n, ogg in enumerate(oggs)]\n\noggs = get_oggs()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:39:37.925032Z","iopub.execute_input":"2025-03-13T09:39:37.925347Z","iopub.status.idle":"2025-03-13T09:39:37.954748Z","shell.execute_reply.started":"2025-03-13T09:39:37.925323Z","shell.execute_reply":"2025-03-13T09:39:37.953913Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Process the files","metadata":{}},{"cell_type":"code","source":"class HiddenPrints:\n    def __enter__(self):\n        self._original_stdout = sys.stdout\n        sys.stdout = open(os.devnull, 'w')\n\n    def __exit__(self, exc_type, exc_val, exc_tb):\n        sys.stdout.close()\n        sys.stdout = self._original_stdout","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:39:37.956046Z","iopub.execute_input":"2025-03-13T09:39:37.956319Z","iopub.status.idle":"2025-03-13T09:39:37.960859Z","shell.execute_reply.started":"2025-03-13T09:39:37.956297Z","shell.execute_reply":"2025-03-13T09:39:37.959852Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"analyzer = Analyzer()\n\nrow_ids = []\nresult = []\nfor _, fname, ss_id in oggs:\n    print(f'{ss_id}')\n    with HiddenPrints():\n        recording = Recording(analyzer,\n                              fname,\n                              #lat=6.763345368718646, \n                              #lon=-74.20911748873883,\n                              min_conf=1e-10\n                             )\n        recording.analyze()\n    \n    x1 = np.arange(1.5, 60, 3)\n    x2 = np.arange(2.5, 60, 5)\n    \n    # Zero-filled resulting array of size [duration // 3; num_species]\n    bn_result = np.zeros((20, len(common_names)))\n    \n    # Fill the result with BirdNet prediction\n    for rec in recording.detections:\n        if rec['common_name'] in common_names:\n            species_idx = taxonomy_map[rec['common_name']]\n            time_idx = int(rec['start_time'] // 3)\n            bn_result[time_idx, species_idx] = rec['confidence']\n    \n    # Reshape the resulting array to the size of [duration // 5; num_species]\n    bn_result = CubicSpline(x1, bn_result)(x2)\n\n    row_ids += [f'{ss_id}_{n}' for n in range(5, 65, 5)]\n    result.append(bn_result)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:39:37.961752Z","iopub.execute_input":"2025-03-13T09:39:37.962095Z","iopub.status.idle":"2025-03-13T09:40:00.338000Z","shell.execute_reply.started":"2025-03-13T09:39:37.962071Z","shell.execute_reply":"2025-03-13T09:40:00.336896Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame(np.concatenate(result), columns=primary_labels)\nsubmission['row_id'] = row_ids\nsubmission = submission[['row_id'] + primary_labels]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:40:00.338974Z","iopub.execute_input":"2025-03-13T09:40:00.339391Z","iopub.status.idle":"2025-03-13T09:40:00.346845Z","shell.execute_reply.started":"2025-03-13T09:40:00.339357Z","shell.execute_reply":"2025-03-13T09:40:00.345588Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Write CSV\nsubmission.to_csv('submission.csv', index=False)\n\n# Display submission DataFrame\ndisplay(submission.head(20))\n\ndisplay(submission.tail(20))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T09:40:00.347986Z","iopub.execute_input":"2025-03-13T09:40:00.348273Z","iopub.status.idle":"2025-03-13T09:40:00.452218Z","shell.execute_reply.started":"2025-03-13T09:40:00.348241Z","shell.execute_reply":"2025-03-13T09:40:00.451406Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}