{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"pip install '../input/rsna-monai-packages/monai-0.6.0-202107081903-py3-none-any.whl'","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:46:44.202984Z","iopub.execute_input":"2023-09-26T13:46:44.203361Z","iopub.status.idle":"2023-09-26T13:47:13.000306Z","shell.execute_reply.started":"2023-09-26T13:46:44.203273Z","shell.execute_reply":"2023-09-26T13:47:12.999043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nimport os\n\nimport pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import roc_auc_score\nimport glob","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-26T13:47:13.002101Z","iopub.execute_input":"2023-09-26T13:47:13.002436Z","iopub.status.idle":"2023-09-26T13:47:13.993320Z","shell.execute_reply.started":"2023-09-26T13:47:13.002400Z","shell.execute_reply":"2023-09-26T13:47:13.992349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import albumentations as A\nimport pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom albumentations.pytorch import ToTensorV2\nfrom sklearn.metrics import roc_auc_score\nfrom torch.optim import lr_scheduler\nfrom tqdm import tqdm\nimport re","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:47:50.082922Z","iopub.execute_input":"2023-09-26T13:47:50.083306Z","iopub.status.idle":"2023-09-26T13:47:52.503179Z","shell.execute_reply.started":"2023-09-26T13:47:50.083248Z","shell.execute_reply":"2023-09-26T13:47:52.502278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"NUM_IMAGES_3D = 64\nTRAINING_BATCH_SIZE = 8\nTEST_BATCH_SIZE = 8\nIMAGE_SIZE = 256\nN_EPOCHS = 15\ndo_valid = True\nn_workers = 4\ntype_ = \"T1wCE\"","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:47:53.690499Z","iopub.execute_input":"2023-09-26T13:47:53.690859Z","iopub.status.idle":"2023-09-26T13:47:53.696070Z","shell.execute_reply.started":"2023-09-26T13:47:53.690828Z","shell.execute_reply":"2023-09-26T13:47:53.695119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom_image(path, img_size=IMAGE_SIZE, voi_lut=True, rotate=0):\n    dicom = pydicom.read_file(path)\n    data = dicom.pixel_array\n    if voi_lut:\n        data = apply_voi_lut(dicom.pixel_array, dicom)\n    else:\n        data = dicom.pixel_array\n\n    if rotate > 0:\n        rot_choices = [\n            0,\n            cv2.ROTATE_90_CLOCKWISE,\n            cv2.ROTATE_90_COUNTERCLOCKWISE,\n            cv2.ROTATE_180,\n        ]\n        data = cv2.rotate(data, rot_choices[rotate])\n\n    data = cv2.resize(data, (img_size, img_size))\n    return data","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:47:55.925045Z","iopub.execute_input":"2023-09-26T13:47:55.925525Z","iopub.status.idle":"2023-09-26T13:47:55.933303Z","shell.execute_reply.started":"2023-09-26T13:47:55.925481Z","shell.execute_reply":"2023-09-26T13:47:55.932194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\n\nimport cv2\nfrom torch.utils.data import Dataset\n\n\nclass BrainRSNADataset(Dataset):\n    def __init__(\n        self, data, transform=None, target=\"MGMT_value\", mri_type=\"FLAIR\", is_train=True\n    ):\n        self.target = target\n        self.data = data\n        self.type = mri_type\n\n        self.transform = transform\n        self.is_train = is_train\n        self.folder = \"train\" if self.is_train else \"test\"\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, index):\n        row = self.data.loc[index]\n        case_id = int(row.BraTS21ID)\n        target = int(row[self.target])\n        _3d_images = self.load_dicom_images_3d(case_id)\n        _3d_images = torch.tensor(_3d_images).float()\n        if self.is_train:\n            return {\"image\": _3d_images, \"target\": target}\n        else:\n            return {\"image\": _3d_images, \"case_id\": case_id}\n\n    def load_dicom_images_3d(\n        self,\n        case_id,\n        num_imgs=NUM_IMAGES_3D,\n        img_size=IMAGE_SIZE,\n        rotate=0,\n    ):\n        case_id = str(case_id).zfill(5)\n\n        path = f\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/{self.folder}/{case_id}/{self.type}/*.dcm\"\n        files = sorted(\n            glob.glob(path),\n            key=lambda var: [\n                int(x) if x.isdigit() else x for x in re.findall(r\"[^0-9]|[0-9]+\", var)\n            ],\n        )\n\n        middle = len(files) // 2\n        num_imgs2 = num_imgs // 2\n        p1 = max(0, middle - num_imgs2)\n        p2 = min(len(files), middle + num_imgs2)\n        image_stack = [load_dicom_image(f, rotate=rotate) for f in files[p1:p2]]\n        \n        img3d = np.stack(image_stack).T\n        if img3d.shape[-1] < num_imgs:\n            n_zero = np.zeros((img_size, img_size, num_imgs - img3d.shape[-1]))\n            img3d = np.concatenate((img3d, n_zero), axis=-1)\n\n        if np.min(img3d) < np.max(img3d):\n            img3d = img3d - np.min(img3d)\n            img3d = img3d / np.max(img3d)\n\n        return np.expand_dims(img3d, 0)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:03.645237Z","iopub.execute_input":"2023-09-26T13:48:03.645638Z","iopub.status.idle":"2023-09-26T13:48:03.663490Z","shell.execute_reply.started":"2023-09-26T13:48:03.645605Z","shell.execute_reply":"2023-09-26T13:48:03.662430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ls ../input/","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:07.024963Z","iopub.execute_input":"2023-09-26T13:48:07.025351Z","iopub.status.idle":"2023-09-26T13:48:08.001924Z","shell.execute_reply.started":"2023-09-26T13:48:07.025316Z","shell.execute_reply":"2023-09-26T13:48:08.000502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import monai\n\n# model \nmodel = monai.networks.nets.resnet10(spatial_dims=3, n_input_channels=1, n_classes=1)\ndevice = torch.device(\"cuda\")\nmodel.to(device);\nall_weights = os.listdir(\"../input/resnet10rsna\")\nfold_files = [f for f in all_weights if type_ in f]\ncriterion = nn.BCEWithLogitsLoss()","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:11.416121Z","iopub.execute_input":"2023-09-26T13:48:11.416527Z","iopub.status.idle":"2023-09-26T13:48:18.173752Z","shell.execute_reply.started":"2023-09-26T13:48:11.416488Z","shell.execute_reply":"2023-09-26T13:48:18.172760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold_files","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:21.657768Z","iopub.execute_input":"2023-09-26T13:48:21.658143Z","iopub.status.idle":"2023-09-26T13:48:21.667653Z","shell.execute_reply.started":"2023-09-26T13:48:21.658109Z","shell.execute_reply":"2023-09-26T13:48:21.666687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:25.522840Z","iopub.execute_input":"2023-09-26T13:48:25.523202Z","iopub.status.idle":"2023-09-26T13:48:25.539990Z","shell.execute_reply.started":"2023-09-26T13:48:25.523168Z","shell.execute_reply":"2023-09-26T13:48:25.539043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tta_true_labels = []\ntta_preds = []\ntest_dataset = BrainRSNADataset(data=sample, mri_type=type_, is_train=False)\ntest_dl = torch.utils.data.DataLoader(\n        test_dataset, batch_size=8, shuffle=False, num_workers=4\n    )\n\npreds_f = np.zeros(len(sample))\nfor fold in range(5):\n    image_ids = []\n    model.load_state_dict(torch.load(f\"../input/resnet10rsna/{fold_files[fold]}\"))\n    preds = []\n    epoch_iterator_test = tqdm(test_dl)\n    with torch.no_grad():\n        for  step, batch in enumerate(epoch_iterator_test):\n            model.eval()\n            images = batch[\"image\"].to(device)\n\n            outputs = model(images)\n            preds.append(outputs.sigmoid().detach().cpu().numpy())\n            image_ids.append(batch[\"case_id\"].detach().cpu().numpy())\n    \n\n    preds_f += np.vstack(preds).T[0]/5\n\n    ids_f = np.hstack(image_ids)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:48:26.422852Z","iopub.execute_input":"2023-09-26T13:48:26.423215Z","iopub.status.idle":"2023-09-26T13:50:37.328908Z","shell.execute_reply.started":"2023-09-26T13:48:26.423181Z","shell.execute_reply":"2023-09-26T13:50:37.327417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample[\"BraTS21ID\"] = ids_f\nsample[\"MGMT_value\"] = preds_f","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:50:37.330952Z","iopub.execute_input":"2023-09-26T13:50:37.331372Z","iopub.status.idle":"2023-09-26T13:50:37.338036Z","shell.execute_reply.started":"2023-09-26T13:50:37.331322Z","shell.execute_reply":"2023-09-26T13:50:37.337008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = sample.sort_values(by=\"BraTS21ID\").reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:54:59.975728Z","iopub.execute_input":"2023-09-26T13:54:59.976092Z","iopub.status.idle":"2023-09-26T13:54:59.985766Z","shell.execute_reply.started":"2023-09-26T13:54:59.976058Z","shell.execute_reply":"2023-09-26T13:54:59.984941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T13:55:04.126667Z","iopub.execute_input":"2023-09-26T13:55:04.127023Z","iopub.status.idle":"2023-09-26T13:55:04.136591Z","shell.execute_reply.started":"2023-09-26T13:55:04.126988Z","shell.execute_reply":"2023-09-26T13:55:04.135659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}