{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":6927,"databundleVersionId":45059,"sourceType":"competition"}],"dockerImageVersionId":25160,"isInternetEnabled":false,"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 in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\nfrom sklearn.model_selection import train_test_split\nfrom skimage.transform import resize\nimport cv2\nfrom scipy.misc import imresize\nfrom PIL import Image\nfrom scipy import ndimage\nimport matplotlib.pyplot as plt","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"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))","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"execution_count":null,"outputs":[]},{"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)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"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')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#utility function to convert greyscale images 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","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#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 = images[i].split(\"/\")[-1]\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","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen = data_generator('train/', train_masks, train_images, dims=[img_rows, img_cols])\nimg, msk = next(train_gen)\n# train_img = img[0].swapaxes(0,2)\n# train_msk = msk.swapaxes(1,3)\n\nfig, ax = plt.subplots(1,2, figsize=(16, 16))\nax = ax.ravel()\nax[0].imshow(img[0], cmap='gray') \nax[0].set_title('Training Image')\nax[1].imshow(grey2rgb(msk[0]), cmap='gray')\nax[1].set_title('Training Image mask')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"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])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import backend as K\nfrom keras.models import Sequential, Model \nfrom keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, Conv2DTranspose, Flatten,concatenate\nfrom keras.callbacks import ModelCheckpoint\nfrom keras.optimizers import Adam, SGD","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"K.set_image_data_format('channels_last')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Model Creation\ninput_x = Input((img_rows, img_cols, 3))\nconv0 = Conv2D(8, 3, activation = 'relu', padding = 'same')(input_x)\nconv0 = Conv2D(8, 3, activation = 'relu', padding = 'same')(conv0)\npool0 = MaxPooling2D(pool_size=(2, 2))(conv0)\n\nconv1 = Conv2D(16, 3, activation = 'relu', padding = 'same')(pool0)\nconv1 = Conv2D(16, 3, activation = 'relu', padding = 'same')(conv1)\npool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n\nconv2 = Conv2D(32, 3, activation = 'relu', padding = 'same')(pool1)\nconv2 = Conv2D(32, 3, activation = 'relu', padding = 'same')(conv2)\npool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n\nconv3 = Conv2D(64, 3, activation = 'relu', padding = 'same')(pool2)\nconv3 = Conv2D(64, 3, activation = 'relu', padding = 'same')(conv3)\npool3 = MaxPooling2D(pool_size=(2, 2))(conv3)\n\nconv4 = Conv2D(128, 3, activation = 'relu', padding = 'same')(pool3)\nconv4 = Conv2D(128, 3, activation = 'relu', padding = 'same')(conv4)\npool4 = MaxPooling2D(pool_size=(2, 2))(conv4)\n\nconv5 = Conv2D(256, 3, activation = 'relu', padding = 'same')(pool4)\nconv5 = Conv2D(256, 3, activation = 'relu', padding = 'same')(conv5)\n\nup6 = UpSampling2D(size = (2,2))(conv5)\nup6 = Conv2D(128, 2, activation = 'relu', padding = 'same')(up6)\nmerge6 = concatenate([conv4,up6])\nconv6 = Conv2D(128, 3, activation = 'relu', padding = 'same')(merge6)\nconv6 = Conv2D(128, 3, activation = 'relu', padding = 'same')(conv6)\n\nup7 = UpSampling2D(size = (2,2))(conv6)\nup7 = Conv2D(64, 2, activation = 'relu', padding = 'same')(up7)\nmerge7 = concatenate([conv3,up7])\nconv7 = Conv2D(64, 3, activation = 'relu', padding = 'same')(merge7)\nconv7 = Conv2D(64, 3, activation = 'relu', padding = 'same')(conv7)\n\nup8 = UpSampling2D(size = (2,2))(conv7)\nup8 = Conv2D(32, 2, activation = 'relu', padding = 'same')(up8)\nmerge8 = concatenate([conv2,up8])\nconv8 = Conv2D(32, 3, activation = 'relu', padding = 'same')(merge8)\nconv8 = Conv2D(32, 3, activation = 'relu', padding = 'same')(conv8)\n\nup9 = UpSampling2D(size = (2,2))(conv8)\nup9 = Conv2D(16, 2, activation = 'relu', padding = 'same')(up9)\nmerge9 = concatenate([conv1,up9])\nconv9 = Conv2D(16, 3, activation = 'relu', padding = 'same')(merge9)\nconv9 = Conv2D(16, 3, activation = 'relu', padding = 'same')(conv9)\n\nup10 = UpSampling2D(size = (2,2))(conv9)\nup10 = Conv2D(16, 2, activation = 'relu', padding = 'same')(up10)\n\nconv10 = Conv2D(8, 3, activation = 'relu', padding = 'same')(up10)\nconv11 = Conv2D(1, 1, activation = 'sigmoid')(conv10)\n\nmodel = Model(inputs = input_x, outputs = conv11)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Compiling the Model and setting up the loss metric\nadam = Adam(lr = 0.001)\nmodel.compile(optimizer= adam, loss='binary_crossentropy', metrics=[dice_coef])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\ncallbacks = [\n    EarlyStopping(monitor = \"val_loss\",\n                 patience = 18,\n                 verbose = 1,\n                 min_delta = 0.001,\n                 mode = \"min\"),\n    ReduceLROnPlateau(monitor = \"val_loss\",\n                     factor = 0.2,\n                     patience = 8,\n                     verbose = 1,\n                     mode = \"min\"),\n    ModelCheckpoint(monitor = \"val_loss\",\n                   filepath = \"Freq_wt.{epoch:02d}-{val_loss:.2f}.hdf5\", \n                   save_best_only=True,\n                   period = 1)]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit_generator(train_gen, \n                    steps_per_epoch=50, \n                    epochs=10, \n                    validation_data=validation_gen, \n                    validation_steps=50, \n                    callbacks=callbacks)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img, msk = next(validation_gen)\npredicted_mask = model.predict(img)\nvalidation_image = img[0]\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')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"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)\ntest_mask = grey2rgb(predicted_mask_tst[0])\n\ntest_image = img_tst[0]\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')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}