{"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 pynrrd","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-17T14:34:46.52808Z","iopub.execute_input":"2023-04-17T14:34:46.528523Z","iopub.status.idle":"2023-04-17T14:34:48.388754Z","shell.execute_reply.started":"2023-04-17T14:34:46.528477Z","shell.execute_reply":"2023-04-17T14:34:48.38728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install opencv-contrib-python","metadata":{"execution":{"iopub.status.busy":"2023-04-17T12:50:43.186194Z","iopub.status.idle":"2023-04-17T12:50:43.187031Z","shell.execute_reply.started":"2023-04-17T12:50:43.186754Z","shell.execute_reply":"2023-04-17T12:50:43.18678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport cv2\nimport os \nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow import keras \nfrom tensorflow.keras.models import  Model\nfrom tensorflow.keras.layers import Conv2D ,MaxPooling2D ,UpSampling2D ,concatenate,Dropout ,Activation ,Input\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, LearningRateScheduler ,ReduceLROnPlateau, EarlyStopping\nfrom tensorflow.keras import backend as K\nfrom matplotlib import cm\nimport matplotlib.animation as anim\nfrom tqdm import tqdm\nfrom random import randint\nimport nibabel as nib\nimport pydicom as pdm\nimport nilearn as nl\nimport nilearn.plotting as nlplt\nimport nrrd\nimport h5py\nfrom IPython.display import Image as show_gif","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:34:49.139377Z","iopub.execute_input":"2023-04-17T14:34:49.140677Z","iopub.status.idle":"2023-04-17T14:34:49.150612Z","shell.execute_reply.started":"2023-04-17T14:34:49.140622Z","shell.execute_reply":"2023-04-17T14:34:49.148995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv('/kaggle/input/chest-ct-segmentation/train.csv')\ndata.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:34:50.749978Z","iopub.execute_input":"2023-04-17T14:34:50.750368Z","iopub.status.idle":"2023-04-17T14:34:50.789802Z","shell.execute_reply.started":"2023-04-17T14:34:50.750333Z","shell.execute_reply":"2023-04-17T14:34:50.788456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageToGIF:\n    \"\"\"Create GIF without saving image files.\"\"\"\n    def __init__(self,\n                 size=(600, 400), \n                 xy_text=(80, 10),\n                 dpi=100, \n                 cmap='CMRmap'):\n\n        self.fig = plt.figure()\n        self.fig.set_size_inches(size[0] / dpi, size[1] / dpi)\n        self.xy_text = xy_text\n        self.cmap = cmap\n        \n        self.ax = self.fig.add_axes([0, 0, 1, 1])\n        self.ax.set_xticks([])\n        self.ax.set_yticks([])\n        self.images = []\n \n    def add(self, *args, label, with_mask=True):\n        \n        image = args[0]\n        mask = args[-1]\n        plt.set_cmap(self.cmap)\n        plt_img = self.ax.imshow(image, animated=True)\n        if with_mask:\n            plt_mask = self.ax.imshow(np.ma.masked_where(mask == False, mask),\n                                      alpha=0.4, animated=True)\n\n        plt_text = self.ax.text(*self.xy_text, label, color='red')\n        to_plot = [plt_img, plt_mask, plt_text] if with_mask else [plt_img, plt_text]\n        self.images.append(to_plot)\n        plt.close()\n \n    def save(self, filename, fps):\n        animation = anim.ArtistAnimation(self.fig, self.images)\n        animation.save(filename, writer='imagemagick', fps=fps)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T11:26:45.184143Z","iopub.execute_input":"2023-04-17T11:26:45.184524Z","iopub.status.idle":"2023-04-17T11:26:45.198517Z","shell.execute_reply.started":"2023-04-17T11:26:45.184492Z","shell.execute_reply":"2023-04-17T11:26:45.196785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_nrrd_file(path: str, tensor_shape: tuple ) -> np.ndarray:\n    if os.path.exists(path):\n        tensor = nrrd.read(path)[0] \n        tensor = np.flip(tensor, -1)  \n    else: \n        tensor = np.zeros(tensor_shape, dtype=np.float32)\n    return tensor\n\ndef nrrd_to_numpy(id_: str, tensor_shape: tuple):\n    '''\n    Returns:  all id masks in single numpy tensor.\n    '''\n    lung_file_path = '../input/ct-lung-heart-trachea-segmentation/nrrd_lung/nrrd_lung/' + id_ + '_lung.nrrd'\n    heart_file_path  = '../input/ct-lung-heart-trachea-segmentation/nrrd_heart/nrrd_heart/' + id_ + '_heart.nrrd'      \n    trachea_file_path = '../input/ct-lung-heart-trachea-segmentation/nrrd_trachea/nrrd_trachea/' + id_ + '_trachea.nrrd'\n\n    lung_tensor = read_nrrd_file(lung_file_path, tensor_shape)\n    heart_tensor = read_nrrd_file(heart_file_path, tensor_shape)\n    trachea_tensor = read_nrrd_file(trachea_file_path, tensor_shape)\n    \n    # chek if all tensors  have the same shape.\n    if not (lung_tensor.shape == heart_tensor.shape == trachea_tensor.shape):\n        #print(lung_tensor.shape, heart_tensor.shape, trachea_tensor.shape)\n        print(\"problem with id:\", id_)\n        return \n        # now each tensor channel is a mask with a unique label\n    full_mask = np.stack([lung_tensor, heart_tensor, trachea_tensor])\n    print(\"shape : \", full_mask.shape)\n    # reorient the axes from CHWB to BWHC\n    full_mask = np.moveaxis(full_mask,\n                            [0, 1, 2, 3],\n                            [3, 2, 1, 0]).astype(np.float32)\n\n    return full_mask","metadata":{"execution":{"iopub.status.busy":"2023-04-17T10:55:16.124933Z","iopub.status.idle":"2023-04-17T10:55:16.125833Z","shell.execute_reply.started":"2023-04-17T10:55:16.125454Z","shell.execute_reply":"2023-04-17T10:55:16.125595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_path =  '../input/osic-pulmonary-fibrosis-progression/train/ID00019637202178323708467'\nsample_path_files = sorted(os.listdir(sample_path), key=lambda x: int(x[:-4]))","metadata":{"execution":{"iopub.status.busy":"2023-04-17T10:55:16.127218Z","iopub.status.idle":"2023-04-17T10:55:16.12803Z","shell.execute_reply.started":"2023-04-17T10:55:16.127778Z","shell.execute_reply":"2023-04-17T10:55:16.127803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_data_gif = ImageToGIF(size=(730,730 ),\n                             xy_text=(250, 15))\n\nlabel = sample_path.split('/')[-1]\nfor i in range(len(sample_path_files)):\n    path = os.path.join(sample_path, sample_path_files[i])\n    image = pdm.dcmread(path).pixel_array\n    sample_data_gif.add(image, label=f'{label}_{str(i)}', with_mask=False)\n\nsample_data_gif.save(f'{label}.gif', fps=8)\nshow_gif(f'{label}.gif', format='png')","metadata":{"execution":{"iopub.status.busy":"2023-04-17T09:43:56.743632Z","iopub.execute_input":"2023-04-17T09:43:56.74401Z","iopub.status.idle":"2023-04-17T09:44:09.81325Z","shell.execute_reply.started":"2023-04-17T09:43:56.743977Z","shell.execute_reply":"2023-04-17T09:44:09.811162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id_ = 'ID00019637202178323708467'\nsample_masks = nrrd_to_numpy(id_, (768, 768))\nsample_masks.shape","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-04-17T09:44:09.819143Z","iopub.execute_input":"2023-04-17T09:44:09.820022Z","iopub.status.idle":"2023-04-17T09:44:10.27724Z","shell.execute_reply.started":"2023-04-17T09:44:09.819955Z","shell.execute_reply":"2023-04-17T09:44:10.276196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_data_gif = ImageToGIF(size=(768, 768),\n                             xy_text=(250, 15))\n\nlabel = id_ + '_mask'\nfor i in range(sample_masks.shape[0]):\n    sample_data_gif.add(sample_masks[i],label=f'{label}_{str(i)}', with_mask=False)\n \nsample_data_gif.save(f'{label}.gif', fps=8)\nshow_gif(f'{label}.gif', format='png')","metadata":{"execution":{"iopub.status.busy":"2023-04-17T09:44:10.281718Z","iopub.execute_input":"2023-04-17T09:44:10.284393Z","iopub.status.idle":"2023-04-17T09:44:22.869489Z","shell.execute_reply.started":"2023-04-17T09:44:10.28434Z","shell.execute_reply":"2023-04-17T09:44:22.868206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageToGIF:\n    def __init__(self,\n                 size=(768, 768), \n                 xy_text=(250, 25),\n                 dpi=100):\n        \n        self.fig = plt.figure()\n        self.fig.set_size_inches(size[0] / dpi, size[1] / dpi)\n        self.xy_text = xy_text\n        \n        self.ax = self.fig.add_axes([0, 0, 1, 1])\n        self.ax.set_xticks([])\n        self.ax.set_yticks([])\n        self.images = []\n \n    def add(self, image, mask, label, with_mask=True):\n        \n        lung, heart, trachea = [mask[:, :, i] for i in range(3)]\n        plt_img = self.ax.imshow(image, cmap=\"bone\", animated=True)\n\n        # Overlaying segmentation masks\n        plt_mask1 = self.ax.imshow(np.ma.masked_where(lung == False, lung),\n                               cmap='cool', alpha=0.3, animated=True)\n        plt_mask2 = self.ax.imshow(np.ma.masked_where(heart == False, heart),\n                               cmap='autumn', alpha=0.3, animated=True)\n        plt_mask3 = self.ax.imshow(np.ma.masked_where(trachea == False, trachea),\n                               cmap='autumn_r', alpha=0.3, animated=True) #cool_r - blue\n        plt_text = self.ax.text(*self.xy_text, label, color='red')\n        to_plot = [plt_img, plt_mask1, plt_mask2, plt_mask3, plt_text] \n        self.images.append(to_plot)\n        plt.close()\n \n    def save(self, filename, fps):\n        animation = anim.ArtistAnimation(self.fig, self.images)\n        animation.save(filename, writer='imagemagick', fps=fps)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T09:44:22.872753Z","iopub.execute_input":"2023-04-17T09:44:22.873404Z","iopub.status.idle":"2023-04-17T09:44:22.887717Z","shell.execute_reply.started":"2023-04-17T09:44:22.873347Z","shell.execute_reply":"2023-04-17T09:44:22.886354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_data_gif = ImageToGIF()\n\nlabel = id_ + '_with_masks'\nfor i in range(sample_masks.shape[0]):\n    path = os.path.join(sample_path, sample_path_files[i])\n    image = pdm.dcmread(path).pixel_array\n    mask = sample_masks[i]\n    sample_data_gif.add(image, mask, label=f'{label}_{str(i)}',)\n    \nsample_data_gif.save(f'{label}.gif', fps=8)\nshow_gif(f'{label}.gif', format='png')","metadata":{"execution":{"iopub.status.busy":"2023-04-17T09:51:15.498631Z","iopub.execute_input":"2023-04-17T09:51:15.499066Z","iopub.status.idle":"2023-04-17T09:51:37.632231Z","shell.execute_reply.started":"2023-04-17T09:51:15.499029Z","shell.execute_reply":"2023-04-17T09:51:37.630505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img  = plt.imread('../input/chest-ct-segmentation/images/images/ID00007637202177411956430_20.jpg')\nmask = plt.imread('../input/chest-ct-segmentation/masks/masks/ID00007637202177411956430_mask_20.jpg')\n\nprint(\"Image Shape : \" , img.shape)\nprint(\"Mask Shape : \" , mask.shape)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:35:01.103014Z","iopub.execute_input":"2023-04-17T14:35:01.103452Z","iopub.status.idle":"2023-04-17T14:35:01.12716Z","shell.execute_reply.started":"2023-04-17T14:35:01.103407Z","shell.execute_reply":"2023-04-17T14:35:01.126077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create a figure with two subplots\nfig, axs = plt.subplots(1, 2, figsize=(16, 8), constrained_layout=True)\n\n# Plot the first image on the left subplot\naxs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) \naxs[0].axis('off')\naxs[0].set_title('Image')\n# Plot the second image on the right subplot\naxs[1].imshow(mask)\naxs[1].axis('off')\naxs[1].set_title('Mask')\n\n# Show the figure\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:35:01.638251Z","iopub.execute_input":"2023-04-17T14:35:01.638999Z","iopub.status.idle":"2023-04-17T14:35:02.466929Z","shell.execute_reply.started":"2023-04-17T14:35:01.63895Z","shell.execute_reply":"2023-04-17T14:35:02.465931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n# we create two instances with the same arguments\n\n# VI Note: use the same seed for image_datagen and mask_datagen to ensure the transformation for image and mask is the same\ndata_gen_args = dict(rotation_range=0.2,\n                    width_shift_range=0.05,\n                    height_shift_range=0.05,\n                    shear_range=0.05,\n                    zoom_range=0.05,\n                    horizontal_flip=True,\n                    fill_mode='nearest',\n                    rescale=1./255,\n                    validation_split = 0.2)\n\nmask_gen_args = dict(rotation_range=0.2,\n                    width_shift_range=0.05,\n                    height_shift_range=0.05,\n                    shear_range=0.05,\n                    zoom_range=0.05,\n                    horizontal_flip=True,\n                    fill_mode='nearest',\n                    rescale=1./255,\n                    validation_split = 0.2)\n                    \n\nimage_datagen = ImageDataGenerator(**data_gen_args)\nmask_datagen  = ImageDataGenerator(**mask_gen_args)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:35:09.163605Z","iopub.execute_input":"2023-04-17T14:35:09.164565Z","iopub.status.idle":"2023-04-17T14:35:09.172602Z","shell.execute_reply.started":"2023-04-17T14:35:09.164524Z","shell.execute_reply":"2023-04-17T14:35:09.171447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = (256, 256) # resolution\nBATCH_SIZE = 32\ndirectory='../input/chest-ct-segmentation/'\n\nimage_generator = image_datagen.flow_from_dataframe(\n    dataframe=data,\n    directory=directory + '/images/images',\n    class_mode=None,\n    #classes=['images'],\n    x_col='ImageId',\n    seed=50,\n    color_mode='grayscale',\n    batch_size=BATCH_SIZE,\n    target_size=IMG_SIZE,\n    subset='training'\n)\n\nimage_generator_val = image_datagen.flow_from_dataframe(\n    dataframe=data,\n    directory=directory + '/images/images',\n    class_mode=None,\n    #classes=['images'],\n    x_col='ImageId',\n    seed=50,\n    color_mode='grayscale',\n    batch_size=BATCH_SIZE,\n    target_size=IMG_SIZE,\n    subset='validation'\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:35:09.596263Z","iopub.execute_input":"2023-04-17T14:35:09.597035Z","iopub.status.idle":"2023-04-17T14:36:02.588106Z","shell.execute_reply.started":"2023-04-17T14:35:09.596991Z","shell.execute_reply":"2023-04-17T14:36:02.586884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mask_generator = mask_datagen.flow_from_dataframe(\n    dataframe=data,\n    directory= directory + '/masks/masks',\n    #classes=['masks'],\n    class_mode=None,\n    x_col='MaskId',\n    seed=50,\n    batch_size=BATCH_SIZE,\n    color_mode='rgb',\n    target_size=IMG_SIZE,\n    subset='training')\n\nmask_generator_val = mask_datagen.flow_from_dataframe(\n    dataframe=data,\n    directory=directory + '/masks/masks',\n    #classes=['masks'],\n    class_mode=None,\n    x_col='MaskId',\n    seed=50,\n    batch_size=BATCH_SIZE,\n    color_mode='rgb',\n    target_size=IMG_SIZE,\n    subset='validation')","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:36:02.590392Z","iopub.execute_input":"2023-04-17T14:36:02.590789Z","iopub.status.idle":"2023-04-17T14:36:55.043343Z","shell.execute_reply.started":"2023-04-17T14:36:02.590746Z","shell.execute_reply":"2023-04-17T14:36:55.042094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = zip(image_generator, mask_generator)\ndef train_generator_fn():\n    for (img,mask) in train_generator:\n        yield (img,mask) \nvalid_generator = zip(image_generator_val, mask_generator_val)\ndef valid_generator_fn():\n    for (img,mask) in valid_generator:\n        yield (img,mask)  ","metadata":{"execution":{"iopub.status.busy":"2023-04-17T14:36:55.045191Z","iopub.execute_input":"2023-04-17T14:36:55.045951Z","iopub.status.idle":"2023-04-17T14:36:55.052922Z","shell.execute_reply.started":"2023-04-17T14:36:55.045908Z","shell.execute_reply":"2023-04-17T14:36:55.051882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20,20))\nfor X_batch, y_batch in train_generator:\n    # create a grid of 3x3 images\n    for i in range(0,16):\n        plt.subplot(4,4,i+1)\n        plt.imshow(X_batch[i],cmap='gray')\n    # show the plot\n    plt.show()\n    break","metadata":{"execution":{"iopub.status.busy":"2023-04-17T12:50:58.057599Z","iopub.status.idle":"2023-04-17T12:50:58.058754Z","shell.execute_reply.started":"2023-04-17T12:50:58.058487Z","shell.execute_reply":"2023-04-17T12:50:58.058513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20,20))\nfor X_batch, y_batch in train_generator:\n    # create a grid of 3x3 images\n    for i in range(0,16):\n        plt.subplot(4,4,i+1)\n        plt.imshow(y_batch[i])\n    # show the plot\n    plt.show()\n    break","metadata":{"execution":{"iopub.status.busy":"2023-04-17T11:31:09.698839Z","iopub.execute_input":"2023-04-17T11:31:09.699797Z","iopub.status.idle":"2023-04-17T11:31:15.478001Z","shell.execute_reply.started":"2023-04-17T11:31:09.699743Z","shell.execute_reply":"2023-04-17T11:31:15.477085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"smooth=1.\n\ndef dice_coef(y_true, y_pred):\n    y_true = K.flatten(y_true)\n    y_pred = K.flatten(y_pred)\n    intersection = K.sum(y_true * y_pred)\n    union = K.sum(y_true) + K.sum(y_pred)\n    return (2.0 * intersection + smooth) / (union + smooth)\n\ndef dice_coef_loss(y_true, y_pred):\n    return 1 - dice_coef(y_true, y_pred)\n\ndef bce_dice_loss(y_true, y_pred):\n    bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n    return dice_coef_loss(y_true, y_pred) + bce(y_true, y_pred)\n\ndef iou(y_true, y_pred):\n    intersection = K.sum(y_true * y_pred)\n    sum_ = K.sum(y_true + y_pred)\n    jac = (intersection + smooth) / (sum_ - intersection + smooth)\n    return jac","metadata":{"execution":{"iopub.status.busy":"2023-04-17T15:24:20.675589Z","iopub.execute_input":"2023-04-17T15:24:20.676562Z","iopub.status.idle":"2023-04-17T15:24:20.685062Z","shell.execute_reply.started":"2023-04-17T15:24:20.676523Z","shell.execute_reply":"2023-04-17T15:24:20.683643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def unet(n_classes,input_size = (256,256,1)):\n    inputs = Input(input_size)\n    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)\n    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)\n    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)\n    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)\n    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)\n    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)\n    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)\n    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)\n    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)\n    drop4 = Dropout(0.5)(conv4)\n    pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)\n\n    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)\n    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)\n    drop5 = Dropout(0.5)(conv5)\n\n    x = UpSampling2D(size = (2,2))(drop5)\n    up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(x)\n    merge6 = concatenate([drop4,up6], axis = 3)\n    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)\n    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)\n\n    up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))\n    merge7 = concatenate([conv3,up7], axis = 3)\n    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)\n    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)\n\n    up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))\n    merge8 = concatenate([conv2,up8], axis = 3)\n    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8)\n    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8)\n\n    up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8))\n    merge9 = concatenate([conv1,up9], axis = 3)\n    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)\n    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)\n    \n    conv10 = Conv2D(n_classes, (1,1), padding='same')(conv9)\n    \n    output_layer = Activation('softmax')(conv10)\n     \n\n    model = Model(inputs = inputs, outputs = output_layer)\n    \n    return model\n","metadata":{"execution":{"iopub.status.busy":"2023-04-17T15:29:41.095536Z","iopub.execute_input":"2023-04-17T15:29:41.095906Z","iopub.status.idle":"2023-04-17T15:29:41.114774Z","shell.execute_reply.started":"2023-04-17T15:29:41.09587Z","shell.execute_reply":"2023-04-17T15:29:41.113586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = unet(n_classes = 3)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-04-17T15:29:43.526043Z","iopub.execute_input":"2023-04-17T15:29:43.526448Z","iopub.status.idle":"2023-04-17T15:29:43.900319Z","shell.execute_reply.started":"2023-04-17T15:29:43.526406Z","shell.execute_reply":"2023-04-17T15:29:43.899455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EarlyStop=EarlyStopping(patience=10,restore_best_weights=True)\nReduce_LR=ReduceLROnPlateau(monitor='val_loss',verbose=2,factor=0.5,min_lr=0.00001)\nmodel_checkpoint = ModelCheckpoint('unet_camvid.hdf5', monitor='val_loss',verbose=1, save_best_only=True)\ncallback=[EarlyStop , Reduce_LR,model_checkpoint]","metadata":{"execution":{"iopub.status.busy":"2023-04-17T15:29:51.950489Z","iopub.execute_input":"2023-04-17T15:29:51.951626Z","iopub.status.idle":"2023-04-17T15:29:51.95916Z","shell.execute_reply.started":"2023-04-17T15:29:51.951572Z","shell.execute_reply":"2023-04-17T15:29:51.958098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.metrics import Recall, Precision\nmodel.compile(optimizer=Adam(lr=1e-3), loss=bce_dice_loss, metrics=[dice_coef, Recall(),Precision(), iou])","metadata":{"execution":{"iopub.status.busy":"2023-04-17T15:29:53.942818Z","iopub.execute_input":"2023-04-17T15:29:53.94408Z","iopub.status.idle":"2023-04-17T15:29:53.965233Z","shell.execute_reply.started":"2023-04-17T15:29:53.944028Z","shell.execute_reply":"2023-04-17T15:29:53.964201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_generator_fn(), validation_data=valid_generator_fn(),epochs= 5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}