{"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":"Thanks to :\n\n    https://www.kaggle.com/arnabs007/part-1-rsna-miccai-btrc-understanding-the-data\n    https://www.kaggle.com/rluethy/efficientnet3d-with-one-mri-type\n    https://www.kaggle.com/ammarnassanalhajali/brain-tumor-3d-training\n    https://www.kaggle.com/ammarnassanalhajali/brain-tumor-3d-inference\n    https://keras.io/examples/vision/3D_image_classification/\n    ","metadata":{"papermill":{"duration":0.0143,"end_time":"2021-08-19T20:35:07.545878","exception":false,"start_time":"2021-08-19T20:35:07.531578","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os \nimport glob\nimport re\nimport math\nimport numpy as np\nimport pandas as pd\nimport cv2\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n\nfrom random import shuffle\nfrom sklearn import model_selection as sk_model_selection\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom tensorflow.keras.metrics import AUC","metadata":{"papermill":{"duration":5.035942,"end_time":"2021-08-19T20:35:12.596347","exception":false,"start_time":"2021-08-19T20:35:07.560405","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:32:43.100647Z","iopub.execute_input":"2021-09-07T00:32:43.100953Z","iopub.status.idle":"2021-09-07T00:32:48.590257Z","shell.execute_reply.started":"2021-09-07T00:32:43.100881Z","shell.execute_reply":"2021-09-07T00:32:48.589261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading Data","metadata":{"papermill":{"duration":0.015919,"end_time":"2021-08-19T20:35:12.627716","exception":false,"start_time":"2021-08-19T20:35:12.611797","status":"completed"},"tags":[]}},{"cell_type":"code","source":"data_directory = '../input/rsna-miccai-brain-tumor-radiogenomic-classification'\n# pytorch3dpath = \"../input/efficientnetpyttorch3d/EfficientNet-PyTorch-3D\"\n \nmri_types_orig = ['FLAIR','T1w','T1wCE','T2w']\nmri_types = ['FLAIR','T1w','T1wCE','T2w']\n\nIMAGE_SIZE = 96\nNUM_IMAGES_PER_TYPE = 30\nNUM_IMAGES = NUM_IMAGES_PER_TYPE * len(mri_types)\nBATCH_SIZE= 4\n\ntrain_df = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")\n\nto_exclude = [109, 123, 709]\ntrain_df = train_df[~train_df['BraTS21ID'].isin(to_exclude)]\n\ntrain_df['BraTS21ID5'] = [format(x, '05d') for x in train_df.BraTS21ID]\nprint(len(train_df))\ntrain_df.head(3)","metadata":{"papermill":{"duration":0.053371,"end_time":"2021-08-19T20:35:12.696135","exception":false,"start_time":"2021-08-19T20:35:12.642764","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:32:48.591844Z","iopub.execute_input":"2021-09-07T00:32:48.592183Z","iopub.status.idle":"2021-09-07T00:32:48.627683Z","shell.execute_reply.started":"2021-09-07T00:32:48.592145Z","shell.execute_reply":"2021-09-07T00:32:48.626750Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv')\ntest=sample_submission\ntest['BraTS21ID5'] = [format(x, '05d') for x in test.BraTS21ID]\ntest.head(3)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:48.629601Z","iopub.execute_input":"2021-09-07T00:32:48.629953Z","iopub.status.idle":"2021-09-07T00:32:48.646505Z","shell.execute_reply.started":"2021-09-07T00:32:48.629917Z","shell.execute_reply":"2021-09-07T00:32:48.645581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Functions to load images\n","metadata":{"papermill":{"duration":0.015034,"end_time":"2021-08-19T20:35:12.726544","exception":false,"start_time":"2021-08-19T20:35:12.71151","status":"completed"},"tags":[]}},{"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 = [0, cv2.ROTATE_90_CLOCKWISE, cv2.ROTATE_90_COUNTERCLOCKWISE, cv2.ROTATE_180]\n        data = cv2.rotate(data, rot_choices[rotate])\n        \n    data = cv2.resize(data, (img_size, img_size))\n    return data\n\n\ndef load_dicom_images_3d(scan_id, split, mri_type=\"FLAIR\", num_imgs=NUM_IMAGES_PER_TYPE, img_size=IMAGE_SIZE, rotate=0):\n\n    files = sorted(glob.glob(f\"{data_directory}/{split}/{scan_id}/{mri_type}/*.dcm\"), \n               key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])\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    img3d = np.stack([load_dicom_image(f, rotate=rotate) for f in files[p1:p2]]).T \n    \n#     middle = len(files)//2\n#     num_imgs2 = num_imgs\n#     p1 = max(0, middle - num_imgs2)\n#     p2 = min(len(files), middle + num_imgs2)\n#     img3d = np.stack([load_dicom_image(f, rotate=rotate) for f in files[p1:p2:2]]).T \n\n#     if img3d.shape[-1] <= num_imgs//2:\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#         img3d = np.stack([load_dicom_image(f, rotate=rotate) for f in files[p1:p2]]).T \n\n    if img3d.shape[-1] < num_imgs:\n        # n_zero = np.zeros((img_size, img_size, num_imgs - img3d.shape[-1]))\n        n_zero_front = np.zeros((img_size, img_size, (num_imgs - img3d.shape[-1])//2))\n        n_zero_back = np.zeros((img_size, img_size, num_imgs - img3d.shape[-1] - n_zero_front.shape[-1]))\n\n        # img3d = np.concatenate((img3d, n_zero), axis = -1)\n        img3d = np.concatenate((n_zero_front, img3d, n_zero_back), 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\ndef load_dicom_images_3d_all(scan_id, split):\n    img3d_all = np.concatenate([load_dicom_images_3d(scan_id, split, mri_type) for mri_type in mri_types], axis = -1)\n    \n    return img3d_all\n\na = load_dicom_images_3d_all(\"00000\", 'train')\nprint(a.shape)\nprint(np.min(a), np.max(a), np.mean(a), np.median(a))","metadata":{"papermill":{"duration":1.266786,"end_time":"2021-08-19T20:35:14.00852","exception":false,"start_time":"2021-08-19T20:35:12.741734","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:32:48.648106Z","iopub.execute_input":"2021-09-07T00:32:48.648493Z","iopub.status.idle":"2021-09-07T00:32:50.187313Z","shell.execute_reply.started":"2021-09-07T00:32:48.648456Z","shell.execute_reply":"2021-09-07T00:32:50.185871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import Sequence\n\nclass Dataset(Sequence):\n    def __init__(self,df,split, is_train=True,batch_size=BATCH_SIZE,shuffle=True):\n        self.idx = df[\"BraTS21ID\"].values\n        self.paths = df[\"BraTS21ID5\"].values\n        self.y =  df[\"MGMT_value\"].values\n        self.is_train = is_train\n        self.batch_size = batch_size\n        self.shuffle = shuffle\n        self.split = split\n        \n    def __len__(self):\n        return math.ceil(len(self.idx)/self.batch_size)\n   \n    def __getitem__(self,ids):\n        id_path= self.paths[ids]\n        batch_paths = self.paths[ids * self.batch_size:(ids + 1) * self.batch_size]\n        split=self.split\n        \n        if self.y is not None:\n            batch_y = self.y[ids * self.batch_size: (ids + 1) * self.batch_size]\n\n        list_x =  [load_dicom_images_3d_all(x, split) for x in batch_paths]\n        batch_X = np.stack(list_x, axis=4)\n            \n        if self.is_train:\n            return batch_X, batch_y\n        else:\n            return batch_X\n","metadata":{"papermill":{"duration":0.034492,"end_time":"2021-08-19T20:35:16.541772","exception":false,"start_time":"2021-08-19T20:35:16.50728","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:32:50.188637Z","iopub.execute_input":"2021-09-07T00:32:50.188961Z","iopub.status.idle":"2021-09-07T00:32:50.197589Z","shell.execute_reply.started":"2021-09-07T00:32:50.188926Z","shell.execute_reply":"2021-09-07T00:32:50.196768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Splitting Data","metadata":{"papermill":{"duration":0.021535,"end_time":"2021-08-19T20:35:16.384696","exception":false,"start_time":"2021-08-19T20:35:16.363161","status":"completed"},"tags":[]}},{"cell_type":"code","source":"df_train, df_valid = sk_model_selection.train_test_split(\n    train_df, \n    test_size=0.2, \n    random_state=12, \n    stratify=train_df[\"MGMT_value\"],\n)","metadata":{"papermill":{"duration":0.03518,"end_time":"2021-08-19T20:35:16.441369","exception":false,"start_time":"2021-08-19T20:35:16.406189","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:32:50.199122Z","iopub.execute_input":"2021-09-07T00:32:50.199741Z","iopub.status.idle":"2021-09-07T00:32:50.214270Z","shell.execute_reply.started":"2021-09-07T00:32:50.199707Z","shell.execute_reply":"2021-09-07T00:32:50.213189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:50.215786Z","iopub.execute_input":"2021-09-07T00:32:50.216201Z","iopub.status.idle":"2021-09-07T00:32:50.229236Z","shell.execute_reply.started":"2021-09-07T00:32:50.216168Z","shell.execute_reply":"2021-09-07T00:32:50.228152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = Dataset(df_train, 'train')\nvalid_dataset = Dataset(df_valid, 'train')","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:50.232565Z","iopub.execute_input":"2021-09-07T00:32:50.232932Z","iopub.status.idle":"2021-09-07T00:32:50.238019Z","shell.execute_reply.started":"2021-09-07T00:32:50.232901Z","shell.execute_reply":"2021-09-07T00:32:50.236918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train_df","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:50.240336Z","iopub.execute_input":"2021-09-07T00:32:50.240738Z","iopub.status.idle":"2021-09-07T00:32:50.244798Z","shell.execute_reply.started":"2021-09-07T00:32:50.240689Z","shell.execute_reply":"2021-09-07T00:32:50.243800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  Plotting train data","metadata":{}},{"cell_type":"code","source":"def plot_sample_all(images, label, j): \n    plt.figure(figsize=(35, 35))\n    for i in range(NUM_IMAGES):\n        # plt.subplot(14,14,(i+1))\n        plt.subplot(15,15,(i+1))\n        plt.xticks([])\n        plt.yticks([])\n        plt.grid(False)\n        plt.imshow(images[0,:,:,i,j], cmap=\"gray\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:50.246342Z","iopub.execute_input":"2021-09-07T00:32:50.246690Z","iopub.status.idle":"2021-09-07T00:32:50.253508Z","shell.execute_reply.started":"2021-09-07T00:32:50.246657Z","shell.execute_reply":"2021-09-07T00:32:50.252569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nj = 0\nimages, label = train_dataset[i]\nplot_sample_all(images, label, j)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:32:50.254998Z","iopub.execute_input":"2021-09-07T00:32:50.255610Z","iopub.status.idle":"2021-09-07T00:33:01.088736Z","shell.execute_reply.started":"2021-09-07T00:32:50.255576Z","shell.execute_reply":"2021-09-07T00:33:01.087950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nj = 1\nimages, label = train_dataset[i]\nplot_sample_all(images, label, j)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-09-07T00:33:01.089734Z","iopub.execute_input":"2021-09-07T00:33:01.090029Z","iopub.status.idle":"2021-09-07T00:33:08.529235Z","shell.execute_reply.started":"2021-09-07T00:33:01.090001Z","shell.execute_reply":"2021-09-07T00:33:08.528350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nj = 2\nimages, label = train_dataset[i]\nplot_sample_all(images, label, j)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:08.530573Z","iopub.execute_input":"2021-09-07T00:33:08.530885Z","iopub.status.idle":"2021-09-07T00:33:16.705329Z","shell.execute_reply.started":"2021-09-07T00:33:08.530853Z","shell.execute_reply":"2021-09-07T00:33:16.704534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nj = 3\nimages, label = train_dataset[i]\nplot_sample_all(images, label, j)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:16.706709Z","iopub.execute_input":"2021-09-07T00:33:16.707255Z","iopub.status.idle":"2021-09-07T00:33:24.728226Z","shell.execute_reply.started":"2021-09-07T00:33:16.707222Z","shell.execute_reply":"2021-09-07T00:33:24.727313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plotting the middle images of each MRI types","metadata":{}},{"cell_type":"markdown","source":"## Train images","metadata":{}},{"cell_type":"code","source":"def plot_sample_train(images, label): \n    plt.figure(figsize=(15, 15))\n    idx_base = int(NUM_IMAGES_PER_TYPE/2)\n    idx = [idx_base, idx_base*3, idx_base*5, idx_base*7]\n    # idx = [idx_base, idx_base*3, idx_base*5]\n#     idx = [idx_base, idx_base*3]\n#     idx = [idx_base]\n    for i in range(len(idx)*BATCH_SIZE):\n        plt.subplot(BATCH_SIZE,len(idx),i+1)\n        plt.xticks([])\n        plt.yticks([])\n        plt.grid(False)\n        j = int(i/len(idx))\n        plt.imshow(images[0,:,:,idx[i%len(idx)],j], cmap=\"gray\")\n        plt.xlabel(f'{idx[i%len(idx)]} {label[j]}')\n    plt.show()","metadata":{"papermill":{"duration":2.743245,"end_time":"2021-08-19T20:35:19.358845","exception":false,"start_time":"2021-08-19T20:35:16.6156","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:33:24.729552Z","iopub.execute_input":"2021-09-07T00:33:24.729863Z","iopub.status.idle":"2021-09-07T00:33:24.737811Z","shell.execute_reply.started":"2021-09-07T00:33:24.729832Z","shell.execute_reply":"2021-09-07T00:33:24.737070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nimages, label = train_dataset[i]\nprint(\"Dimension of the CT scan is:\", images.shape)\nprint(\"label=\",label ,label.shape)\nplot_sample_train(images, label)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:24.739015Z","iopub.execute_input":"2021-09-07T00:33:24.739571Z","iopub.status.idle":"2021-09-07T00:33:27.617700Z","shell.execute_reply.started":"2021-09-07T00:33:24.739532Z","shell.execute_reply":"2021-09-07T00:33:27.616868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{"papermill":{"duration":0.024861,"end_time":"2021-08-19T20:35:19.407712","exception":false,"start_time":"2021-08-19T20:35:19.382851","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def get_model(width=IMAGE_SIZE, height=IMAGE_SIZE, depth=NUM_IMAGES):\n    \"\"\"Build a 3D convolutional neural network model.\"\"\"\n\n    inputs = keras.Input((width, height, depth, 1))\n\n    x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(inputs)\n    x = layers.BatchNormalization()(x)\n    \n    x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(x)\n    x = layers.BatchNormalization()(x)\n    \n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.Dropout(0.5)(x)\n\n    x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\")(x)\n    x = layers.BatchNormalization()(x)\n    \n    x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\")(x)\n    x = layers.BatchNormalization()(x)\n    \n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.Dropout(0.5)(x)\n    \n    x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\")(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\")(x)\n    x = layers.BatchNormalization()(x)\n    \n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.Dropout(0.5)(x)\n\n#     x = layers.Conv3D(filters=256, kernel_size=2, activation=\"relu\")(x)\n#     x = layers.BatchNormalization()(x)\n    \n#     x = layers.Conv3D(filters=256, kernel_size=2, activation=\"relu\")(x)\n#     x = layers.BatchNormalization()(x)\n    \n#     x = layers.MaxPool3D(pool_size=2)(x)\n#     x = layers.Dropout(0.2)(x)\n\n    x = layers.GlobalAveragePooling3D()(x)\n    x = layers.Dense(units=128, activation=\"relu\")(x)\n    x = layers.Dropout(0.6)(x)\n\n    outputs = layers.Dense(units=1, activation=\"sigmoid\")(x)\n\n    # Define the model.\n    model = keras.Model(inputs, outputs, name=\"3D_CNN\")\n\n    return model","metadata":{"papermill":{"duration":2.318395,"end_time":"2021-08-19T20:35:21.750413","exception":false,"start_time":"2021-08-19T20:35:19.432018","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:33:27.618957Z","iopub.execute_input":"2021-09-07T00:33:27.619308Z","iopub.status.idle":"2021-09-07T00:33:27.630717Z","shell.execute_reply.started":"2021-09-07T00:33:27.619271Z","shell.execute_reply":"2021-09-07T00:33:27.629844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Build model.\nmodel = get_model()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:27.631965Z","iopub.execute_input":"2021-09-07T00:33:27.632538Z","iopub.status.idle":"2021-09-07T00:33:29.725656Z","shell.execute_reply.started":"2021-09-07T00:33:27.632500Z","shell.execute_reply":"2021-09-07T00:33:29.724852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training","metadata":{"papermill":{"duration":0.023922,"end_time":"2021-08-19T20:35:21.799287","exception":false,"start_time":"2021-08-19T20:35:21.775365","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# # Compile model.\n# initial_learning_rate = 0.0001\n# lr_schedule = keras.optimizers.schedules.ExponentialDecay(\n#     initial_learning_rate, decay_steps=100000, decay_rate=0.96, staircase=True\n# )\n# model.compile(\n#     loss=\"binary_crossentropy\",\n#     optimizer=keras.optimizers.Adam(learning_rate=lr_schedule),\n#     metrics=[\"acc\"],\n# )\n# # Define callbacks.\n# model_save = ModelCheckpoint('Brain_Tumor_All_MRI_3D_CNN.h5', \n#                              save_best_only = True, \n#                              monitor = 'val_auc', \n#                              mode = 'max', verbose = 1)\n# early_stop = EarlyStopping(monitor = 'val_auc', \n#                            patience = 25, mode = 'max', verbose = 1,\n#                            restore_best_weights = True)\n\n# # Train the model, doing validation at the end of each epoch\n# epochs = 100\n# model.fit(\n#     train_dataset,\n#     validation_data=valid_dataset,\n#     epochs=epochs,\n#     batch_size=1,\n#     shuffle=True,\n#     verbose=1,\n#     callbacks = [model_save, early_stop],\n# )","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:29.728237Z","iopub.execute_input":"2021-09-07T00:33:29.728498Z","iopub.status.idle":"2021-09-07T00:33:29.732145Z","shell.execute_reply.started":"2021-09-07T00:33:29.728473Z","shell.execute_reply":"2021-09-07T00:33:29.731066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing model performance","metadata":{"papermill":{"duration":1.077633,"end_time":"2021-08-19T22:36:58.345072","exception":false,"start_time":"2021-08-19T22:36:57.267439","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# fig, ax = plt.subplots(1, 2, figsize=(20, 7))\n# ax = ax.ravel()\n\n# for i, metric in enumerate([\"acc\", \"loss\"]):\n#     ax[i].plot(model.history.history[metric])\n#     ax[i].plot(model.history.history[\"val_\" + metric])\n#     ax[i].set_title(\"Model {}\".format(metric))\n#     ax[i].set_xlabel(\"epochs\")\n#     ax[i].set_ylabel(metric)\n#     ax[i].legend([\"train\", \"val\"])","metadata":{"papermill":{"duration":1.339771,"end_time":"2021-08-19T22:37:00.618072","exception":false,"start_time":"2021-08-19T22:36:59.278301","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-09-07T00:33:29.733748Z","iopub.execute_input":"2021-09-07T00:33:29.734093Z","iopub.status.idle":"2021-09-07T00:33:29.745006Z","shell.execute_reply.started":"2021-09-07T00:33:29.734049Z","shell.execute_reply":"2021-09-07T00:33:29.744200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Model Weights from file","metadata":{}},{"cell_type":"code","source":"model.load_weights('../input/brain-tumor-model-v3-2-7/Brain_Tumor_All_MRI_3D_CNN_v3_2_7.h5')","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:29.746422Z","iopub.execute_input":"2021-09-07T00:33:29.746845Z","iopub.status.idle":"2021-09-07T00:33:30.313463Z","shell.execute_reply.started":"2021-09-07T00:33:29.746808Z","shell.execute_reply":"2021-09-07T00:33:30.312637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import Sequence\n\nclass Dataset(Sequence):\n    def __init__(self,df,split, is_train=True,batch_size=1,shuffle=True):\n        self.idx = df[\"BraTS21ID\"].values\n        self.paths = df[\"BraTS21ID5\"].values\n        self.y =  df[\"MGMT_value\"].values\n        self.is_train = is_train\n        self.batch_size = batch_size\n        self.shuffle = shuffle\n        self.split = split \n        \n    def __len__(self):\n        return math.ceil(len(self.idx)/self.batch_size)\n   \n    def __getitem__(self,ids):\n        id_path= self.paths[ids]\n        batch_paths = self.paths[ids * self.batch_size:(ids + 1) * self.batch_size]\n        split = self.split\n        \n        if self.y is not None:\n            batch_y = self.y[ids * self.batch_size: (ids + 1) * self.batch_size]\n            \n        list_x =  load_dicom_images_3d_all(id_path, split) #str(scan_id).zfill(5)\n        #list_x =  [load_dicom_images_3d(x) for x in batch_paths]\n        batch_X = np.stack(list_x)\n        if self.is_train:\n            return batch_X,batch_y\n        else:\n            return batch_X\n    \n    def on_epoch_end(self):\n        if self.shuffle and self.is_train:\n            ids_y = list(zip(self.idx, self.y))\n            shuffle(ids_y)\n            self.idx, self.y = list(zip(*ids_y))","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:30.314771Z","iopub.execute_input":"2021-09-07T00:33:30.315088Z","iopub.status.idle":"2021-09-07T00:33:30.325239Z","shell.execute_reply.started":"2021-09-07T00:33:30.315055Z","shell.execute_reply":"2021-09-07T00:33:30.324140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Test Images","metadata":{}},{"cell_type":"code","source":"test_dataset = Dataset(df = test,split = 'test', is_train = False)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:30.329326Z","iopub.execute_input":"2021-09-07T00:33:30.329714Z","iopub.status.idle":"2021-09-07T00:33:30.337121Z","shell.execute_reply.started":"2021-09-07T00:33:30.329651Z","shell.execute_reply":"2021-09-07T00:33:30.336295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_sample_test(images): \n    plt.figure(figsize=(16, 16))\n    idx_base = int(NUM_IMAGES_PER_TYPE/2)\n    idx = [idx_base, idx_base*3, idx_base*5, idx_base*7]\n#     idx = [idx_base, idx_base*3, idx_base*5]\n#     idx = [idx_base, idx_base*3]\n#     idx = [idx_base]\n    for i in range(len(idx)):\n        plt.subplot(1,len(idx),i+1)\n        plt.xticks([])\n        plt.yticks([])\n        plt.grid(False)\n        plt.imshow(images[0,:,:,idx[i]], cmap=\"gray\")\n        plt.xlabel(idx[i])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:30.338747Z","iopub.execute_input":"2021-09-07T00:33:30.339135Z","iopub.status.idle":"2021-09-07T00:33:30.346607Z","shell.execute_reply.started":"2021-09-07T00:33:30.339102Z","shell.execute_reply":"2021-09-07T00:33:30.345508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nimages = test_dataset[i]\n# print(test_dataset[0])\nprint(\"Dimension of the CT scan is:\", images.shape)\nplot_sample_test(images)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:30.348097Z","iopub.execute_input":"2021-09-07T00:33:30.348785Z","iopub.status.idle":"2021-09-07T00:33:32.356573Z","shell.execute_reply.started":"2021-09-07T00:33:30.348749Z","shell.execute_reply":"2021-09-07T00:33:32.355767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{}},{"cell_type":"code","source":"predictions = model.predict(test_dataset)\npredictions","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:33:32.357828Z","iopub.execute_input":"2021-09-07T00:33:32.358164Z","iopub.status.idle":"2021-09-07T00:35:20.891195Z","shell.execute_reply.started":"2021-09-07T00:33:32.358117Z","shell.execute_reply":"2021-09-07T00:35:20.890184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = predictions.reshape(-1)\npredictions","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.893039Z","iopub.execute_input":"2021-09-07T00:35:20.893364Z","iopub.status.idle":"2021-09-07T00:35:20.903460Z","shell.execute_reply.started":"2021-09-07T00:35:20.893332Z","shell.execute_reply":"2021-09-07T00:35:20.902324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({'BraTS21ID':sample_submission['BraTS21ID'],'MGMT_value':predictions})","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.905180Z","iopub.execute_input":"2021-09-07T00:35:20.905719Z","iopub.status.idle":"2021-09-07T00:35:20.912756Z","shell.execute_reply.started":"2021-09-07T00:35:20.905673Z","shell.execute_reply":"2021-09-07T00:35:20.911430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.914401Z","iopub.execute_input":"2021-09-07T00:35:20.914816Z","iopub.status.idle":"2021-09-07T00:35:20.935223Z","shell.execute_reply.started":"2021-09-07T00:35:20.914778Z","shell.execute_reply":"2021-09-07T00:35:20.934173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['BraTS21ID'] = [format(x, '05d') for x in submission.BraTS21ID]","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.936661Z","iopub.execute_input":"2021-09-07T00:35:20.937211Z","iopub.status.idle":"2021-09-07T00:35:20.943731Z","shell.execute_reply.started":"2021-09-07T00:35:20.937173Z","shell.execute_reply":"2021-09-07T00:35:20.942587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.945154Z","iopub.execute_input":"2021-09-07T00:35:20.945917Z","iopub.status.idle":"2021-09-07T00:35:20.964521Z","shell.execute_reply.started":"2021-09-07T00:35:20.945861Z","shell.execute_reply":"2021-09-07T00:35:20.963357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2021-09-07T00:35:20.966404Z","iopub.execute_input":"2021-09-07T00:35:20.966954Z","iopub.status.idle":"2021-09-07T00:35:20.977296Z","shell.execute_reply.started":"2021-09-07T00:35:20.966908Z","shell.execute_reply":"2021-09-07T00:35:20.976095Z"},"trusted":true},"execution_count":null,"outputs":[]}]}