{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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":11940535,"sourceType":"datasetVersion","datasetId":7506665}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-25T04:17:02.160513Z","iopub.execute_input":"2025-05-25T04:17:02.160866Z","iopub.status.idle":"2025-05-25T04:17:33.422029Z","shell.execute_reply.started":"2025-05-25T04:17:02.160844Z","shell.execute_reply":"2025-05-25T04:17:33.420886Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\npd.read_csv(\"/kaggle/input/birdclef-25/taxonomy.csv\").columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T07:50:46.619504Z","iopub.execute_input":"2025-05-25T07:50:46.619789Z","iopub.status.idle":"2025-05-25T07:50:46.995842Z","shell.execute_reply.started":"2025-05-25T07:50:46.619769Z","shell.execute_reply":"2025-05-25T07:50:46.995071Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport librosa\nimport scipy.signal\nfrom tqdm.notebook import tqdm\nfrom tensorflow.keras.models import load_model\nimport pickle\n\ntaxonomy_df = pd.read_csv(\"/kaggle/input/birdclef-25/taxonomy.csv\")\nspecies_cols = taxonomy_df['primary_label'].unique().tolist()\n\nmodel = load_model(\"/kaggle/input/birdclef-25/final_cnn_model.keras\")\nwith open(\"/kaggle/input/birdclef-25/label_encoder.pkl\", \"rb\") as f:\n    le = pickle.load(f)\n\ntest_audio_dir = \"/kaggle/input/birdclef-2025/test_soundscapes\"\nfile_list = [f for f in sorted(os.listdir(test_audio_dir)) if f.endswith('.ogg')]\n\npred_rows = []\nfor file_name in tqdm(file_list):\n    file_path = os.path.join(test_audio_dir, file_name)\n    y, sr = librosa.load(file_path, sr=32000)\n    for i in range(0, len(y), sr*5):\n        chunk = y[i:i+sr*5]\n        if len(chunk) < sr*5:\n            pad_width = sr*5 - len(chunk)\n            chunk = np.pad(chunk, (0, pad_width))\n        if len(chunk) >= 2048:\n            mfcc = librosa.feature.mfcc(y=chunk, sr=sr, n_mfcc=40)\n        else:\n            mfcc = librosa.feature.mfcc(y=chunk, sr=sr, n_mfcc=40, n_fft=512)\n        mfcc = mfcc.T\n        if mfcc.shape[0] < 400:\n            mfcc = np.pad(mfcc, ((0, 400-mfcc.shape[0]), (0,0)), mode='constant')\n        else:\n            mfcc = mfcc[:400, :]\n        mfcc = mfcc[np.newaxis, ..., np.newaxis]\n        prob = model.predict(mfcc, verbose=0)[0]\n        row_id = f\"{file_name.split('.')[0]}_{i//sr+5}\"\n        prob_full = pd.Series(0, index=species_cols)\n        for sp, p in zip(le.classes_, prob):\n            if sp in prob_full.index:\n                prob_full[sp] = p\n        pred_rows.append([row_id] + prob_full.tolist())\n\nsubmission_result = pd.DataFrame(pred_rows, columns=[\"row_id\"] + list(species_cols))\nsubmission_result.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nsubmission_result.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}