{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import os\nimport sys\nimport random\n\nimport numpy as np\nfrom skimage.io import imread, imshow, imread_collection, concatenate_images\nfrom skimage.transform import resize\nimport cv2\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nfrom tensorflow import keras","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_path = \"../input/stage1_train/\"\nimg_size = 128\ntrain_ids = next(os.walk(train_data_path))[1]\n\nx_train = np.zeros((len(train_ids), img_size, img_size, 3), dtype=np.uint8)\ny_train = np.zeros((len(train_ids), img_size, img_size, 1), dtype=np.bool)\n\nfor i, id_ in enumerate(train_ids):\n    path = train_data_path+\"{}/images/{}\".format(id_, id_)\n    img = cv2.imread(path+\".png\", 1)\n    img = cv2.resize(img, (img_size, img_size))\n    x_train[i]=img\n    \n    height, width, _ = img.shape\n    label = np.zeros((height, width, 1))\n    path2 = train_data_path+\"{}/masks/\".format(id_)\n    for mask_file in next(os.walk(path2))[2]:\n        mask_ = cv2.imread(path2+mask_file, 0)\n        mask_ = cv2.resize(mask_, (img_size, img_size))\n        mask_ = np.expand_dims(mask_, axis=-1)\n        label = np.maximum(label, mask_)\n        y_train[i]=label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ymg = x_train[1]\nimshow(ymg)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_image = y_train[1][:,:,0]\nimshow(test_image)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(12,12))\nrows = 4\ncolumns = 2\nc = 0\ncounter = 0\n\nfor i in range(1, (rows*columns)+1):\n    fig.add_subplot(rows, columns, i)\n    if counter%2 == 0:\n        plt.imshow(x_train[c][:,:,0])\n    else:\n        plt.imshow(y_train[c][:,:,0])\n        c = c+1\n    counter = counter+1\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Original image shape : {}\".format(x_train.shape))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from skimage.color import rgb2gray\n\nx_train_ = rgb2gray(x_train)\nprint(x_train_.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train = np.expand_dims(x_train_, axis=-1)\nprint(x_train.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ymg = x_train[1][:,:,0]\nimshow(ymg)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_gen = ImageDataGenerator(rescale = 1./255,\n                              rotation_range=40,\n                              height_shift_range = 0.2,\n                              width_shift_range = 0.2,\n                              zoom_range = 0.2,\n                              horizontal_flip = True,\n                              fill_mode='nearest')\n\nval_gen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nxt, xv, yt, yv = train_test_split(x_train, y_train, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"args = dict(batch_size = 32,\n            shuffle=True)\n\ndef combineGenerator(gen1, gen2):\n    while True:\n        yield(gen1.next(), gen2.next())\n\ntrain_generator_image = train_gen.flow(xt,**args)\ntrain_generator_mask = train_gen.flow(yt, **args)\ntrain_generator = combineGenerator(train_generator_image, train_generator_mask)\nvalidation_generator_image = val_gen.flow(xv, **args)\nvalidation_generator_mask = val_gen.flow(yv, **args)\nvalidation_generator = combineGenerator(validation_generator_image, validation_generator_mask)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def down_block(x, filters, kernel_size=(3, 3), padding=\"same\", strides=1):\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation=\"relu\")(x)\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation=\"relu\")(c)\n    p = keras.layers.MaxPool2D(2, 2)(c)\n    return c, p\n    \n    return c,p\n\ndef up_block(x, skip, filters, kernel_size=(3,3), padding=\"same\", strides=1):\n    us = keras.layers.UpSampling2D((2,2))(x)\n    concat = keras.layers.Concatenate()([us, skip])\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation='relu')(concat)\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation='relu')(c) \n    return c\n\ndef bottleneck(x, filters, kernel_size=(3,3), padding=\"same\", strides=1):\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation=\"relu\")(x)\n    c = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides, activation=\"relu\")(c)\n    return c\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def Unet():\n    f = [16,32,64,128,256]\n    img_=128\n    inputs = keras.layers.Input((img_, img_, 1))\n        \n    p0 = inputs\n    c1, p1 = down_block(p0, f[0]) #128 -> 64\n    c2, p2 = down_block(p1, f[1]) #64 -> 32\n    c3, p3 = down_block(p2, f[2]) #32 -> 16\n    c4, p4 = down_block(p3, f[3]) #16->8\n    \n    bn = bottleneck(p4, f[4])\n    \n    u1 = up_block(bn, c4, f[3]) #8 -> 16\n    u2 = up_block(u1, c3, f[2]) #16 -> 32\n    u3 = up_block(u2, c2, f[1]) #32 -> 64\n    u4 = up_block(u3, c1, f[0]) #64 -> 128\n    \n    outputs = keras.layers.Conv2D(1, (1, 1), padding=\"same\", activation=\"sigmoid\")(u4)\n    model = keras.models.Model(inputs, outputs)\n    return model\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Unet()\nmodel.compile(optimizer=\"adam\", loss=\"binary_crossentropy\", metrics=[\"acc\"])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_steps = len(xt)//32\nval_steps = len(xv)//32\nhistory = model.fit_generator(train_generator, steps_per_epoch = train_steps, epochs = 15, validation_data = validation_generator, validation_steps = val_steps)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"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.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}