{"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":"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\n\nimport concurrent.futures","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-06-25T17:41:44.681250Z","iopub.execute_input":"2023-06-25T17:41:44.681862Z","iopub.status.idle":"2023-06-25T17:41:44.694847Z","shell.execute_reply.started":"2023-06-25T17:41:44.681810Z","shell.execute_reply":"2023-06-25T17:41:44.692773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(torch.__version__)\nprint(timm.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.697394Z","iopub.execute_input":"2023-06-25T17:41:44.698948Z","iopub.status.idle":"2023-06-25T17:41:44.707968Z","shell.execute_reply.started":"2023-06-25T17:41:44.698882Z","shell.execute_reply":"2023-06-25T17:41:44.706340Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seconds = [i for i in range(5, 605, 5)]\n\n\nclass CFG:\n    sample_rate = 32000\n\n    target_columns = [\n        'abethr1', 'abhori1', 'abythr1', 'afbfly1', 'afdfly1', 'afecuc1',\n        'affeag1', 'afgfly1', 'afghor1', 'afmdov1', 'afpfly1', 'afpkin1',\n        'afpwag1', 'afrgos1', 'afrgrp1', 'afrjac1', 'afrthr1', 'amesun2',\n        'augbuz1', 'bagwea1', 'barswa', 'bawhor2', 'bawman1', 'bcbeat1',\n        'beasun2', 'bkctch1', 'bkfruw1', 'blacra1', 'blacuc1', 'blakit1',\n        'blaplo1', 'blbpuf2', 'blcapa2', 'blfbus1', 'blhgon1', 'blhher1',\n        'blksaw1', 'blnmou1', 'blnwea1', 'bltapa1', 'bltbar1', 'bltori1',\n        'blwlap1', 'brcale1', 'brcsta1', 'brctch1', 'brcwea1', 'brican1',\n        'brobab1', 'broman1', 'brosun1', 'brrwhe3', 'brtcha1', 'brubru1',\n        'brwwar1', 'bswdov1', 'btweye2', 'bubwar2', 'butapa1', 'cabgre1',\n        'carcha1', 'carwoo1', 'categr', 'ccbeat1', 'chespa1', 'chewea1',\n        'chibat1', 'chtapa3', 'chucis1', 'cibwar1', 'cohmar1', 'colsun2',\n        'combul2', 'combuz1', 'comsan', 'crefra2', 'crheag1', 'crohor1',\n        'darbar1', 'darter3', 'didcuc1', 'dotbar1', 'dutdov1', 'easmog1',\n        'eaywag1', 'edcsun3', 'egygoo', 'equaka1', 'eswdov1', 'eubeat1',\n        'fatrav1', 'fatwid1', 'fislov1', 'fotdro5', 'gabgos2', 'gargan',\n        'gbesta1', 'gnbcam2', 'gnhsun1', 'gobbun1', 'gobsta5', 'gobwea1',\n        'golher1', 'grbcam1', 'grccra1', 'grecor', 'greegr', 'grewoo2',\n        'grwpyt1', 'gryapa1', 'grywrw1', 'gybfis1', 'gycwar3', 'gyhbus1',\n        'gyhkin1', 'gyhneg1', 'gyhspa1', 'gytbar1', 'hadibi1', 'hamerk1',\n        'hartur1', 'helgui', 'hipbab1', 'hoopoe', 'huncis1', 'hunsun2',\n        'joygre1', 'kerspa2', 'klacuc1', 'kvbsun1', 'laudov1', 'lawgol',\n        'lesmaw1', 'lessts1', 'libeat1', 'litegr', 'litswi1', 'litwea1',\n        'loceag1', 'lotcor1', 'lotlap1', 'luebus1', 'mabeat1', 'macshr1',\n        'malkin1', 'marsto1', 'marsun2', 'mcptit1', 'meypar1', 'moccha1',\n        'mouwag1', 'ndcsun2', 'nobfly1', 'norbro1', 'norcro1', 'norfis1',\n        'norpuf1', 'nubwoo1', 'pabspa1', 'palfly2', 'palpri1', 'piecro1',\n        'piekin1', 'pitwhy', 'purgre2', 'pygbat1', 'quailf1', 'ratcis1',\n        'raybar1', 'rbsrob1', 'rebfir2', 'rebhor1', 'reboxp1', 'reccor',\n        'reccuc1', 'reedov1', 'refbar2', 'refcro1', 'reftin1', 'refwar2',\n        'rehblu1', 'rehwea1', 'reisee2', 'rerswa1', 'rewsta1', 'rindov',\n        'rocmar2', 'rostur1', 'ruegls1', 'rufcha2', 'sacibi2', 'sccsun2',\n        'scrcha1', 'scthon1', 'shesta1', 'sichor1', 'sincis1', 'slbgre1',\n        'slcbou1', 'sltnig1', 'sobfly1', 'somgre1', 'somtit4', 'soucit1',\n        'soufis1', 'spemou2', 'spepig1', 'spewea1', 'spfbar1', 'spfwea1',\n        'spmthr1', 'spwlap1', 'squher1', 'strher', 'strsee1', 'stusta1',\n        'subbus1', 'supsta1', 'tacsun1', 'tafpri1', 'tamdov1', 'thrnig1',\n        'trobou1', 'varsun2', 'vibsta2', 'vilwea1', 'vimwea1', 'walsta1',\n        'wbgbir1', 'wbrcha2', 'wbswea1', 'wfbeat1', 'whbcan1', 'whbcou1',\n        'whbcro2', 'whbtit5', 'whbwea1', 'whbwhe3', 'whcpri2', 'whctur2',\n        'wheslf1', 'whhsaw1', 'whihel1', 'whrshr1', 'witswa1', 'wlwwar',\n        'wookin1', 'woosan', 'wtbeat1', 'yebapa1', 'yebbar1', 'yebduc1',\n        'yebere1', 'yebgre1', 'yebsto1', 'yeccan1', 'yefcan', 'yelbis1',\n        'yenspu1', 'yertin1', 'yesbar1', 'yespet1', 'yetgre1', 'yewgre1'\n        ]\n\n\nclass TestDataset(torchdata.Dataset):\n    def __init__(self, \n                 df: pd.DataFrame, \n                 clip: np.ndarray,\n                 config=None,\n                ):\n        \n        self.df = df\n        self.clip = clip\n        self.sr = CFG.sample_rate\n        self.config = config\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[self.sr * start_seconds : self.sr * end_seconds].astype(np.float32)\n            \n        return {\n            \"row_id\": row_id,\n            \"wave\": wave,\n            \"rating\": torch.ones(1),\n            \"loss_target\": torch.ones(1),\n            \"embedding\": torch.rand(264).unsqueeze(0),\n        }\n\n\ndef prediction_for_clip(audio_path):\n    \n    prediction_dict = {}\n    \n    clip, _ = librosa.load(audio_path, sr=32000)\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 model in models_ensemble:\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)\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 = np.array(prediction_dict[row_id]).mean(0)\n        prediction_dict[row_id] = {}\n        for label in range(len(CFG.target_columns)):\n            prediction_dict[row_id][CFG.target_columns[label]] = logits[label]\n\n    return prediction_dict\n\n\nmodels_ensemble = []\nmodel1 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp105_eca_nfnet_l0/\", f\"fold_0_model_jit_bs4.pt\"))\nmodel1.eval()\nmodels_ensemble.append(model1)\nmodel2 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp106_eca_nfnet_l0/\", f\"fold_3_model_jit_bs4.pt\"))\nmodel2.eval()\nmodels_ensemble.append(model2)\nmodel3 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp107_eca_nfnet_l0/\", f\"fold_4_model_jit_bs4.pt\"))\nmodel3.eval()\nmodels_ensemble.append(model3)\nmodel4 = torch.jit.load(os.path.join(f\"/kaggle/input/birdclef2023-4th-models/exp108_eca_nfnet_l0/\", f\"fold_2_model_jit_bs4.pt\"))\nmodel4.eval()\nmodels_ensemble.append(model4)\n\n\ndef main():\n\n    all_audios = list(glob.glob('/kaggle/input/birdclef-2023/test_soundscapes/*.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('rodou')\n\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-25T17:41:44.710883Z","iopub.execute_input":"2023-06-25T17:41:44.711352Z","iopub.status.idle":"2023-06-25T17:43:17.514031Z","shell.execute_reply.started":"2023-06-25T17:41:44.711303Z","shell.execute_reply":"2023-06-25T17:43:17.511901Z"}},"execution_count":null,"outputs":[]}]}