{"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":"2021-09-11T15:22:16.083185Z","iopub.execute_input":"2021-09-11T15:22:16.083707Z","iopub.status.idle":"2021-09-11T15:22:42.619000Z","shell.execute_reply.started":"2021-09-11T15:22:16.083620Z","shell.execute_reply":"2021-09-11T15:22:42.618066Z"},"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":"2021-09-11T15:22:42.621453Z","iopub.execute_input":"2021-09-11T15:22:42.621860Z","iopub.status.idle":"2021-09-11T15:22:43.033222Z","shell.execute_reply.started":"2021-09-11T15:22:42.621812Z","shell.execute_reply":"2021-09-11T15:22:43.032369Z"},"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":"2021-09-11T15:22:43.036052Z","iopub.execute_input":"2021-09-11T15:22:43.036620Z","iopub.status.idle":"2021-09-11T15:22:43.812055Z","shell.execute_reply.started":"2021-09-11T15:22:43.036576Z","shell.execute_reply":"2021-09-11T15:22:43.811201Z"},"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":"2021-09-11T15:22:43.813383Z","iopub.execute_input":"2021-09-11T15:22:43.813735Z","iopub.status.idle":"2021-09-11T15:22:43.820767Z","shell.execute_reply.started":"2021-09-11T15:22:43.813699Z","shell.execute_reply":"2021-09-11T15:22:43.819933Z"},"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":"2021-09-11T15:22:43.822018Z","iopub.execute_input":"2021-09-11T15:22:43.822702Z","iopub.status.idle":"2021-09-11T15:22:43.829910Z","shell.execute_reply.started":"2021-09-11T15:22:43.822663Z","shell.execute_reply":"2021-09-11T15:22:43.828849Z"},"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":"2021-09-11T15:22:43.831274Z","iopub.execute_input":"2021-09-11T15:22:43.831929Z","iopub.status.idle":"2021-09-11T15:22:43.847348Z","shell.execute_reply.started":"2021-09-11T15:22:43.831887Z","shell.execute_reply":"2021-09-11T15:22:43.846481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ls ../input/","metadata":{"execution":{"iopub.status.busy":"2021-09-11T15:22:43.848542Z","iopub.execute_input":"2021-09-11T15:22:43.848907Z","iopub.status.idle":"2021-09-11T15:22:44.500441Z","shell.execute_reply.started":"2021-09-11T15:22:43.848869Z","shell.execute_reply":"2021-09-11T15:22:44.499312Z"},"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":"2021-09-11T15:22:44.504732Z","iopub.execute_input":"2021-09-11T15:22:44.505039Z","iopub.status.idle":"2021-09-11T15:22:47.472053Z","shell.execute_reply.started":"2021-09-11T15:22:44.505003Z","shell.execute_reply":"2021-09-11T15:22:47.471118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold_files","metadata":{},"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":"2021-09-11T15:22:47.473534Z","iopub.execute_input":"2021-09-11T15:22:47.473911Z","iopub.status.idle":"2021-09-11T15:22:47.483292Z","shell.execute_reply.started":"2021-09-11T15:22:47.473869Z","shell.execute_reply":"2021-09-11T15:22:47.482529Z"},"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":"2021-09-11T15:22:47.484583Z","iopub.execute_input":"2021-09-11T15:22:47.485124Z","iopub.status.idle":"2021-09-11T15:24:44.693295Z","shell.execute_reply.started":"2021-09-11T15:22:47.485084Z","shell.execute_reply":"2021-09-11T15:24:44.692259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample[\"BraTS21ID\"] = ids_f\nsample[\"MGMT_value\"] = preds_f","metadata":{"execution":{"iopub.status.busy":"2021-09-11T15:27:04.501610Z","iopub.execute_input":"2021-09-11T15:27:04.502045Z","iopub.status.idle":"2021-09-11T15:27:04.507949Z","shell.execute_reply.started":"2021-09-11T15:27:04.502007Z","shell.execute_reply":"2021-09-11T15:27:04.507001Z"},"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":"2021-09-11T15:27:04.830024Z","iopub.execute_input":"2021-09-11T15:27:04.830376Z","iopub.status.idle":"2021-09-11T15:27:04.837301Z","shell.execute_reply.started":"2021-09-11T15:27:04.830342Z","shell.execute_reply":"2021-09-11T15:27:04.836396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-09-11T15:27:05.095075Z","iopub.execute_input":"2021-09-11T15:27:05.101578Z","iopub.status.idle":"2021-09-11T15:27:05.117319Z","shell.execute_reply.started":"2021-09-11T15:27:05.101519Z","shell.execute_reply":"2021-09-11T15:27:05.116150Z"},"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":[]}]}