{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 16's place solution","metadata":{"papermill":{"duration":0.04953,"end_time":"2021-02-16T15:59:39.560117","exception":false,"start_time":"2021-02-16T15:59:39.510587","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"This kenel based on https://www.kaggle.com/kneroma/clean-fast-simple-bird-identifier-inference My model's weights trained with this code https://www.kaggle.com/kneroma/clean-fast-simple-bird-identifier-training-colab","metadata":{"papermill":{"duration":0.04754,"end_time":"2021-02-16T15:59:39.092567","exception":false,"start_time":"2021-02-16T15:59:39.045027","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!nvidia-smi","metadata":{"id":"ikMF-nQSdTbF","outputId":"041c6767-86ab-46e4-9b22-a4840121ecca","papermill":{"duration":1.301859,"end_time":"2021-02-16T15:59:41.363841","exception":false,"start_time":"2021-02-16T15:59:40.061982","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:41:25.738134Z","iopub.execute_input":"2021-05-26T13:41:25.738478Z","iopub.status.idle":"2021-05-26T13:41:26.482327Z","shell.execute_reply.started":"2021-05-26T13:41:25.738447Z","shell.execute_reply":"2021-05-26T13:41:26.481182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    import resnest\nexcept ModuleNotFoundError:\n    !pip install -q \"../input/resnest50-fast-package/resnest-0.0.6b20200701/resnest\"","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:41:26.484764Z","iopub.execute_input":"2021-05-26T13:41:26.48505Z","iopub.status.idle":"2021-05-26T13:41:26.495742Z","shell.execute_reply.started":"2021-05-26T13:41:26.485021Z","shell.execute_reply":"2021-05-26T13:41:26.494872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install ../input/timm-pytorch-image-models/pytorch-image-models-master/\n!pip install ../input/torchlibrosa/torchlibrosa-0.0.5-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:41:26.497395Z","iopub.execute_input":"2021-05-26T13:41:26.497811Z","iopub.status.idle":"2021-05-26T13:42:19.934902Z","shell.execute_reply.started":"2021-05-26T13:41:26.497772Z","shell.execute_reply":"2021-05-26T13:42:19.933836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install ../input/pytorchlightning/tensorboard-2.2.0-py3-none-any.whl ../input/pytorchlightning/pytorch_lightning-0.9.0-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:42:19.937824Z","iopub.execute_input":"2021-05-26T13:42:19.938127Z","iopub.status.idle":"2021-05-26T13:42:45.742882Z","shell.execute_reply.started":"2021-05-26T13:42:19.938097Z","shell.execute_reply":"2021-05-26T13:42:45.741953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install ../input/torchaudiomentations070/torch_audiomentations-0.7.0-py3-none-any.whl ","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:42:45.750956Z","iopub.execute_input":"2021-05-26T13:42:45.751253Z","iopub.status.idle":"2021-05-26T13:43:11.365092Z","shell.execute_reply.started":"2021-05-26T13:42:45.751224Z","shell.execute_reply":"2021-05-26T13:43:11.364199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport librosa\nimport soundfile as sf\nimport pandas as pd\nimport cv2\nfrom pathlib import Path\nimport re\n\nimport torch\nfrom torch import nn, optim\nfrom  torch.utils.data import Dataset, DataLoader\nimport torch.nn.functional as F\n\n\nimport torchaudio\n\nfrom torchlibrosa.stft import LogmelFilterBank, Spectrogram\nfrom torchlibrosa.augmentation import SpecAugmentation\n\nimport timm\nfrom contextlib import contextmanager\nfrom typing import Optional\nimport warnings\n\nimport audioread\nimport logging\nimport random\n\nimport os\nimport json\n\nfrom tqdm.notebook import tqdm\n\nimport time\nfrom resnest.torch import resnest50\n\nfrom albumentations.core.transforms_interface import ImageOnlyTransform\n\nimport joblib\n\nimport gc\n\nfrom sklearn.metrics import label_ranking_average_precision_score\n\nimport pytorch_lightning as pl\n\nimport torch_audiomentations as AA","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","id":"kSCcqxf0c_O7","papermill":{"duration":4.153186,"end_time":"2021-02-16T15:59:57.894303","exception":false,"start_time":"2021-02-16T15:59:53.741117","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:43:11.368619Z","iopub.execute_input":"2021-05-26T13:43:11.369011Z","iopub.status.idle":"2021-05-26T13:43:11.378591Z","shell.execute_reply.started":"2021-05-26T13:43:11.368969Z","shell.execute_reply":"2021-05-26T13:43:11.377591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.__version__","metadata":{"papermill":{"duration":0.046502,"end_time":"2021-02-16T15:59:59.284533","exception":false,"start_time":"2021-02-16T15:59:59.238031","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:43:11.380091Z","iopub.execute_input":"2021-05-26T13:43:11.380419Z","iopub.status.idle":"2021-05-26T13:43:11.396724Z","shell.execute_reply.started":"2021-05-26T13:43:11.380387Z","shell.execute_reply":"2021-05-26T13:43:11.395653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Configs","metadata":{"papermill":{"duration":0.046996,"end_time":"2021-02-16T15:59:59.377834","exception":false,"start_time":"2021-02-16T15:59:59.330838","status":"completed"},"tags":[]}},{"cell_type":"code","source":"NUM_CLASSES = 397\nSR = 32_000\nDURATION = 5\nTHRESH = 0.25\n\n\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"DEVICE:\", DEVICE)\n\nTEST_AUDIO_ROOT = Path(\"../input/birdclef-2021/test_soundscapes\")\nSAMPLE_SUB_PATH = \"../input/birdclef-2021/sample_submission.csv\"\nPUBLIC = False\n#TARGET_PATH = None\n    \nif not len(list(TEST_AUDIO_ROOT.glob(\"*.ogg\"))):\n    TEST_AUDIO_ROOT = Path(\"../input/birdclef-2021/train_soundscapes\")\n    SAMPLE_SUB_PATH = None\n    # SAMPLE_SUB_PATH = \"../input/birdclef-2021/sample_submission.csv\"\n    PUBLIC = True\n    \nTARGET_PATH = Path(\"../input/birdclef-2021/train_soundscape_labels.csv\")","metadata":{"id":"rJhYZVIDc_O9","papermill":{"duration":0.440614,"end_time":"2021-02-16T15:59:59.86408","exception":false,"start_time":"2021-02-16T15:59:59.423466","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:43:11.398683Z","iopub.execute_input":"2021-05-26T13:43:11.399588Z","iopub.status.idle":"2021-05-26T13:43:11.412339Z","shell.execute_reply.started":"2021-05-26T13:43:11.399548Z","shell.execute_reply":"2021-05-26T13:43:11.411254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data","metadata":{"papermill":{"duration":0.046026,"end_time":"2021-02-16T16:00:00.054107","exception":false,"start_time":"2021-02-16T16:00:00.008081","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## Transform audio ogg to melspec npy ","metadata":{}},{"cell_type":"code","source":"data = pd.DataFrame(\n     [(path.stem, *path.stem.split(\"_\"), path) for path in TEST_AUDIO_ROOT.glob(\"*.ogg\")],\n    columns = [\"filename\", \"id\", \"site\", \"date\", \"filepath\"]\n)\nprint(data.shape)\ndata.head()","metadata":{"id":"rVwlOrbxc_PD","outputId":"9b53ec99-634a-4b30-f9b5-75036184482b","papermill":{"duration":0.162256,"end_time":"2021-02-16T16:00:01.102152","exception":false,"start_time":"2021-02-16T16:00:00.939896","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:43:11.414064Z","iopub.execute_input":"2021-05-26T13:43:11.414942Z","iopub.status.idle":"2021-05-26T13:43:11.441289Z","shell.execute_reply.started":"2021-05-26T13:43:11.414901Z","shell.execute_reply":"2021-05-26T13:43:11.440249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"public_data = pd.DataFrame(\n     [(path.stem, *path.stem.split(\"_\"), path) for path in Path(\"../input/birdclef-2021/train_soundscapes\").glob(\"*.ogg\")],\n    columns = [\"filename\", \"id\", \"site\", \"date\", \"filepath\"]\n)\nprint(data.shape)\ndata.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:43:11.44273Z","iopub.execute_input":"2021-05-26T13:43:11.443064Z","iopub.status.idle":"2021-05-26T13:43:11.46405Z","shell.execute_reply.started":"2021-05-26T13:43:11.443028Z","shell.execute_reply":"2021-05-26T13:43:11.463236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf test_data_1 \n!mkdir test_data_1 \nTARGET_AUDIO_1 = Path(\"test_data_1\")\n","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:43:11.499342Z","iopub.execute_input":"2021-05-26T13:43:11.499732Z","iopub.status.idle":"2021-05-26T13:43:13.064472Z","shell.execute_reply.started":"2021-05-26T13:43:11.499693Z","shell.execute_reply":"2021-05-26T13:43:13.063466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MelSpecComputer:\n    def __init__(self, sr, n_mels, fmin=0, fmax=16000, **kwargs):\n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax\n        kwargs[\"n_fft\"] = kwargs.get(\"n_fft\", self.sr//10)\n        kwargs[\"hop_length\"] = kwargs.get(\"hop_length\", self.sr//(10*4))\n        self.kwargs = kwargs\n\n    def __call__(self, y):\n\n        melspec = librosa.feature.melspectrogram(\n            y, sr=self.sr, n_mels=self.n_mels, fmin=self.fmin, fmax=self.fmax, **self.kwargs,\n        )\n\n        melspec = librosa.power_to_db(melspec).astype(np.float32)\n        return melspec","metadata":{"id":"4fwNhdbJc_O-","papermill":{"duration":0.056975,"end_time":"2021-02-16T16:00:00.157168","exception":false,"start_time":"2021-02-16T16:00:00.100193","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:43:13.067815Z","iopub.execute_input":"2021-05-26T13:43:13.068237Z","iopub.status.idle":"2021-05-26T13:43:13.076923Z","shell.execute_reply.started":"2021-05-26T13:43:13.068192Z","shell.execute_reply":"2021-05-26T13:43:13.075798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\ndef load_audio(record, sr=32000, root=Path(\"./\")):\n    waveform, sample_rate = torchaudio.load(\n        root.joinpath(record).with_suffix(\".ogg\").as_posix(),\n    )\n    if sample_rate != sr:\n        y = torchaudio.transforms.Resample(sample_rate, sr)(waveform)\n        return y\n    else:\n        return waveform\n\nsound_len = 5 * 32000\n\ndo_melspec_1 = MelSpecComputer(sr=32000, n_mels=128)\n\n#Тестовый файл нарезается на фрагменты, длинною sound_len, \ndef load_and_save_test(row):\n   # try:\n        y = load_audio(row[\"filepath\"], 32000)\n        y = y.squeeze()\n        len_y = len(y)\n        #print(row[\"t_min\"], row[\"t_max\"])\n        #print(len_y)\n\n        for i in range(math.ceil(len(y) / sound_len)):\n            t_min = max(i * sound_len - 32000 , 0)\n            t_max = min((i +1) * sound_len + 32000, len_y)\n            #print(t_min, t_max)\n            labl = np.array(y[int(t_min):int(t_max)])#.view(1,-1)\n            if len(labl) < (7 * 32000):\n                labl = np.hstack([labl, labl])[:(7 * 32000)]\n            #print(len(labl))\n            \n            np.save(TARGET_AUDIO_1/(\"_\".join(row[\"filename\"].split(\"_\")[:2] + [str((i+1)*5)])+\".npy\"), do_melspec_1(labl), allow_pickle=True)\n            \n\nfor n, row in tqdm(data.iterrows(), total=data.shape[0]):\n    load_and_save_test(row)\n\nif PUBLIC:\n    pass\nelse:\n    for n, row in tqdm(public_data.iterrows(), total=public_data.shape[0]):\n        load_and_save_test(row)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2021-05-26T13:43:13.078765Z","iopub.execute_input":"2021-05-26T13:43:13.07921Z","iopub.status.idle":"2021-05-26T13:49:15.604164Z","shell.execute_reply.started":"2021-05-26T13:43:13.079147Z","shell.execute_reply":"2021-05-26T13:49:15.603261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import IPython\n# IPython.display.Audio(\"test_data/11254_COR_10.ogg\")","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:15.605814Z","iopub.execute_input":"2021-05-26T13:49:15.606191Z","iopub.status.idle":"2021-05-26T13:49:15.610291Z","shell.execute_reply.started":"2021-05-26T13:49:15.606135Z","shell.execute_reply":"2021-05-26T13:49:15.609092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib\nimport matplotlib.pyplot as plt\nplt.imshow(np.load(\"test_data_1/11254_COR_10.npy\"))","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:15.611729Z","iopub.execute_input":"2021-05-26T13:49:15.612203Z","iopub.status.idle":"2021-05-26T13:49:15.776787Z","shell.execute_reply.started":"2021-05-26T13:49:15.612167Z","shell.execute_reply":"2021-05-26T13:49:15.775902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Use data in models","metadata":{}},{"cell_type":"code","source":"def normalize(X, eps=1e-6, mean=None, std=None):\n    mean = mean or X.mean()\n    std = std or X.std()\n    X = (X - mean) / (std + eps)\n    \n    _min, _max = X.min(), X.max()\n\n    if (_max - _min) > eps:\n        V = np.clip(X, _min, _max)\n        V = 255 * (V - _min) / (_max - _min)\n        V = V.astype(np.uint8)\n    else:\n        V = np.zeros_like(X, dtype=np.uint8)\n\n    return V\n\n\ndef mono_to_color(image):\n    image = image.astype(\"float32\", copy=False) / 255.0\n    image = np.stack([image, image, image])\n    return image\n\ndef crop_or_pad(y, length):\n    if len(y) < length:\n        y = np.concatenate([y, length - np.zeros(len(y))])\n    elif len(y) > length:\n        y = y[:length]\n    return y","metadata":{"id":"Nk0haSTIc_O_","papermill":{"duration":0.065406,"end_time":"2021-02-16T16:00:00.271104","exception":false,"start_time":"2021-02-16T16:00:00.205698","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:15.778173Z","iopub.execute_input":"2021-05-26T13:49:15.778681Z","iopub.status.idle":"2021-05-26T13:49:15.789409Z","shell.execute_reply.started":"2021-05-26T13:49:15.778639Z","shell.execute_reply":"2021-05-26T13:49:15.788403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"apply_augmentation = AA.Compose(\n    transforms=[\n        AA.Gain(\n            min_gain_in_db=-5.0,\n            max_gain_in_db=5.0,\n            p=0.5,\n        ),\n        AA.AddColoredNoise(p = 0.9, min_f_decay=0,  max_f_decay=1, \n                           min_snr_in_db=5,  max_snr_in_db = 20, sample_rate = 32000), # white, pink noise\n        AA.Shift(p=0.2, min_shift=-0.2, max_shift=0.2, sample_rate = 32000),\n    ]\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BirdCLEFDataset(Dataset):\n    def __init__(self, data, sr=SR, n_mels=128, fmin=0, fmax=None, duration=DURATION, step=None, res_type=\"kaiser_fast\", resample=True, transform = False):\n        \n        self.data = data\n        \n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax or self.sr//2\n\n        self.duration = duration\n        self.audio_length = self.duration*self.sr\n        self.step = step or self.audio_length\n        \n        self.res_type = res_type\n        self.resample = resample\n        self.transform = transform\n\n        self.mel_spec_computer = MelSpecComputer(sr=self.sr, n_mels=self.n_mels, fmin=self.fmin,\n                                                 fmax=self.fmax)\n    def __len__(self):\n        return len(self.data)\n    \n\n    \n    def audio_to_image(self, audio):\n        melspec = self.mel_spec_computer(audio) \n        image = mono_to_color(melspec)\n        image = self.normalize(image)\n        return image\n\n    def read_file(self, filepath):\n        audio, orig_sr = sf.read(filepath, dtype=\"float32\")\n\n        if self.resample and orig_sr != self.sr:\n            audio = lb.resample(audio, orig_sr, self.sr, res_type=self.res_type)\n          \n        audios = []\n        for i in range(self.audio_length, len(audio) + self.step, self.step):\n            start = max(0, i - self.audio_length)\n            end = start + self.audio_length\n            audios.append(audio[start:end])\n            \n        if len(audios[-1]) < self.audio_length:\n            audios = audios[:-1]\n            \n        images = [self.audio_to_image(audio) for audio in audios]\n        images = np.stack(images)\n        \n        return images\n    def read_ready_file(self, filename):\n        audios = []\n        i = 0\n        fname = \"_\".join(filename.split(\"_\")[:2] + [str((i+1)*5)])+\".npy\"\n        all_files = os.listdir(TARGET_AUDIO_1)\n        while fname in all_files:\n            melspec = np.load(TARGET_AUDIO_1/fname)\n            image = np.nan_to_num(normalize(melspec)) \n            image = mono_to_color(image)\n            if self.transform:\n                image = apply_augmentation(torch.Tensor(image))\n \n            #print(fname)\n            audios.append(image)\n            \n            i+=1\n            fname = \"_\".join(filename.split(\"_\")[:2] + [str((i+1)*5)])+\".npy\"\n        return np.stack(audios)\n            \n    def __getitem__(self, idx):\n        return self.read_ready_file(self.data.loc[idx, \"filename\"])","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:02:22.977871Z","iopub.execute_input":"2021-05-26T14:02:22.978243Z","iopub.status.idle":"2021-05-26T14:02:22.995523Z","shell.execute_reply.started":"2021-05-26T14:02:22.978208Z","shell.execute_reply":"2021-05-26T14:02:22.994483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(\"../input/birdclef-2021/train_metadata.csv\")\n\nLABEL_IDS = {label: label_id for label_id,label in enumerate(sorted(df_train[\"primary_label\"].unique()))}\nINV_LABEL_IDS = {val: key for key,val in LABEL_IDS.items()}","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:15.816091Z","iopub.execute_input":"2021-05-26T13:49:15.816398Z","iopub.status.idle":"2021-05-26T13:49:16.045587Z","shell.execute_reply.started":"2021-05-26T13:49:15.816372Z","shell.execute_reply":"2021-05-26T13:49:16.04436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference","metadata":{"id":"BNsivZZZc_PG","papermill":{"duration":0.048675,"end_time":"2021-02-16T16:00:08.424781","exception":false,"start_time":"2021-02-16T16:00:08.376106","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test_data = BirdCLEFDataset(data=data)\nlen(test_data), test_data[3].shape","metadata":{"id":"AzlOErOmc_PH","papermill":{"duration":0.058312,"end_time":"2021-02-16T16:00:08.531199","exception":false,"start_time":"2021-02-16T16:00:08.472887","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:16.047186Z","iopub.execute_input":"2021-05-26T13:49:16.047542Z","iopub.status.idle":"2021-05-26T13:49:16.199222Z","shell.execute_reply.started":"2021-05-26T13:49:16.047506Z","shell.execute_reply":"2021-05-26T13:49:16.198321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.048931,"end_time":"2021-02-16T16:00:14.351476","exception":false,"start_time":"2021-02-16T16:00:14.302545","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_net(checkpoint_path, num_classes=NUM_CLASSES):\n    #net = resnest50(pretrained=False)\n    net = timm.create_model('resnest50d', pretrained = False)\n    #print(net)\n    net.fc = nn.Linear(net.fc.in_features, num_classes)\n    dummy_device = torch.device(\"cpu\")\n    d = torch.load(checkpoint_path, map_location=dummy_device)\n    for key in list(d.keys()):\n        d[key.replace(\"model.\", \"\")] = d.pop(key)\n    net.load_state_dict(d)\n    net = net.to(DEVICE)\n    net = net.eval()\n    return net\n\ndef load_net2(checkpoint_path, num_classes=NUM_CLASSES):\n    #net = resnest50(pretrained=False)\n    net = timm.create_model('resnest50d_4s2x40d', pretrained = False)\n    #print(net)\n    net.fc = nn.Linear(net.fc.in_features, num_classes)\n    dummy_device = torch.device(\"cpu\")\n    d = torch.load(checkpoint_path, map_location=dummy_device)['state_dict']\n    for key in list(d.keys()):\n        d[key.replace(\"model.\", \"\")] = d.pop(key)\n    net.load_state_dict(d)\n    net = net.to(DEVICE)\n    net = net.eval()\n    return net","metadata":{"papermill":{"duration":0.05945,"end_time":"2021-02-16T16:00:14.565804","exception":false,"start_time":"2021-02-16T16:00:14.506354","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:16.201005Z","iopub.execute_input":"2021-05-26T13:49:16.20141Z","iopub.status.idle":"2021-05-26T13:49:16.211812Z","shell.execute_reply.started":"2021-05-26T13:49:16.201371Z","shell.execute_reply":"2021-05-26T13:49:16.210931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nnets = [\n    load_net(Path(\"../input/kkiller-birdclef-models-public/birdclef_resnest50_fold0_epoch_10_f1_val_06471_20210417161101.pth\").as_posix()),\n    #Path(\"../input/hpa-mw2/birdclef_resnest50d_fold0_epoch_09_f1_val_07535_20210518114548.pth\"),\n    #Path(\"../input/hpa-mw2/resnest50d_4s2x40d-epoch4-val_loss0.023-val_f10.619.ckpt\")\n    load_net2(Path(\"../input/birdclef-for-nadya/resnest50d_4s2x40d-epoch11-val_loss0.022-val_f10.730.ckpt\").as_posix())\n]\n\n","metadata":{"id":"ayVLRTzLc_PI","papermill":{"duration":14.506299,"end_time":"2021-02-16T16:00:30.268614","exception":false,"start_time":"2021-02-16T16:00:15.762315","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:16.213327Z","iopub.execute_input":"2021-05-26T13:49:16.213998Z","iopub.status.idle":"2021-05-26T13:49:17.832006Z","shell.execute_reply.started":"2021-05-26T13:49:16.213957Z","shell.execute_reply":"2021-05-26T13:49:17.83071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.051509,"end_time":"2021-02-16T16:00:30.373444","exception":false,"start_time":"2021-02-16T16:00:30.321935","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@torch.no_grad()\ndef get_thresh_preds(out, thresh=None):\n    thresh = thresh or THRESH\n    o = (-out).argsort(1)\n    npreds = (out > thresh).sum(1)\n    preds = []\n    for oo, npred in zip(o, npreds):\n        preds.append(oo[:npred].cpu().numpy().tolist())\n    return preds","metadata":{"papermill":{"duration":0.059925,"end_time":"2021-02-16T16:00:30.912547","exception":false,"start_time":"2021-02-16T16:00:30.852622","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:17.836254Z","iopub.execute_input":"2021-05-26T13:49:17.837008Z","iopub.status.idle":"2021-05-26T13:49:17.843577Z","shell.execute_reply.started":"2021-05-26T13:49:17.836965Z","shell.execute_reply":"2021-05-26T13:49:17.842696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_bird_names(preds):\n    bird_names = []\n    for pred in preds:\n        if not pred:\n            bird_names.append(\"nocall\")\n        else:\n            bird_names.append(\" \".join([INV_LABEL_IDS[bird_id] for bird_id in pred]))\n    return bird_names","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:17.845067Z","iopub.execute_input":"2021-05-26T13:49:17.845749Z","iopub.status.idle":"2021-05-26T13:49:17.856344Z","shell.execute_reply.started":"2021-05-26T13:49:17.845709Z","shell.execute_reply":"2021-05-26T13:49:17.854944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(nets, test_data, names=True):\n    preds = []\n    with torch.no_grad():\n        for idx in  tqdm(list(range(len(test_data)))):\n            xb = torch.from_numpy(test_data[idx]).to(DEVICE)\n            pred = 0.\n            for net in nets:\n                o = net(xb)\n                o = torch.sigmoid(o)\n\n                pred += o\n\n            pred /= len(nets)\n            \n            if names:\n                pred = get_bird_names(get_thresh_preds(pred))\n\n            preds.append(pred)\n    return preds","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:17.858073Z","iopub.execute_input":"2021-05-26T13:49:17.858502Z","iopub.status.idle":"2021-05-26T13:49:17.867576Z","shell.execute_reply.started":"2021-05-26T13:49:17.85846Z","shell.execute_reply":"2021-05-26T13:49:17.866563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preds_as_df(data, preds):\n    sub = {\n        \"row_id\": [],\n        \"birds\": [],\n    }\n    \n    for row, pred in zip(data.itertuples(False), preds):\n        row_id = [f\"{row.id}_{row.site}_{5*i}\" for i in range(1, len(pred)+1)]\n        sub[\"birds\"] += pred\n        sub[\"row_id\"] += row_id\n        \n    sub = pd.DataFrame(sub)\n    \n    if SAMPLE_SUB_PATH:\n        sample_sub = pd.read_csv(SAMPLE_SUB_PATH, usecols=[\"row_id\"])\n        sub = sample_sub.merge(sub, on=\"row_id\", how=\"left\")\n        sub[\"birds\"] = sub[\"birds\"].fillna(\"nocall\")\n    return sub","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:17.869357Z","iopub.execute_input":"2021-05-26T13:49:17.869901Z","iopub.status.idle":"2021-05-26T13:49:17.883912Z","shell.execute_reply.started":"2021-05-26T13:49:17.869863Z","shell.execute_reply":"2021-05-26T13:49:17.882833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_probas = predict([nets[0]], test_data, names=False)\nprint(len(pred_probas))\npreds = [get_bird_names(get_thresh_preds(pred, thresh=0.1)) for pred in pred_probas]\nsub = preds_as_df(data, preds)\nprint(sub.shape)\nsub.to_csv(\"submission_1_0.csv\", index=False)","metadata":{"papermill":{"duration":7466.932385,"end_time":"2021-02-16T18:04:58.116349","exception":false,"start_time":"2021-02-16T16:00:31.183964","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-05-26T13:49:17.885515Z","iopub.execute_input":"2021-05-26T13:49:17.885999Z","iopub.status.idle":"2021-05-26T13:49:24.928478Z","shell.execute_reply.started":"2021-05-26T13:49:17.885959Z","shell.execute_reply":"2021-05-26T13:49:24.927527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_probas = predict([nets[1]], test_data, names=False)\nprint(len(pred_probas))\npreds = [get_bird_names(get_thresh_preds(pred, thresh=0.4)) for pred in pred_probas]\nsub = preds_as_df(data, preds)\nprint(sub.shape)\nsub.to_csv(\"submission_1_1.csv\", index=False)\n","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:24.929844Z","iopub.execute_input":"2021-05-26T13:49:24.930359Z","iopub.status.idle":"2021-05-26T13:49:31.899138Z","shell.execute_reply.started":"2021-05-26T13:49:24.930318Z","shell.execute_reply":"2021-05-26T13:49:31.898104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del sub","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:49:31.900705Z","iopub.execute_input":"2021-05-26T13:49:31.901064Z","iopub.status.idle":"2021-05-26T13:49:31.90599Z","shell.execute_reply.started":"2021-05-26T13:49:31.901026Z","shell.execute_reply":"2021-05-26T13:49:31.904912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:10.334521Z","iopub.execute_input":"2021-05-26T13:50:10.334958Z","iopub.status.idle":"2021-05-26T13:50:10.53895Z","shell.execute_reply.started":"2021-05-26T13:50:10.334918Z","shell.execute_reply":"2021-05-26T13:50:10.537902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Filter by location","metadata":{}},{"cell_type":"code","source":"from sklearn import preprocessing\nlb = preprocessing.MultiLabelBinarizer()\nlb = joblib.load(\"../input/birdclef-for-nadya/labelbinarizer_3.joblib\")\n\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.datasets import make_classification\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.multiclass import OneVsRestClassifier\nfrom sklearn.svm import SVC\nclf = OneVsRestClassifier(LogisticRegression(random_state=1812, solver=\"saga\", class_weight=\"balanced\", max_iter=100, C=1291.54966501), n_jobs=-1)\nclf = joblib.load(\"../input/birdclef-for-nadya/classifier_3.joblib\")\n\ndef get_month(x):\n    date = x.split(\"-\")\n    if len(date) > 1:\n        return date[1]\n    else:\n        return None\ndf_train[\"month\"] = df_train[\"date\"].astype(str).apply(lambda x: get_month(x))\ndf_train.dropna(inplace=True)\n\nsc = preprocessing.StandardScaler()\nsc.fit(df_train[[ 'latitude', 'longitude','month']].astype(float).to_numpy())","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:10.54077Z","iopub.execute_input":"2021-05-26T13:50:10.541638Z","iopub.status.idle":"2021-05-26T13:50:11.025693Z","shell.execute_reply.started":"2021-05-26T13:50:10.541594Z","shell.execute_reply":"2021-05-26T13:50:11.024372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"locs = {}\nprint(data[\"site\"].unique())\nfor loc in data[\"site\"].unique():\n    with open(Path(\"../input/birdclef-2021/test_soundscapes\")/(loc + \"_recording_location.txt\"), \"r\") as f:\n        row = {}\n        for line in f:\n            line = line.strip()\n            #print(line, len(line.split(\":\")))\n            if len(line.split(\":\")) == 2:\n                row.update({line.split(\":\")[0]: line.split(\":\")[1]})\n        \n        locs.update({loc: row})\n        print(locs)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:11.027303Z","iopub.execute_input":"2021-05-26T13:50:11.02768Z","iopub.status.idle":"2021-05-26T13:50:11.051892Z","shell.execute_reply.started":"2021-05-26T13:50:11.027643Z","shell.execute_reply":"2021-05-26T13:50:11.05092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[\"month\"] = data[\"date\"].apply(lambda x: float(str(x)[4:6]))\ndata['Latitude'] = data[\"site\"].apply(lambda x: locs.get(x).get('Latitude'))\ndata['Longitude'] = data[\"site\"].apply(lambda x: locs.get(x).get('Longitude'))\n\nfor n, row in data.iterrows():\n    proba = clf.predict_proba(sc.transform(np.array([row['Latitude'], row['Longitude'], row[\"month\"]]).astype(float).reshape(1,3)))\n    data.loc[n, \"freq_birds\"] = \" \".join(lb.classes_[np.nonzero(np.where(proba[0] >= 0.5, proba[0], 0))])\ndata.to_csv(\"location.csv\")\ndata.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:11.053427Z","iopub.execute_input":"2021-05-26T13:50:11.054094Z","iopub.status.idle":"2021-05-26T13:50:11.765255Z","shell.execute_reply.started":"2021-05-26T13:50:11.054054Z","shell.execute_reply":"2021-05-26T13:50:11.764209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mod1 = pd.read_csv(\"submission_1_0.csv\")\nmod2 = pd.read_csv(\"submission_1_1.csv\")\nmodpred = mod1.merge(mod2, how=\"left\", on=\"row_id\", suffixes=[\"_1\", \"_2\"])\nmodpred[\"reg_id\"] = modpred[\"row_id\"].apply(lambda x: x.split(\"_\")[1])\nmodpred[\"audio_id\"] = modpred[\"row_id\"].apply(lambda x: x.split(\"_\")[0])\nmodpred[\"birds\"] = modpred[\"birds_1\"]\nmodpred = modpred.fillna(\"nocall\")\nmodpred","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:11.766861Z","iopub.execute_input":"2021-05-26T13:50:11.767566Z","iopub.status.idle":"2021-05-26T13:50:11.824723Z","shell.execute_reply.started":"2021-05-26T13:50:11.767524Z","shell.execute_reply":"2021-05-26T13:50:11.823866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for n, row in modpred[modpred[\"birds_1\"] != modpred[\"birds_2\"]].iterrows():\n    if row[\"birds_1\"] == \"nocall\":\n        bird = set(row[\"birds_2\"].split(\" \"))\n    elif row[\"birds_2\"] == \"nocall\":\n        bird = set(row[\"birds_1\"].split(\" \"))\n    else: \n        bird = set(row[\"birds_2\"].split(\" \") + row[\"birds_1\"].split(\" \"))\n    #print(bird)\n    #print(data[data[\"id\"] == row[\"audio_id\"]][\"freq_birds\"].values[0])\n    freq_birds = set(data[data[\"id\"] == row[\"audio_id\"]][\"freq_birds\"].values[0].split(\" \"))\n    res = bird & freq_birds\n    if len(res) == 0:\n        modpred.loc[n, \"birds\"] = \"nocall\"\n    else:\n        modpred.loc[n, \"birds\"] = \" \".join(list(res))\n    #print(modpred.loc[n, \"birds\"])\nmodpred[[\"row_id\", \"birds\"]].to_csv(\"submission_3.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:11.826366Z","iopub.execute_input":"2021-05-26T13:50:11.826996Z","iopub.status.idle":"2021-05-26T13:50:12.2738Z","shell.execute_reply.started":"2021-05-26T13:50:11.826957Z","shell.execute_reply":"2021-05-26T13:50:12.272994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Small validation","metadata":{}},{"cell_type":"code","source":"new_data = pd.read_csv(\"submission_3.csv\")\nnew_data['birds'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:12.275096Z","iopub.execute_input":"2021-05-26T13:50:12.275481Z","iopub.status.idle":"2021-05-26T13:50:12.290306Z","shell.execute_reply.started":"2021-05-26T13:50:12.275444Z","shell.execute_reply":"2021-05-26T13:50:12.289326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_metrics(s_true, s_pred):\n    s_true = set(s_true.split())\n    s_pred = set(s_pred.split())\n    n, n_true, n_pred = len(s_true.intersection(s_pred)), len(s_true), len(s_pred)\n    \n    prec = n/n_pred\n    rec = n/n_true\n    f1 = 2*prec*rec/(prec + rec) if prec + rec else 0\n    \n    return {\"f1\": f1, \"prec\": prec, \"rec\": rec, \"n_true\": n_true, \"n_pred\": n_pred, \"n\": n}","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:12.29204Z","iopub.execute_input":"2021-05-26T13:50:12.292427Z","iopub.status.idle":"2021-05-26T13:50:12.300458Z","shell.execute_reply.started":"2021-05-26T13:50:12.292392Z","shell.execute_reply":"2021-05-26T13:50:12.29912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if PUBLIC:\n    sub_target = pd.read_csv(TARGET_PATH)\n    sub_target = sub_target.merge(pd.read_csv(\"submission_3.csv\"), how=\"left\", on=\"row_id\")\n    \n    print(sub_target[\"birds_x\"].notnull().sum(), sub_target[\"birds_x\"].notnull().sum())\n    assert sub_target[\"birds_x\"].notnull().all()\n    assert sub_target[\"birds_y\"].notnull().all()\n    \n    df_metrics = pd.DataFrame([get_metrics(s_true, s_pred) for s_true, s_pred in zip(sub_target.birds_x, sub_target.birds_y)])\n    \n    print(df_metrics.mean())","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:12.301903Z","iopub.execute_input":"2021-05-26T13:50:12.302509Z","iopub.status.idle":"2021-05-26T13:50:12.358409Z","shell.execute_reply.started":"2021-05-26T13:50:12.302469Z","shell.execute_reply":"2021-05-26T13:50:12.357385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_target[sub_target.birds_y != \"nocall\"]","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:12.360069Z","iopub.execute_input":"2021-05-26T13:50:12.36048Z","iopub.status.idle":"2021-05-26T13:50:12.385976Z","shell.execute_reply.started":"2021-05-26T13:50:12.360437Z","shell.execute_reply":"2021-05-26T13:50:12.384691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_target[sub_target.birds_x != \"nocall\"]","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:12.387611Z","iopub.execute_input":"2021-05-26T13:50:12.38799Z","iopub.status.idle":"2021-05-26T13:50:12.411483Z","shell.execute_reply.started":"2021-05-26T13:50:12.387951Z","shell.execute_reply":"2021-05-26T13:50:12.410286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for tr in np.linspace(0.01, 1, 50):\n    preds = [get_bird_names(get_thresh_preds(pred, thresh=tr)) for pred in pred_probas]\n    sub = preds_as_df(data, preds)\n    sub_target = pd.read_csv(TARGET_PATH)\n    sub_target = sub_target.merge(sub, how=\"left\", on=\"row_id\")\n    \n    #print(sub_target[\"birds_x\"].notnull().sum(), sub_target[\"birds_x\"].notnull().sum())\n    assert sub_target[\"birds_x\"].notnull().all()\n    assert sub_target[\"birds_y\"].notnull().all()\n    \n    df_metrics = pd.DataFrame([get_metrics(s_true, s_pred) for s_true, s_pred in zip(sub_target.birds_x, sub_target.birds_y)])\n    print(tr, df_metrics.f1.mean())","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:08:49.487336Z","iopub.execute_input":"2021-05-26T14:08:49.487652Z","iopub.status.idle":"2021-05-26T14:08:55.000945Z","shell.execute_reply.started":"2021-05-26T14:08:49.487623Z","shell.execute_reply":"2021-05-26T14:08:55.000065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train model with test data","metadata":{}},{"cell_type":"markdown","source":"### Training the model","metadata":{}},{"cell_type":"code","source":"def one_step( xb, yb, net, criterion, optimizer, scheduler=None):\n  xb, yb = xb.to(DEVICE), yb.to(DEVICE)\n        \n  optimizer.zero_grad()\n  o = net(xb)\n  loss = criterion(o, yb)\n  loss.backward()\n  optimizer.step()\n  \n  with torch.no_grad():\n      l = loss.item()\n\n      o = o.sigmoid()\n      yb = (yb > 0.5 )*1.0\n      lrap = label_ranking_average_precision_score(yb.cpu().numpy(), o.cpu().numpy())\n\n      o = (o > 0.5)*1.0\n\n      prec = (o*yb).sum()/(1e-6 + o.sum())\n      rec = (o*yb).sum()/(1e-6 + yb.sum())\n      f1 = 2*prec*rec/(1e-6+prec+rec)\n\n  if  scheduler is not None:\n    scheduler.step()\n\n  return l, lrap, f1.item(), rec.item(), prec.item()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.872248Z","iopub.execute_input":"2021-05-26T13:50:17.872671Z","iopub.status.idle":"2021-05-26T13:50:17.88365Z","shell.execute_reply.started":"2021-05-26T13:50:17.872602Z","shell.execute_reply":"2021-05-26T13:50:17.882228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@torch.no_grad()\ndef evaluate(net, criterion, val_laoder):\n    net.eval()\n\n    os, y = [], []\n    val_laoder = tqdm(val_laoder, leave = False, total=len(val_laoder))\n\n    for icount, (xb, yb) in  enumerate(val_laoder):\n\n        y.append(yb.to(DEVICE))\n\n        xb = xb.to(DEVICE)\n        o = net(xb)\n\n        os.append(o)\n\n    y = torch.cat(y)\n    o = torch.cat(os)\n\n    l = criterion(o, y).item()\n    \n    o = o.sigmoid()\n    y = (y > 0.5)*1.0\n\n    lrap = label_ranking_average_precision_score(y.cpu().numpy(), o.cpu().numpy())\n\n    o = (o > 0.5)*1.0\n\n    prec = ((o*y).sum()/(1e-6 + o.sum())).item()\n    rec = ((o*y).sum()/(1e-6 + y.sum())).item()\n    f1 = 2*prec*rec/(1e-6+prec+rec)\n\n    return l, lrap, f1, rec, prec, \n    ","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.885186Z","iopub.execute_input":"2021-05-26T13:50:17.885588Z","iopub.status.idle":"2021-05-26T13:50:17.904404Z","shell.execute_reply.started":"2021-05-26T13:50:17.88555Z","shell.execute_reply":"2021-05-26T13:50:17.903317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def one_epoch(net, criterion, optimizer, scheduler, train_laoder, val_laoder):\n  net.train()\n  l, lrap, prec, rec, f1, icount = 0.,0.,0.,0., 0., 0\n  train_laoder = tqdm(train_laoder, leave = False)\n  epoch_bar = train_laoder\n  \n  for (xb, yb) in  epoch_bar:\n      #print(len(xb), xb)\n      # epoch_bar.set_description(\"----|----|----|----|---->\")\n      _l, _lrap, _f1, _rec, _prec = one_step(xb, yb, net, criterion, optimizer)\n      l += _l\n      lrap += _lrap\n      f1 += _f1\n      rec += _rec\n      prec += _prec\n\n      icount += 1\n        \n      if hasattr(epoch_bar, \"set_postfix\") and not icount%10:\n          epoch_bar.set_postfix(\n            loss=\"{:.6f}\".format(l/icount),\n            lrap=\"{:.3f}\".format(lrap/icount),\n            prec=\"{:.3f}\".format(prec/icount),\n            rec=\"{:.3f}\".format(rec/icount),\n            f1=\"{:.3f}\".format(f1/icount),\n          )\n  \n  scheduler.step()\n\n  l /= icount\n  lrap /= icount\n  f1 /= icount\n  rec /= icount\n  prec /= icount\n  \n  l_val, lrap_val, f1_val, rec_val, prec_val = evaluate(net, criterion, val_laoder)\n  \n  return (l, l_val), (lrap, lrap_val), (f1, f1_val), (rec, rec_val), (prec, prec_val), net\n","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.906263Z","iopub.execute_input":"2021-05-26T13:50:17.906692Z","iopub.status.idle":"2021-05-26T13:50:17.920557Z","shell.execute_reply.started":"2021-05-26T13:50:17.906652Z","shell.execute_reply":"2021-05-26T13:50:17.919095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:18.034578Z","iopub.execute_input":"2021-05-26T13:50:18.035064Z","iopub.status.idle":"2021-05-26T13:50:18.042229Z","shell.execute_reply.started":"2021-05-26T13:50:18.035025Z","shell.execute_reply":"2021-05-26T13:50:18.041218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"MODEL_ROOT = Path(\"models\")\nclass AutoSave:\n  def __init__(self, top_k=2, metric=\"f1\", mode=\"min\", root=None, name=\"ckpt\"):\n    self.top_k = top_k\n    self.logs = []\n    self.metric = metric\n    self.mode = mode\n    self.root = Path(root or MODEL_ROOT)\n    assert self.root.exists()\n    self.name = name\n\n    self.top_models = []\n    self.top_metrics = []\n\n  def log(self, model, metrics):\n    metric = metrics[self.metric]\n    rank = self.rank(metric)\n\n    self.top_metrics.insert(rank+1, metric)\n    if len(self.top_metrics) > self.top_k:\n      self.top_metrics.pop(0)\n\n    self.logs.append(metrics)\n    self.save(model, metric, rank, metrics[\"epoch\"])\n\n\n  def save(self, model, metric, rank, epoch):\n    t = time.strftime(\"%Y%m%d%H%M%S\")\n    name = \"{}_epoch_{:02d}_{}_{:.04f}_{}\".format(self.name, epoch, self.metric, metric, t)\n    name = re.sub(r\"[^\\w_-]\", \"\", name) + \".pth\"\n    path = self.root.joinpath(name)\n\n    old_model = None\n    self.top_models.insert(rank+1, name)\n    if len(self.top_models) > self.top_k:\n      old_model = self.root.joinpath(self.top_models[0])\n      self.top_models.pop(0)      \n\n    torch.save(model.state_dict(), path.as_posix())\n\n    if old_model is not None:\n      old_model.unlink()\n\n    self.to_json()\n\n\n  def rank(self, val):\n    r = -1\n    for top_val in self.top_metrics:\n      if val <= top_val:\n        return r\n      r += 1\n\n    return r\n  \n  def to_json(self):\n    # t = time.strftime(\"%Y%m%d%H%M%S\")\n    name = \"{}_logs\".format(self.name)\n    name = re.sub(r\"[^\\w_-]\", \"\", name) + \".json\"\n    path = self.root.joinpath(name)\n\n    with path.open(\"w\") as f:\n      json.dump(self.logs, f, indent=2)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.922167Z","iopub.execute_input":"2021-05-26T13:50:17.922732Z","iopub.status.idle":"2021-05-26T13:50:17.943527Z","shell.execute_reply.started":"2021-05-26T13:50:17.92269Z","shell.execute_reply":"2021-05-26T13:50:17.942379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE = 64\nNUM_WORKERS = 2\n\ndef one_fold(train_set, val_set, epochs=20, save=True, save_root=None):\n\n  save_root = Path(save_root) or MODEL_ROOT\n\n  saver = AutoSave(root=save_root, name=f\"birdclef_test_all\", metric=\"f1_val\")\n  #net = nets[0]\n  net = load_net(Path(\"../input/kkiller-birdclef-models-public/birdclef_resnest50_fold0_epoch_10_f1_val_06471_20210417161101.pth\").as_posix())\n  net.train() #= get_model(model_name).to(DEVICE)\n\n  criterion = nn.BCEWithLogitsLoss()\n\n  optimizer = optim.Adam(net.parameters(), lr=8e-4, weight_decay = 8e-5)\n  scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, eta_min=1e-5, T_max=epochs, verbose=1)\n\n  train_data = TestBirdCLEFDataset(train_set, \n                           sr=SR, duration=DURATION)\n  train_laoder = DataLoader(train_data, batch_size=BATCH_SIZE, num_workers=NUM_WORKERS, shuffle=True, pin_memory=True)\n\n  val_data = TestBirdCLEFDataset(train_set,  sr=SR, duration=DURATION)\n  val_laoder = DataLoader(val_data, batch_size=BATCH_SIZE, num_workers=NUM_WORKERS, shuffle=False)\n\n  epochs_bar = tqdm(list(range(epochs)), leave=False)\n  print(epochs)\n  for epoch  in epochs_bar:\n    epochs_bar.set_description(f\"--> [EPOCH {epoch:02d}]\")\n    #net.train()\n\n    (l, l_val), (lrap, lrap_val), (f1, f1_val), (rec, rec_val), (prec, prec_val), net = one_epoch(\n        net=net,\n        criterion=criterion,\n        optimizer=optimizer,\n        scheduler=scheduler,\n        train_laoder=train_laoder,\n        val_laoder=val_laoder,\n      )\n\n    epochs_bar.set_postfix(\n    loss=\"({:.6f}, {:.6f})\".format(l, l_val),\n    prec=\"({:.3f}, {:.3f})\".format(prec, prec_val),\n    rec=\"({:.3f}, {:.3f})\".format(rec, rec_val),\n    f1=\"({:.3f}, {:.3f})\".format(f1, f1_val),\n    lrap=\"({:.3f}, {:.3f})\".format(lrap, lrap_val),\n    )\n\n    print(\n        \"[{epoch:02d}] loss: {loss} lrap: {lrap} f1: {f1} rec: {rec} prec: {prec}\".format(\n            epoch=epoch,\n            loss=\"({:.6f}, {:.6f})\".format(l, l_val),\n            prec=\"({:.3f}, {:.3f})\".format(prec, prec_val),\n            rec=\"({:.3f}, {:.3f})\".format(rec, rec_val),\n            f1=\"({:.3f}, {:.3f})\".format(f1, f1_val),\n            lrap=\"({:.3f}, {:.3f})\".format(lrap, lrap_val),\n        )\n    )\n\n    if save:\n      metrics = {\n          \"loss\": l, \"lrap\": lrap, \"f1\": f1, \"rec\": rec, \"prec\": prec,\n          \"loss_val\": l_val, \"lrap_val\": lrap_val, \"f1_val\": f1_val, \"rec_val\": rec_val, \"prec_val\": prec_val,\n          \"epoch\": epoch,\n      }\n\n      saver.log(net, metrics)\n  return net","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.945282Z","iopub.execute_input":"2021-05-26T13:50:17.945696Z","iopub.status.idle":"2021-05-26T13:50:17.966259Z","shell.execute_reply.started":"2021-05-26T13:50:17.945613Z","shell.execute_reply":"2021-05-26T13:50:17.965115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.read_csv(TARGET_PATH).head()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.968105Z","iopub.execute_input":"2021-05-26T13:50:17.968634Z","iopub.status.idle":"2021-05-26T13:50:17.993808Z","shell.execute_reply.started":"2021-05-26T13:50:17.968593Z","shell.execute_reply":"2021-05-26T13:50:17.992892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nsecond_data = pd.read_csv(\"submission_3.csv\")\nsecond_data[\"audio_id\"] = second_data[\"row_id\"].apply(lambda x: x.split(\"_\")[0])\nsecond_data[\"site\"] = second_data[\"row_id\"].apply(lambda x: x.split(\"_\")[1])\nsecond_data[\"seconds\"] = second_data[\"row_id\"].apply(lambda x: x.split(\"_\")[2])\nsecond_data = pd.concat([second_data, pd.read_csv(TARGET_PATH)], axis=0)\nsecond_data = second_data[second_data[\"birds\"] != \"nocall\"].reset_index()\nprint(second_data.head())\n\ndef train(train_set, epochs=2, save=True, n_splits=5, seed=1812, save_root=None, suffix=\"\", folds=None):\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    save_root = save_root or MODEL_ROOT\n    save_root.mkdir(exist_ok=True, parents=True)\n\n    \n    train_idx, val_idx = train_test_split(np.arange(len(train_set.index)), test_size=0.2, random_state=seed)\n\n    nets2 = []\n    for fold in folds:\n        nets2.append(one_fold(train_set=train_set.loc[train_idx].reset_index() , val_set=train_set.loc[val_idx].reset_index(), epochs=epochs, save=save, save_root=save_root))\n\n    gc.collect()\n    torch.cuda.empty_cache()\n    return nets2","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:17.995184Z","iopub.execute_input":"2021-05-26T13:50:17.995823Z","iopub.status.idle":"2021-05-26T13:50:18.033274Z","shell.execute_reply.started":"2021-05-26T13:50:17.995776Z","shell.execute_reply":"2021-05-26T13:50:18.032335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestBirdCLEFDataset(Dataset):\n    def __init__(self, data, sr=SR, n_mels=128, fmin=0, fmax=None, duration=DURATION, step=None, res_type=\"kaiser_fast\", resample=True):\n        \n        self.data = data\n        \n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax or self.sr//2\n\n        self.duration = duration\n        self.audio_length = self.duration*self.sr\n        self.step = step or self.audio_length\n        \n        self.res_type = res_type\n        self.resample = resample\n\n        self.mel_spec_computer = MelSpecComputer(sr=self.sr, n_mels=self.n_mels, fmin=self.fmin,\n                                                 fmax=self.fmax)\n    def __len__(self):\n        return len(self.data)\n\n    def read_ready_file(self, filename):\n        audios = []\n        fname = filename + \".npy\"\n        melspec = np.load(TARGET_AUDIO_1/fname)\n        image = np.nan_to_num(normalize(melspec)) \n        \n        image = mono_to_color(image)\n        image = apply_augmentation(torch.Tensor(image))\n        #print(fname)\n        audios.append(image)\n        return image\n            \n    def __getitem__(self, idx):\n        labels = np.zeros(len(LABEL_IDS))\n        for label in self.data.loc[idx, \"birds\"].split(\" \"):\n            labels[LABEL_IDS[label]] = 1\n        return self.read_ready_file(self.data.loc[idx, \"row_id\"]), labels","metadata":{"execution":{"iopub.status.busy":"2021-05-26T13:50:18.043887Z","iopub.execute_input":"2021-05-26T13:50:18.044643Z","iopub.status.idle":"2021-05-26T13:50:18.060738Z","shell.execute_reply.started":"2021-05-26T13:50:18.044599Z","shell.execute_reply":"2021-05-26T13:50:18.059644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nets2 = train(second_data, epochs=3, suffix=f\"_sr{SR}_d{DURATION}_v2405_v1\", folds=range(5))","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:10:30.538754Z","iopub.execute_input":"2021-05-26T14:10:30.539219Z","iopub.status.idle":"2021-05-26T14:15:35.021468Z","shell.execute_reply.started":"2021-05-26T14:10:30.53918Z","shell.execute_reply":"2021-05-26T14:15:35.020125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = BirdCLEFDataset(data=data, transform = True)\npred_probas = []\nfor n in range(10):\n    pred_probas.append(predict(nets2, test_data, names=False))\nprint(len(pred_probas))\npred_probas = np.stack(pred_probas, axis=0).mean(axis=0)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:22:41.720311Z","iopub.execute_input":"2021-05-26T14:22:41.72067Z","iopub.status.idle":"2021-05-26T14:27:54.856195Z","shell.execute_reply.started":"2021-05-26T14:22:41.72064Z","shell.execute_reply":"2021-05-26T14:27:54.855257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = [get_bird_names(get_thresh_preds(pred, thresh=0.3)) for pred in pred_probas]\nsub = preds_as_df(data, preds)\nprint(sub.shape)\nsub","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:27:54.85856Z","iopub.execute_input":"2021-05-26T14:27:54.858952Z","iopub.status.idle":"2021-05-26T14:27:55.310724Z","shell.execute_reply.started":"2021-05-26T14:27:54.858913Z","shell.execute_reply":"2021-05-26T14:27:55.309818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:27:55.312351Z","iopub.execute_input":"2021-05-26T14:27:55.312849Z","iopub.status.idle":"2021-05-26T14:27:55.326911Z","shell.execute_reply.started":"2021-05-26T14:27:55.312811Z","shell.execute_reply":"2021-05-26T14:27:55.325686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if TARGET_PATH:\n    sub_target = pd.read_csv(TARGET_PATH)\n    sub_target = sub_target.merge(pd.read_csv(\"submission.csv\"), how=\"left\", on=\"row_id\")\n    \n    print(sub_target[\"birds_x\"].notnull().sum(), sub_target[\"birds_x\"].notnull().sum())\n    assert sub_target[\"birds_x\"].notnull().all()\n    assert sub_target[\"birds_y\"].notnull().all()\n    \n    df_metrics = pd.DataFrame([get_metrics(s_true, s_pred) for s_true, s_pred in zip(sub_target.birds_x, sub_target.birds_y)])\n    \n    print(df_metrics.mean())","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:27:55.328816Z","iopub.execute_input":"2021-05-26T14:27:55.329443Z","iopub.status.idle":"2021-05-26T14:27:55.378855Z","shell.execute_reply.started":"2021-05-26T14:27:55.329398Z","shell.execute_reply":"2021-05-26T14:27:55.377785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf test_data_1 test_data_2 ","metadata":{"execution":{"iopub.status.busy":"2021-05-26T14:27:55.381503Z","iopub.execute_input":"2021-05-26T14:27:55.381928Z","iopub.status.idle":"2021-05-26T14:27:55.386643Z","shell.execute_reply.started":"2021-05-26T14:27:55.381887Z","shell.execute_reply":"2021-05-26T14:27:55.385375Z"},"trusted":true},"execution_count":null,"outputs":[]}]}