{"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,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":15853,"sourceType":"modelInstanceVersion","isSourceIdPinned":false,"modelInstanceId":2739,"modelId":319}],"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\nfrom concurrent.futures import ThreadPoolExecutor\nimport glob\nimport librosa\nimport numpy as np\nimport os\nimport pandas as pd\nimport re\nimport sys\nimport tensorflow as tf\n\ntf.experimental.numpy.experimental_enable_numpy_behavior()\n\nTERMINATE_TIME = START + 5300","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-14T13:57:00.390165Z","iopub.execute_input":"2025-03-14T13:57:00.390871Z","iopub.status.idle":"2025-03-14T13:57:00.397883Z","shell.execute_reply.started":"2025-03-14T13:57:00.390821Z","shell.execute_reply":"2025-03-14T13:57:00.396316Z"},"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"birdclassifier = tf.saved_model.load('/kaggle/input/bird-vocalization-classifier/tensorflow2/bird-vocalization-classifier/8/')","metadata":{"trusted":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},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bc_labels = pd.read_csv('/kaggle/input/bird-vocalization-classifier/tensorflow2/bird-vocalization-classifier/8/assets/label.csv').iloc[:, 0].to_list()\nbc_labels_indices = range(len(bc_labels))\n\nprimary_labels_map = dict(zip(bc_labels, bc_labels_indices))\n\nbirdclassifier_last = len(bc_labels)\nbirdclassifier_indices = [primary_labels_map[pl] if pl in bc_labels else birdclassifier_last for pl in primary_labels]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"total_predicted_species = sum([pl in bc_labels for pl in primary_labels])\nprint(f'Note: we can predict {total_predicted_species} species only!')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Get all the data files","metadata":{}},{"cell_type":"code","source":"def get_oggs(max_oggs=8):\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},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Process the files in threads","metadata":{}},{"cell_type":"code","source":"def bvc_result(ogg):\n    _, fname, ss_id = ogg\n    sr = 32_000\n\n    print(f'{ss_id}')\n    row_ids = [f'{ss_id}_{n}' for n in range(5, 65, 5)]\n\n    if time.time() > TERMINATE_TIME:\n        return row_ids, -1000 * np.ones((12, 206))\n        \n    data, _ = librosa.load(fname, sr=sr)\n\n    model_outputs = birdclassifier.infer_tf(data.reshape((-1, 5 * sr)))['label']\n    model_outputs = tf.pad(model_outputs, tf.constant([[0, 0], [0, 1]]))\n    result = model_outputs[:, birdclassifier_indices]\n\n    return row_ids, result","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"row_ids = []\nresult = []\n\nwith ThreadPoolExecutor(max_workers=4) as executor:\n    for ogg_row_ids, ogg_result in executor.map(bvc_result, oggs):\n        row_ids += ogg_row_ids\n        result.append(ogg_result)","metadata":{"trusted":true},"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},"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},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}