{"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":"import tensorflow as tf\nimport os\nimport random\nimport numpy as np\n\nfrom tqdm import tqdm \nfrom zipfile import ZipFile\n\nfrom skimage.io import imread, imshow\nfrom skimage.transform import resize\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-10-05T17:53:39.746576Z","iopub.execute_input":"2022-10-05T17:53:39.747365Z","iopub.status.idle":"2022-10-05T17:53:46.246010Z","shell.execute_reply.started":"2022-10-05T17:53:39.747258Z","shell.execute_reply":"2022-10-05T17:53:46.244741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with 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":"2022-10-05T17:53:46.249187Z","iopub.execute_input":"2022-10-05T17:53:46.250534Z","iopub.status.idle":"2022-10-05T17:53:57.010729Z","shell.execute_reply.started":"2022-10-05T17:53:46.250490Z","shell.execute_reply":"2022-10-05T17:53:57.008951Z"},"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":"2022-10-05T17:53:57.013802Z","iopub.execute_input":"2022-10-05T17:53:57.014255Z","iopub.status.idle":"2022-10-05T17:53:57.023729Z","shell.execute_reply.started":"2022-10-05T17:53:57.014209Z","shell.execute_reply":"2022-10-05T17:53:57.022187Z"},"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":"2022-10-05T17:53:57.027555Z","iopub.execute_input":"2022-10-05T17:53:57.028435Z","iopub.status.idle":"2022-10-05T17:53:57.118868Z","shell.execute_reply.started":"2022-10-05T17:53:57.028392Z","shell.execute_reply":"2022-10-05T17:53:57.117072Z"},"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":"2022-10-05T17:53:57.121409Z","iopub.execute_input":"2022-10-05T17:53:57.121969Z","iopub.status.idle":"2022-10-05T17:59:31.290409Z","shell.execute_reply.started":"2022-10-05T17:53:57.121927Z","shell.execute_reply":"2022-10-05T17:59:31.289062Z"},"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":"2022-10-05T17:59:31.292690Z","iopub.execute_input":"2022-10-05T17:59:31.293642Z","iopub.status.idle":"2022-10-05T17:59:33.219334Z","shell.execute_reply.started":"2022-10-05T17:59:31.293599Z","shell.execute_reply":"2022-10-05T17:59:33.218091Z"},"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":"2022-10-05T17:59:33.221327Z","iopub.execute_input":"2022-10-05T17:59:33.222781Z","iopub.status.idle":"2022-10-05T17:59:33.752687Z","shell.execute_reply.started":"2022-10-05T17:59:33.222709Z","shell.execute_reply":"2022-10-05T17:59:33.750619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install segmentation-models\nimport segmentation_models as sm","metadata":{"execution":{"iopub.status.busy":"2022-10-05T17:59:33.754590Z","iopub.execute_input":"2022-10-05T17:59:33.754979Z","iopub.status.idle":"2022-10-05T17:59:49.439506Z","shell.execute_reply.started":"2022-10-05T17:59:33.754938Z","shell.execute_reply":"2022-10-05T17:59:49.437831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras import backend as K\nsmooth = 1.\ndropout_rate = 0.5\n\n\n# Custom loss function\n# def dice_coef(y_true, y_pred):\n#     smooth = 1.\n#     y_true_f = K.flatten(y_true)\n#     y_pred_f = K.flatten(y_pred)\n#     intersection = K.sum(K.dot(y_true_f , y_pred_f))\n#     return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)\n\n# def dice_loss(y_true, y_pred):\n#     return 1 - dice_coef(y_true, y_pred)\n\n# def bce_dice_loss(y_true, y_pred):\n#     return 0.5 * keras.losses.binary_crossentropy(y_true, y_pred) - dice_coef(y_true, y_pred)\n\ndef iou(y_true, y_pred):\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    return tf.numpy_function(f, [y_true, y_pred], tf.float32)\n\nimport keras\nimport os\nos.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"2\"\nimport numpy as np\nimport cv2\nimport glob\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.callbacks import ModelCheckpoint, CSVLogger, ReduceLROnPlateau\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.metrics import Recall, Precision\n# from metrics import dice_loss, dice_coef, iou\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import *\nfrom tensorflow.keras.applications import ResNet50\nimport matplotlib.pyplot as plt\nphysical_devices = tf.config.experimental.list_physical_devices('GPU')\n\nclass UNetPlusPlus():\n    \n    \n    \n    def __init__(self, input_shape = (96, 96, 3), filters = [32, 64, 128, 256, 512], nb_classes = 1, deep_supervision = False):\n        \n       \n        self.input__shape = input_shape\n        self.filters = filters\n        self.num_classes = nb_classes\n        self.deep_supervision = deep_supervision\n        self.__smooth = 1. \n    \n    def BuildNetwork(self):\n\n\n        input_img = Input(shape = (96, 96, 3), name = 'InputLayer')\n        \n        conv00 = self.AadyasConvolutionBlock(input_img, block_level = '00', filters = self.filters[0])\n        pool0 = MaxPooling2D(pool_size = 2, strides = 2, name = 'pool0')(conv00)\n\n        conv10 = self.AadyasConvolutionBlock(pool0, block_level = '10', filters = self.filters[1])\n        pool1 = MaxPooling2D(pool_size = 2, strides = 2, name = 'pool1')(conv10)\n\n        up01 = Conv2DTranspose(filters = self.filters[0], kernel_size = 2, strides = 2, padding='same', name='upsample01')(conv10)\n        conv01 = concatenate([up01, conv00], name='concat01')\n        conv01 = self.AadyasConvolutionBlock(conv01, block_level = '01', filters = self.filters[0])\n\n        conv20 = self.AadyasConvolutionBlock(pool1, block_level = '20', filters = self.filters[2])\n        pool2 = MaxPooling2D(pool_size = 2, strides = 2, name = 'pool2')(conv20)\n\n        up11 = Conv2DTranspose(filters = self.filters[1], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample11')(conv20)\n        conv11 = concatenate([up11, conv10], name = 'concat11')\n        conv11 = self.skip_path(conv11, block_level = '11', filters = self.filters[1])\n\n        up02 = Conv2DTranspose(filters = self.filters[0], kernel_size = 2, strides = 2, padding='same', name='upsample02')(conv11)\n        conv02 = concatenate([up02, conv00, conv01], name = 'concat02')\n        conv02 = self.AadyasConvolutionBlock(conv02, block_level = '02', filters = self.filters[0])\n\n        conv30 = self.AadyasConvolutionBlock(pool2, block_level = '30', filters = self.filters[3])\n        pool3 = MaxPooling2D(pool_size = 2, strides = 2, name = 'pool3')(conv30)\n\n        up21 = Conv2DTranspose(filters = self.filters[2], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample21')(conv30)\n        conv21 = concatenate([up21, conv20], name='concat21')\n\n        conv21 = self.AadyasConvolutionBlock(conv21, block_level='21', filters = self.filters[2])\n\n        up12 = Conv2DTranspose(filters = self.filters[1], kernel_size = 2, strides = 2, padding='same', name = 'upsample12')(conv21)\n        conv12 = concatenate([up12, conv10, conv11], name = 'concat12')\n        conv12 = self.skip_path(conv12, block_level = '12', filters = self.filters[1])\n\n        up03 = Conv2DTranspose(filters = self.filters[0], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample03')(conv12)\n        conv03 = concatenate([up03, conv00, conv01, conv02], name = 'concat03')\n        conv03 = self.AadyasConvolutionBlock(conv03, block_level = '03', filters = self.filters[0])\n\n        conv40 = self.AadyasConvolutionBlock(pool3, block_level = '40', filters = self.filters[4])\n\n        up31 = Conv2DTranspose(filters = self.filters[3], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample31')(conv40)\n        conv31 = concatenate([up31, conv30], name = 'concat31')\n        conv31 = self.skip_path(conv31, block_level = '31', filters=self.filters[3])\n\n        up22 = Conv2DTranspose(filters = self.filters[2], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample22')(conv31)\n        conv22 = concatenate([up22, conv20, conv21], name = 'concat22')\n        conv22 = self.skip_path(conv22, block_level = '22', filters = self.filters[2])\n\n        up13 = Conv2DTranspose(filters = self.filters[1], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample13')(conv22)\n        conv13 = concatenate([up13, conv10, conv11, conv12], name='concat13')\n        conv13 = self.skip_path(conv13, block_level = '13', filters = self.filters[1])\n\n        up04 = Conv2DTranspose(filters = self.filters[0], kernel_size = 2, strides = 2, padding = 'same', name = 'upsample04')(conv13)\n        conv04 = concatenate([up04, conv00, conv01, conv02, conv03], name = 'concat04')\n        conv04 = self.AadyasConvolutionBlock(conv04, block_level = '04', filters = self.filters[0])\n\n        nested_op_1 = Conv2D(filters = self.num_classes, kernel_size = 1, activation = tf.nn.sigmoid, \n                                  padding = 'same', name = 'op1')(conv01)\n\n        nested_op_2 = Conv2D(filters = self.num_classes, kernel_size = 1, activation = tf.nn.sigmoid, \n                                  padding = 'same', name = 'op2')(conv02)\n\n        nested_op_3 = Conv2D(filters = self.num_classes, kernel_size = 1, activation = tf.nn.sigmoid, \n                                  padding= 'same', name = 'op3')(conv03)\n\n        nested_op_4 = Conv2D(filters = self.num_classes, kernel_size = 1, activation = tf.nn.sigmoid, \n                                  padding = 'same', name = 'op4')(conv04)\n\n        if self.deep_supervision:\n            output = [nested_op_1, nested_op_2, nested_op_3, nested_op_4]\n        else:\n            output = [nested_op_4]\n\n        model = Model(inputs = input_img, outputs = output, name = \"UNetPP\")\n\n        return model\n\n    \n    def skip_path(self, input_tensor, block_level, filters, kernel_size = 3):\n\n        x = Conv2D(filters = filters, kernel_size = kernel_size, activation = tf.nn.relu, \n                   padding = 'same', name = 'conv' + block_level + '_1')(input_tensor)\n\n        x = Dropout(rate = 0.5, name = 'X' + block_level + '_')(x)\n\n        x = Conv2D(filters = filters, kernel_size = kernel_size, activation = tf.nn.relu, \n                   padding = 'same', name = 'conv' + block_level + '_2')(x)\n\n        x = Dropout(rate = 0.5, name = 'X' + block_level)(x)\n\n        return x\n\n    def AadyasConvolutionBlock(self, input_tensor, block_level, filters, kernel_size = 3):\n\n\n        x = Conv2D(filters = filters, kernel_size = kernel_size, activation = tf.nn.relu, \n                   padding = 'same', name = 'conv' + block_level + '_1')(input_tensor)\n\n        x = Dropout(rate = 0.5, name = 'X' + block_level + '_')(x)\n\n        x = Conv2D(filters = filters, kernel_size = kernel_size, activation = tf.nn.relu, \n                   padding = 'same', name = 'conv' + block_level + '_2')(x)\n\n        x = Dropout(rate = 0.5, name = 'X' + block_level)(x)\n\n        return x\n\n    \n    def CompileAndSummarizeModel(self, model, optimizer=Adam(learning_rate = 0.0001)):\n\n        \n        model.compile(optimizer = optimizer, \n                      loss = 'binary_crossentropy',\n                       metrics = iou\n                     )\n        \n        model.summary()\n","metadata":{"execution":{"iopub.status.busy":"2022-10-05T18:03:57.800215Z","iopub.execute_input":"2022-10-05T18:03:57.800684Z","iopub.status.idle":"2022-10-05T18:03:57.843311Z","shell.execute_reply.started":"2022-10-05T18:03:57.800650Z","shell.execute_reply":"2022-10-05T18:03:57.841766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Modelcheckpoint\nUNetPlusPlus_ = UNetPlusPlus()\nmodel = UNetPlusPlus_.BuildNetwork()\nUNetPlusPlus_.CompileAndSummarizeModel(model = model)\n\n\nresults = model.fit(x = X_train, y = Y_train,batch_size=16, epochs=1200)","metadata":{"execution":{"iopub.status.busy":"2022-10-05T18:04:35.273817Z","iopub.execute_input":"2022-10-05T18:04:35.274564Z","iopub.status.idle":"2022-10-05T18:04:37.264003Z","shell.execute_reply.started":"2022-10-05T18:04:35.274502Z","shell.execute_reply":"2022-10-05T18:04:37.259375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idx = random.randint(0, len(X_train))\n\n\npreds_train = model.predict(X_train[:int(X_train.shape[0]*0.9)], verbose=1)\npreds_val = model.predict(X_train[int(X_train.shape[0]*0.9):], verbose=1)\npreds_test = model.predict(X_test, verbose=1)\n\n \npreds_train_t = (preds_train > 0.5).astype(np.uint8)\npreds_val_t = (preds_val > 0.5).astype(np.uint8)\npreds_test_t = (preds_test > 0.5).astype(np.uint8)","metadata":{"execution":{"iopub.status.busy":"2022-10-05T18:02:20.569833Z","iopub.execute_input":"2022-10-05T18:02:20.570703Z","iopub.status.idle":"2022-10-05T18:02:24.282308Z","shell.execute_reply.started":"2022-10-05T18:02:20.570642Z","shell.execute_reply":"2022-10-05T18:02:24.280902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Perform a sanity check on some random training samples\nix = random.randint(0, len(preds_train_t))\nimshow(X_train[ix])\nplt.show()\nimshow(np.squeeze(Y_train[ix]))\nplt.show()\nimshow(np.squeeze(preds_train_t[ix]))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-10-05T18:02:24.287754Z","iopub.execute_input":"2022-10-05T18:02:24.291275Z","iopub.status.idle":"2022-10-05T18:02:25.324054Z","shell.execute_reply.started":"2022-10-05T18:02:24.291230Z","shell.execute_reply":"2022-10-05T18:02:25.322747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Perform a sanity check on some random validation samples\nix = random.randint(0, len(preds_val_t))\nimshow(X_train[int(X_train.shape[0]*0.9):][ix])\nplt.show()\nimshow(np.squeeze(Y_train[int(Y_train.shape[0]*0.9):][ix]))\nplt.show()\nimshow(np.squeeze(preds_val_t[ix]))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-10-05T18:02:25.326229Z","iopub.execute_input":"2022-10-05T18:02:25.326750Z","iopub.status.idle":"2022-10-05T18:02:26.248027Z","shell.execute_reply.started":"2022-10-05T18:02:25.326704Z","shell.execute_reply":"2022-10-05T18:02:26.246739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('/kaggle/working/unetpp.h5')","metadata":{},"execution_count":null,"outputs":[]}]}