{"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":8108072,"sourceType":"datasetVersion","datasetId":4789213},{"sourceId":8363000,"sourceType":"datasetVersion","datasetId":4970504},{"sourceId":8627238,"sourceType":"datasetVersion","datasetId":4955173},{"sourceId":8639296,"sourceType":"datasetVersion","datasetId":4786201},{"sourceId":8642188,"sourceType":"datasetVersion","datasetId":4836532}],"dockerImageVersionId":30698,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!lscpu","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:20.939416Z","iopub.execute_input":"2024-06-08T18:44:20.940012Z","iopub.status.idle":"2024-06-08T18:44:21.960002Z","shell.execute_reply.started":"2024-06-08T18:44:20.939961Z","shell.execute_reply":"2024-06-08T18:44:21.958362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-08T18:44:21.963181Z","iopub.execute_input":"2024-06-08T18:44:21.963744Z","iopub.status.idle":"2024-06-08T18:44:26.000975Z","shell.execute_reply.started":"2024-06-08T18:44:21.963674Z","shell.execute_reply":"2024-06-08T18:44:25.999393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install \"/kaggle/input/openvino-202410-py310/openvino-2024.1.0-15008-cp310-cp310-manylinux2014_x86_64.whl\" --no-index --find-links \"/kaggle/input/openvino-202410-py310\"","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:26.002777Z","iopub.execute_input":"2024-06-08T18:44:26.003157Z","iopub.status.idle":"2024-06-08T18:44:41.652512Z","shell.execute_reply.started":"2024-06-08T18:44:26.003124Z","shell.execute_reply":"2024-06-08T18:44:41.651054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom pathlib import Path\nimport os\nimport warnings\nimport joblib\nimport torch\n# import onnxruntime  as ort\nimport math\nfrom glob import glob\nimport openvino as ov\ncore = ov.Core()\n\nimport torch\nimport os\nfrom torch.utils.data import Dataset, DataLoader\nimport warnings\n\n# warnings.filterwarnings('ignore')\nimport torch.nn as nn\nimport timm\nimport librosa as lb\nimport soundfile as sf\nfrom  soundfile import SoundFile \nimport torchaudio\n\nimport torch.nn as nn\nimport time\nfrom torch.nn import functional as F\nfrom torch.distributions import Beta\nfrom torch.nn.parameter import Parameter\nfrom joblib.externals.loky.backend.context import get_context","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:41.656579Z","iopub.execute_input":"2024-06-08T18:44:41.657127Z","iopub.status.idle":"2024-06-08T18:44:50.902462Z","shell.execute_reply.started":"2024-06-08T18:44:41.657078Z","shell.execute_reply":"2024-06-08T18:44:50.901220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Config:\n    num_classes = 182\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\n    SR = 32000\n    DURATION = 5\n\n    \n    infer_duration=5\n    train_duration=10\n","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:50.903699Z","iopub.execute_input":"2024-06-08T18:44:50.904171Z","iopub.status.idle":"2024-06-08T18:44:50.911254Z","shell.execute_reply.started":"2024-06-08T18:44:50.904135Z","shell.execute_reply":"2024-06-08T18:44:50.909458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_files = glob(Config.test_path + \"/*\")\nif len(test_files) == 1:\n    Config.test_path = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n    IS_COMMIT = True\nelse:\n    IS_COMMIT = False\nprint(f\"{IS_COMMIT=}\")","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:50.912952Z","iopub.execute_input":"2024-06-08T18:44:50.913448Z","iopub.status.idle":"2024-06-08T18:44:51.110355Z","shell.execute_reply.started":"2024-06-08T18:44:50.913400Z","shell.execute_reply":"2024-06-08T18:44:51.109249Z"},"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-08T18:44:51.112125Z","iopub.execute_input":"2024-06-08T18:44:51.112894Z","iopub.status.idle":"2024-06-08T18:44:51.309285Z","shell.execute_reply.started":"2024-06-08T18:44:51.112857Z","shell.execute_reply":"2024-06-08T18:44:51.308122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.DataFrame(\n     [(path.stem,  path) for path in Path(Config.test_path).glob(\"*.ogg\")],\n    columns = [\"filename\", \"path\"]\n)\nif IS_COMMIT:\n    df_test = df_test.sort_values(by='filename', ascending=True).reset_index(drop=True)\n    df_test = df_test.iloc[:15]\nprint(df_test.shape)\ndf_test.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.310557Z","iopub.execute_input":"2024-06-08T18:44:51.311016Z","iopub.status.idle":"2024-06-08T18:44:51.473726Z","shell.execute_reply.started":"2024-06-08T18:44:51.310981Z","shell.execute_reply":"2024-06-08T18:44:51.472341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Compose:\n    def __init__(self, transforms: list):\n        self.transforms = transforms\n\n    def __call__(self, y: np.ndarray, sr):\n        for trns in self.transforms:\n            y = trns(y, sr)\n        return y\n\n\nclass AudioTransform:\n    def __init__(self, always_apply=False, p=0.5):\n        self.always_apply = always_apply\n        self.p = p\n\n    def __call__(self, y: np.ndarray, sr):\n        if self.always_apply:\n            return self.apply(y, sr=sr)\n        else:\n            if np.random.rand() < self.p:\n                return self.apply(y, sr=sr)\n            else:\n                return y\n\n    def apply(self, y: np.ndarray, **params):\n        raise NotImplementedError\n\n\nclass OneOf(Compose):\n    # https://github.com/albumentations-team/albumentations/blob/master/albumentations/core/composition.py\n    def __init__(self, transforms, p=0.5):\n        super().__init__(transforms)\n        self.p = p\n        transforms_ps = [t.p for t in transforms]\n        s = sum(transforms_ps)\n        self.transforms_ps = [t / s for t in transforms_ps]\n\n    def __call__(self, y: np.ndarray, sr):\n        data = y\n        if self.transforms_ps and (random.random() < self.p):\n            random_state = np.random.RandomState(random.randint(0, 2 ** 32 - 1))\n            t = random_state.choice(self.transforms, p=self.transforms_ps)\n            data = t(y, sr)\n        return data\n\n\nclass Normalize(AudioTransform):\n    def __init__(self, always_apply=False, p=1):\n        super().__init__(always_apply, p)\n\n    def apply(self, y: np.ndarray, **params):\n        max_vol = np.abs(y).max()\n        y_vol = y * 1 / max_vol\n        return np.asfortranarray(y_vol)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.475331Z","iopub.execute_input":"2024-06-08T18:44:51.475712Z","iopub.status.idle":"2024-06-08T18:44:51.489164Z","shell.execute_reply.started":"2024-06-08T18:44:51.475672Z","shell.execute_reply":"2024-06-08T18:44:51.487929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"END_PAD = int(Config.SR * (Config.train_duration - Config.DURATION) / 2)\nSTART_PAD = int(Config.SR * (Config.train_duration - Config.DURATION) / 2)\n\nWINDOW_DIFF = Config.train_duration - Config.DURATION\nHALF_WINDOW_DIFF = WINDOW_DIFF / 2","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.492703Z","iopub.execute_input":"2024-06-08T18:44:51.493198Z","iopub.status.idle":"2024-06-08T18:44:51.504150Z","shell.execute_reply.started":"2024-06-08T18:44:51.493163Z","shell.execute_reply":"2024-06-08T18:44:51.502809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BirdDatasetSED(torch.utils.data.Dataset):\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, downsample = 2, 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        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.downsample = downsample\n        self.wave_transform = Compose([Normalize(p=1),])\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        \n        if audio.shape[0] == 1:\n            audio = audio[0].numpy()\n        else:\n            audio = audio.mean(0).numpy()\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        \n        audios = []\n        audios_clip = []\n        for i, second in enumerate(seconds):\n            end_seconds = int(second)\n            start_seconds = int(end_seconds - Config.DURATION)\n\n#             最後を入れるとややこしいので、start_index_clipにだけ2.5秒マイナスにして、全体の長さを7.5秒にする\n            end_index_clip = int(self.sr * (end_seconds)) + len(audio) // 3\n            start_index_clip = int(self.sr * (start_seconds - HALF_WINDOW_DIFF)) + len(audio) // 3\n#             end_pad_clip = int(self.sr * (Config.train_duration - Config.DURATION) / 2)\n            start_pad_clip = int(self.sr * HALF_WINDOW_DIFF)\n            \n#             3回リピートしており、最初の-2.5秒の部分はパッドとして0にする\n            y_clip = audio[start_index_clip:end_index_clip].astype(np.float32)\n            if i == 0:\n                y_clip[:start_pad_clip] = 0\n#             elif i == (len(seconds) - 1):\n#                 y_clip[-end_pad_clip:] = 0\n\n            audio_clip = self.wave_transform(y_clip, self.sr)\n            audio_clip = audio_clip[0:len(audio_clip):self.downsample]\n            audios_clip.append(audio_clip)\n\n            ###　audiosの分は触ってない。audiosと同じくaudios_clipを伸ばした\n            end_index = int(self.sr * (end_seconds + HALF_WINDOW_DIFF)) + len(audio) // 3\n            start_index = int(self.sr * (start_seconds - HALF_WINDOW_DIFF)) + len(audio) // 3\n\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\n        audios = np.stack(audios)\n        audios = torch.from_numpy(audios).float().unsqueeze(1)\n        audios_clip = np.stack(audios_clip)\n        audios_clip = torch.from_numpy(audios_clip).float()\n        \n        spec256, spec256_80 = transform_to_spec(audios,train=False)\n        return spec256, spec256_80, audios_clip\n\n    def __getitem__(self, idx):\n        return self.read_file(self.df.iloc[idx][\"path\"])\n","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.505964Z","iopub.execute_input":"2024-06-08T18:44:51.506417Z","iopub.status.idle":"2024-06-08T18:44:51.527304Z","shell.execute_reply.started":"2024-06-08T18:44:51.506375Z","shell.execute_reply":"2024-06-08T18:44:51.526024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hop_length256 = Config.infer_duration*Config.SR // (256-1)\nmelspec_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\ndb_transform = torchaudio.transforms.AmplitudeToDB(stype='power',top_db=80)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.528636Z","iopub.execute_input":"2024-06-08T18:44:51.529045Z","iopub.status.idle":"2024-06-08T18:44:51.667633Z","shell.execute_reply.started":"2024-06-08T18:44:51.529013Z","shell.execute_reply":"2024-06-08T18:44:51.666296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transform_to_spec(audio,train=True):\n    spec256 = melspec_transform256(audio)\n    spec256 = db_transform(spec256)\n\n    spec256_80 = (spec256 + 80)/80\n    spec256 = spec256/255\n\n    return spec256, spec256_80\n\ndef reshp(images):\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\ndef reshp_wave(waves):\n    bs,clip_len,dims = waves.size()\n    waves = waves.reshape((bs*clip_len, dims))\n    return waves, dims","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.669129Z","iopub.execute_input":"2024-06-08T18:44:51.669493Z","iopub.status.idle":"2024-06-08T18:44:51.677569Z","shell.execute_reply.started":"2024-06-08T18:44:51.669461Z","shell.execute_reply":"2024-06-08T18:44:51.676201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_test = BirdDatasetSED(\n        df_test, \n        sr = Config.SR,\n        duration = Config.DURATION,\n        train = False\n    )\ndl_test = DataLoader(ds_test, batch_size=2, num_workers =4, pin_memory=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.679458Z","iopub.execute_input":"2024-06-08T18:44:51.679925Z","iopub.status.idle":"2024-06-08T18:44:51.689263Z","shell.execute_reply.started":"2024-06-08T18:44:51.679880Z","shell.execute_reply":"2024-06-08T18:44:51.687817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 量子化無し\nmodel_wo_quant = core.compile_model('/kaggle/input/birdclef2024-openvino-model/EXP034_reshape_effnetb0_5sec_removedupl_gsk5folds_ds2_unlabelnoise_cleandata/best_fold-1.xml', \"CPU\")\nmodel_wo_quant = model_wo_quant.create_infer_request()\n\n# 量子化有り\nmodel_quant = core.compile_model('/kaggle/input/birdcled2024-models/EXP034_fold0_quant4/quant-fold1.xml', \"CPU\")\nmodel_quant = model_quant.create_infer_request()\n","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:51.690846Z","iopub.execute_input":"2024-06-08T18:44:51.691247Z","iopub.status.idle":"2024-06-08T18:44:52.967581Z","shell.execute_reply.started":"2024-06-08T18:44:51.691216Z","shell.execute_reply":"2024-06-08T18:44:52.966238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from datetime import datetime\nimport time\n\n# def get_opnevino_pred(model, x):\n#     outputs = model.infer(x)\n#     outputs = outputs[list(outputs.keys())[0]]\n#     return outputs\n#     outputs_reshp_0 = get_opnevino_pred(compiled_model_reshp_0, audio_clip.numpy())\n\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\nstart=datetime.now()\npredictions_wo_quant = []\npredictions_quant = []\n\ntimes_wo_quant = []\ntimes_quant = []\nfor spec256, spec256_80, audio_clip in dl_test:\n    spec256 = reshp(spec256)\n    spec256_80 = reshp(spec256_80)\n    audio_clip, dims = reshp_wave(audio_clip)\n\n#     -2.5秒～7.5秒のオーディオを-2.5秒～2.5秒にする\n    image = spec256[:,:,:,64:320].numpy()\n    audio_clip = audio_clip[:, int(dims*(1/3)):].numpy()\n    \n    # rexnet\n    p1 = time.perf_counter()\n    outputs_1 = model_wo_quant.infer(audio_clip)\n    outputs_1 = outputs_1[list(outputs_1.keys())[0]]\n    outputs_1 = sigmoid(outputs_1)\n    times_wo_quant.append(time.perf_counter()-p1)\n    predictions_wo_quant.append(outputs_1)\n    \n    p2 = time.perf_counter()\n    outputs_2 = model_quant.infer(audio_clip)\n    outputs_2 = outputs_2[list(outputs_2.keys())[0]]\n    outputs_2 = sigmoid(outputs_2)\n    times_quant.append(time.perf_counter()-p2)\n    predictions_quant.append(outputs_2)\n    \npredictions_wo_quant = np.concatenate(predictions_wo_quant)\npredictions_quant = np.concatenate(predictions_quant)\nprint (datetime.now()-start)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:44:52.969135Z","iopub.execute_input":"2024-06-08T18:44:52.969527Z","iopub.status.idle":"2024-06-08T18:45:34.387860Z","shell.execute_reply.started":"2024-06-08T18:44:52.969492Z","shell.execute_reply":"2024-06-08T18:45:34.386498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 初回=wamupを除いた合計時間\nprint(f\"times w/o  quantization: {sum(times_wo_quant[1:]):.3f} sec\")\nprint(f\"times with quantization: {sum(times_quant[1:]):.3f} sec\")","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.390032Z","iopub.execute_input":"2024-06-08T18:45:34.390529Z","iopub.status.idle":"2024-06-08T18:45:34.398177Z","shell.execute_reply.started":"2024-06-08T18:45:34.390476Z","shell.execute_reply":"2024-06-08T18:45:34.396923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bird_cols = list(pd.get_dummies(df_train['primary_label']).columns)\ndf_predictions_wo_quant = pd.DataFrame(predictions_wo_quant, columns=bird_cols)\ndf_predictions_quant = pd.DataFrame(predictions_quant, columns=bird_cols)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.399573Z","iopub.execute_input":"2024-06-08T18:45:34.399938Z","iopub.status.idle":"2024-06-08T18:45:34.418207Z","shell.execute_reply.started":"2024-06-08T18:45:34.399907Z","shell.execute_reply":"2024-06-08T18:45:34.417037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_predictions_wo_quant","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.419630Z","iopub.execute_input":"2024-06-08T18:45:34.420157Z","iopub.status.idle":"2024-06-08T18:45:34.457251Z","shell.execute_reply.started":"2024-06-08T18:45:34.420120Z","shell.execute_reply":"2024-06-08T18:45:34.455991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_predictions_quant","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.458937Z","iopub.execute_input":"2024-06-08T18:45:34.459381Z","iopub.status.idle":"2024-06-08T18:45:34.491701Z","shell.execute_reply.started":"2024-06-08T18:45:34.459339Z","shell.execute_reply":"2024-06-08T18:45:34.490368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_row_ids(file, num_rows=48):\n    row_ids = np.array([f'{file}_{(i+1)*5}' for i in range(num_rows)])\n    return row_ids\n\nrow_ids = np.concatenate([make_row_ids(f) for f in df_test[\"filename\"].values])\n# bird_cols = list(pd.get_dummies(df_train['primary_label']).columns)\n# sub_df = pd.DataFrame(columns=['row_id']+bird_cols)\n# sub_df[\"row_id\"] = row_ids\n# sub_df[bird_cols] = predictions\n# row_ids.shape","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.493307Z","iopub.execute_input":"2024-06-08T18:45:34.493739Z","iopub.status.idle":"2024-06-08T18:45:34.505208Z","shell.execute_reply.started":"2024-06-08T18:45:34.493689Z","shell.execute_reply":"2024-06-08T18:45:34.503817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df = df_predictions_wo_quant.copy()\n\ndebug = sub_df.shape[0]<=720\nif debug:\n    import matplotlib.pyplot as plt\n    sub_df_tmp = sub_df.copy()\n    #nocall_df = pd.DataFrame({'nocall': preds[0][1][:,0].tolist()})\n    sub_df_tmp = pd.concat([sub_df_tmp], axis=1)\n    fig, ax = plt.subplots(figsize=(20, 15))\n    heatmap = ax.pcolor(sub_df_tmp.iloc[:48,1:].values.T, edgecolors='k', linewidths=0.1, vmin=0, vmax=1, cmap='Blues')\n    # cbar = plt.colorbar(heatmap)\n    ax.set_xticks(np.arange(0, 48+0.5, 12))\n    ax.set_yticks(np.arange(sub_df_tmp.shape[1]-1))\n    ax.set_xticklabels(np.arange(0,245,60))\n    #ax.set_yticklabels(CFG.target_columns)\n    plt.xlabel('sec')\n    plt.ylabel('species')\n    fig.tight_layout()\n    fig, ax = plt.subplots(figsize=(15, 0.5))\n    #heatmap = ax.pcolor(sub_df_tmp.T, edgecolors='k', linewidths=0.1, vmin=0, vmax=1, cmap='Blues')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:34.506939Z","iopub.execute_input":"2024-06-08T18:45:34.507376Z","iopub.status.idle":"2024-06-08T18:45:36.563629Z","shell.execute_reply.started":"2024-06-08T18:45:34.507336Z","shell.execute_reply":"2024-06-08T18:45:36.562309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df = df_predictions_quant.copy()\n\ndebug = sub_df.shape[0]<=720\nif debug:\n    import matplotlib.pyplot as plt\n    sub_df_tmp = sub_df.copy()\n    #nocall_df = pd.DataFrame({'nocall': preds[0][1][:,0].tolist()})\n    sub_df_tmp = pd.concat([sub_df_tmp], axis=1)\n    fig, ax = plt.subplots(figsize=(20, 15))\n    heatmap = ax.pcolor(sub_df_tmp.iloc[:48,1:].values.T, edgecolors='k', linewidths=0.1, vmin=0, vmax=1, cmap='Blues')\n    # cbar = plt.colorbar(heatmap)\n    ax.set_xticks(np.arange(0, 48+0.5, 12))\n    ax.set_yticks(np.arange(sub_df_tmp.shape[1]-1))\n    ax.set_xticklabels(np.arange(0,245,60))\n    #ax.set_yticklabels(CFG.target_columns)\n    plt.xlabel('sec')\n    plt.ylabel('species')\n    fig.tight_layout()\n    fig, ax = plt.subplots(figsize=(15, 0.5))\n    #heatmap = ax.pcolor(sub_df_tmp.T, edgecolors='k', linewidths=0.1, vmin=0, vmax=1, cmap='Blues')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T18:45:36.565358Z","iopub.execute_input":"2024-06-08T18:45:36.565876Z","iopub.status.idle":"2024-06-08T18:45:38.339860Z","shell.execute_reply.started":"2024-06-08T18:45:36.565829Z","shell.execute_reply":"2024-06-08T18:45:38.338735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}