{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Install Packages","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"!cp -r /kaggle/input/python-packages /kaggle/working\n!pip install /kaggle/working/python-packages/pylibjpeg_libjpeg-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n!pip install /kaggle/working/python-packages/pylibjpeg_openjpeg-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n!pip install /kaggle/working/python-packages/pylibjpeg_rle-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n!pip install /kaggle/working/python-packages/portalocker-2.8.2-py3-none-any.whl\n!pip install /kaggle/working/python-packages/iopath-0.1.9-py3-none-any.whl\n!pip install /kaggle/working/python-packages/av-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n!pip install /kaggle/working/python-packages/yacs-0.1.8-py3-none-any.whl\n!pip install /kaggle/working/python-packages/fvcore-0.1.5.post20220512/\n!pip install /kaggle/working/python-packages/tokenizers-0.12.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n!pip install /kaggle/working/python-packages/transformers-4.19.2-py3-none-any.whl\n!pip install /kaggle/working/python-packages/parameterized-0.8.1-py2.py3-none-any.whl\n!pip install /kaggle/working/python-packages/pytorchvideo-0.1.5/\n!pip install /kaggle/working/python-packages/timm-0.6.7-py3-none-any.whl\n!pip install /kaggle/working/python-packages/antlr4-python3-runtime-4.9.3/\n!pip install /kaggle/working/python-packages/omegaconf-2.2.2-py3-none-any.whl\n!pip install /kaggle/working/python-packages/monai-0.8.1-202202162213-py3-none-any.whl\n\n!cp /kaggle/input/gdcm-conda-install/gdcm.tar /kaggle/working/\n!tar -xzvf gdcm.tar\n!conda install --offline /kaggle/working/gdcm/gdcm-2.8.9-py37h71b2a6d_0.tar.bz2","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:08:55.717193Z","iopub.execute_input":"2023-10-13T00:08:55.717995Z","iopub.status.idle":"2023-10-13T00:17:05.665196Z","shell.execute_reply.started":"2023-10-13T00:08:55.71796Z","shell.execute_reply":"2023-10-13T00:17:05.664046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Imports","metadata":{}},{"cell_type":"code","source":"import sys\nsys.path.insert(0, \"/kaggle/input/rsna-trauma-src/\")\n\nimport glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport pandas as pd\nimport pydicom\nimport time\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom omegaconf import OmegaConf\nfrom scipy.ndimage import zoom\nfrom sklearn.metrics import roc_auc_score\nfrom torch.utils.data import Dataset, DataLoader\nfrom tqdm import tqdm\n\nfrom skp import builder","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:17:05.667545Z","iopub.execute_input":"2023-10-13T00:17:05.667895Z","iopub.status.idle":"2023-10-13T00:17:45.449987Z","shell.execute_reply.started":"2023-10-13T00:17:05.66786Z","shell.execute_reply":"2023-10-13T00:17:45.449013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Functions","metadata":{}},{"cell_type":"code","source":"def window(x, WL=50, WW=400):\n    lower, upper = WL - WW // 2, WL + WW // 2\n    x = np.clip(x, lower, upper)\n    x = x - lower\n    x = x / (upper - lower)\n    x = np.uint8(x * 255)\n    return x\n\n\ndef preprocess(x):\n    x = x / 255.0\n    x = x - 0.5\n    x = x * 2.0\n    return x\n\n\ndef load_dicom(fp, return_position=False):\n    dcm = pydicom.dcmread(fp)\n    arr = dcm.pixel_array\n    if dcm.PixelRepresentation == 1:\n        bit_shift = dcm.BitsAllocated - dcm.BitsStored\n        dtype = arr.dtype\n        arr = (arr << bit_shift).astype(dtype) >> bit_shift\n    arr = np.float32(arr)\n    slope = int(dcm.RescaleSlope)\n    intercept = int(dcm.RescaleIntercept)\n    arr = slope * arr + intercept\n    if return_position:\n        return arr, float(dcm.ImagePositionPatient[-2])\n    return arr\n\n\ndef convert_dicom_to_3ch_png(arr):\n    win1 = window(arr, WL=50, WW=400) # soft tissue\n    win2 = window(arr, WL=90, WW=150) # liver\n    win3 = window(arr, WL=100, WW=700) # angiography\n    arr = np.stack([win1, win2, win3], axis=-1)\n    return arr\n\n\ndef unscale_coords_and_convert_to_xyxy(c, img_h, img_w):\n    xc, yc, w, h = c\n    xc, yc, w, h = int(xc * img_w), int(yc * img_h), int(w * img_w), int(h * img_h)\n    x1, y1 = xc - w // 2, yc - h // 2\n    x2, y2 = x1 + w, y1 + h\n    x1, y1 = max(0, x1), max(0, y1)\n    x2, y2 = min(x2, img_w), min(y2, img_h)\n    return x1, y1, x2, y2\n\n\ndef crop_img(img, c):\n    x1, y1, x2, y2 = c\n    return img[y1:y2, x1:x2]\n\n\ndef crop_stack(array, model):\n    # array is torch tensor with shape (1, num_slices, h, w, num_channels)\n    h, w = array.size(2), array.size(3)\n    array = F.interpolate(array.squeeze(0).permute(0, 3, 1, 2), (256, 256)).float()\n    array = preprocess(array)\n    with torch.inference_mode():\n        coords = model(array[:, 0].unsqueeze(1)).cpu().numpy()\n    coords = np.stack([unscale_coords_and_convert_to_xyxy(c, h, w) for c in coords])\n    x1, y1, x2, y2 = coords[:, 0].min(), coords[:, 1].min(), coords[:, 2].max(), coords[:, 3].max()\n    return x1, y1, x2, y2\n\n\ndef crop_lks(array, model):\n    # array is torch tensor with shape (num_slices, h, w, num_channels)\n    array = F.interpolate(array.permute(0, 3, 1, 2), (256, 256)).float()\n    array = preprocess(array)\n    with torch.inference_mode():\n        lks = model(array).cpu().numpy()\n    lks = (lks >= 0.10).astype(int)\n    lks = lks.sum(1)\n    lks = np.where(lks > 0)[0]\n    return lks\n\n\ndef resample_indices(indices, num_slices):\n    indices_resampled = zoom(indices, num_slices / len(indices), order=0, prefilter=False).astype(int)\n    assert len(indices_resampled) == num_slices\n    return indices_resampled\n\n\ndef run_lks3d(array, model, num_slices=96):\n    # array is torch tensor with shape (num_slices, h, w, num_channels)\n    indices = np.arange(array.size(0))\n    indices = resample_indices(indices, num_slices)\n    array = array[indices]\n    assert array.size(0) == num_slices\n    array = F.interpolate(array.permute(3, 0, 1, 2).unsqueeze(0), (num_slices, 288, 384)).float()\n    array = preprocess(array)\n    with torch.inference_mode():\n        lks_pred = model(array).cpu().numpy()\n    return lks_pred\n\n\ndef run_lks2d(array, model, num_slices=128):\n    # array is torch tensor with shape (num_slices, h, w, num_channels)\n    indices = np.arange(array.size(0))\n    if len(indices) > num_slices:\n        indices = resample_indices(indices, num_slices)\n        array = array[indices]\n    array = F.interpolate(array.permute(0, 3, 1, 2).float(), (288, 384), mode=\"bilinear\")\n    array = preprocess(array)\n    with torch.inference_mode():\n        lks_pred = model(array, num_slices).cpu().numpy()\n    return lks_pred\n\n\ndef run_extrav(array, model, num_slices=128):\n    # array is torch tensor with shape (num_slices, h, w, num_channels)\n    indices = np.arange(array.size(0))\n    if len(indices) > num_slices:\n        indices = resample_indices(indices, num_slices)\n        array = array[indices]\n    array = F.interpolate(array.permute(0, 3, 1, 2).float(), (384, 512), mode=\"bilinear\")\n    array = preprocess(array)\n    with torch.inference_mode():\n        extrav_pred = model(array, num_slices).cpu().numpy()\n    return extrav_pred\n\n\ndef run_bowel(array, model, num_slices=128):\n    # array is torch tensor with shape (num_slices, h, w, num_channels)\n    indices = np.arange(array.size(0))\n    if len(indices) > num_slices:\n        indices = resample_indices(indices, num_slices)\n        array = array[indices]\n    array = F.interpolate(array.permute(0, 3, 1, 2).float(), (384, 512), mode=\"bilinear\")\n    array = preprocess(array)\n    with torch.inference_mode():\n        bowel_pred = model(array, num_slices).cpu().numpy()\n    return bowel_pred","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:17:45.451526Z","iopub.execute_input":"2023-10-13T00:17:45.452562Z","iopub.status.idle":"2023-10-13T00:17:45.472045Z","shell.execute_reply.started":"2023-10-13T00:17:45.45253Z","shell.execute_reply":"2023-10-13T00:17:45.471105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Classes","metadata":{}},{"cell_type":"code","source":"class SeriesDataset(Dataset):\n    \n    def __init__(self,\n                 series_list,\n                 max_images_to_load):\n        self.series_list = series_list\n        self.max_images_to_load = max_images_to_load\n    \n    def __len__(self):\n        return len(self.series_list)\n        \n    def __getitem__(self, i):\n        dicom_files = np.asarray(glob.glob(os.path.join(self.series_list[i], \"*\")))\n        slice_num = [int(os.path.basename(d).split(\".\")[0]) for d in dicom_files]\n        dicom_files = dicom_files[np.argsort(slice_num)]\n        indices = np.arange(len(dicom_files))\n        if len(indices) > self.max_images_to_load:\n            indices_to_load = zoom(indices, self.max_images_to_load / len(indices), prefilter=False, order=0).astype(int)\n        else:\n            indices_to_load = indices \n        array = []\n        for idx in indices_to_load:\n            try:\n                array.append(load_dicom(dicom_files[idx]))\n            except:\n                continue\n        array = np.stack(array)\n        array = convert_dicom_to_3ch_png(array) \n        assert len(array) <= self.max_images_to_load\n        return array \n    \n    \n    \nclass Ensemble(nn.Module):\n    \n    def __init__(self, model_list):\n        super().__init__()\n        self.models = nn.ModuleList(model_list)\n    \n    def forward(self, x):\n        out = torch.sigmoid(torch.stack([m(x) for m in self.models])).mean(0)\n        return out            \n    \n\nclass TwoStageEnsemble(nn.Module):\n    \n    def __init__(self, cnn_model_list, tf_model_list):\n        super().__init__()\n        self.cnn_models = nn.ModuleList(cnn_model_list)\n        self.tf_models = nn.ModuleList(tf_model_list)\n        assert len(self.cnn_models) == len(self.tf_models)\n        \n    def forward(self, x, num_slices):\n        out_list = []\n        for cnn_mod, tf_mod in zip(self.cnn_models, self.tf_models):\n            feats = cnn_mod.extract_features(x)\n            if feats.size(0) != num_slices:\n                indices = np.arange(feats.size(0))\n                indices = resample_indices(indices, num_slices)\n                feats = feats[indices]\n            assert feats.size(0) == num_slices\n            mask = torch.ones((1, feats.size(0)))\n            out = tf_mod((feats.unsqueeze(0), mask.to(feats.device)))\n            out_list.append(out)\n        return torch.stack(out_list).mean(0)\n    \n    \nclass LKSEnsemble(nn.Module):\n    \n    def __init__(self, cnn_model_list, tf_model_list):\n        super().__init__()\n        self.cnn_models = nn.ModuleList(cnn_model_list)\n        self.tf_models = nn.ModuleList(tf_model_list)\n        assert len(self.cnn_models) == len(self.tf_models)\n        \n    def forward(self, x, num_slices):\n        out_list = []\n        for cnn_mod, tf_mod in zip(self.cnn_models, self.tf_models):\n            feats = cnn_mod.extract_features(x)\n            if feats.size(0) != num_slices:\n                indices = np.arange(feats.size(0))\n                indices = resample_indices(indices, num_slices)\n                feats = feats[indices]\n            assert feats.size(0) == num_slices\n            mask = torch.ones((1, feats.size(0)))\n            p1, p2, p3 = tf_mod((feats.unsqueeze(0), mask.to(feats.device)))\n            out_list.append(torch.cat([p1, p2, p3], dim=1))\n        return torch.stack(out_list).mean(0)\n\n    \nclass ThreeStageEnsemble(nn.Module):\n    \n    def __init__(self, cnn_model_list, tf1_model_list, tf2_model_list):\n        super().__init__()\n        self.cnn_models = nn.ModuleList(cnn_model_list)\n        self.tf1_models = nn.ModuleList(tf1_model_list)\n        self.tf2_models = nn.ModuleList(tf2_model_list)\n        self.tile_size = 128\n        self.tile_batch_size = 128\n        assert len(self.cnn_models) == len(self.tf1_models) == len(self.tf2_models)\n        \n    def forward(self, x, num_slices):\n        out_list = []\n        for cnn_mod, tf1_mod, tf2_mod in zip(self.cnn_models, self.tf1_models, self.tf2_models):\n            tiles = self.tile_image(x)\n            B, N, C, H, W = tiles.size()\n            tiles = tiles.reshape(B*N, C, H, W)\n            feats = torch.cat([cnn_mod.extract_features(tiles[i:i+self.tile_batch_size]) for i in range(0, len(tiles), self.tile_batch_size)])\n            feats = feats.reshape(B, N, -1)\n            if B != num_slices:\n                indices = np.arange(B)\n                indices = resample_indices(indices, num_slices)\n                feats = feats[indices]\n            assert feats.size(0) == num_slices\n            mask = torch.ones((feats.size(0), feats.size(1)))\n            out = tf1_mod.extract_features((feats, mask.to(feats.device)))\n            mask = torch.ones((1, out.size(0)))\n            out = tf2_mod((out.unsqueeze(0), mask.to(out.device)))\n            out_list.append(out)\n        return torch.stack(out_list).mean(0)\n    \n    def tile_image(self, x, num_rows=3, num_cols=4):\n        # x.shape = (B, C, H, W)\n        b, c, h, w = x.shape\n        assert h >= self.tile_size and w >= self.tile_size\n        h_c = np.linspace(0, h - self.tile_size, num_rows).astype(\"int\")\n        w_c = np.linspace(0, w - self.tile_size, num_cols).astype(\"int\")\n        coords = []\n        for i in h_c:\n            for j in w_c:\n                coords.append((i, j))\n        return torch.stack([x[:, :, i:i+self.tile_size, j:j+self.tile_size] for i, j in coords], dim=1)\n","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:17:45.474677Z","iopub.execute_input":"2023-10-13T00:17:45.475314Z","iopub.status.idle":"2023-10-13T00:17:45.497313Z","shell.execute_reply.started":"2023-10-13T00:17:45.475284Z","shell.execute_reply":"2023-10-13T00:17:45.496343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load Models","metadata":{}},{"cell_type":"code","source":"FOLDS = [0, 1, 2, 3, 4]\n\ncrop_models = []\nfor i in FOLDS:\n    crop_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/initcrop/initcrop000.yaml\")\n    crop_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-initcrop000/fold{i}.ckpt\"\n    crop_cfg.model.params.pretrained = False \n    crop_models.append(builder.build_model(crop_cfg).cuda().eval())\n\ncrop_ensemble = Ensemble(crop_models).cuda().eval()\n\norgan_models = []\nfor i in FOLDS:\n    organ_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/organcls/organcls000.yaml\")\n    organ_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-organcls000/fold{i}.ckpt\"\n    organ_cfg.model.params.pretrained = False \n    organ_models.append(builder.build_model(organ_cfg).cuda().eval())\n\norgan_ensemble = Ensemble(organ_models).cuda().eval()\n\nlks2d_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     lks2d_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/lks2d/lks2d003.yaml\")\n#     lks2d_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-lks2d003/fold{i}.ckpt\"\n#     lks2d_cfg.model.params.pretrained = False \n#     lks2d_models.append(builder.build_model(lks2d_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    lks2d_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/lks2d/lks2d100.yaml\")\n    lks2d_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-lks2d100/fold{i}.ckpt\"\n    lks2d_cfg.model.params.pretrained = False \n    lks2d_models.append(builder.build_model(lks2d_cfg).cuda().eval())\n\nlks2dseq_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     lks2dseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/lks2dseq/lks2dseq101.yaml\")\n#     lks2dseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-lks2dseq101/fold{i}.ckpt\"\n#     lks2dseq_models.append(builder.build_model(lks2dseq_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    lks2dseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/lks2dseq/lks2dseq101b.yaml\")\n    lks2dseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-lks2dseq101b/fold{i}.ckpt\"\n    lks2dseq_models.append(builder.build_model(lks2dseq_cfg).cuda().eval())\n\nlks2d_ensemble = LKSEnsemble(lks2d_models, lks2dseq_models).cuda().eval()\n\nbowel_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     bowel_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/bowel/bowel000.yaml\")\n#     bowel_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-bowel000/fold{i}.ckpt\"\n#     bowel_cfg.model.params.pretrained = False \n#     bowel_models.append(builder.build_model(bowel_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    bowel_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/bowel/bowel001.yaml\")\n    bowel_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-bowel001/fold{i}.ckpt\"\n    bowel_cfg.model.params.pretrained = False \n    bowel_models.append(builder.build_model(bowel_cfg).cuda().eval())\n    \nbowelseq_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     bowelseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/bowelseq/bowelseq100.yaml\")\n#     bowelseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-bowelseq100/fold{i}.ckpt\"\n#     bowelseq_models.append(builder.build_model(bowelseq_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    bowelseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/bowelseq/bowelseq101.yaml\")\n    bowelseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-bowelseq101/fold{i}.ckpt\"\n    bowelseq_models.append(builder.build_model(bowelseq_cfg).cuda().eval())\n    \nbowel_ensemble = TwoStageEnsemble(bowel_models, bowelseq_models).cuda().eval()\n\nextrav_patch_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     extrav_patch_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_patch/extrav_patch001.yaml\")\n#     extrav_patch_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-patch001/fold{i}.ckpt\"\n#     extrav_patch_cfg.model.params.pretrained = False \n#     extrav_patch_models.append(builder.build_model(extrav_patch_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    extrav_patch_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_patch/extrav_patch004.yaml\")\n    extrav_patch_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-patch004/fold{i}.ckpt\"\n    extrav_patch_cfg.model.params.pretrained = False \n    extrav_patch_models.append(builder.build_model(extrav_patch_cfg).cuda().eval())\n    \nextrav_fullseq_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     extrav_fullseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_fullseq/extrav_fullseq001.yaml\")\n#     extrav_fullseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-fullseq001/fold{i}.ckpt\"\n#     extrav_fullseq_models.append(builder.build_model(extrav_fullseq_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    extrav_fullseq_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_fullseq/extrav_fullseq006.yaml\")\n    extrav_fullseq_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-fullseq006/fold{i}.ckpt\"\n    extrav_fullseq_models.append(builder.build_model(extrav_fullseq_cfg).cuda().eval())\n    \nextrav_series_models = []\n# tf_efficientnetv2_s\n# for i in FOLDS[:2]:\n#     extrav_series_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_series/extrav_series101.yaml\")\n#     extrav_series_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-series-101/fold{i}.ckpt\"\n#     extrav_series_models.append(builder.build_model(extrav_series_cfg).cuda().eval())\n# convnext_tiny\nfor i in FOLDS:\n    extrav_series_cfg = OmegaConf.load(\"/kaggle/input/rsna-trauma-src/configs/extrav_series/extrav_series101b.yaml\")\n    extrav_series_cfg.model.load_pretrained = f\"/kaggle/input/rsna-trauma-extrav-series101b/fold{i}.ckpt\"\n    extrav_series_models.append(builder.build_model(extrav_series_cfg).cuda().eval())\n    \nextrav_ensemble = ThreeStageEnsemble(extrav_patch_models, extrav_fullseq_models, extrav_series_models)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:17:45.498728Z","iopub.execute_input":"2023-10-13T00:17:45.499389Z","iopub.status.idle":"2023-10-13T00:18:20.76639Z","shell.execute_reply.started":"2023-10-13T00:17:45.499358Z","shell.execute_reply":"2023-10-13T00:18:20.7654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"series_list = glob.glob(\"/kaggle/input/rsna-2023-abdominal-trauma-detection/test_images/*/*\")\n\n# folds_df = pd.read_csv(\"/kaggle/input/rsna-trauma-folds/train_folds.csv\")\n# series_list = [s for s in series_list if int(os.path.basename(s)) in folds_df[folds_df.outer == FOLDS[0]].series_id.tolist()]\n\ndset = SeriesDataset(series_list, 256)\nloader = DataLoader(dset, batch_size=1, num_workers=2, drop_last=False, shuffle=False)\n\npred_list = []\ncurrent_iter = 0\nfor batch in tqdm(loader):\n    tic = time.time()\n    x1, y1, x2, y2 = crop_stack(batch.cuda(), crop_ensemble)\n    batch_crop = batch.squeeze(0)[:, y1:y2, x1:x2]\n    toc = time.time() - tic \n    print(f\"1- CROPPING took {toc:0.2f} s\")\n    \n    tic = time.time()\n    lks = crop_lks(batch_crop.cuda(), organ_ensemble)\n    toc = time.time() - tic\n    print(f\"2- LKS TRIMMING took {toc:0.2f} s\")\n    \n    tic = time.time()\n    lks_pred = run_lks2d(batch_crop[lks].cuda(), lks2d_ensemble)[0]\n    toc = time.time() - tic\n    print(f\"3- LKS PRED took {toc:0.2f} s\")\n    \n    tic = time.time()\n    extrav_pred = run_extrav(batch_crop.cuda(), extrav_ensemble)[0]\n    toc = time.time() - tic\n    print(f\"4- EXTRAV PRED took {toc:0.2f} s\")\n    \n    tic = time.time() \n    bowel_pred = run_bowel(batch_crop.cuda(), bowel_ensemble)[0]\n    toc = time.time() - tic\n    print(f\"5- BOWEL PRED took {toc:0.2f} s\")\n    \n    pred_list.append(np.concatenate([lks_pred, extrav_pred, bowel_pred]))\n    \n    if current_iter % 10 == 0:\n        print(f\"PROGRESS: {current_iter} / {len(loader)}\")\n    current_iter += 1","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:18:20.767656Z","iopub.execute_input":"2023-10-13T00:18:20.768215Z","iopub.status.idle":"2023-10-13T00:19:16.356181Z","shell.execute_reply.started":"2023-10-13T00:18:20.768182Z","shell.execute_reply":"2023-10-13T00:19:16.354619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df = np.stack(pred_list)\npred_df = pd.DataFrame(pred_df)\ncol_names = [\"liver_healthy\", \"liver_low\", \"liver_high\", \"spleen_healthy\", \"spleen_low\", \"spleen_high\", \"kidney_healthy\", \"kidney_low\", \"kidney_high\", \"extravasation_healthy\", \"extravasation_injury\", \"bowel_healthy\", \"bowel_injury\"]\npred_df.columns = col_names\npred_df[\"series_id\"] = series_list[:len(pred_df)]\npred_df[\"patient_id\"] = pred_df.series_id.apply(lambda x: x.split(\"/\")[-2]).astype(int)\npred_df[\"series_id\"] = pred_df.series_id.apply(lambda x: x.split(\"/\")[-1]).astype(int)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:19:16.357657Z","iopub.status.idle":"2023-10-13T00:19:16.358347Z","shell.execute_reply.started":"2023-10-13T00:19:16.358101Z","shell.execute_reply":"2023-10-13T00:19:16.358123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df = pred_df.groupby(\"patient_id\").mean().reset_index()\ndel pred_df[\"series_id\"]\n# pred_df[col_names] = pred_df[col_names] ** 0.5","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:19:16.359555Z","iopub.status.idle":"2023-10-13T00:19:16.36022Z","shell.execute_reply.started":"2023-10-13T00:19:16.359981Z","shell.execute_reply":"2023-10-13T00:19:16.360003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/*","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:19:16.361368Z","iopub.status.idle":"2023-10-13T00:19:16.362121Z","shell.execute_reply.started":"2023-10-13T00:19:16.361833Z","shell.execute_reply":"2023-10-13T00:19:16.361854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df.to_csv(\"/kaggle/working/submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T00:19:16.363514Z","iopub.status.idle":"2023-10-13T00:19:16.36415Z","shell.execute_reply.started":"2023-10-13T00:19:16.363934Z","shell.execute_reply":"2023-10-13T00:19:16.363955Z"},"trusted":true},"execution_count":null,"outputs":[]}]}