{"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":8890861,"sourceType":"datasetVersion","datasetId":5347375},{"sourceId":8894856,"sourceType":"datasetVersion","datasetId":5348675},{"sourceId":8901305,"sourceType":"datasetVersion","datasetId":5351223},{"sourceId":8906958,"sourceType":"datasetVersion","datasetId":5355363},{"sourceId":8911251,"sourceType":"datasetVersion","datasetId":5358232},{"sourceId":8912081,"sourceType":"datasetVersion","datasetId":5358905},{"sourceId":3836,"sourceType":"modelInstanceVersion","modelInstanceId":2739,"modelId":319}],"dockerImageVersionId":30732,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import pandas as pd\n# train_csv_path = '/kaggle/input/train-noduplicates/train_noduplicates.csv'\n# unlabeled_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n# output_path = '/kaggle/working/labeled_google_soundscapes.csv'\n\n# #=============================#\n# #== Prepairing Google model ==#\n# #=============================#\n\n# import tensorflow_hub as hub\n# model = hub.load('https://www.kaggle.com/models/google/bird-vocalization-classifier/TensorFlow2/bird-vocalization-classifier/1')\n# labels_path = hub.resolve('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/1') + \"/assets/label.csv\"\n\n# # getting species from Google model\n# labels = pd.read_csv(labels_path)\n# google_species_to_label = {k: v for k, v in zip(labels.index, labels['ebird2021'])}\n# google_species_to_label_reverse = {k: v for k, v in zip(labels['ebird2021'], labels.index)}\n# species_google = set(list(google_species_to_label.values()))\n\n# # getting species from BirdCLEF 2024\n# train2024 = pd.read_csv(train_csv_path)\n# train2024['n_chunks'] = train2024['lengths'] // 160_000\n\n# species2024 = train2024['primary_label']\n# species2024 = set(list(species2024))\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-28T16:47:16.812461Z","iopub.execute_input":"2024-07-28T16:47:16.812888Z","iopub.status.idle":"2024-07-28T16:47:16.845869Z","shell.execute_reply.started":"2024-07-28T16:47:16.812847Z","shell.execute_reply":"2024-07-28T16:47:16.844693Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n\n# # species that are in BirdCLEF 2024 but no in Google model\n# new_species = list(species2024 - species_google)\n\n# # matching Google labels to 2024 by reindexing\n# train2024_google = train2024[~train2024['primary_label'].isin(new_species)]\n# species_2024_x_google = train2024_google['primary_label'].unique()\n\n# species_to_label_2024_x_google = {}\n# label_to_index_2024_x_google_reset_index = {}\n# for i, spec in enumerate(list(species_2024_x_google)):\n#     species_to_label_2024_x_google[spec] = google_species_to_label_reverse[spec]\n#     label_to_index_2024_x_google_reset_index[i] = spec\n    \n# actual_indeces = np.array(list(species_to_label_2024_x_google.values()))\n\n","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:16.848060Z","iopub.execute_input":"2024-07-28T16:47:16.848692Z","iopub.status.idle":"2024-07-28T16:47:16.853555Z","shell.execute_reply.started":"2024-07-28T16:47:16.848662Z","shell.execute_reply":"2024-07-28T16:47:16.852437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from tqdm import tqdm\n# import librosa\n# train_path = r'/kaggle/input/birdclef-2024/train_audio'\n\n# #=========================#\n# #== Labeling Train Audio ==#\n# #=========================#\n\n# google_probs = {}\n# for i in tqdm(range(len(train2024))):\n#     obj = train2024.iloc[i]\n#     filename = obj['filename']\n#     n_chunks = obj['n_chunks']\n#     length = obj['lengths']\n#     x_full, sr = librosa.load(train_path + '/' + obj['filename'], sr=32_000)\n#     x_full = x_full.astype(np.float32)\n#     step = sr * 5\n#     offset_probs = {}\n#     if n_chunks == 0:\n#         x_full = np.hstack([x for _ in range(int(5 / (x_full.shape[0] / sr)) + 1)])\n#         n_chunks = 1\n#     for i in range(n_chunks):\n#         x = x_full[step * i : step * (i+1)]\n#         logits = None\n#         if obj['primary_label'] in new_species:\n#             logits = np.zeros(len(actual_indeces)) - 20.0\n#         else:\n#             logits = model.infer_tf(x[np.newaxis, :])[0][0].numpy()[actual_indeces]\n#         offset_probs[i * 5] = list(logits)\n#     google_probs[filename] = offset_probs\n","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:16.854728Z","iopub.execute_input":"2024-07-28T16:47:16.855005Z","iopub.status.idle":"2024-07-28T16:47:16.866761Z","shell.execute_reply.started":"2024-07-28T16:47:16.854980Z","shell.execute_reply":"2024-07-28T16:47:16.865460Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# output_path = '/kaggle/input/train-noduplicates/labeled_google_soundscapes.csv'\n\n# filename_list = []\n# offset_list = []\n# logits_list = []\n# for filename, offset_dict in google_probs.items():\n#     for offset, logits in offset_dict.items():\n#         filename_list.append(filename)\n#         offset_list.append(offset)\n#         logits_list.append(logits)\n\n# logits_array = np.array(logits_list)\n\n# metainfo_df = pd.DataFrame({'filename': filename_list, 'offset_seconds': offset_list})\n# logit_df = pd.DataFrame(logits_array, columns=list(label_to_index_2024_x_google_reset_index.values()))\n# df = pd.concat([metainfo_df, logit_df], axis=1)\n# df = pd.merge(df, train2024, on=['filename'])\n\n# # adding new species to labels\n# for spec in new_species:\n#     df[spec] = -20.0\n#     df[spec][df['primary_label'] == spec] = 3.0\n\n# df.to_csv(output_path, index=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:16.868806Z","iopub.execute_input":"2024-07-28T16:47:16.869177Z","iopub.status.idle":"2024-07-28T16:47:16.884232Z","shell.execute_reply.started":"2024-07-28T16:47:16.869139Z","shell.execute_reply":"2024-07-28T16:47:16.883109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import os\n# import numpy as np\n# import pandas as pd\n# from tqdm import tqdm\n# import librosa\n\n# import warnings\n# warnings.filterwarnings(\"ignore\")\n# from warnings import simplefilter\n# simplefilter(action=\"ignore\", category=pd.errors.PerformanceWarning)\n\n\n# train_csv_path = '/kaggle/input/birdclef-2024/train_metadata.csv'\n# unlabeled_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes/'\n\n# output_path = '/kaggle/working/labeled_google_soundscapes.csv'\n\n# #=============================#\n# #== Prepairing Google model ==#\n# #=============================#\n\n# import tensorflow_hub as hub\n# model = hub.load('https://www.kaggle.com/models/google/bird-vocalization-classifier/TensorFlow2/bird-vocalization-classifier/1')\n# labels_path = hub.resolve('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/1') + \"/assets/label.csv\"\n\n# # getting species from Google model\n# labels = pd.read_csv(labels_path)\n# google_species_to_label = {k: v for k, v in zip(labels.index, labels['ebird2021'])}\n# google_species_to_label_reverse = {k: v for k, v in zip(labels['ebird2021'], labels.index)}\n# species_google = set(list(google_species_to_label.values()))\n\n# # getting species from BirdCLEF 2024\n# train2024 = pd.read_csv(train_csv_path)\n# species2024 = train2024['primary_label']\n# species2024 = set(list(species2024))\n\n# # species that are in BirdCLEF 2024 but no in Google model\n# new_species = list(species2024 - species_google)\n\n# # matching Google labels to 2024 by reindexing\n# train2024_google = train2024[~train2024['primary_label'].isin(new_species)]\n# species_2024_x_google = train2024_google['primary_label'].unique()\n\n# species_to_label_2024_x_google = {}\n# label_to_index_2024_x_google_reset_index = {}\n# for i, spec in enumerate(list(species_2024_x_google)):\n#     species_to_label_2024_x_google[spec] = google_species_to_label_reverse[spec]\n#     label_to_index_2024_x_google_reset_index[i] = spec\n    \n# actual_indices = np.array(list(species_to_label_2024_x_google.values()))\n\n# #===================================#\n# #== Labeling Unlabeled Soundscapes ==#\n# #===================================#\n\n# unlabeled_soundscapes = sorted(os.listdir(unlabeled_path))\n\n# paths = []\n# offsets = []\n# logits = []\n# for path in tqdm(unlabeled_soundscapes):\n#     n_chunks = 4 * 60 // 5\n#     x_full, sr = librosa.load(unlabeled_path + path, sr=32_000)\n#     if len(x_full) < 4 * 60 * sr:\n#         continue\n#     x_full = x_full.astype(np.float32)\n#     step = sr * 5\n#     for i in range(n_chunks):\n#         x = x_full[step * i : step * (i+1)]\n#         logits.append(model.infer_tf(x[np.newaxis, :])[0][0].numpy()[actual_indices])\n#         offsets.append(i * 5)\n#         paths.append(path)\n\n# df = pd.DataFrame(np.array(logits).astype(np.float32), columns=list(label_to_index_2024_x_google_reset_index.values()))\n# df.insert(loc=0, column='offset_seconds', value=offsets)\n# df.insert(loc=0, column='filename', value=paths)\n# df.to_csv(output_path, index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:16.885550Z","iopub.execute_input":"2024-07-28T16:47:16.885867Z","iopub.status.idle":"2024-07-28T16:47:16.898137Z","shell.execute_reply.started":"2024-07-28T16:47:16.885839Z","shell.execute_reply":"2024-07-28T16:47:16.897090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import torch\n# import timm\n\n# import warnings\n# warnings.filterwarnings(\"ignore\")\n# from warnings import simplefilter\n# simplefilter(action=\"ignore\", category=pd.errors.PerformanceWarning)\n\n# train_csv_path = '/kaggle/input/birdclef-2024/train_metadata.csv'\n# unlab_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n# unlab_mel_dir = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/unlabeled_mels/'\n# model_paths = ['/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/models_weights/fold{i}.ckpt' for i in [0, 1, 3]]\n# output_path = '/kaggle/working/labeled_effnet_soundscapes.csv'\n\n# #=========================#\n# #== Prepairing Metadata ==#\n# #=========================#\n\n# data = pd.read_csv(train_csv_path)\n# LABELS = sorted(data['primary_label'].unique())\n# data_unlab = pd.read_csv(unlab_path)\n# data_unlab['offset_seconds'] = data_unlab['offset_seconds'].astype(int)\n# data_unlab['filename'] = data_unlab.filename.apply(lambda s: s.replace('.ogg', '')) + \\\n#                              '_' + (data_unlab.offset_seconds // 60).astype(str) + '.npy'\n# data_unlab['mel_path'] = unlab_mel_dir + data_unlab.filename\n# data_unlab['offset_seconds'] = data_unlab['offset_seconds'] % 60\n# data_unlab.drop(columns=LABELS, inplace=True, errors=\"ignore\")\n\n# #====================================#\n# #== Prepairing EfficientNet models ==#\n# #====================================#\n\n# global_device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n# models = []\n# for model_path in model_paths:\n#     state_dict = torch.load(model_path, map_location=global_device)\n#     model = timm.create_model(\n#         'efficientnet_b0', pretrained=None,\n#         num_classes=182, in_chans=1,\n#     )\n#     new_state_dict = {}\n#     for key, val in state_dict['state_dict'].items():\n#         if key.startswith('model.'):\n#             new_state_dict[key[6:]] = val\n#     model.load_state_dict(new_state_dict)\n#     model.eval().to(global_device)\n#     models.append(model)\n# print(f'{len(models)} models are ready')\n\n# #====================================#\n# #== Labeling Unlabeled Soundscapes ==#\n# #====================================#\n\n# all_preds = np.empty((0, 182))\n# with torch.no_grad():\n#     for mel_path in tqdm(data_unlab.mel_path.unique()):\n#         spec = np.load(mel_path)\n#         pad_len = 320 - spec.shape[-1] % 320\n#         if pad_len >= 319:\n#             spec = spec[..., :spec.shape[-1] - spec.shape[-1] % 320]\n#         else:\n#             spec = np.pad(spec, ((0, 0), (0, pad_len)))\n#         spec = np.transpose(spec.reshape(128, -1, 320), axes=(1, 0, 2))\n#         spec = librosa.power_to_db(spec, ref=1, top_db=100.0)\n#         spec = torch.from_numpy(spec).unsqueeze(1).to(global_device)\n        \n#         preds = np.zeros((spec.shape[0], 182))\n#         for model in models:\n#             preds += model(spec).cpu().numpy().astype('float32')\n#         preds /= len(models)\n#         all_preds = np.concatenate([all_preds, preds], axis=0)\n# data_unlab.loc[:, LABELS] = all_preds\n\n# data_unlab.to_csv(output_path, index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:17.026187Z","iopub.execute_input":"2024-07-28T16:47:17.027059Z","iopub.status.idle":"2024-07-28T16:47:17.034531Z","shell.execute_reply.started":"2024-07-28T16:47:17.027027Z","shell.execute_reply":"2024-07-28T16:47:17.033444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n# import pandas as pd\n# import librosa\n# import warnings\n# warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning)\n# warnings.simplefilter(action='ignore', category=pd.errors.SettingWithCopyWarning)\n# import random\n\n# import torch\n# import torch.nn as nn\n# import torch.nn.functional as F\n# from torch.utils.data import Dataset, DataLoader\n# from torch.optim import AdamW\n# from torch.optim.lr_scheduler import CosineAnnealingLR\n# from torchmetrics import MetricCollection, MeanMetric\n# from torchmetrics.classification import MultilabelAUROC\n\n# from pytorch_lightning import LightningModule, LightningDataModule\n\n\n# class BirdDataset(Dataset):\n#     def __init__(self, \n#                  df, \n#                  transform=None, \n#                  segm_sec=None,\n#                  **kwargs):        \n#         df = df.reset_index(drop=True)\n#         df.loc[:, 'npy_idx'] = df.index.tolist()\n#         if segm_sec is None:\n#             self.objidx2npyidx = df.groupby(['mel_path'], as_index=False)['npy_idx'].aggregate(lambda x: x.tolist())\n#         else:\n#             df['offset_segm'] = df['offset_seconds'].astype(int) // segm_sec\n#             self.objidx2npyidx = df.groupby(['mel_path', 'offset_segm'], as_index=False)['npy_idx'].aggregate(lambda x: x.tolist())\n#         self.npy_data = np.ascontiguousarray(np.array(df['npy_data'].values.tolist()))\n#         self.transform = transform\n#         self.pps = 32_000 // 500\n#         self.duration = 10\n\n#     def __len__(self):\n#         return len(self.objidx2npyidx)\n\n#     def __getitem__(self, idx):\n#         obj = self.objidx2npyidx.iloc[idx]\n#         rand_idx = np.random.choice(obj.npy_idx)\n#         offset = self.npy_data[rand_idx][0]\n#         x = self._read_spec(path=obj.mel_path, offset=offset)\n#         y = self.npy_data[rand_idx:rand_idx+2, 1:].mean(axis=0)\n#         return x, y\n    \n#     def _cyclic_fill(self, x):\n#         if (x.shape[1] / self.pps) < self.duration:\n#             x = np.hstack([x for _ in range(int(self.duration / (x.shape[1] / self.pps)) + 1)])\n#             x = x[:, :self.pps*self.duration]\n#         return x\n    \n#     def _read_spec(self, path, offset):\n#         x = np.load(path)\n#         start = int(offset * self.pps)\n#         end = start + self.duration * self.pps\n#         x = x[:, start:end]\n#         x = self._cyclic_fill(x)\n#         x = librosa.power_to_db(x, ref=1, top_db=100.0).astype('float32')\n#         x = x[np.newaxis, ...]\n#         if self.transform:\n#             x = x.transpose((1, 2, 0))\n#             x = self.transform(image=x)['image']\n#             x = x.transpose((2, 0, 1))\n#         return x\n    \n\n# class BirdDataModule(LightningDataModule):\n#     def __init__(self, train_dataset, val_dataset, batch_size=64):\n#         super().__init__()\n#         self.batch_size = batch_size\n#         self.train_dataset = train_dataset\n#         self.val_dataset = val_dataset\n            \n#     def train_dataloader(self):\n#         return DataLoader(dataset=self.train_dataset,\n#                           batch_size=self.batch_size,\n#                           num_workers=4,\n#                           pin_memory=False,\n#                           shuffle=True,\n#                         )\n\n#     def val_dataloader(self):\n#         return DataLoader(dataset=self.val_dataset,\n#                           batch_size=self.batch_size,\n#                           num_workers=4,\n#                           pin_memory=False,\n#                           shuffle=False,\n#                         )\n\n\n# class CutMix:\n#     def __init__(self, \n#                  mode: str = 'horizontal', \n#                  p: float = 1.0, \n#                  cuts_num: int = 1):\n#         assert mode in ['horizontal']\n#         self.mode = mode\n#         self.cuts_num = cuts_num\n#         self.p = p\n  \n#     def apply_horizontal(self, imgs, labels):\n#         w = imgs.shape[-1]\n#         b = imgs.shape[0]\n        \n#         alphas = np.sort(np.random.rand(self.cuts_num))\n#         rand_index = [np.random.permutation(b) for _ in range(self.cuts_num)]\n#         imgs_tomix = [imgs[idxes] for idxes in rand_index]\n#         labels_tomix = [labels[idxes] for idxes in rand_index]\n        \n#         for alpha, img_tomix in zip(alphas, imgs_tomix):\n#             imgs[..., int(alpha*w):] = img_tomix[..., int(alpha*w):]\n        \n#         labels = labels*alphas[0]\n#         for i in range(1, self.cuts_num):\n#             labels += labels_tomix[i-1]*(alphas[i] - alphas[i-1])\n#         labels +=  labels_tomix[-1] * (1 - alphas[-1])\n        \n#         return imgs, labels\n        \n#     def __call__(self, imgs, labels):\n#         if random.random() > self.p:\n#             return imgs, labels\n#         if self.mode in ['horizontal']:\n#             imgs, labels = self.apply_horizontal(imgs, labels)\n#         return imgs, labels\n    \n\n# class LitCls(LightningModule):\n\n#     def __init__(\n#             self,\n#             model: torch.nn.Module,\n#             learning_rate: float = 3e-4,\n#             cutmix_p: float = 0,\n#             cuts_num: int = 1,\n#     ) -> None:\n#         super().__init__()\n\n#         self.model: torch.nn.Module = model\n#         self.learning_rate: float = learning_rate\n#         self.aug_cutmix = CutMix(mode='horizontal', p=cutmix_p, cuts_num=cuts_num)\n        \n#         self.loss: torch.nn.Module = nn.CrossEntropyLoss()\n#         metric_ce = MetricCollection({\n#             \"CE\": MeanMetric()\n#         })\n#         metric_auroc = MetricCollection({\n#             \"AUROC\": MultilabelAUROC(num_labels=182, average=\"macro\"),\n#         })\n        \n#         self.train_ce: MetricCollection = metric_ce.clone(prefix=\"train_\")\n#         self.val_ce: MetricCollection = metric_ce.clone(prefix=\"val_\")\n#         self.train_auroc: MetricCollection = metric_auroc.clone(prefix=\"train_\")\n#         self.val_auroc: MetricCollection = metric_auroc.clone(prefix=\"val_\")\n\n#     def training_step(self, batch, batch_idx: int) -> torch.Tensor:\n#         x, y = batch\n#         x, y = self.aug_cutmix(x, y)\n#         preds = self.model(x)\n#         train_loss = self.loss(preds, y)\n#         self.train_ce(train_loss)\n#         self.log('train_loss', train_loss, prog_bar=True, sync_dist=True)\n#         self.train_auroc(F.sigmoid(preds), (y+0.9).int())\n#         return train_loss\n    \n#     def on_train_epoch_end(self) -> None:\n#         self.log_dict(self.train_ce.compute(), sync_dist=True)\n#         self.train_ce.reset()\n#         self.log_dict(self.train_auroc.compute(), sync_dist=True)\n#         self.train_auroc.reset()\n\n#     def validation_step(self, batch: dict[str, torch.Tensor], batch_idx: int) -> None:\n#         x, y = batch\n#         preds = self.model(x)\n#         val_loss = self.loss(preds, y)\n#         self.val_ce(val_loss)\n#         self.val_auroc(F.sigmoid(preds), (y+0.9).int())\n\n#     def on_validation_epoch_end(self) -> None:\n#         self.log_dict(self.val_ce.compute(), prog_bar=True, sync_dist=True)\n#         self.val_ce.reset()\n#         self.log_dict(self.val_auroc.compute(), prog_bar=True, sync_dist=True)\n#         self.val_auroc.reset()\n\n#     def configure_optimizers(self):\n#         optimizer = AdamW(params=self.trainer.model.parameters(), lr=self.learning_rate)\n#         scheduler = CosineAnnealingLR(optimizer, T_max=self.trainer.max_epochs)\n#         return [optimizer], [scheduler]\n    ","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:17.041008Z","iopub.execute_input":"2024-07-28T16:47:17.041393Z","iopub.status.idle":"2024-07-28T16:47:17.055629Z","shell.execute_reply.started":"2024-07-28T16:47:17.041356Z","shell.execute_reply":"2024-07-28T16:47:17.054270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import json\n# import argparse\n\n# warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning)\n# warnings.simplefilter(action='ignore', category=pd.errors.SettingWithCopyWarning)\n\n# from sklearn.model_selection import KFold\n\n# from pytorch_lightning import Trainer\n# # from pytorch_lightning.loggers import WandbLogger\n# from pytorch_lightning.callbacks import ModelCheckpoint, LearningRateMonitor, RichProgressBar\n\n# import timm\n# import albumentations as A\n# # import wandb\n\n# # from training_utils import BirdDataset, BirdDataModule, LitCls\n\n\n# if __name__ == '__main__':\n\n#     # parser = argparse.ArgumentParser()\n#     # parser.add_argument('-с', '--cfg', help='Model config file path', dest='cfg_path')\n#     # args = {}\n#     # for name, value in vars(parser.parse_args()).items():\n#     #     args[name] = value\n\n\n#     train_csv_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/train_noduplicates.csv'\n#     train_lab_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/train_prepared.csv'\n#     train_mels_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/train_mels/'\n#     train_stats_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/train_stats.csv'\n#     unlab_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/unlabeled_prepared.csv'\n#     unlab_mels_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/tmp/unlabeled_mels/'\n#     models_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/models_weights/'\n\n#     # load config\n#     with open(\"/kaggle/input/config1/effnet_seg20_80low.json\", 'r') as f:\n#         CFG = json.load(f)\n\n#     # read train metadata\n#     data = pd.read_csv(train_lab_path)\n#     LABELS = sorted(data['primary_label'].unique())\n#     data['npy_data'] = list(data[['offset_seconds'] + LABELS].values)\n#     data.drop(columns=LABELS, inplace=True)\n#     data['mel_path'] = train_mels_path + data[\"filename\"].apply(lambda s: str(s).replace('.ogg', '.npy'))\n\n#     # read unlabeled soundscapes metadata\n#     data_unlab = pd.read_csv(unlab_path)\n#     data_unlab['npy_data'] = list(data_unlab[['offset_seconds'] + LABELS].values)\n#     data_unlab = data_unlab.drop(columns=LABELS)\n#     data_unlab['mel_path'] = unlab_mels_path + data_unlab[\"filename\"]\n\n#     # split only train_audio part\n#     if CFG['split_type'] == 'fold0':\n#         data_nodup = pd.read_csv(train_csv_path)\n#         kf_splitter = KFold(n_splits=5, random_state=42, shuffle=True)\n#         train_idx, valid_idx = list(kf_splitter.split(data_nodup, data_nodup['primary_label']))[0]\n#         train_filenames = data_nodup.loc[train_idx].filename\n#         valid_filenames = data_nodup.loc[valid_idx].filename\n#     elif CFG['split_type'] == '80low':\n#         data_quantile = pd.read_csv(train_stats_path)\n#         train_filenames = data_quantile[data_quantile['T'] <= data_quantile['T_80q']].filename\n#         valid_filenames = data_quantile[data_quantile['T'] > data_quantile['T_80q']].filename\n#     train_df = data[data.filename.isin(train_filenames)]\n#     valid_df = data[data.filename.isin(valid_filenames)]\n\n#     train_df = train_df[train_df.good == 1]\n#     train_df = pd.concat([train_df, data_unlab])\n\n\n#     # keep only center chunks for validation\n#     valid_df = valid_df.groupby(['filename'], as_index=False).aggregate(func=lambda df: df.iloc[df.shape[0]//2])\n\n#     # create train and validation datasets\n#     transform = A.Compose([\n#     A.XYMasking(\n#         num_masks_x=(1, 12),\n#         num_masks_y=(1, 3),\n#         mask_x_length=(8, 16), \n#         mask_y_length=(8, 16),\n#         fill_value=0,\n#         p=0.9,\n#         ),\n#     ])\n#     train_dataset = BirdDataset(df=train_df,\n#                                 transform=transform, \n#                                 segm_sec=CFG['segmentation_sec'])\n#     valid_dataset = BirdDataset(df=valid_df)\n#     datamodule = BirdDataModule(train_dataset, train_dataset, \n#                                 batch_size=CFG['batch_size'])\n\n#     # create pretrained model\n#     model = timm.create_model(\n#         CFG['model_name'], pretrained=True,\n#         num_classes=182, in_chans=1,\n#     )\n#     lit_cls = LitCls(model, cutmix_p=0.9, learning_rate=CFG['learning_rate'])\n\n#     # create callbacks\n#     checkpoint_callback = ModelCheckpoint(\n#         monitor=None,  # save only last\n#         filename='{epoch}-{val_AUROC:.3f}',\n#         save_last=True,\n#     )\n#     lr_monitor = LearningRateMonitor(logging_interval='epoch')\n#     rich_progress = RichProgressBar()\n\n#     # with open('/wandb_key.txt') as f:\n#     #     WANDB_KEY = f.readline()\n#     # wandb.login(key=WANDB_KEY)\n#     # logger = WandbLogger(\n#     #     project='BirdCLEF',\n#     #     log_model=True,\n#     # )\n\n#     # create trainer and start training process\n#     trainer = Trainer(\n#         check_val_every_n_epoch=1,\n#         num_sanity_val_steps=0,\n#         max_epochs=CFG['epochs_num'],\n#         accumulate_grad_batches=1,\n#         callbacks=[rich_progress, lr_monitor, checkpoint_callback],\n#         # logger=logger,\n#         log_every_n_steps=50,\n#         # accelerator='gpu',\n#     )\n#     trainer.fit(lit_cls, datamodule=datamodule)\n#     # wandb.finish()\n\n#     # name = args['cfg_path'].split('/')[-1].split('.')[0]\n#     name = \"effnet_seg20_80low_new\"\n#     trainer.save_checkpoint(f'{\"/kaggle/working/model_weights/\"}{CFG[\"name\"]}.ckpt')\n    ","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:47:17.063024Z","iopub.execute_input":"2024-07-28T16:47:17.063428Z","iopub.status.idle":"2024-07-28T16:47:17.075870Z","shell.execute_reply.started":"2024-07-28T16:47:17.063397Z","shell.execute_reply":"2024-07-28T16:47:17.074781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install -r /kaggle/input/my-requirements/requirements.txt\n","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:48:52.496469Z","iopub.execute_input":"2024-07-28T16:48:52.496844Z","iopub.status.idle":"2024-07-28T16:49:30.411927Z","shell.execute_reply.started":"2024-07-28T16:48:52.496816Z","shell.execute_reply":"2024-07-28T16:49:30.410676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport joblib\nimport openvino as ov\nimport librosa\nimport torch\nimport timm\nimport torch.nn.functional as F\n\nSHAPE = [48, 1, 128, 320*2]\n\ndef mel(arr, sr=32_000):\n    arr = arr * 1024\n    S = librosa.feature.melspectrogram(y=arr, sr=sr,\n                                       n_fft=1024, hop_length=500, n_mels=128, \n                                       fmin=40, fmax=15000, power=2.0)\n    return S\n\ndef mel_preproc(x):\n    x = librosa.power_to_db(x, ref=1, top_db=100.0)\n    x = x.astype('float32')\n    return x\n\ndef torch_to_ov(model, input_shape=[48, 1, 128, 0], name='model'):\n    core = ov.Core()\n    ov_model = ov.convert_model(model)\n#     ov_model.reshape(input_shape)\n    compiled_model = core.compile_model(ov_model)\n    return compiled_model\ndef mel(arr, sr=32_000):\n    arr = arr * 1024\n    spec = librosa.feature.melspectrogram(y=arr, sr=sr,\n                                          n_fft=1024, hop_length=500, n_mels=128, \n                                          fmin=40, fmax=15000, power=2.0)\n    spec = spec.astype('float32')\n    return spec\n\ndef torch_to_ov(model, input_shape=[48, 1, 128, 0]):\n    core = ov.Core()\n    ov_model = ov.convert_model(model)\n    # ov_model.reshape(input_shape)\n    compiled_model = core.compile_model(ov_model)\n    return compiled_model\n\nmodel_paths = [\n    # EfficientNet_b0\n    '/kaggle/input/weights/effnet_seg20_80low.ckpt',\n    '/kaggle/input/weights/epoch4-val_AUROC0.957.ckpt',\n    '/kaggle/input/weights/last.ckpt',\n#     # RegNetY\n#     'models_weights/regnety_seg60_fold0.ckpt',\n#     'models_weights/regnety_seg30_fold0.ckpt',\n#     'models_weights/regnety_seg30_80low.ckpt',\n]\n\ntest_audio_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes/'\nunlab_audio_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes/'\ntrain_metadata_path = '/kaggle/input/birdclef2024-preprocess/git hub Bird CLEF/BirdCLEF_2024/data/train_metadata.csv'\nsubmission_path = '/kaggle/working/submission.csv'\n\nSHAPE = [48, 1, 128, 320*2]\n\n# load and compile models\nmodels = []\nfor i, model_path in enumerate(model_paths):\n    state_dict = torch.load(model_path, map_location=torch.device('cpu'))\n\n    model_name = 'efficientnet_b0'\n    if 'regnety' in model_path:\n        model_name = 'regnety_008.pycls_in1k'\n    \n    model = timm.create_model(\n        model_name, pretrained=None,\n        num_classes=182, in_chans=SHAPE[1]\n    )\n    \n    new_state_dict = {}\n    for key, val in state_dict['state_dict'].items():\n        if key.startswith('model.'):\n            new_state_dict[key[6:]] = val\n    model.load_state_dict(new_state_dict)\n    model.eval()\n    model = torch_to_ov(model, input_shape=SHAPE)\n    models.append(model)\nprint(f'{len(models)} models are ready')\n\ntest_audio_dir = '/kaggle/input/birdclef-2024/test_soundscapes/'\ntest_paths = [test_audio_dir+f for f in sorted(os.listdir(test_audio_dir))]\nif len(test_paths)==1:\n    test_audio_dir = '/kaggle/input/birdclef-2024/unlabeled_soundscapes/'\n    test_paths = [test_audio_dir+f for f in sorted(os.listdir(test_audio_dir))][:3]\ntest_df = pd.DataFrame(test_paths, columns=['filepath'])\ntest_df['filename'] = test_df.filepath.map(lambda x: x.split('/')[-1].replace('.ogg',''))\n\ndef process(idx):\n    row = test_df.iloc[idx]\n    audiopath = row['filepath']\n    audio, sr = librosa.load(audiopath, sr=None)\n    chunk_size = sr * 5\n    chunks = audio.reshape(-1, chunk_size)\n    chunks_mel = mel(chunks, sr=sr)[:, :, :320].astype(np.float32)\n    return row['filename'], chunks_mel\n    \nindexes = test_df.index\noutput = joblib.Parallel(n_jobs=-1, backend=\"loky\")(\n        joblib.delayed(process)(idx) for idx in indexes\n    )\n\nmels_dict = dict(output)\n\nids = []\npreds = [np.empty(shape=(0, 182), dtype='float32') for _ in range(len(models))]\n\nfor filename in test_df.filename.tolist():\n    chunks = mels_dict[filename]\n    chunks = chunks[:, np.newaxis, :, :]\n    chunks_1 = np.concatenate([chunks[:1], chunks[:-1]], axis=0)\n    chunks_2 = np.concatenate([chunks[1:], chunks[-1:]], axis=0)\n    chunks = np.concatenate([chunks_1, chunks, chunks_2], axis=-1)\n    chunks = chunks[...,160:-160]\n    chunks = mel_preproc(chunks)\n    for m_idx in range(len(models)):\n        rec_preds = models[m_idx](torch.from_numpy(chunks))[0]\n        preds[m_idx] = np.concatenate([preds[m_idx], rec_preds], axis=0)\n\n    # create ID for each chunk in the audio with the filename and frame number\n    rec_ids = [f'{filename}_{(frame_id+1)*5}' for frame_id in range(rec_preds.shape[0])]\n    ids += rec_ids\npreds = F.sigmoid(torch.Tensor(np.array(preds))).numpy()","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:51:24.616250Z","iopub.execute_input":"2024-07-28T16:51:24.616693Z","iopub.status.idle":"2024-07-28T16:51:47.891836Z","shell.execute_reply.started":"2024-07-28T16:51:24.616659Z","shell.execute_reply":"2024-07-28T16:51:47.890373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"s0 = preds.shape[0]\npreds = preds.reshape(s0, -1, 48, 182)\nsmooth_preds = preds.copy()\nfor i in range(48):\n    smooth_preds[:, :, i] = preds[:, :, max(0,i-2):i+3].mean(axis=-2)\npreds = smooth_preds.reshape(s0, -1, 182)\n\n# preds[:3] = preds[:3].min(axis=0, keepdims=True)\n# preds[3:] = preds[3:].min(axis=0, keepdims=True)\npreds = preds.mean(axis=0, keepdims=True)\npreds = preds.squeeze()","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:51:47.894519Z","iopub.execute_input":"2024-07-28T16:51:47.895674Z","iopub.status.idle":"2024-07-28T16:51:47.907881Z","shell.execute_reply.started":"2024-07-28T16:51:47.895628Z","shell.execute_reply":"2024-07-28T16:51:47.906405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\nLABELS = sorted(list(data['primary_label'].unique()))\n\npred_df = pd.DataFrame(ids, columns=['row_id'])\npred_df.loc[:, LABELS] = preds\npred_df.to_csv('submission.csv', index=False)\npred_df.head(100)","metadata":{"execution":{"iopub.status.busy":"2024-07-28T16:51:47.909765Z","iopub.execute_input":"2024-07-28T16:51:47.910194Z","iopub.status.idle":"2024-07-28T16:51:48.356301Z","shell.execute_reply.started":"2024-07-28T16:51:47.910159Z","shell.execute_reply":"2024-07-28T16:51:48.354955Z"},"trusted":true},"execution_count":null,"outputs":[]}]}