{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":8089,"databundleVersionId":44321,"sourceType":"competition"},{"sourceId":407317,"sourceType":"datasetVersion","datasetId":181273}],"dockerImageVersionId":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport tensorflow as tf\nimport os\nimport random\nimport numpy as np\n \nfrom tqdm import tqdm\nimport glob\n\nfrom skimage.io import imread, imshow\nfrom skimage.transform import resize\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Conv2D, Conv2DTranspose, MaxPooling2D, Dropout, Lambda, concatenate, add\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport tensorflow.keras.backend as K\n\nfrom sklearn.model_selection import train_test_split\n\nfrom PIL import Image\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\nimport os\nimport glob\nfrom tqdm.notebook import tqdm, trange\n\n#initialize GPUs    \ngpus = tf.config.list_physical_devices('GPU')\nif gpus:\n  # Restrict TensorFlow to only use the first GPU\n  try:\n    tf.config.set_visible_devices(gpus[0], 'GPU')\n    logical_gpus = tf.config.list_logical_devices('GPU')\n    print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPU\")\n  except RuntimeError as e:\n    # Visible devices must be set before GPUs have been initialized\n    print(e)\n            \n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-20T00:24:13.548359Z","iopub.execute_input":"2024-03-20T00:24:13.548727Z","iopub.status.idle":"2024-03-20T00:24:35.713280Z","shell.execute_reply.started":"2024-03-20T00:24:13.548700Z","shell.execute_reply":"2024-03-20T00:24:35.712272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# MRI Dataset","metadata":{}},{"cell_type":"code","source":"config = {\n    'IMAGE_WIDTH':256,\n    'IMAGE_HEIGHT':256,\n    'NUM_CHANNELS':3\n}","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:24:35.715079Z","iopub.execute_input":"2024-03-20T00:24:35.715637Z","iopub.status.idle":"2024-03-20T00:24:35.719907Z","shell.execute_reply.started":"2024-03-20T00:24:35.715611Z","shell.execute_reply":"2024-03-20T00:24:35.719006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mask_paths = glob.glob('/kaggle/input/lgg-mri-segmentation/kaggle_3m/*/*_mask.tif')","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:24:35.721771Z","iopub.execute_input":"2024-03-20T00:24:35.722167Z","iopub.status.idle":"2024-03-20T00:24:38.284460Z","shell.execute_reply.started":"2024-03-20T00:24:35.722134Z","shell.execute_reply":"2024-03-20T00:24:38.283637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### categorizing datapoints with empty mask and non empty mask into seperate arrays","metadata":{}},{"cell_type":"code","source":"empty_masks = []\nnon_empty_masks = []\n\nfor mask_path in tqdm(mask_paths):\n    mask = np.array(Image.open(mask_path))\n    if (mask == 0).all():\n        empty_masks.append(mask_path)\n    else:\n        non_empty_masks.append(mask_path)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:24:38.286501Z","iopub.execute_input":"2024-03-20T00:24:38.286811Z","iopub.status.idle":"2024-03-20T00:25:01.677825Z","shell.execute_reply.started":"2024-03-20T00:24:38.286788Z","shell.execute_reply":"2024-03-20T00:25:01.676911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### select all datapoints with non empty mask and 200 with empty mask datapoint for train","metadata":{}},{"cell_type":"code","source":"masks_paths = non_empty_masks + [empty_masks[idx] for idx in np.random.choice(len(empty_masks), 200)]\nimage_paths = [mask_path.replace('_mask', '') for mask_path in mask_paths]\n\npath_df = pd.DataFrame({'image':image_paths, 'mask':mask_paths})","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:25:01.678939Z","iopub.execute_input":"2024-03-20T00:25:01.679210Z","iopub.status.idle":"2024-03-20T00:25:01.691935Z","shell.execute_reply.started":"2024-03-20T00:25:01.679187Z","shell.execute_reply":"2024-03-20T00:25:01.691086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(non_empty_masks)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:25:01.692915Z","iopub.execute_input":"2024-03-20T00:25:01.693191Z","iopub.status.idle":"2024-03-20T00:25:01.707484Z","shell.execute_reply.started":"2024-03-20T00:25:01.693168Z","shell.execute_reply":"2024-03-20T00:25:01.706629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### preparing dataloader","metadata":{}},{"cell_type":"code","source":"class MRIDataset(tf.keras.utils.Sequence):\n    def __init__(self, df, batch_size):\n        self.df = df\n        self.batch_size = batch_size\n        \n    def __len__(self):\n        return len(self.df) // self.batch_size\n    \n    def get_image(self, path):\n        image = Image.open(path)\n        image = np.array(image).astype(np.float32) / 255\n        image = resize(image, (config['IMAGE_HEIGHT'], config['IMAGE_WIDTH']), mode='constant', preserve_range=True)        \n        return image\n    \n    def get_mask(self, path):\n        mask = Image.open(path)\n        mask = np.array(mask).astype(np.bool_)\n        mask = resize(mask, (config['IMAGE_HEIGHT'], config['IMAGE_WIDTH']), mode='constant', preserve_range=True)\n        mask = mask.astype(np.float32)\n        mask = np.expand_dims(mask, axis=-1)\n\n        return mask\n    \n    def __getitem__(self, idx):\n        batch = self.df[idx*self.batch_size:(idx+1)*self.batch_size]\n        images = []\n        masks = []\n        \n        for _, (image_path, mask_path) in batch.iterrows():\n            images.append(self.get_image(image_path))\n            masks.append(self.get_mask(mask_path))\n            \n        images = np.array(images)\n        masks = np.array(masks)\n        \n        return images, masks\n    \ndataset = MRIDataset(path_df, 1)\nimage, mask = dataset[200]\nplt.imshow(image[0])\n            \n    ","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:25:01.708585Z","iopub.execute_input":"2024-03-20T00:25:01.708848Z","iopub.status.idle":"2024-03-20T00:25:02.128845Z","shell.execute_reply.started":"2024-03-20T00:25:01.708827Z","shell.execute_reply":"2024-03-20T00:25:02.127855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### train test val split","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain, test_val = train_test_split(path_df, test_size=0.4)\ntest, val = train_test_split(test_val, test_size=0.25)\ntrain = MRIDataset(train, 32)\ntest = MRIDataset(test, 32)\nval = MRIDataset(val, 32)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:26:48.281678Z","iopub.execute_input":"2024-03-20T00:26:48.282437Z","iopub.status.idle":"2024-03-20T00:26:48.291539Z","shell.execute_reply.started":"2024-03-20T00:26:48.282407Z","shell.execute_reply":"2024-03-20T00:26:48.290603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### define loss functions (dice_loss, jaccard_loss) ","metadata":{}},{"cell_type":"code","source":"def dice_coef(y_true, y_pred):\n    y_true_f = K.flatten(y_true)\n    y_pred_f = K.flatten(y_pred)\n    intersection = K.sum(y_true_f*y_pred_f)\n    \n    dice_coef = (2*intersection + 1) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1)\n    return dice_coef\n\ndef jaccard_coef(y_true, y_pred):\n    y_true_f = K.flatten(y_true)\n    y_pred_f = K.flatten(y_pred)\n    intersection = K.sum(y_true_f*y_pred_f)\n    \n    jaccard_coef = (intersection + 1) / (K.sum(y_true_f) + K.sum(y_pred_f) - intersection + 1)\n    return jaccard_coef\n\ndef dice_loss(y_true, y_pred):\n    return -dice_coef(y_true, y_pred)\n\ndef jaccard_loss(y_true, y_pred):\n    return -jaccard_coef(y_true, y_pred)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:26:51.666750Z","iopub.execute_input":"2024-03-20T00:26:51.667401Z","iopub.status.idle":"2024-03-20T00:26:51.675339Z","shell.execute_reply.started":"2024-03-20T00:26:51.667354Z","shell.execute_reply":"2024-03-20T00:26:51.674262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Simple U-Net","metadata":{}},{"cell_type":"code","source":"def build_model():\n    inputs = Input((config['IMAGE_WIDTH'], config['IMAGE_HEIGHT'], config['NUM_CHANNELS']))\n    scaled = Lambda(lambda x: x /255)(inputs)\n    \n    c1 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(scaled)\n    c1 = Dropout(0.1)(c1)\n    c1 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c1)\n    c1 = Dropout(0.1)(c1)\n    p1 = MaxPooling2D((2, 2))(c1)\n    \n    c2 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p1)\n    c2 = Dropout(0.1)(c2)\n    c2 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c2)\n    c2 = Dropout(0.1)(c2)\n    p2 = MaxPooling2D((2, 2))(c2)\n    \n    c3 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p2)\n    c3 = Dropout(0.2)(c3)\n    c3 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c3)\n    c3 = Dropout(0.2)(c3)\n    p3 = MaxPooling2D((2, 2))(c3)\n    \n    c4 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p3)\n    c4 = Dropout(0.2)(c4)\n    c4 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c4)\n    c4 = Dropout(0.2)(c4)\n    p4 = MaxPooling2D((2, 2))(c4)\n    \n    c5 = Conv2D(256, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p4)\n    c5 = Dropout(0.3)(c5)\n    c5 = Conv2D(256, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c5)\n    \n    u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)\n    c6 = concatenate([u6, c4])\n    c6 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c6)\n    c6 = Dropout(0.2)(c6)\n    c6 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c6) \n    \n    u7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)\n    c7 = concatenate([u7, c3])\n    c7 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c7)\n    c7 = Dropout(0.2)(c7)\n    c7 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c7)     \n    \n    u8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)\n    c8 = concatenate([u8, c2])\n    c8 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c8)\n    c8 = Dropout(0.1)(c8)\n    c8 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c8) \n    \n    u9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)\n    c9 = concatenate([u9, c1])\n    c9 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c9)\n    c9 = Dropout(0.1)(c9)\n    c9 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c9)\n    \n    outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9)\n    \n    model = tf.keras.Model(inputs=[inputs], outputs=[outputs])\n    return model\n\nEPOCHS = 30\nlr = 1e-3\n# decay_rate = lr/EPOCHS \n\nmodel = build_model()\nmodel.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr), loss='binary_crossentropy', metrics=[dice_coef])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:26:58.344366Z","iopub.execute_input":"2024-03-20T00:26:58.345087Z","iopub.status.idle":"2024-03-20T00:26:58.643730Z","shell.execute_reply.started":"2024-03-20T00:26:58.345055Z","shell.execute_reply":"2024-03-20T00:26:58.642775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Res-U-Net","metadata":{}},{"cell_type":"code","source":"def build_model():\n    inputs = Input((config['IMAGE_WIDTH'], config['IMAGE_HEIGHT'], config['NUM_CHANNELS']))\n    scaled = Lambda(lambda x: x /255)(inputs)\n    \n    c1 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(scaled)\n    c1 = Dropout(0.1)(c1)\n    c1 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c1)\n    c1 = Dropout(0.1)(c1)\n    res = Conv2D(16, (1,1), padding='same')(scaled)\n    c1 = add([c1, res])\n    p1 = MaxPooling2D((2, 2))(c1)\n    \n    c2 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p1)\n    c2 = Dropout(0.1)(c2)\n    c2 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c2)\n    c2 = Dropout(0.1)(c2)\n    res = Conv2D(32, (1,1), padding='same')(p1)\n    c2 = add([c2, res])    \n    p2 = MaxPooling2D((2, 2))(c2)\n    \n    c3 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p2)\n    c3 = Dropout(0.2)(c3)\n    c3 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c3)\n    c3 = Dropout(0.2)(c3)\n    res = Conv2D(64, (1,1), padding='same')(p2)\n    c3 = add([c3, res])    \n    p3 = MaxPooling2D((2, 2))(c3)\n    \n    c4 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p3)\n    c4 = Dropout(0.2)(c4)\n    c4 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c4)\n    c4 = Dropout(0.2)(c4)\n    res = Conv2D(128, (1,1), padding='same')(p3)\n    c4 = add([c4, res])    \n    p4 = MaxPooling2D((2, 2))(c4)\n    \n    c5 = Conv2D(256, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(p4)\n    c5 = Dropout(0.3)(c5)\n    c5 = Conv2D(256, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c5)\n    \n    u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)\n    u6 = concatenate([u6, c4])\n    c6 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(u6)\n    c6 = Dropout(0.2)(c6)\n    c6 = Conv2D(128, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c6)\n    u6 = Conv2D(128, (1, 1), padding='same')(u6)\n    c6 = add([u6, c6])\n    \n    u7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)\n    u7 = concatenate([u7, c3])\n    c7 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(u7)\n    c7 = Dropout(0.2)(c7)\n    c7 = Conv2D(64, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c7)     \n    u7 = Conv2D(64, (1, 1), padding='same')(u7)\n    c7 = add([u7, c7])    \n    \n    u8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)\n    u8 = concatenate([u8, c2])\n    c8 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(u8)\n    c8 = Dropout(0.1)(c8)\n    c8 = Conv2D(32, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c8) \n    u8 = Conv2D(32, (1, 1), padding='same')(u8)\n    c8 = add([u8, c8])\n    \n    u9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)\n    u9 = concatenate([u9, c1])\n    c9 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(u9)\n    c9 = Dropout(0.1)(c9)\n    c9 = Conv2D(16, (3,3), activation='relu', padding='same', kernel_initializer='he_normal')(c9)\n    u9 = Conv2D(16, (1, 1), padding='same')(u9)\n    c9 = add([u9, c9])\n    \n    outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9)\n    \n    model = tf.keras.Model(inputs=[inputs], outputs=[outputs])\n    return model\n\nEPOCHS = 30\nlr = 1e-3\n# decay_rate = lr/EPOCHS \n\nres_model = build_model()\nres_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr), loss='binary_crossentropy', metrics=[dice_coef])\nres_model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T01:09:20.123663Z","iopub.execute_input":"2024-03-20T01:09:20.124436Z","iopub.status.idle":"2024-03-20T01:09:20.536363Z","shell.execute_reply.started":"2024-03-20T01:09:20.124382Z","shell.execute_reply":"2024-03-20T01:09:20.535429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training","metadata":{}},{"cell_type":"markdown","source":"### training UNet","metadata":{}},{"cell_type":"code","source":"checkpointer = tf.keras.callbacks.ModelCheckpoint('model_for_mri.keras', verbose=1, save_best_only=True)\n\ncallbacks = [\n#         tf.keras.callbacks.EarlyStopping(patience=4, monitor='val_loss'),\n        tf.keras.callbacks.TensorBoard(log_dir='logs'),\n        checkpointer]\n\nresults = model.fit(train, validation_data=val, epochs=EPOCHS, callbacks=callbacks)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### train res-U-Net","metadata":{}},{"cell_type":"code","source":"checkpointer = tf.keras.callbacks.ModelCheckpoint('res_model_for_mri.keras', verbose=1, save_best_only=True)\n\ncallbacks = [\n#         tf.keras.callbacks.EarlyStopping(patience=4, monitor='val_loss'),\n        tf.keras.callbacks.TensorBoard(log_dir='logs'),\n        checkpointer]\n\nresults = res_model.fit(train, validation_data=val, epochs=EPOCHS, callbacks=callbacks)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-20T01:14:33.002331Z","iopub.execute_input":"2024-03-20T01:14:33.003257Z","iopub.status.idle":"2024-03-20T01:49:09.576651Z","shell.execute_reply.started":"2024-03-20T01:14:33.003225Z","shell.execute_reply":"2024-03-20T01:49:09.575662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plotting predictions","metadata":{}},{"cell_type":"markdown","source":"### predicting for 10 selected test images from UNet","metadata":{}},{"cell_type":"code","source":"model.load_weights('/kaggle/working/model_for_mri.keras')\n\ni = 10\nimage, mask = test[i]\npred = res_model.predict(image)\n\nplt.subplots(10, 2, figsize=(10, 50))\nfor i in range(10):\n    plt.subplot(10, 2, i*2+1)\n    plt.imshow(pred[i] > .5)\n    plt.subplot(10, 2, i*2+2)\n    plt.imshow(mask[i])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T02:01:14.937365Z","iopub.execute_input":"2024-03-20T02:01:14.937788Z","iopub.status.idle":"2024-03-20T02:01:19.678377Z","shell.execute_reply.started":"2024-03-20T02:01:14.937759Z","shell.execute_reply":"2024-03-20T02:01:19.677429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### predicting for 10 selected test images from res-UNet","metadata":{}},{"cell_type":"code","source":"res_model.load_weights('/kaggle/working/res_model_for_mri.keras')\n\ni = 10\nimage, mask = test[i]\npred = res_model.predict(image)\n\nplt.subplots(10, 2, figsize=(10, 50))\nfor i in range(10):\n    plt.subplot(10, 2, i*2+1)\n    plt.imshow(pred[i] > .5)\n    plt.subplot(10, 2, i*2+2)\n    plt.imshow(mask[i])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T01:58:35.966985Z","iopub.execute_input":"2024-03-20T01:58:35.967378Z","iopub.status.idle":"2024-03-20T01:58:41.595549Z","shell.execute_reply.started":"2024-03-20T01:58:35.967349Z","shell.execute_reply":"2024-03-20T01:58:41.594469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}