{"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":"Author : Aadya Aneesh Chinubhai \n\nKey Steps :\nBuild U-Net Class,\nDefine Activation function candidates,\nCompare Accuracy & Training time.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Conv2DTranspose, concatenate\nfrom tensorflow.keras.models import Model\nfrom keras import metrics\nimport keras\nimport os\nimport random\nfrom tqdm import tqdm \nfrom zipfile import ZipFile\nfrom skimage.io import imread, imshow\nfrom skimage.transform import resize\nimport matplotlib.pyplot as plt\nimport pandas as pd","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:16.433884Z","iopub.execute_input":"2023-02-20T13:17:16.434731Z","iopub.status.idle":"2023-02-20T13:17:23.695275Z","shell.execute_reply.started":"2023-02-20T13:17:16.434635Z","shell.execute_reply":"2023-02-20T13:17:23.694166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class UNet:\n    \n    def __init__(self, input_shape_,  activation_ = \"relu\"):\n        self.activation = activation_\n        self.input_shape = input_shape_\n    \n    def dice_coef(self, y_true, y_pred, smooth=100):\n        y_true = tf.cast(y_true, tf.float32)\n        y_pred = tf.cast(y_pred, tf.float32)\n        \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        dice = (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)\n        return dice\n    \n    def dice_coef_loss(self, y_true, y_pred):\n        return -self.dice_coef(y_true, y_pred)\n    \n    def iou(self, y_true, y_pred):\n        y_true = tf.cast(y_true, tf.float32)\n        y_pred = tf.cast(y_pred, tf.float32)\n\n        def f(y_true, y_pred):\n            intersection = (y_true * y_pred).sum()\n            union = y_true.sum() + y_pred.sum() - intersection\n            x = (intersection + 1e-15) / (union + 1e-15)\n            x = x.astype(np.float32)\n            return x\n        \n        return tf.numpy_function(f, [y_true, y_pred], tf.float32)\n\n    def buildModel(self):\n        \n        # Lets create the DownSampling Blocks \n        kernel_initializer =  'he_uniform'\n         \n        inputs = tf.keras.Input(shape = self.input_shape)\n        \n        # Block - 1\n    \n        s = inputs\n\n        #Contraction path\n        c1 = Conv2D(16, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(s)\n#         c1 = Dropout(0.1)(c1)\n        c1 = Conv2D(16, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c1)\n        p1 = MaxPooling2D((2, 2))(c1)\n\n        c2 = Conv2D(32, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(p1)\n#         c2 = Dropout(0.1)(c2)\n        c2 = Conv2D(32, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c2)\n        p2 = MaxPooling2D((2, 2))(c2)\n\n        c3 = Conv2D(64, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(p2)\n#         c3 = Dropout(0.2)(c3)\n        c3 = Conv2D(64, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c3)\n        p3 = MaxPooling2D((2, 2))(c3)\n\n        c4 = Conv2D(128, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(p3)\n#         c4 = Dropout(0.2)(c4)\n        c4 = Conv2D(128, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c4)\n        p4 = MaxPooling2D(pool_size=(2, 2))(c4)\n\n        c5 = Conv2D(256, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(p4)\n#         c5 = Dropout(0.3)(c5)\n        c5 = Conv2D(256, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c5)\n\n        #Expansive path \n        u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)\n        u6 = concatenate([u6, c4])\n        c6 = Conv2D(128, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(u6)\n#         c6 = Dropout(0.2)(c6)\n        c6 = Conv2D(128, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(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= self.activation, kernel_initializer=kernel_initializer, padding='same')(u7)\n#         c7 = Dropout(0.2)(c7)\n        c7 = Conv2D(64, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(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= self.activation, kernel_initializer=kernel_initializer, padding='same')(u8)\n#         c8 = Dropout(0.1)(c8)\n        c8 = Conv2D(32, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(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= self.activation, kernel_initializer=kernel_initializer, padding='same')(u9)\n#         c9 = Dropout(0.1)(c9)\n        c9 = Conv2D(16, (3, 3), activation= self.activation, kernel_initializer=kernel_initializer, padding='same')(c9)\n\n        outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9)\n\n        model = Model(inputs=[inputs], outputs=[outputs])\n        #compile model outside of this function to make it flexible. \n        model.summary()\n\n        return model\n \n    \n    def CompileandSummarize(self, model_):\n        model_.compile(optimizer = tf.keras.optimizers.Adam(), loss = self.dice_coef_loss, metrics = self.iou)","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:23.699620Z","iopub.execute_input":"2023-02-20T13:17:23.701353Z","iopub.status.idle":"2023-02-20T13:17:23.741361Z","shell.execute_reply.started":"2023-02-20T13:17:23.701315Z","shell.execute_reply":"2023-02-20T13:17:23.739414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''Defining callbacks to calculate training time '''\n\nfrom timeit import default_timer as timer\n\nclass TimingCallback(keras.callbacks.Callback):\n    def __init__(self, logs={}):\n        self.logs=[]\n    def on_epoch_begin(self, epoch, logs={}):\n        self.starttime = timer()\n    def on_epoch_end(self, epoch, logs={}):\n        self.logs.append(timer()-self.starttime)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:23.746870Z","iopub.execute_input":"2023-02-20T13:17:23.749775Z","iopub.status.idle":"2023-02-20T13:17:23.759258Z","shell.execute_reply.started":"2023-02-20T13:17:23.749740Z","shell.execute_reply":"2023-02-20T13:17:23.758225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Now lets focus on preparing the data\n\nwith ZipFile(\"../input/data-science-bowl-2018/stage1_train.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"./stage1_train\")\n    \nwith ZipFile(\"../input/data-science-bowl-2018/stage1_test.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"./stage1_test\")    ","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:23.765478Z","iopub.execute_input":"2023-02-20T13:17:23.767622Z","iopub.status.idle":"2023-02-20T13:17:29.847262Z","shell.execute_reply.started":"2023-02-20T13:17:23.767588Z","shell.execute_reply":"2023-02-20T13:17:29.846210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 42\nnp.random.seed = seed\n\nIMG_WIDTH = 96\nIMG_HEIGHT = 96\nIMG_CHANNELS = 3\n\nTRAIN_PATH = './stage1_train/'\nTEST_PATH = './stage1_test/'","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:29.848586Z","iopub.execute_input":"2023-02-20T13:17:29.849472Z","iopub.status.idle":"2023-02-20T13:17:29.856677Z","shell.execute_reply.started":"2023-02-20T13:17:29.849434Z","shell.execute_reply":"2023-02-20T13:17:29.854787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ids = next(os.walk(TRAIN_PATH))[1]\ntest_ids = next(os.walk(TEST_PATH))[1]\n\ntrain_ids[:5]","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:29.858487Z","iopub.execute_input":"2023-02-20T13:17:29.860407Z","iopub.status.idle":"2023-02-20T13:17:29.882877Z","shell.execute_reply.started":"2023-02-20T13:17:29.860371Z","shell.execute_reply":"2023-02-20T13:17:29.881765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nY_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\n\nprint('Resizing training images and masks')\nfor n, file_name in tqdm(enumerate(train_ids)):   \n    path = TRAIN_PATH + file_name\n    img = imread(path + '/images/' + file_name + '.png')[:,:,:IMG_CHANNELS]  \n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    X_train[n] = img  #Fill empty X_train with values from img\n    mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\n    for mask_file in next(os.walk(path + '/masks/'))[2]:\n        mask_ = imread(path + '/masks/' + mask_file)\n        mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant',  \n                                      preserve_range=True), axis=-1)\n        mask = np.maximum(mask, mask_)  \n            \n    Y_train[n] = mask","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:17:29.884486Z","iopub.execute_input":"2023-02-20T13:17:29.885022Z","iopub.status.idle":"2023-02-20T13:22:47.431881Z","shell.execute_reply.started":"2023-02-20T13:17:29.884984Z","shell.execute_reply":"2023-02-20T13:22:47.430733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test images\nX_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nsizes_test = []\nprint('Resizing test images') \nfor n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):\n    path = TEST_PATH + id_\n    img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]\n    sizes_test.append([img.shape[0], img.shape[1]])\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    X_test[n] = img\n\nprint('Done!')","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:22:47.433677Z","iopub.execute_input":"2023-02-20T13:22:47.434384Z","iopub.status.idle":"2023-02-20T13:22:48.772540Z","shell.execute_reply.started":"2023-02-20T13:22:47.434342Z","shell.execute_reply":"2023-02-20T13:22:48.771383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_x = random.randint(0, len(train_ids))\nimshow(X_train[image_x])\nplt.show()\nimshow(np.squeeze(Y_train[image_x]))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:22:48.775118Z","iopub.execute_input":"2023-02-20T13:22:48.775901Z","iopub.status.idle":"2023-02-20T13:22:49.238646Z","shell.execute_reply.started":"2023-02-20T13:22:48.775845Z","shell.execute_reply":"2023-02-20T13:22:49.237700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class GCU(tf.keras.layers.Layer):\n    def __init__(self):\n        super(GCU, self).__init__()\n    \n    def call(self, x):\n        return tf.cast(tf.math.multiply(x , tf.math.cos(x))/tf.reduce_sum(x), tf.float32)","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:40:57.163741Z","iopub.execute_input":"2023-02-20T13:40:57.164700Z","iopub.status.idle":"2023-02-20T13:40:57.170974Z","shell.execute_reply.started":"2023-02-20T13:40:57.164666Z","shell.execute_reply":"2023-02-20T13:40:57.169651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntraining_inferences = {}\ncb = TimingCallback()\n\nUNet_1 = UNet((96, 96, 3), activation_= \"relu\")\nmodel1 = UNet_1.buildModel()\nUNet_1.CompileandSummarize(model1)\nresults1 = model1.fit(x = X_train, y = Y_train, batch_size = 8, epochs=100, callbacks = [cb])\n\ntraining_inferences['ReLU'] = sum(cb.logs)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-20T13:40:59.593322Z","iopub.execute_input":"2023-02-20T13:40:59.594059Z","iopub.status.idle":"2023-02-20T13:43:15.234997Z","shell.execute_reply.started":"2023-02-20T13:40:59.594019Z","shell.execute_reply":"2023-02-20T13:43:15.234066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}