{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom glob import glob # For pathname matching\nfrom skimage.transform import resize\nfrom keras import backend as K\nfrom sklearn.model_selection import train_test_split\nfrom keras.models import Sequential, Model \nfrom keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, Flatten,concatenate\nfrom keras.callbacks import ModelCheckpoint\nfrom keras.optimizers import Adam\nimport cv2\n\nfrom PIL import Image\nfrom scipy import ndimage\nimport matplotlib.pyplot as plt\nfrom scipy.misc import imresize\n\nfrom time import time\nimport warnings\nwarnings.filterwarnings(\"ignore\", category=DeprecationWarning) \nfrom matplotlib.pyplot import rc\nfont = {'family' : 'monospace',\n        'weight' : 'bold',\n        'size'   : 12}\nrc('font', **font)  # pass in the font dict as kwargs\nK.set_image_dim_ordering('th')\n\nimport os\nfrom os.path import basename\nprint(os.listdir(\"../input\"))\nprint(os.listdir(\"../\"))\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"input_folder = '../input'\n\ntrain= glob('/'.join([input_folder,'train/*.jpg']))\ntrain_masks= glob('/'.join([input_folder,'train_masks/*.gif']))\ntest= glob('/'.join([input_folder,'test/*.jpg']))\nprint('Number of training images: ', len(train), 'Number of corresponding masks: ', len(train_masks), 'Number of test images: ', len(test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8e2333282af5900555e5f9b3a7c83833c3a4e318"},"cell_type":"code","source":"tt_ratio = 0.8\nimg_rows, img_cols = 1024,1024\nbatch_size = 8\ndef dice_coef(y_true, y_pred, smooth=0):\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    return(2. * intersection + smooth) / ((K.sum(y_true_f) + K.sum(y_pred_f)) + smooth)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"531d58c84515a4cddc5679a989e9ccac44072972"},"cell_type":"code","source":"#split the training set into train and validation samples\ntrain_images, validation_images = train_test_split(train, train_size=tt_ratio, test_size=1-tt_ratio)\nprint('Size of the training sample=', len(train_images), 'and size of the validation sample=', len(validation_images), ' images')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e03c7299b64e23994c874e5f361e0190727b1e77"},"cell_type":"code","source":"#utility function to convert greyscale inages to rgb\ndef grey2rgb(img):\n    new_img = []\n    for i in range(img.shape[0]):\n        for j in range(img.shape[1]):\n            new_img.append(list(img[i][j])*3)\n    new_img = np.array(new_img).reshape(img.shape[0], img.shape[1], 3)\n    return new_img\n\n#generator that will be used to read data from the directory\ndef data_generator(data_dir, masks, images, dims, batch_size=batch_size):\n    while True:\n        ix=np.random.choice(np.arange(len(images)), batch_size)\n        imgs = []\n        labels = []\n        for i in ix:\n            # images\n            original_img = cv2.imread(images[i])\n            resized_img = imresize(original_img, dims + [3]) \n            array_img = resized_img/255\n            array_img = array_img.swapaxes(0, 2)\n            imgs.append(array_img)\n            #imgs is a numpy array with dim: (batch size X 128 X 128 3)\n            #print('shape of imgs ', array_img.shape)\n            # masks\n            try:\n                mask_filename = basename(images[i])\n                file_name = os.path.splitext(mask_filename)[0]\n                correct_mask = '/'.join([input_folder,'train_masks',file_name+'_mask.gif'])\n                original_mask = Image.open(correct_mask).convert('L')\n                data = np.asarray(original_mask, dtype=\"int32\")\n                resized_mask = imresize(original_mask, dims+[3])\n                array_mask = resized_mask / 255\n                labels.append(array_mask)\n            except Exception as e:\n                labels=None\n            \n        imgs = np.array(imgs)\n        labels = np.array(labels)\n        try:\n            relabel = labels.reshape(-1, dims[0], dims[1], 1)\n            relabel = relabel.swapaxes(1, 3)\n        except Exception as e:\n            relabel=labels\n        yield imgs, relabel","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"trusted":true,"_uuid":"474d9db54a8b8c5a232852d92f5c0f6d4f599727","scrolled":true},"cell_type":"code","source":"train_gen = data_generator('train/', train_masks, train_images, dims=[img_rows, img_cols])\nimg, msk = next(train_gen)\ntrain_img = img[0].swapaxes(0,2)\ntrain_msk = msk.swapaxes(1,3)\n\nfig, ax = plt.subplots(1,2, figsize=(16, 16))\nax = ax.ravel()\nax[0].imshow(train_img, cmap='gray') \nax[0].set_title('Training Image')\nax[1].imshow(grey2rgb(train_msk[0]), cmap='gray')\nax[1].set_title('Training Image mask')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fc4cea2700e2ee06acb154c36c6e0278b0e184c3"},"cell_type":"code","source":"# create an instance of a validation generator:\nvalidation_gen = data_generator('train/', train_masks, validation_images, dims=[img_rows, img_cols]) \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"365855c4388559f17c0d8c6a6dffb6b44b51e116"},"cell_type":"code","source":"def unet(input_size = (3,img_rows,img_cols)):\n    input_ = Input(input_size)\n    conv0 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(input_)\n    conv0 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv0)\n    pool0 = MaxPooling2D(pool_size=(2, 2))(conv0)\n    \n    conv1 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool0)\n    conv1 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)\n    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n    \n    conv2 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)\n    conv2 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)\n    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n    \n    conv3 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)\n    conv3 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)\n    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)\n    \n    conv4 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)\n    conv4 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)\n    pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)\n\n    conv5 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)\n    conv5 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)\n\n    up6 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv5))\n    merge6 = concatenate([conv4,up6], axis = 1)\n    conv6 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)\n    conv6 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)\n\n    up7 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))\n    merge7 = concatenate([conv3,up7], axis = 1)\n    conv7 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)\n    conv7 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)\n\n    up8 = Conv2D(32, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))\n    merge8 = concatenate([conv2,up8], axis = 1)\n    conv8 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8)\n    conv8 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8)\n\n    up9 = Conv2D(16, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8))\n    merge9 = concatenate([conv1,up9], axis = 1)\n    conv9 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)\n    conv9 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)\n    \n    up10 = Conv2D(16, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv9))\n\n    conv10 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(up10)\n    conv11 = Conv2D(1, 1, activation = 'sigmoid')(conv10)\n\n    model = Model(input = input_, outputs = conv11)\n    \n    model.compile(optimizer= Adam(lr=0.0005), loss='binary_crossentropy', metrics=[dice_coef])\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fc9c2011201c43bcd2beb30aa75f5e1c983bed92"},"cell_type":"code","source":"# Build and compile the model\nmodel = unet()\nmodel.summary()\n\nmodel.load_weights('saved_model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"63a3bd4cd0ce4ac55b15b536f8f195540e2d99be"},"cell_type":"code","source":"# Fit the model to the training set and compute dice coefficient at each validation set\nmodel_save = ModelCheckpoint('best_model.hdf5', save_best_only=True, monitor='val_loss', mode='min')\n\nmodel_run = model.fit_generator(train_gen, steps_per_epoch=50, epochs=60, validation_data=validation_gen, validation_steps=50, callbacks=[model_save])\n\nmodel.save(\"saved_model.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"12dd76495244e402c32cf30dfbe926b366402f3c"},"cell_type":"code","source":"pd.DataFrame(model_run.history)[['dice_coef','val_dice_coef']].plot()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f01dc3e83484c556079a5ee4cc4225f134a8ad99"},"cell_type":"code","source":"img, msk = next(validation_gen)\npredicted_mask = model.predict(img).swapaxes(1,3)\nvalidation_image = img[0].swapaxes(0,2)\n\nfig, ax = plt.subplots(1,2, figsize=(16, 16))\nax = ax.ravel()\nax[0].imshow(validation_image, cmap='gray') \nax[0].set_title('Validation Image')\nax[1].imshow(grey2rgb(predicted_mask[0]), cmap='gray')\nax[1].set_title('Validation Image mask')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"935366381e8278e70cf56a2aaf34e172693d3332"},"cell_type":"code","source":"test_set = data_generator('test/', train_masks, test, dims=[img_rows, img_cols]) \nimg_tst, msk_tst = next(test_set)\npredicted_mask_tst = model.predict(img_tst)\npredicted_mask_tst = predicted_mask_tst.swapaxes(1,3)\ntest_mask = grey2rgb(predicted_mask_tst[0])\n\ntest_image = img_tst[0].swapaxes(0,2)\n\nfig, ax = plt.subplots(1,2, figsize=(16, 16))\nax = ax.ravel()\nax[0].imshow(test_image, cmap='gray') \nax[0].set_title('Test Image')\nax[1].imshow(test_mask, cmap='gray')\nax[1].set_title('Test Image mask')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ef51b8b9220ba5c522d2fe6e289e2f3c82a6a517"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}