Repository: nikhilroxtomar/UNet-Segmentation-in-Keras-TensorFlow Branch: master Commit: a092b3bb5381 Files: 5 Total size: 65.3 KB Directory structure: gitextract_zsnthsi3/ ├── LICENSE ├── README.md ├── dataset/ │ └── README.md ├── images/ │ └── README.md └── unet-segmentation.ipynb ================================================ FILE CONTENTS ================================================ ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2023 Nikhil Tomar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # U-Net Segmentation in Keras TensorFlow U-Net is a fully convolutional network(FCN) that does image segmentation. Its goal is to predict each pixel's class. It is built upon the FCN and modified in a way that it yields better segmentation in medical imaging.
- Arxiv Link: https://arxiv.org/abs/1505.04597
- YouTube Video: https://youtu.be/M3EZS__Z_XE - Blog Post: https://idiotdeveloper.com/unet-segmentation-in-tensorflow/ ## Architecture | ![U-Net Architecture](images/u-net-architecture.png) | | :--: | | *U-Net Architecture* | ================================================ FILE: dataset/README.md ================================================ ## Dataset - https://www.kaggle.com/c/data-science-bowl-2018 ## upload stage1_train files here ================================================ FILE: images/README.md ================================================ ================================================ FILE: unet-segmentation.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# UNET SEGMENTATION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arxiv Link: U-Net: Convolutional Networks for Biomedical Image Segmentation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 Architecture\n", "\n", "\n", "\n", "

UNet Architecture has 3 parts:

\n", "
    \n", "
  1. The Contracting/Downsampling Path
  2. \n", "
  3. Bottleneck
  4. \n", "
  5. The Expanding/Upsampling Path
  6. \n", "
\n", "\n", "

Downsampling Path:

\n", "
    \n", "
  1. It consists of two 3x3 convolutions (unpadded convolutions), each followed by a rectified linear unit (ReLU) and a 2x2 max pooling operation with stride 2 for downsampling.
  2. \n", "
  3. At each downsampling step we double the number of feature channels.
  4. \n", "
\n", "\n", "

Upsampling Path:

\n", "
    \n", "
  1. Every step in the expansive path consists of an upsampling of the feature map followed by a 2x2 convolution (“up-convolution”), a concatenation with the correspondingly feature map from the downsampling path, and two 3x3 convolutions, each followed by a ReLU.
  2. \n", "
\n", "\n", "

Skip Connection:

\n", "The skip connection from the downsampling path are concatenated with feature map during upsampling path. These skip connection provide local information to global information while upsampling.\n", "\n", "

Final Layer:

\n", "At the final layer a 1x1 convolution is used to map each feature vector to the desired number of classes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 Advantages\n", "

Advantages:

\n", "
    \n", "
  1. The UNet combines the location information from the downsampling path to finally obtain a general information combining localisation and context, which is necessary to predict a good segmentation map.
  2. \n", "
  3. No Dense layer is used, so image sizes can be used.
  4. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 Dataset\n", "Link: Data Science Bowl 2018\n", "Find the nuclei in divergent images to advance medical discovery" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.4 Code" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "## Imports\n", "import os\n", "import sys\n", "import random\n", "\n", "import numpy as np\n", "import cv2\n", "import matplotlib.pyplot as plt\n", "\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "\n", "## Seeding \n", "seed = 2019\n", "random.seed = seed\n", "np.random.seed = seed\n", "tf.seed = seed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Generator" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class DataGen(keras.utils.Sequence):\n", " def __init__(self, ids, path, batch_size=8, image_size=128):\n", " self.ids = ids\n", " self.path = path\n", " self.batch_size = batch_size\n", " self.image_size = image_size\n", " self.on_epoch_end()\n", " \n", " def __load__(self, id_name):\n", " ## Path\n", " image_path = os.path.join(self.path, id_name, \"images\", id_name) + \".png\"\n", " mask_path = os.path.join(self.path, id_name, \"masks/\")\n", " all_masks = os.listdir(mask_path)\n", " \n", " ## Reading Image\n", " image = cv2.imread(image_path, 1)\n", " image = cv2.resize(image, (self.image_size, self.image_size))\n", " \n", " mask = np.zeros((self.image_size, self.image_size, 1))\n", " \n", " ## Reading Masks\n", " for name in all_masks:\n", " _mask_path = mask_path + name\n", " _mask_image = cv2.imread(_mask_path, -1)\n", " _mask_image = cv2.resize(_mask_image, (self.image_size, self.image_size)) #128x128\n", " _mask_image = np.expand_dims(_mask_image, axis=-1)\n", " mask = np.maximum(mask, _mask_image)\n", " \n", " ## Normalizaing \n", " image = image/255.0\n", " mask = mask/255.0\n", " \n", " return image, mask\n", " \n", " def __getitem__(self, index):\n", " if(index+1)*self.batch_size > len(self.ids):\n", " self.batch_size = len(self.ids) - index*self.batch_size\n", " \n", " files_batch = self.ids[index*self.batch_size : (index+1)*self.batch_size]\n", " \n", " image = []\n", " mask = []\n", " \n", " for id_name in files_batch:\n", " _img, _mask = self.__load__(id_name)\n", " image.append(_img)\n", " mask.append(_mask)\n", " \n", " image = np.array(image)\n", " mask = np.array(mask)\n", " \n", " return image, mask\n", " \n", " def on_epoch_end(self):\n", " pass\n", " \n", " def __len__(self):\n", " return int(np.ceil(len(self.ids)/float(self.batch_size)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperparameters" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "image_size = 128\n", "train_path = \"dataset/stage1_train/\"\n", "epochs = 5\n", "batch_size = 8\n", "\n", "## Training Ids\n", "train_ids = next(os.walk(train_path))[1]\n", "\n", "## Validation Data Size\n", "val_data_size = 10\n", "\n", "valid_ids = train_ids[:val_data_size]\n", "train_ids = train_ids[val_data_size:]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(8, 128, 128, 3) (8, 128, 128, 1)\n" ] } ], "source": [ "gen = DataGen(train_ids, train_path, batch_size=batch_size, image_size=image_size)\n", "x, y = gen.__getitem__(0)\n", "print(x.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "r = random.randint(0, len(x)-1)\n", "\n", "fig = plt.figure()\n", "fig.subplots_adjust(hspace=0.4, wspace=0.4)\n", "ax = fig.add_subplot(1, 2, 1)\n", "ax.imshow(x[r])\n", "ax = fig.add_subplot(1, 2, 2)\n", "ax.imshow(np.reshape(y[r], (image_size, image_size)), cmap=\"gray\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Different Convolutional Blocks" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "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), (2, 2))(c)\n", " return c, p\n", "\n", "def 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", "\n", "def 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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## UNet Model" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def UNet():\n", " f = [16, 32, 64, 128, 256]\n", " inputs = keras.layers.Input((image_size, image_size, 3))\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" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_2 (InputLayer) (None, 128, 128, 3) 0 \n", "__________________________________________________________________________________________________\n", "conv2d_10 (Conv2D) (None, 128, 128, 16) 448 input_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_11 (Conv2D) (None, 128, 128, 16) 2320 conv2d_10[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_4 (MaxPooling2D) (None, 64, 64, 16) 0 conv2d_11[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_12 (Conv2D) (None, 64, 64, 32) 4640 max_pooling2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_13 (Conv2D) (None, 64, 64, 32) 9248 conv2d_12[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_5 (MaxPooling2D) (None, 32, 32, 32) 0 conv2d_13[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_14 (Conv2D) (None, 32, 32, 64) 18496 max_pooling2d_5[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_15 (Conv2D) (None, 32, 32, 64) 36928 conv2d_14[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_6 (MaxPooling2D) (None, 16, 16, 64) 0 conv2d_15[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_16 (Conv2D) (None, 16, 16, 128) 73856 max_pooling2d_6[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_17 (Conv2D) (None, 16, 16, 128) 147584 conv2d_16[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_7 (MaxPooling2D) (None, 8, 8, 128) 0 conv2d_17[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_18 (Conv2D) (None, 8, 8, 256) 295168 max_pooling2d_7[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_19 (Conv2D) (None, 8, 8, 256) 590080 conv2d_18[0][0] \n", "__________________________________________________________________________________________________\n", "up_sampling2d_1 (UpSampling2D) (None, 16, 16, 256) 0 conv2d_19[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_1 (Concatenate) (None, 16, 16, 384) 0 up_sampling2d_1[0][0] \n", " conv2d_17[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_20 (Conv2D) (None, 16, 16, 128) 442496 concatenate_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_21 (Conv2D) (None, 16, 16, 128) 147584 conv2d_20[0][0] \n", "__________________________________________________________________________________________________\n", "up_sampling2d_2 (UpSampling2D) (None, 32, 32, 128) 0 conv2d_21[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_2 (Concatenate) (None, 32, 32, 192) 0 up_sampling2d_2[0][0] \n", " conv2d_15[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_22 (Conv2D) (None, 32, 32, 64) 110656 concatenate_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_23 (Conv2D) (None, 32, 32, 64) 36928 conv2d_22[0][0] \n", "__________________________________________________________________________________________________\n", "up_sampling2d_3 (UpSampling2D) (None, 64, 64, 64) 0 conv2d_23[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_3 (Concatenate) (None, 64, 64, 96) 0 up_sampling2d_3[0][0] \n", " conv2d_13[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_24 (Conv2D) (None, 64, 64, 32) 27680 concatenate_3[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_25 (Conv2D) (None, 64, 64, 32) 9248 conv2d_24[0][0] \n", "__________________________________________________________________________________________________\n", "up_sampling2d_4 (UpSampling2D) (None, 128, 128, 32) 0 conv2d_25[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_4 (Concatenate) (None, 128, 128, 48) 0 up_sampling2d_4[0][0] \n", " conv2d_11[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_26 (Conv2D) (None, 128, 128, 16) 6928 concatenate_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_27 (Conv2D) (None, 128, 128, 16) 2320 conv2d_26[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_28 (Conv2D) (None, 128, 128, 1) 17 conv2d_27[0][0] \n", "==================================================================================================\n", "Total params: 1,962,625\n", "Trainable params: 1,962,625\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "model = UNet()\n", "model.compile(optimizer=\"adam\", loss=\"binary_crossentropy\", metrics=[\"acc\"])\n", "model.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training the model" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "82/82 [==============================] - 32s 388ms/step - loss: 1.5266 - acc: 0.8353 - val_loss: 2.0455 - val_acc: 0.8186\n", "Epoch 2/5\n", "82/82 [==============================] - 15s 186ms/step - loss: 0.7552 - acc: 0.8980 - val_loss: 0.1193 - val_acc: 0.9636\n", "Epoch 3/5\n", "82/82 [==============================] - 14s 175ms/step - loss: 0.5312 - acc: 0.9338 - val_loss: 0.1020 - val_acc: 0.9650\n", "Epoch 4/5\n", "82/82 [==============================] - 13s 160ms/step - loss: 0.4616 - acc: 0.9382 - val_loss: 0.0900 - val_acc: 0.9676\n", "Epoch 5/5\n", "82/82 [==============================] - 15s 187ms/step - loss: 0.4432 - acc: 0.9425 - val_loss: 0.1418 - val_acc: 0.9540\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_gen = DataGen(train_ids, train_path, image_size=image_size, batch_size=batch_size)\n", "valid_gen = DataGen(valid_ids, train_path, image_size=image_size, batch_size=batch_size)\n", "\n", "train_steps = len(train_ids)//batch_size\n", "valid_steps = len(valid_ids)//batch_size\n", "\n", "model.fit_generator(train_gen, validation_data=valid_gen, steps_per_epoch=train_steps, validation_steps=valid_steps, \n", " epochs=epochs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testing the model" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "## Save the Weights\n", "model.save_weights(\"UNetW.h5\")\n", "\n", "## Dataset for prediction\n", "x, y = valid_gen.__getitem__(1)\n", "result = model.predict(x)\n", "\n", "result = result > 0.5" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "fig.subplots_adjust(hspace=0.4, wspace=0.4)\n", "\n", "ax = fig.add_subplot(1, 2, 1)\n", "ax.imshow(np.reshape(y[0]*255, (image_size, image_size)), cmap=\"gray\")\n", "\n", "ax = fig.add_subplot(1, 2, 2)\n", "ax.imshow(np.reshape(result[0]*255, (image_size, image_size)), cmap=\"gray\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "fig.subplots_adjust(hspace=0.4, wspace=0.4)\n", "\n", "ax = fig.add_subplot(1, 2, 1)\n", "ax.imshow(np.reshape(y[1]*255, (image_size, image_size)), cmap=\"gray\")\n", "\n", "ax = fig.add_subplot(1, 2, 2)\n", "ax.imshow(np.reshape(result[1]*255, (image_size, image_size)), cmap=\"gray\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }