{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":100132,"sourceType":"modelInstanceVersion","modelInstanceId":64905,"modelId":89293},{"sourceId":111114,"sourceType":"modelInstanceVersion","modelInstanceId":85952,"modelId":84065}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# WELCOME EVERYONE IN MY NOTEBOOK","metadata":{}},{"cell_type":"markdown","source":"# Install Dependencies","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:41:13.98116Z","iopub.execute_input":"2024-09-22T18:41:13.981579Z","iopub.status.idle":"2024-09-22T18:41:13.988445Z","shell.execute_reply.started":"2024-09-22T18:41:13.981542Z","shell.execute_reply":"2024-09-22T18:41:13.987066Z"}}},{"cell_type":"code","source":"%pip install --quiet /kaggle/input/timm_3d_deps/other/initial/9/pydicom/pydicom/pydicom-2.4.4-py3-none-any.whl\n%pip install timm_3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/timm_3d/\n%pip install torchio --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/torchio/\n%pip install itk --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/itk/itk\n%pip install skorch --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/skorch/skorch\n%pip install spacecutter --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/spacecutter/\n%pip install open3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/open3d","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:48:47.010489Z","iopub.execute_input":"2024-09-24T13:48:47.010897Z","iopub.status.idle":"2024-09-24T13:50:42.501859Z","shell.execute_reply.started":"2024-09-24T13:48:47.010857Z","shell.execute_reply":"2024-09-24T13:50:42.500714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import library","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport open3d as o3d\nfrom pydicom import dcmread\nimport math\nimport numpy as np\nimport cv2\nimport copy\nimport numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nimport torchio as tio\nimport torch.nn as nn\nimport pydicom\nimport matplotlib.pyplot as plt\nimport glob \nimport torch\nimport torch.nn as nn\nimport timm_3d\nfrom spacecutter import *\nfrom spacecutter.losses import *\nfrom spacecutter.models import *\nfrom spacecutter.callbacks import *\nimport glob\nimport os\nimport torch\nfrom torch.cuda.amp import autocast\nimport time\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:50:42.504055Z","iopub.execute_input":"2024-09-24T13:50:42.504378Z","iopub.status.idle":"2024-09-24T13:50:52.059159Z","shell.execute_reply.started":"2024-09-24T13:50:42.504343Z","shell.execute_reply":"2024-09-24T13:50:52.058342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Retrieval","metadata":{}},{"cell_type":"code","source":"data_path = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/\"\ndef retrieve_test_data(data_path):\n    test_df = pd.read_csv(data_path + 'test_series_descriptions.csv')\n    print(\"Test data retrieved successfully.\")\n    return test_df\n\nretrieve_test_data(data_path)","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:51:14.848354Z","iopub.execute_input":"2024-09-24T13:51:14.849238Z","iopub.status.idle":"2024-09-24T13:51:14.877613Z","shell.execute_reply.started":"2024-09-24T13:51:14.849196Z","shell.execute_reply":"2024-09-24T13:51:14.876656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Retrieve Image Paths","metadata":{}},{"cell_type":"code","source":"def retrieve_image_paths(base_path, study_id, series_id):\n    series_dir = os.path.join(base_path, str(study_id), str(series_id))\n    images = os.listdir(series_dir)\n    image_paths = [os.path.join(series_dir, img) for img in images]\n    print(f\"Retrieved image paths for study_id: {study_id}, series_id: {series_id}.\")\n    return image_paths","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:51:18.5208Z","iopub.execute_input":"2024-09-24T13:51:18.52164Z","iopub.status.idle":"2024-09-24T13:51:18.526942Z","shell.execute_reply.started":"2024-09-24T13:51:18.521599Z","shell.execute_reply":"2024-09-24T13:51:18.525899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read Study as PCD","metadata":{}},{"cell_type":"code","source":"# Step 3: Read Study as Point Cloud Data\ndef read_study_as_pcd(dir_path, series_types_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = o3d.geometry.PointCloud()\n\n    for path in glob.glob(os.path.join(dir_path, \"**/*.dcm\"), recursive=True):\n        dicom_slice = dcmread(path)\n\n        series_id = os.path.basename(os.path.dirname(path))\n        study_id = os.path.basename(os.path.dirname(os.path.dirname(path)))\n        if series_types_dict is None or int(series_id) not in series_types_dict:\n            series_desc = dicom_slice.SeriesDescription\n        else:\n            series_desc = series_types_dict[int(series_id)]\n            series_desc = series_desc.split(\" \")[-1]\n\n        x_orig, y_orig = dicom_slice.pixel_array.shape\n        img = np.expand_dims(cv2.resize(dicom_slice.pixel_array, img_size, interpolation=cv2.INTER_AREA), -1)\n        x, y, z = np.where(img)\n\n        downsampling_factor_iter = max(downsampling_factor, int(math.ceil(len(x) / 6e6)))\n\n        index_voxel = np.vstack((x, y, z))[:, ::downsampling_factor_iter]\n        grid_index_array = index_voxel.T\n        pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(grid_index_array.astype(np.float64)))\n\n        vals = np.expand_dims(img[x, y, z][::downsampling_factor_iter], -1)\n        if series_desc == \"T1\":\n            vals = np.pad(vals, ((0, 0), (0, 2)))\n        elif series_desc == \"T2\":\n            vals = np.pad(vals, ((0, 0), (1, 1)))\n        elif series_desc == \"T2/STIR\":\n            vals = np.pad(vals, ((0, 0), (2, 0)))\n        else:\n            raise ValueError(f\"Unknown series desc: {series_desc}\")\n\n        pcd.colors = o3d.utility.Vector3dVector(vals.astype(np.float64))\n\n        dX, dY = dicom_slice.PixelSpacing\n        dZ = dicom_slice.SliceThickness\n\n        X = np.array(list(dicom_slice.ImageOrientationPatient[:3]) + [0]) * dX\n        Y = np.array(list(dicom_slice.ImageOrientationPatient[3:]) + [0]) * dY\n\n        for z in range(int(dZ)):\n            pos = list(dicom_slice.ImagePositionPatient)\n            if series_desc == \"T2\":\n                pos[-1] += z\n            else:\n                pos[0] += z\n            S = np.array(pos + [1])\n\n            transform_matrix = np.array([X, Y, np.zeros(len(X)), S]).T\n            transform_matrix = transform_matrix @ np.matrix(\n                [[0, y_orig / img_size[1], 0, 0],\n                 [x_orig / img_size[0], 0, 0, 0],\n                 [0, 0, 1, 0],\n                 [0, 0, 0, 1]]\n            )\n\n            pcd_overall += copy.deepcopy(pcd).transform(transform_matrix)\n\n    return pcd_overall","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:51:20.819953Z","iopub.execute_input":"2024-09-24T13:51:20.82056Z","iopub.status.idle":"2024-09-24T13:51:20.84199Z","shell.execute_reply.started":"2024-09-24T13:51:20.820522Z","shell.execute_reply":"2024-09-24T13:51:20.840611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read Study as Voxel Grid","metadata":{}},{"cell_type":"code","source":"def read_study_as_voxel_grid(dir_path, series_type_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = read_study_as_pcd(dir_path,\n                                    series_types_dict=series_type_dict,\n                                    downsampling_factor=downsampling_factor,\n                                    img_size=img_size)\n    box = pcd_overall.get_axis_aligned_bounding_box()\n\n    max_b = np.array(box.get_max_bound())\n    min_b = np.array(box.get_min_bound())\n\n    pts = (np.array(pcd_overall.points) - (min_b)) * (\n                (img_size[0] - 1, img_size[0] - 1, img_size[0] - 1) / (max_b - min_b))\n    coords = np.round(pts).astype(np.int32)\n    vals = np.array(pcd_overall.colors, dtype=np.float16)\n\n    grid = np.zeros((3, img_size[0], img_size[0], img_size[0]), dtype=np.float16)\n    indices = coords[:, 0], coords[:, 1], coords[:, 2]\n\n    np.maximum.at(grid[0], indices, vals[:, 0])\n    np.maximum.at(grid[1], indices, vals[:, 1])\n    np.maximum.at(grid[2], indices, vals[:, 2])\n\n    print(\"Study read as voxel grid successfully.\")\n    return grid\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:51:24.164682Z","iopub.execute_input":"2024-09-24T13:51:24.1651Z","iopub.status.idle":"2024-09-24T13:51:24.174721Z","shell.execute_reply.started":"2024-09-24T13:51:24.165061Z","shell.execute_reply":"2024-09-24T13:51:24.173685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Patient Level Testset","metadata":{}},{"cell_type":"code","source":"CONDITIONS = {\n    \"Sagittal T2/STIR\": [\"Spinal Canal Stenosis\"],\n    \"Axial T2\": [\"Left Subarticular Stenosis\", \"Right Subarticular Stenosis\"],\n    \"Sagittal T1\": [\"Left Neural Foraminal Narrowing\", \"Right Neural Foraminal Narrowing\"],\n}","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:51:55.691957Z","iopub.execute_input":"2024-09-24T13:51:55.692336Z","iopub.status.idle":"2024-09-24T13:51:55.697187Z","shell.execute_reply.started":"2024-09-24T13:51:55.692297Z","shell.execute_reply":"2024-09-24T13:51:55.695995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class PatientLevelTestset(Dataset):\n    def __init__(self,\n                 base_path: str,\n                 dataframe: pd.DataFrame,\n                 transform_3d=None):\n        self.base_path = base_path\n\n        self.dataframe = (dataframe[['study_id', \"series_id\", \"series_description\"]]\n                          .drop_duplicates())\n\n        self.subjects = self.dataframe[['study_id']].drop_duplicates().reset_index(drop=True)\n        self.series_descs = {e[0]: e[1] for e in self.dataframe[[\"series_id\", \"series_description\"]].drop_duplicates().values}\n\n        self.transform_3d = transform_3d\n\n    def __len__(self):\n        return len(self.subjects)\n\n    def __getitem__(self, index):\n        curr = self.subjects.iloc[index]\n        study_path = os.path.join(self.base_path, str(curr[\"study_id\"]))\n\n        study_images = read_study_as_voxel_grid(study_path, self.series_descs)\n\n        if self.transform_3d is not None:\n            study_images = self.transform_3d(torch.FloatTensor(study_images))  # .data\n            return study_images.to(torch.half), str(curr[\"study_id\"])\n\n        return torch.HalfTensor(study_images), str(curr[\"study_id\"])","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:52:10.268938Z","iopub.execute_input":"2024-09-24T13:52:10.26929Z","iopub.status.idle":"2024-09-24T13:52:10.279296Z","shell.execute_reply.started":"2024-09-24T13:52:10.269257Z","shell.execute_reply":"2024-09-24T13:52:10.278324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Data Loader","metadata":{}},{"cell_type":"code","source":"transform_3d = tio.Compose([\n    tio.RescaleIntensity([0, 1]),\n])","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:52:21.324269Z","iopub.execute_input":"2024-09-24T13:52:21.325328Z","iopub.status.idle":"2024-09-24T13:52:21.329302Z","shell.execute_reply.started":"2024-09-24T13:52:21.325285Z","shell.execute_reply":"2024-09-24T13:52:21.328366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_subject_level_testset_and_loader(df: pd.DataFrame,\n                                             transform_3d,\n                                             base_path: str,\n                                             batch_size=1,\n                                             num_workers=0):\n    testset = PatientLevelTestset(base_path, df, transform_3d=transform_3d)\n    test_loader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers)\n    print(\"Subject level testset and data loader created successfully.\")\n    return testset, test_loader","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:52:23.946548Z","iopub.execute_input":"2024-09-24T13:52:23.947459Z","iopub.status.idle":"2024-09-24T13:52:23.952898Z","shell.execute_reply.started":"2024-09-24T13:52:23.947419Z","shell.execute_reply":"2024-09-24T13:52:23.951949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = retrieve_test_data(data_path)\ndataset, dataloader = create_subject_level_testset_and_loader(data, transform_3d, os.path.join(data_path, \"test_images\"))","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:52:46.500086Z","iopub.execute_input":"2024-09-24T13:52:46.500868Z","iopub.status.idle":"2024-09-24T13:52:46.518985Z","shell.execute_reply.started":"2024-09-24T13:52:46.500828Z","shell.execute_reply":"2024-09-24T13:52:46.518102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Grid","metadata":{}},{"cell_type":"code","source":"grid = dataset[0][0]\n\nfig, axs = plt.subplots(3, 3)\n\naxs[0, 0].imshow(grid[0, 128])\naxs[1, 0].imshow(grid[1, 128])\naxs[2, 0].imshow(grid[2, 128])\n\naxs[0, 1].imshow(grid[0, :, 128])\naxs[1, 1].imshow(grid[1, :, 128])\naxs[2, 1].imshow(grid[2, :, 128])\n\naxs[0, 2].imshow(grid[0, :, :, 128])\naxs[1, 2].imshow(grid[1, :, :, 128])\naxs[2, 2].imshow(grid[2, :, :, 128])\n\nplt.show()\nprint(\"Visualization completed.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:53:04.075412Z","iopub.execute_input":"2024-09-24T13:53:04.075827Z","iopub.status.idle":"2024-09-24T13:53:23.402188Z","shell.execute_reply.started":"2024-09-24T13:53:04.075789Z","shell.execute_reply":"2024-09-24T13:53:23.401286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\") if torch.cuda.is_available() else \"cpu\"","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:53:47.535966Z","iopub.execute_input":"2024-09-24T13:53:47.536353Z","iopub.status.idle":"2024-09-24T13:53:47.549205Z","shell.execute_reply.started":"2024-09-24T13:53:47.536316Z","shell.execute_reply":"2024-09-24T13:53:47.548265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Model","metadata":{}},{"cell_type":"code","source":"class CNN_Model_3D_Multihead(nn.Module):\n    def __init__(self,\n                 backbone=\"efficientnet_lite0\",\n                 in_chans=1,\n                 out_classes=5,\n                 cutpoint_margin=0.15,\n                 pretrained=False):\n        super(CNN_Model_3D_Multihead, self).__init__()\n        self.out_classes = out_classes\n\n        self.encoder = timm_3d.create_model(\n            backbone,\n            features_only=False,\n            drop_rate=0,\n            drop_path_rate=0,\n            pretrained=pretrained,\n            in_chans=in_chans,\n            global_pool=\"max\"\n        )\n        if \"efficientnet\" in backbone:\n            head_in_dim = self.encoder.classifier.in_features\n            self.encoder.classifier = nn.Sequential(\n                nn.LayerNorm(head_in_dim),\n                nn.Dropout(0),\n            )\n\n        elif \"vit\" in backbone:\n            self.encoder.head.drop = nn.Dropout(0)\n            head_in_dim = self.encoder.head.fc.in_features\n            self.encoder.head.fc = nn.Identity()\n\n        # Modify heads to include additional layers\n        self.heads = nn.ModuleList(\n            [nn.Sequential(\n                nn.Linear(head_in_dim, head_in_dim // 2),  # Add an additional layer\n                nn.ReLU(),  # Activation function\n                nn.BatchNorm1d(head_in_dim // 2),  # Batch normalization\n                nn.Linear(head_in_dim // 2, 1),  # Final output layer\n                LogisticCumulativeLink(3)\n            ) for i in range(out_classes)]\n        )\n\n        self.ascension_callback = AscensionCallback(margin=cutpoint_margin)\n\n    def forward(self, x):\n        feat = self.encoder(x)\n        return torch.swapaxes(torch.stack([head(feat) for head in self.heads]), 0, 1)\n\n    def _ascension_callback(self):\n        for head in self.heads:\n            self.ascension_callback.clip(head[-1])\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:54:21.848566Z","iopub.execute_input":"2024-09-24T13:54:21.849432Z","iopub.status.idle":"2024-09-24T13:54:21.860142Z","shell.execute_reply.started":"2024-09-24T13:54:21.849392Z","shell.execute_reply":"2024-09-24T13:54:21.859261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 모델 초기화 및 학습을 위한 코드 작성\nmodel = CNN_Model_3D_Multihead(backbone=\"maxvit_rmlp_tiny_rw_256\", in_chans=3, out_classes=25).to(device)\n\n# 기존 pretrained 가중치를 사용하지 않고 모델을 처음부터 학습\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:54:26.931847Z","iopub.execute_input":"2024-09-24T13:54:26.932503Z","iopub.status.idle":"2024-09-24T13:54:29.294237Z","shell.execute_reply.started":"2024-09-24T13:54:26.932462Z","shell.execute_reply":"2024-09-24T13:54:29.293312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CONDITIONS = {\n    \"Sagittal T2/STIR\": [\"spinal_canal_stenosis\"],\n    \"Axial T2\": [\"left_subarticular_stenosis\", \"right_subarticular_stenosis\"],\n    \"Sagittal T1\": [\"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"],\n}\n\nALL_CONDITIONS = sorted([\"spinal_canal_stenosis\", \"left_subarticular_stenosis\", \"right_subarticular_stenosis\", \"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"])\nLEVELS = [\"l1_l2\", \"l2_l3\", \"l3_l4\", \"l4_l5\", \"l5_s1\"]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\n\nALL_CONDITIONS","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:54:37.946474Z","iopub.execute_input":"2024-09-24T13:54:37.94736Z","iopub.status.idle":"2024-09-24T13:54:37.955592Z","shell.execute_reply.started":"2024-09-24T13:54:37.947318Z","shell.execute_reply":"2024-09-24T13:54:37.954735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Pre-populate results df","metadata":{}},{"cell_type":"code","source":"study_ids = glob.glob(\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images/*\")\nstudy_ids = [os.path.basename(e) for e in study_ids]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\nfor study_id in study_ids:\n    for condition in ALL_CONDITIONS:\n        for level in LEVELS:\n            row_id = f\"{study_id}_{condition}_{level}\"\n            results_df = results_df._append({\"row_id\": row_id, \"normal_mild\": 1/3, \"moderate\": 1/3, \"severe\": 1/3}, ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:54:53.95972Z","iopub.execute_input":"2024-09-24T13:54:53.960099Z","iopub.status.idle":"2024-09-24T13:54:53.996564Z","shell.execute_reply.started":"2024-09-24T13:54:53.960065Z","shell.execute_reply":"2024-09-24T13:54:53.995654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset.dataframe","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:54:57.398671Z","iopub.execute_input":"2024-09-24T13:54:57.399106Z","iopub.status.idle":"2024-09-24T13:54:57.409069Z","shell.execute_reply.started":"2024-09-24T13:54:57.399067Z","shell.execute_reply":"2024-09-24T13:54:57.408068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Initialize Model and Load Weights","metadata":{}},{"cell_type":"code","source":"# Step 9: Initialize Model and Load Weights\n#model = CNN_Model_3D_Multihead(backbone=\"maxvit_rmlp_tiny_rw_256\", in_chans=3, out_classes=25).to(device)\n#model.load_state_dict(torch.load(\"/kaggle/input/rsna-2024/pytorch/vit_voxel_v2/7/maxvit_rmlp_tiny_rw_256_256_v2_fold_3_32.pt\", map_location=device), strict=False)\n\n#model.eval()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:55:01.276291Z","iopub.execute_input":"2024-09-24T13:55:01.277043Z","iopub.status.idle":"2024-09-24T13:55:01.281697Z","shell.execute_reply.started":"2024-09-24T13:55:01.27698Z","shell.execute_reply":"2024-09-24T13:55:01.280654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Make Predictions","metadata":{}},{"cell_type":"code","source":"# Step 11: Make Predictions\nstart_time = time.time()\n\nwith torch.no_grad():\n    with autocast(dtype=torch.float16):\n        model.eval()\n\n        for images, study_id in dataloader:\n            output = model(images.to(device))\n            for i, batch_out in enumerate(output):\n                batch_out = output.cpu().numpy()[i]\n                for index, level in enumerate(batch_out):\n                    row_id = f\"{study_id[i]}_{ALL_CONDITIONS[index // 5]}_{LEVELS[index % 5]}\"\n                    results_df.loc[results_df.row_id == row_id,'normal_mild'] = level[0]\n                    results_df.loc[results_df.row_id == row_id,'moderate'] = level[1]\n                    results_df.loc[results_df.row_id == row_id,'severe'] = level[2]\n                \nprint(\"--- %s seconds ---\" % (time.time() - start_time))\n","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:55:04.060052Z","iopub.execute_input":"2024-09-24T13:55:04.060785Z","iopub.status.idle":"2024-09-24T13:55:22.754601Z","shell.execute_reply.started":"2024-09-24T13:55:04.060742Z","shell.execute_reply":"2024-09-24T13:55:22.753372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare Submission File","metadata":{}},{"cell_type":"code","source":"results_df","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:55:41.15534Z","iopub.execute_input":"2024-09-24T13:55:41.155986Z","iopub.status.idle":"2024-09-24T13:55:41.171897Z","shell.execute_reply.started":"2024-09-24T13:55:41.155945Z","shell.execute_reply":"2024-09-24T13:55:41.17078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results_df.to_csv('submission.csv', index=False)\nprint(\"Submission file created successfully.\")","metadata":{"execution":{"iopub.status.busy":"2024-09-24T13:55:44.435207Z","iopub.execute_input":"2024-09-24T13:55:44.435577Z","iopub.status.idle":"2024-09-24T13:55:44.443996Z","shell.execute_reply.started":"2024-09-24T13:55:44.435542Z","shell.execute_reply":"2024-09-24T13:55:44.443059Z"},"trusted":true},"execution_count":null,"outputs":[]}]}