{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":8290527,"sourceType":"datasetVersion","datasetId":4841380},{"sourceId":175271735,"sourceType":"kernelVersion"}],"dockerImageVersionId":30698,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import glob\nimport os\nimport random\nimport sys\nimport warnings\nfrom pathlib import Path\n\nimport numpy as np\nimport pandas as pd\nimport librosa\nimport timm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.utils.data as torchdata\nfrom torchaudio.transforms import AmplitudeToDB, MelSpectrogram\nfrom tqdm.auto import tqdm\nimport glob\nimport concurrent.futures\nimport shutil\nimport albumentations as A\nimport torchaudio\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-02T13:25:26.643373Z","iopub.execute_input":"2024-05-02T13:25:26.644018Z","iopub.status.idle":"2024-05-02T13:25:41.352827Z","shell.execute_reply.started":"2024-05-02T13:25:26.643957Z","shell.execute_reply":"2024-05-02T13:25:41.351293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv(\"../input/birdclef-2024/sample_submission.csv\")\ntarget_columns_ = sub.columns.tolist()\ntarget_columns = sub.columns.tolist()[1:]\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:26.823872Z","iopub.execute_input":"2024-05-02T13:38:26.824378Z","iopub.status.idle":"2024-05-02T13:38:26.846830Z","shell.execute_reply.started":"2024-05-02T13:38:26.824339Z","shell.execute_reply":"2024-05-02T13:38:26.845535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TOTAL_SECONDS_CHUNKS = 48\ntest_path = \"/kaggle/input/birdclef-2024/test_soundscapes/\"\nfiles = glob.glob(f'{test_path}*')\nif len(files) == 1:\n    TOTAL_SECONDS_CHUNKS = 2\n\nseconds = [i for i in range(5, (TOTAL_SECONDS_CHUNKS*5) + 5, 5)]","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:25:58.438141Z","iopub.execute_input":"2024-05-02T13:25:58.438888Z","iopub.status.idle":"2024-05-02T13:25:58.449760Z","shell.execute_reply.started":"2024-05-02T13:25:58.438852Z","shell.execute_reply":"2024-05-02T13:25:58.448303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path = \"/kaggle/input/birdclef-2024/test_soundscapes/\"\n\nfiles = glob.glob(f'{test_path}*')\nif len(files) == 1:\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1442779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446379.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1146779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1426779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1441779.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446179.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446719.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446771.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1446789.ogg')\n    shutil.copy('/kaggle/input/birdclef-2024/train_audio/redspu1/XC312771.ogg', '/kaggle/working/soundscape_1448779.ogg')\n    test_path = \"/kaggle/working/\"\n    \nprint (test_path)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:26:00.077827Z","iopub.execute_input":"2024-05-02T13:26:00.079242Z","iopub.status.idle":"2024-05-02T13:26:00.117442Z","shell.execute_reply.started":"2024-05-02T13:26:00.079160Z","shell.execute_reply":"2024-05-02T13:26:00.115820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mel_spec_params = {\n    \"sample_rate\": 32000,\n    \"n_mels\": 128,\n    \"f_min\": 20,\n    \"f_max\": 16000,\n    \"n_fft\": 2048,\n    \"hop_length\": 512,\n    \"normalized\": True,\n    \"center\" : True,\n    \"pad_mode\" : \"constant\",\n    \"norm\" : \"slaney\",\n    \"onesided\" : True,\n    \"mel_scale\" : \"slaney\"\n}\ntop_db = 80","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:30:06.337777Z","iopub.execute_input":"2024-05-02T13:30:06.338220Z","iopub.status.idle":"2024-05-02T13:30:06.345512Z","shell.execute_reply.started":"2024-05-02T13:30:06.338175Z","shell.execute_reply":"2024-05-02T13:30:06.343374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def normalize_melspec(X, eps=1e-6):\n    mean = X.mean((1, 2), keepdim=True)\n    std = X.std((1, 2), keepdim=True)\n    Xstd = (X - mean) / (std + eps)\n\n    norm_min, norm_max = (\n        Xstd.min(-1)[0].min(-1)[0],\n        Xstd.max(-1)[0].max(-1)[0],\n    )\n    fix_ind = (norm_max - norm_min) > eps * torch.ones_like(\n        (norm_max - norm_min)\n    )\n    V = torch.zeros_like(Xstd)\n    if fix_ind.sum():\n        V_fix = Xstd[fix_ind]\n        norm_max_fix = norm_max[fix_ind, None, None]\n        norm_min_fix = norm_min[fix_ind, None, None]\n        V_fix = torch.max(\n            torch.min(V_fix, norm_max_fix),\n            norm_min_fix,\n        )\n        V_fix = (V_fix - norm_min_fix) / (norm_max_fix - norm_min_fix)\n        V[fix_ind] = V_fix\n    return V","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:28.831281Z","iopub.execute_input":"2024-05-02T13:38:28.832906Z","iopub.status.idle":"2024-05-02T13:38:28.845642Z","shell.execute_reply.started":"2024-05-02T13:38:28.832848Z","shell.execute_reply":"2024-05-02T13:38:28.843856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transforms_val = A.Compose([\n    A.Resize(256, 256),\n    A.Normalize()\n])","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:29.488667Z","iopub.execute_input":"2024-05-02T13:38:29.489193Z","iopub.status.idle":"2024-05-02T13:38:29.497379Z","shell.execute_reply.started":"2024-05-02T13:38:29.489156Z","shell.execute_reply":"2024-05-02T13:38:29.495470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.mel_transform = torchaudio.transforms.MelSpectrogram(**mel_spec_params)\n        self.db_transform = torchaudio.transforms.AmplitudeToDB(stype='power', top_db=top_db)\n        self.transform = transforms_val\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx: int):\n\n        sample = self.df.loc[idx, :]\n        row_id = sample.row_id\n\n        end_seconds = int(sample.seconds)\n        start_seconds = int(end_seconds - 5)\n        \n        wave = self.clip[:, 32000 * start_seconds : 32000 * end_seconds]\n        \n        mel_spectrogram = normalize_melspec(self.db_transform(self.mel_transform(wave)))\n        mel_spectrogram = mel_spectrogram * 255\n        mel_spectrogram = mel_spectrogram.expand(3, -1, -1).permute(1, 2, 0).numpy()\n        \n        res = self.transform(image=mel_spectrogram)\n        spec = res['image'].astype(np.float32)\n        spec = spec.transpose(2, 0, 1)\n        \n        return {\n            \"row_id\": row_id,\n            \"wave\": spec,\n        }","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:29.676925Z","iopub.execute_input":"2024-05-02T13:38:29.677412Z","iopub.status.idle":"2024-05-02T13:38:29.692222Z","shell.execute_reply.started":"2024-05-02T13:38:29.677378Z","shell.execute_reply":"2024-05-02T13:38:29.690714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    wav, org_sr = torchaudio.load(audio_path, normalize=True)\n    clip = torchaudio.functional.resample(wav, orig_freq=org_sr, new_freq=32000)\n    \n    name_ = audio_path.split(\".ogg\")[0].split(\"/\")[-1]\n    row_ids = [name_+f\"_{second}\" for second in seconds]\n\n    test_df = pd.DataFrame({\n        \"row_id\": row_ids,\n        \"seconds\": seconds,\n    })\n    \n    dataset = TestDataset(\n        df=test_df, \n        clip=clip,\n    )\n        \n    loader = torchdata.DataLoader(\n        dataset,\n        batch_size=4, \n        num_workers=os.cpu_count(),\n        drop_last=False,\n        shuffle=False,\n        pin_memory=True\n    )\n    \n    for inputs in loader:\n\n        row_ids = inputs['row_id']\n        inputs.pop('row_id')\n\n        for row_id in row_ids:\n            if row_id not in prediction_dict:\n                prediction_dict[str(row_id)] = []\n\n        probas = []\n\n        with torch.no_grad():\n            output = model(inputs[\"wave\"])\n\n        for row_id_idx, row_id in enumerate(row_ids):\n            prediction_dict[str(row_id)].append(output[row_id_idx, :].sigmoid().detach().numpy())\n                                                        \n    for row_id in list(prediction_dict.keys()):\n        logits = prediction_dict[row_id]\n        logits = np.array(logits)[0]#.mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(target_columns)):\n            prediction_dict[row_id][target_columns[label]] = logits[label]\n\n    return prediction_dict","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:30.275291Z","iopub.execute_input":"2024-05-02T13:38:30.275786Z","iopub.status.idle":"2024-05-02T13:38:30.292421Z","shell.execute_reply.started":"2024-05-02T13:38:30.275751Z","shell.execute_reply":"2024-05-02T13:38:30.291117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torch.jit.load(\"../input/save-torch-jit-model/4.pt\")\nmodel.eval()\nprint (\"Loaded\")","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:37:20.141051Z","iopub.execute_input":"2024-05-02T13:37:20.142264Z","iopub.status.idle":"2024-05-02T13:37:20.463247Z","shell.execute_reply.started":"2024-05-02T13:37:20.142188Z","shell.execute_reply":"2024-05-02T13:37:20.460520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def main():\n    \n    \n    all_audios = list(glob.glob(f'{test_path}*.ogg'))\n\n    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:\n        dicts = list(executor.map(prediction_for_clip, all_audios))\n    \n    prediction_dicts = {}\n    for d in dicts:\n        prediction_dicts.update(d)\n        \n    submission = pd.DataFrame.from_dict(prediction_dicts, \"index\").rename_axis(\"row_id\").reset_index()\n    submission.to_csv(\"submission.csv\", index=False)\n    print (\"Done\")\n\n\nif __name__ == \"__main__\":\n    main()","metadata":{"execution":{"iopub.status.busy":"2024-05-02T13:38:31.422650Z","iopub.execute_input":"2024-05-02T13:38:31.423102Z","iopub.status.idle":"2024-05-02T13:38:38.949772Z","shell.execute_reply.started":"2024-05-02T13:38:31.423072Z","shell.execute_reply":"2024-05-02T13:38:38.947981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}