{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":8146763,"sourceType":"datasetVersion","datasetId":4817596},{"sourceId":8584878,"sourceType":"datasetVersion","datasetId":5129195},{"sourceId":8568701,"sourceType":"datasetVersion","datasetId":4972510,"isSourceIdPinned":true}],"dockerImageVersionId":30698,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Baseline for Pytorch Lightning based submission \n\n**Step 1: For generating spectrograms :** https://www.kaggle.com/code/nischaydnk/split-creating-melspecs-stage-1\n\n**Step 2: Training Notebook with Pytorch Lightning:** https://www.kaggle.com/code/nischaydnk/birdclef-2023-pytorch-lightning-training-w-cmap\n\nFeel free to reach out in comments incase you find bugs or have doubts!!","metadata":{}},{"cell_type":"code","source":"!export OMP_NUM_THREADS=N\n\n!export OMP_SCHEDULE=STATIC\n!export OMP_PROC_BIND=CLOSE\n!export GOMP_CPU_AFFINITY=\"N-M\"","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:47:57.693760Z","iopub.execute_input":"2024-06-02T11:47:57.694219Z","iopub.status.idle":"2024-06-02T11:48:02.184408Z","shell.execute_reply.started":"2024-06-02T11:47:57.694188Z","shell.execute_reply":"2024-06-02T11:48:02.182783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install /kaggle/input/openvinowheelfile/openvino_telemetry-2024.1.0-py3-none-any.whl --no-index --find-links /kaggle/input/openvinowheelfile\n!pip install /kaggle/input/openvinowheelfile/openvino-2024.0.0-14509-cp310-cp310-manylinux2014_x86_64.whl --no-index --find-links /kaggle/input/openvinowheelfile","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:02.187041Z","iopub.execute_input":"2024-06-02T11:48:02.187601Z","iopub.status.idle":"2024-06-02T11:48:35.231712Z","shell.execute_reply.started":"2024-06-02T11:48:02.187526Z","shell.execute_reply":"2024-06-02T11:48:35.230010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport warnings\nimport joblib\nimport torch\nfrom glob import glob","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.234219Z","iopub.execute_input":"2024-06-02T11:48:35.234886Z","iopub.status.idle":"2024-06-02T11:48:35.243412Z","shell.execute_reply.started":"2024-06-02T11:48:35.234824Z","shell.execute_reply":"2024-06-02T11:48:35.242298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Config:\n    class_names = sorted(os.listdir('/kaggle/input/birdclef-2024/train_audio/'))\n    num_classes = len(class_names)\n    debug = False\n \n    DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')    \n\n    data_root = \"/kaggle/input/birdclef-2024/\"\n    train_path = \"/kaggle/input/birdclef-2024/train_metadata.csv\"\n    test_path = '/kaggle/input/birdclef-2024/test_soundscapes'\n    if len(glob(f'{test_path}/*.ogg'))==0:\n        test_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n\n    SR = 32000\n    DURATION = 5\n    \n    infer_duration=5\n    \n    train_duration=10\n    \n    # Sed model\n#     model_ckpt = [\n#         '/kaggle/input/birdclef-openvino-comp/sed_v2s_final_30s_finetune/sed3_120.xml', #v2s\n#         '/kaggle/input/birdclef-openvino-comp/sed_se_half_ce/sed_se_120.xml', #seresnext26t\n#         '/kaggle/input/birdclef-openvino-comp/sed_b3ns_30s_finetune/sed3_b3ns_120.xml', #b3ns\n#     ]\n    \n    model_ckpt = [\n#         '/kaggle/input/birdclef2024-openvino-models/sed_b3ns.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/exp001/sed_v2s.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/exp001_baseline_sedb3ns/sed_b3ns.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/exp002_rmv_dupfiles_sedb3ns/sed_b3ns.xml'\n        '/kaggle/input/birdclef2024-openvino-models/sed_v2s/exp006_all_noise/sed_v2s.xml'\n    ]    \n    \n    # CNN model\n    re_model_ckpt = [\n        '/kaggle/input/birdclef2024-models/exp008_20s_all_noise/cnn_b0ns.xml',\n#         '/kaggle/input/birdclef2024-models/exp007_all_noise_cnnb0ns/cnn_b0ns.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/exp002_rmv_dupfiles/cnn_v2s.xml',\n#         '/kaggle/input/birdclef2024-openvino-models/cnn_b3ns.xml',\n        '/kaggle/input/birdclef2024-openvino-models/exp003_add_background_noise/cnn_b0ns.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/exp004_5s_add_noise/cnn_b0ns.xml'\n#         '/kaggle/input/birdclef2024-openvino-models/cnn_b0ns.xml',\n#         '/kaggle/input/birdclef2024-openvino-models/cnn_v2s.xml'\n#         '/kaggle/input/birdclef-openvino-comp/openvino_models_comp_half/re_120.xml', #resnet34d\n#         '/kaggle/input/birdclef-openvino-comp/re_b3ns_ce/re_b3ns_120.xml', #b3ns\n#         '/kaggle/input/birdclef-openvino-comp/re_v2s_30s_finetune/re_v2s_120.xml', #v2s\n#         '/kaggle/input/birdclef-openvino-comp/re_b0ns_final/re_b0ns_120.xml', #b0ns\n    ]\n    ","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.247212Z","iopub.execute_input":"2024-06-02T11:48:35.247714Z","iopub.status.idle":"2024-06-02T11:48:35.269412Z","shell.execute_reply.started":"2024-06-02T11:48:35.247666Z","shell.execute_reply":"2024-06-02T11:48:35.267587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_model = len(Config.model_ckpt)+len(Config.re_model_ckpt)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.271359Z","iopub.execute_input":"2024-06-02T11:48:35.271842Z","iopub.status.idle":"2024-06-02T11:48:35.280896Z","shell.execute_reply.started":"2024-06-02T11:48:35.271803Z","shell.execute_reply":"2024-06-02T11:48:35.279691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(Config.train_path)\nConfig.num_classes = len(df_train.primary_label.unique())","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.283142Z","iopub.execute_input":"2024-06-02T11:48:35.283559Z","iopub.status.idle":"2024-06-02T11:48:35.479357Z","shell.execute_reply.started":"2024-06-02T11:48:35.283526Z","shell.execute_reply":"2024-06-02T11:48:35.477897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\ndef odds(p):\n    return p / (1 - p)\ndef logit(p):\n    return np.log(odds(p))\n'''","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.481097Z","iopub.execute_input":"2024-06-02T11:48:35.481509Z","iopub.status.idle":"2024-06-02T11:48:35.491368Z","shell.execute_reply.started":"2024-06-02T11:48:35.481474Z","shell.execute_reply":"2024-06-02T11:48:35.489936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def pred(df_test,num_workers=1,sleep=0,batch_size=1):\n    import openvino.runtime as ov\n    core = ov.Core()\n    \n    import numpy as np\n    import pandas as pd\n    import torch\n    import os\n    from torch.utils.data import Dataset, DataLoader\n    import warnings\n\n    warnings.filterwarnings('ignore')\n    import torch.nn as nn\n    import timm\n    import librosa as lb\n    import soundfile as sf\n    from  soundfile import SoundFile \n    import torchaudio\n\n    import torch.nn as nn\n    import time\n    from torch.nn import functional as F\n    from torch.distributions import Beta\n    from torch.nn.parameter import Parameter\n    from joblib.externals.loky.backend.context import get_context\n    #torch.jit.enable_onednn_fusion(True)\n\n\n    class BirdDatasetSED(torch.utils.data.Dataset):\n\n        def __init__(self, df, sr = Config.SR,n_mels=128, fmin=0, fmax=None, step=None, res_type=\"kaiser_fast\",resample=True, duration = Config.DURATION, train = True):\n\n            self.df = df\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.train = train\n            self.duration = duration\n            \n            # 5秒の音声長さ\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        def __len__(self):\n            return len(self.df)\n\n        def read_file(self, filepath):\n            #audio, orig_sr = torchaudio.load(filepath)\n            #if orig_sr != self.sr:\n            #    # sinc_interpolation\n            #    resample_transform = torchaudio.transforms.Resample(orig_sr, self.sr, resampling_method=\"kaiser_window\")\n            #    audio = resample_transform(audio)\n\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            seconds = []\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                if end > len(audio):\n                    pass\n                else:\n                    seconds.append(int(end/self.sr))\n\n            audio = np.concatenate([audio,audio,audio])\n            audios = []\n            for i,second in enumerate(seconds):\n                end_seconds = int(second)\n                start_seconds = int(end_seconds - Config.DURATION)\n                \n                # 例えば、サンプリングレートが44100Hzで、Config.train_duration が10秒、Config.DURATION が5秒の場合、\n                # オフセットは (10 - 5) / 2 = 2.5 秒となります。\n                # これにより、クリップの中央から2.5秒前後にわたる部分を考慮してインデックスを計算します。\n                end_index = int(self.sr * (end_seconds + (Config.train_duration - Config.DURATION) / 2) ) + len(audio) // 3\n                start_index = int(self.sr * (start_seconds - (Config.train_duration - Config.DURATION) / 2) ) + len(audio) // 3\n                end_pad = int(self.sr * (Config.train_duration - Config.DURATION) / 2) \n                start_pad = int(self.sr * (Config.train_duration - Config.DURATION) / 2) \n                y = audio[start_index:end_index].astype(np.float32)\n                if i==0:\n                    y[:start_pad] = 0\n                elif i==(len(seconds)-1):\n                    y[-end_pad:] = 0\n                audios.append(y)\n            audios = np.stack(audios)\n            audios = torch.tensor(audios).float().unsqueeze(1)\n            spec384,spec256,spec300_another,spec_rev2s=transform_to_spec(audios,train=False)\n            return spec384,spec256,spec300_another,spec_rev2s\n\n        def __getitem__(self, idx):\n\n            return self.read_file(self.df.loc[idx, \"path\"])\n        \n    # 色んな時間解像度でmelspec_transformを作成\n    # 出力は1channel\n    hop_length384 = Config.infer_duration*Config.SR // (384-1)\n    melspec_transform = torchaudio.transforms.MelSpectrogram(sample_rate=Config.SR, hop_length=hop_length384, n_mels=128, f_min=0, f_max=Config.SR//2, n_fft=2048, center=True, pad_mode='constant',norm='slaney',onesided=True,mel_scale='slaney')\n    if Config.infer_duration==5:\n        hop_length256 = Config.infer_duration*2*Config.SR // (256-1)\n        hop_length300 = Config.infer_duration*2*Config.SR // (300-1)\n    else:\n        hop_length256 = Config.infer_duration*Config.SR // (256-1)\n        hop_length300 = Config.infer_duration*Config.SR // (300-1)\n    melspec_transform256 = torchaudio.transforms.MelSpectrogram(sample_rate=Config.SR, hop_length=hop_length256, n_mels=128, f_min=0, f_max=Config.SR//2, n_fft=2048, center=True, pad_mode='constant',norm='slaney',onesided=True,mel_scale='slaney')\n    #hop_length224 = Config.infer_duration*Config.SR // (224-1)\n    #melspec_transform224 = torchaudio.transforms.MelSpectrogram(sample_rate=Config.SR, hop_length=hop_length224, n_mels=128, f_min=0, f_max=Config.SR//2, n_fft=2048, center=True, pad_mode='constant',norm='slaney',onesided=True,mel_scale='slaney')\n    \n    melspec_transform300 = torchaudio.transforms.MelSpectrogram(sample_rate=Config.SR, hop_length=hop_length300, n_mels=128, f_min=50, f_max=14000, n_fft=1024, center=True, pad_mode='constant',norm='slaney',onesided=True,mel_scale='slaney')\n    melspec_transform_rev2s = torchaudio.transforms.MelSpectrogram(sample_rate=Config.SR, hop_length=320, n_mels=64, f_min=50, f_max=14000, n_fft=1024, center=True, pad_mode='constant',norm='slaney',onesided=True,mel_scale='slaney')\n    \n    db_transform = torchaudio.transforms.AmplitudeToDB(stype='power',top_db=80)\n\n    def transform_to_spec(audio,train=True):\n        import math\n        amin=1e-10\n        ref_value=1.0\n        db_multiplier = math.log10(max(amin, ref_value))\n        spec = melspec_transform(audio)     \n        #spec = torchaudio.functional.amplitude_to_DB(spec,multiplier=10,amin=amin,db_multiplier=db_multiplier,top_db=80)\n        spec = db_transform(spec)\n        spec256 = melspec_transform256(audio)\n        spec256 = db_transform(spec256)\n        \n        #spec224 = melspec_transform224(audio)\n        #spec224 = db_transform(spec224)\n        \n        spec300_another = melspec_transform300(audio)\n        spec300_another = db_transform(spec300_another)\n        \n        spec_rev2s = melspec_transform_rev2s(audio)\n        spec_rev2s = db_transform(spec_rev2s)\n        \n        spec384 = (spec+80)/80\n        spec256 = spec256/255\n        #spec224 = spec224/255\n        spec300_another = spec300_another/255\n        spec_rev2s = (spec_rev2s+80)/80\n        return spec384,spec256,spec300_another,spec_rev2s\n\n    \n    \n    def openvino_infer(model,data,tta):\n        outputs = model.infer(inputs=[data,tta])\n        outputs = torch.tensor(outputs[list(outputs.keys())[0]])\n        return outputs\n    \n    def openvino_infer_re(model,data):\n        outputs = model.infer(inputs=[data])\n        outputs = torch.tensor(outputs[list(outputs.keys())[0]])\n        return outputs\n    \n    def compute_deltas(\n            specgram: torch.Tensor,\n            win_length: int = 5,\n            mode: str = \"replicate\"\n    ) -> torch.Tensor:\n        r\"\"\"Compute delta coefficients of a tensor, usually a spectrogram:\n\n        .. math::\n           d_t = \\frac{\\sum_{n=1}^{\\text{N}} n (c_{t+n} - c_{t-n})}{2 \\sum_{n=1}^{\\text{N}} n^2}\n\n        where :math:`d_t` is the deltas at time :math:`t`,\n        :math:`c_t` is the spectrogram coeffcients at time :math:`t`,\n        :math:`N` is ``(win_length-1)//2``.\n\n        Args:\n            specgram (Tensor): Tensor of audio of dimension (..., freq, time)\n            win_length (int, optional): The window length used for computing delta (Default: ``5``)\n            mode (str, optional): Mode parameter passed to padding (Default: ``\"replicate\"``)\n\n        Returns:\n            Tensor: Tensor of deltas of dimension (..., freq, time)\n\n        Example\n            >>> specgram = torch.randn(1, 40, 1000)\n            >>> delta = compute_deltas(specgram)\n            >>> delta2 = compute_deltas(delta)\n        \"\"\"\n        device = specgram.device\n        dtype = specgram.dtype\n\n        # pack batch\n        shape = specgram.size()\n        specgram = specgram.reshape(1, -1, shape[-1])\n\n        assert win_length >= 3\n\n        n = (win_length - 1) // 2\n\n        # twice sum of integer squared\n        denom = n * (n + 1) * (2 * n + 1) / 3\n\n        specgram = torch.nn.functional.pad(specgram, (n, n), mode=mode)\n\n        kernel = torch.arange(-n, n + 1, 1, device=device, dtype=dtype).repeat(specgram.shape[1], 1, 1)\n\n        output = torch.nn.functional.conv1d(specgram, kernel, groups=specgram.shape[1]) / denom\n\n        # unpack batch\n        output = output.reshape(shape)\n\n        return output\n    \n    \n    def make_delta(\n        input_tensor: torch.Tensor\n    ):\n        input_tensor = input_tensor.transpose(3,2)\n        input_tensor = compute_deltas(input_tensor)\n        input_tensor = input_tensor.transpose(3,2)\n        return input_tensor\n\n    \n    # 3channelに変更\n    def image_delta(x):\n        # 1次デルタ係数\n        delta_1 = make_delta(x)\n        # 2次デルタ係数\n        delta_2 = make_delta(delta_1)\n        x = torch.cat([x,delta_1,delta_2], dim=1)\n        return x\n    \n    def reshp(images):\n        # 4min*60/10inference duration=24batch size?\n        # clip_len=60s/5s=12*4min=48\n        bs,clip_len,channel_num,mel_num,time_len = images.size()\n        images=images.reshape((bs*clip_len,channel_num,mel_num,time_len))\n        return images\n    \n    def predict(data_loader, models,re_models):   \n        predictions = []\n        pred_binary = []\n        dl_test = DataLoader(ds_test, batch_size=batch_size,num_workers = num_workers, multiprocessing_context=get_context('loky'))\n        \n        for spec384,spec256,spec300_another,spec_rev2s in dl_test:\n            spec384 = reshp(spec384)\n            spec256 = reshp(spec256)\n            spec300_another = reshp(spec300_another)\n            spec300_80 = (spec300_another*255+80)/80\n            spec_rev2s = reshp(spec_rev2s)\n            \n            out = []\n            for i,model in enumerate(models):\n                model_name = Config.model_ckpt[i].split('/')[-1].split('.')[0]\n                if model_name=='sed_v2s':\n                    images2_3chan = image_delta(spec384).numpy()\n                    if images2_3chan.shape[0]>48:\n                        output1 = openvino_infer(model,images2_3chan[:48,:,:,:],3)\n                        output2 = openvino_infer(model,images2_3chan[48:96,:,:,:],3)\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer(model,images2_3chan,3)\n                elif model_name=='sed_b3ns':\n                    images_3chan = image_delta(spec300_another).numpy()\n                    print(images_3chan.shape)\n                    if images_3chan.shape[0]>120:\n                        output1 = openvino_infer(model,images_3chan[:120,:,:,:],2)\n                        output2 = openvino_infer(model,images_3chan[120:240,:,:,:],2)\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer(model,images_3chan,3)\n                else:\n                    image_res = spec256.numpy()\n\n                    if image_res.shape[0]>120:\n                        output1 = openvino_infer(model,image_res[:120,:,:,:],2)\n                        output2 = openvino_infer(model,image_res[120:240,:,:,:],2)\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer(model,image_res,2)\n\n                out.append(outputs)\n            for i,model in enumerate(re_models):\n                model_name = Config.re_model_ckpt[i].split('/')[-1].split('.')[0]\n                if (model_name=='cnn_b0ns'):\n                    if Config.infer_duration==5:\n                        image_b0ns = spec256[:,:,:,:].numpy()\n                    else:\n                        image_b0ns = spec256[:,:,:,128:384].numpy()\n                    if image_b0ns.shape[0]>120:\n                        output1 = openvino_infer_re(model,image_b0ns[:120,:,:,:])\n                        output2 = openvino_infer_re(model,image_b0ns[120:240,:,:,:])\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer_re(model,image_b0ns)\n                elif (model_name=='cnn_v2s'):\n                    images_re_v2s = image_delta(spec_rev2s)[:,:,:,250:750].numpy()\n                    if images_re_v2s.shape[0]>120:\n                        output1 = openvino_infer_re(model,images_re_v2s[:120,:,:,:])\n                        output2 = openvino_infer_re(model,images_re_v2s[120:240,:,:,:])\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer_re(model,images_re_v2s)\n                elif (model_name=='cnn_b3ns'):\n                    if Config.infer_duration==5:\n                        images_center_resize2 = image_delta(spec300_80)[:,:,:,:].numpy()\n                    else:\n                        images_center_resize2 = image_delta(spec300_80)[:,:,:,150:450].numpy()\n                    if images_center_resize2.shape[0]>120:\n                        output1 = openvino_infer_re(model,images_center_resize2[:120,:,:,:])\n                        output2 = openvino_infer_re(model,images_center_resize2[120:240,:,:,:])\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer_re(model,images_center_resize2)\n                elif (i==3):\n                    images_center_resize1 = image_delta(spec256)[:,:,:,128:384].numpy()\n                    if images_center_resize1.shape[0]>120:\n                        output1 = openvino_infer_re(model,images_center_resize1[:120,:,:,:])\n                        output2 = openvino_infer_re(model,images_center_resize1[120:240,:,:,:])\n                        outputs = torch.cat([output1,output2],dim=0)\n                    else:\n                        outputs = openvino_infer_re(model,images_center_resize1)\n                else:\n                    outputs = model(images_center_resize3)\n    \n                out.append(outputs)\n                \n            predictions.append(out)\n        return predictions\n\n    import gc\n\n    print(f\"Create Dataloader...\")\n\n    ds_test = BirdDatasetSED(\n        df_test, \n        sr = Config.SR,\n        duration = Config.DURATION,\n        train = False\n    )\n\n    \n    #print(\"Model Creation\")\n    models = []\n    for i,ckpt in enumerate(Config.model_ckpt):\n        #if i==0:\n        #    model = load_mdl(name,ckpt,size,sed_3chan=True)\n        #else:\n        #    model = load_mdl(name,ckpt,size)\n\n        model = core.read_model(model=ckpt)\n        model = core.compile_model(model, device_name=\"CPU\")\n        model = model.create_infer_request()\n        models.append(model)\n        \n    re_models = []\n    for i,ckpt in enumerate(Config.re_model_ckpt):\n\n        model = core.read_model(model=ckpt)\n        model = core.compile_model(model, device_name=\"CPU\")\n        model = model.create_infer_request()\n        re_models.append(model)\n\n    print(\"Running Inference..\")\n    time.sleep(sleep)\n    preds = predict(ds_test, models,re_models)   \n\n    return preds","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.493992Z","iopub.execute_input":"2024-06-02T11:48:35.494831Z","iopub.status.idle":"2024-06-02T11:48:35.584807Z","shell.execute_reply.started":"2024-06-02T11:48:35.494754Z","shell.execute_reply":"2024-06-02T11:48:35.583411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nfrom pathlib import Path\n\ndf_test = pd.DataFrame(\n     [(path.stem, path) for path in Path(Config.test_path).glob(\"*.ogg\")],\n    columns = [\"filename\", \"path\"]\n)\n# if not submission, use only 5 files out of unlabeled dataset\nif len(df_test)==8444:\n    df_test = df_test.sample(9)\nprint(df_test.shape)\ndf_test.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.586852Z","iopub.execute_input":"2024-06-02T11:48:35.588642Z","iopub.status.idle":"2024-06-02T11:48:35.674272Z","shell.execute_reply.started":"2024-06-02T11:48:35.588543Z","shell.execute_reply":"2024-06-02T11:48:35.673101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#df_test = pd.concat([df_test]*200,axis=0).reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.679286Z","iopub.execute_input":"2024-06-02T11:48:35.679787Z","iopub.status.idle":"2024-06-02T11:48:35.685969Z","shell.execute_reply.started":"2024-06-02T11:48:35.679749Z","shell.execute_reply":"2024-06-02T11:48:35.684662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cpu_num=2","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.687886Z","iopub.execute_input":"2024-06-02T11:48:35.688301Z","iopub.status.idle":"2024-06-02T11:48:35.696019Z","shell.execute_reply.started":"2024-06-02T11:48:35.688267Z","shell.execute_reply":"2024-06-02T11:48:35.694665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_job = min([cpu_num,len(df_test)])\nsplit = len(df_test)//num_job\nnum_job,split","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.697541Z","iopub.execute_input":"2024-06-02T11:48:35.697975Z","iopub.status.idle":"2024-06-02T11:48:35.712169Z","shell.execute_reply.started":"2024-06-02T11:48:35.697941Z","shell.execute_reply":"2024-06-02T11:48:35.710701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dfs_test = []\ndf_test_left = None\nfor i in range(num_job):\n    df_test_split = df_test.iloc[i*split:(i+1)*split].reset_index(drop=True)\n    dfs_test.append(df_test_split)\n    if i==num_job-1:\n        df_test_left = df_test.iloc[(i+1)*split:].reset_index(drop=True)\nlen(dfs_test),len(df_test_left)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.714079Z","iopub.execute_input":"2024-06-02T11:48:35.714533Z","iopub.status.idle":"2024-06-02T11:48:35.730654Z","shell.execute_reply.started":"2024-06-02T11:48:35.714496Z","shell.execute_reply":"2024-06-02T11:48:35.729026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for i,df_test in enumerate(dfs_test):\n#     print(f\"Running Job {i}\")\n#     pred(df_test,2,0,1)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.732863Z","iopub.execute_input":"2024-06-02T11:48:35.733806Z","iopub.status.idle":"2024-06-02T11:48:35.742405Z","shell.execute_reply.started":"2024-06-02T11:48:35.733749Z","shell.execute_reply":"2024-06-02T11:48:35.740909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample 9\n# cpu4, num_workers4 → \n# cpu4, num_workers2 → 84s\n# cpu4, num_workers1 → \n# cpu3, num_workers2 → \n# cpu2, num_workers2, batch2 → 79s\n# cpu2, batch1 → 84\nimport time\nt1=time.time()\n# delayedによってpred関数を遅延実行している\n#results1 = joblib.Parallel(n_jobs=num_job, backend='loky')(joblib.delayed(pred)(df_test) for df_test in dfs_test)\n# sl引数は，time.sleep(sleep)で実行を遅らせて，CPU負荷を一気にかけるのを避けるため\nif num_job==4:\n    results1 = joblib.Parallel(n_jobs=num_job, backend='loky')(joblib.delayed(pred)(df_test,num_workers,sl,batch_size) for df_test,num_workers,sl,batch_size in zip(dfs_test,[2,2,2,2],[0,5,10,15],[2,2,2,2]))\nelif num_job==2:\n    results1 = joblib.Parallel(n_jobs=num_job, backend='loky')(joblib.delayed(pred)(df_test,num_workers,sl,batch_size) for df_test,num_workers,sl,batch_size in zip(dfs_test,[2,2],[0,5],[1,1]))\nt2=time.time()\nprint(t2-t1)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:48:35.744372Z","iopub.execute_input":"2024-06-02T11:48:35.745720Z","iopub.status.idle":"2024-06-02T11:50:39.826453Z","shell.execute_reply.started":"2024-06-02T11:48:35.745664Z","shell.execute_reply":"2024-06-02T11:50:39.823566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cpu4, num_workers2 → 18s\nt1=time.time()\nresults2 = []\nif len(df_test_left)>0:\n    results2 = joblib.Parallel(n_jobs=num_job, backend='loky')(joblib.delayed(pred)(df_test_left.iloc[i:i+1].reset_index(drop=True),batch_size=1) for i in range(len(df_test_left)))\nt2=time.time()\nprint(t2-t1)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:50:39.830878Z","iopub.execute_input":"2024-06-02T11:50:39.833141Z","iopub.status.idle":"2024-06-02T11:51:00.671506Z","shell.execute_reply.started":"2024-06-02T11:50:39.833062Z","shell.execute_reply":"2024-06-02T11:51:00.669824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = results1+results2","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.674342Z","iopub.execute_input":"2024-06-02T11:51:00.674964Z","iopub.status.idle":"2024-06-02T11:51:00.682799Z","shell.execute_reply.started":"2024-06-02T11:51:00.674913Z","shell.execute_reply":"2024-06-02T11:51:00.681169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds=[]\n# for rs in results1:\n#     for r in rs:\n#         preds+=r\n# for r in results2:\n#     preds+=r[0]\nfor r in results:\n    preds+=r\nlen(preds)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.685466Z","iopub.execute_input":"2024-06-02T11:51:00.686606Z","iopub.status.idle":"2024-06-02T11:51:00.703383Z","shell.execute_reply.started":"2024-06-02T11:51:00.686446Z","shell.execute_reply":"2024-06-02T11:51:00.701815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if n_model==2:\n    preds1=[]\n    preds2=[]\n    for r1,r2 in preds:\n        preds1.append(r1)\n        preds2.append(r2)\nif n_model==3:\n    preds1=[]\n    preds2=[]\n    preds3=[]\n    for r1,r2,r3 in preds:\n        preds1.append(r1)\n        preds2.append(r2)\n        preds3.append(r3)\nif n_model==4:\n    preds1=[]\n    preds2=[]\n    preds3=[]\n    preds4=[]\n    for r1,r2,r3,r4 in preds:\n        preds1.append(r1)\n        preds2.append(r2)\n        preds3.append(r3)\n        preds4.append(r4)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.705631Z","iopub.execute_input":"2024-06-02T11:51:00.707240Z","iopub.status.idle":"2024-06-02T11:51:00.723437Z","shell.execute_reply.started":"2024-06-02T11:51:00.707174Z","shell.execute_reply":"2024-06-02T11:51:00.721517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = df_test.filename.values.tolist()\n\nbird_cols = list(pd.get_dummies(df_train['primary_label']).columns)\nsub_df = pd.DataFrame(columns=['row_id']+bird_cols)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.726381Z","iopub.execute_input":"2024-06-02T11:51:00.727077Z","iopub.status.idle":"2024-06-02T11:51:00.776841Z","shell.execute_reply.started":"2024-06-02T11:51:00.727019Z","shell.execute_reply":"2024-06-02T11:51:00.775298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.780892Z","iopub.execute_input":"2024-06-02T11:51:00.781351Z","iopub.status.idle":"2024-06-02T11:51:00.803020Z","shell.execute_reply.started":"2024-06-02T11:51:00.781316Z","shell.execute_reply":"2024-06-02T11:51:00.801391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Generate Submission csv","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"def make_row_ids(file):\n    num_rows = 48\n    row_ids = np.array([f'{file}_{(i+1)*5}' for i in range(num_rows)])\n    return row_ids","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.805055Z","iopub.execute_input":"2024-06-02T11:51:00.805554Z","iopub.status.idle":"2024-06-02T11:51:00.814112Z","shell.execute_reply.started":"2024-06-02T11:51:00.805513Z","shell.execute_reply":"2024-06-02T11:51:00.813069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# row_ids = joblib.Parallel(n_jobs=4, backend='loky')(joblib.delayed(make_row_ids)(preds[i],file) for i, file in enumerate(filenames))\nrow_ids = joblib.Parallel(n_jobs=4, backend='loky')(joblib.delayed(make_row_ids)(file) for i, file in enumerate(filenames))\nrow_ids = np.concatenate(row_ids,axis=0)\n# list to numpy array\n\nif n_model==1:\n    data = np.concatenate(preds,axis=0)\n    data = np.concatenate(data,axis=0)\n    if len(Config.re_model_ckpt)!=0:\n        data = torch.tensor(data).sigmoid().numpy()\nif n_model==2:\n    data1 = torch.cat(preds1,dim=0).logit()\n    data2 = torch.cat(preds2,dim=0)\nif n_model==3:\n    data1 = torch.cat(preds1,dim=0).logit()\n    data2 = torch.cat(preds2,dim=0)\n    data3 = torch.cat(preds3,dim=0)\nif n_model==4:\n    data1 = torch.cat(preds1,dim=0).logit()\n    data2 = torch.cat(preds2,dim=0)\n    data3 = torch.cat(preds3,dim=0)\n    data4 = torch.cat(preds4,dim=0)\n\n#data_binary = np.concatenate(preds_binary,axis=0)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:00.816153Z","iopub.execute_input":"2024-06-02T11:51:00.816565Z","iopub.status.idle":"2024-06-02T11:51:03.390901Z","shell.execute_reply.started":"2024-06-02T11:51:00.816533Z","shell.execute_reply":"2024-06-02T11:51:03.389413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def ensemble(preds, weights=None):\n    n_models = len(preds)\n    ensembled_pred = 0\n    if weights:\n        for pred,weight in zip(preds,weights):\n            ensembled_pred += weight*pred        \n    else:\n        weights = 1/n_models\n        for pred in preds:\n            ensembled_pred += weights*pred\n    return ensembled_pred","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:03.398991Z","iopub.execute_input":"2024-06-02T11:51:03.402021Z","iopub.status.idle":"2024-06-02T11:51:03.413428Z","shell.execute_reply.started":"2024-06-02T11:51:03.401963Z","shell.execute_reply":"2024-06-02T11:51:03.412278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if n_model==2:\n    data = ensemble([data1,data2],[0.5,0.5]).sigmoid().numpy()\nif n_model==3:\n    data = ensemble([data1,data2,data3]).sigmoid().numpy()\nif n_model==4:\n    data = ensemble([data1,data2,data3,data4]).sigmoid().numpy()","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:03.416692Z","iopub.execute_input":"2024-06-02T11:51:03.417985Z","iopub.status.idle":"2024-06-02T11:51:03.430617Z","shell.execute_reply.started":"2024-06-02T11:51:03.417933Z","shell.execute_reply":"2024-06-02T11:51:03.429392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.shape","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:03.432762Z","iopub.execute_input":"2024-06-02T11:51:03.433913Z","iopub.status.idle":"2024-06-02T11:51:03.442894Z","shell.execute_reply.started":"2024-06-02T11:51:03.433871Z","shell.execute_reply":"2024-06-02T11:51:03.441648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df['row_id'] = row_ids\nsub_df[bird_cols] = data\n#sub_df = pd.concat(dfs).reset_index(drop=True)\nsub_df","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:03.445090Z","iopub.execute_input":"2024-06-02T11:51:03.445846Z","iopub.status.idle":"2024-06-02T11:51:03.520874Z","shell.execute_reply.started":"2024-06-02T11:51:03.445811Z","shell.execute_reply":"2024-06-02T11:51:03.519664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-02T11:51:03.528982Z","iopub.execute_input":"2024-06-02T11:51:03.529723Z","iopub.status.idle":"2024-06-02T11:51:03.691599Z","shell.execute_reply.started":"2024-06-02T11:51:03.529687Z","shell.execute_reply":"2024-06-02T11:51:03.690185Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}