So guys in today’s blog we will see that how we can perform Human Segmentation using U-Net. U-Net is a very special CNN architecture that was specially made for segmentation in mainly the medical field. It is called a U-Net because of its special architecture whose shape is like U. So without any further due, Let’s do it…
Step 1 – Importing required libraries.
import tensorflow as tf import numpy as np import os from skimage.io import imread,imshow from skimage.transform import resize from skimage import color from tensorflow.keras.models import load_model import matplotlib.pyplot as plt import cv2 from sklearn.model_selection import train_test_split
Step 2 – Create X and y arrays.
IMG_HEIGHT = 256 IMG_WIDTH = 256 CHANNELS = 3 training_images_names = os.listdir('data/Training_Images/') training_masks_names = os.listdir('data/masks/') X = np.zeros((len(training_images_names),IMG_HEIGHT,IMG_WIDTH,CHANNELS),dtype='uint8') y = np.zeros((len(training_masks_names),IMG_HEIGHT,IMG_WIDTH,1))
- Here we are just creating X and y arrays initialized with 0s.
- In the next step, we will fill up these arrays.
Step 3 – Fill X and y arrays.
for i,n in enumerate(training_images_names): img = imread(f'data/Training_Images/{n}') img = resize(img,(IMG_HEIGHT,IMG_WIDTH,CHANNELS),mode='constant',preserve_range=True) fn = str(n.split('.')[0]) + '.png' mask = imread(f'data/masks/{fn}') mask = resize(mask,(IMG_HEIGHT,IMG_WIDTH,1),mode='constant') X[i] = img y[i] = mask X[0].shape
- In this step, we will be filling X and y arrays.
- In X we will fill 256*256 resized images.
- In y we will fill 256*256 resized masks.
Step 4 – Randomly plot the image and its mask.
i = np.random.randint(0,len(X)) fig,(a1,a2)=plt.subplots(1,2) a1.imshow(X[i]) a2.imshow(y[i].reshape(y[i].shape[:-1]),cmap='gray')
- Taking a random index and plotting its image and mask.
Step 5 – Building U-Net.
inputs = tf.keras.layers.Input((IMG_HEIGHT,IMG_WIDTH,CHANNELS)) s = tf.keras.layers.Lambda(lambda x:x/255)(inputs) #contracting path c1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(s) c1 = tf.keras.layers.Dropout(0.1)(c1) c1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c1) p1 = tf.keras.layers.MaxPooling2D((2,2))(c1) c2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(p1) c2 = tf.keras.layers.Dropout(0.1)(c2) c2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c2) p2 = tf.keras.layers.MaxPooling2D((2,2))(c2) c3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(p2) c3 = tf.keras.layers.Dropout(0.2)(c3) c3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c3) p3 = tf.keras.layers.MaxPooling2D((2,2))(c3) c4 = tf.keras.layers.Conv2D(128,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(p3) c4 = tf.keras.layers.Dropout(0.2)(c4) c4 = tf.keras.layers.Conv2D(128,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c4) p4 = tf.keras.layers.MaxPooling2D((2,2))(c4) c5 = tf.keras.layers.Conv2D(256,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(p4) c5 = tf.keras.layers.Dropout(0.3)(c5) c5_1 = tf.keras.layers.Conv2D(256,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c5) c5_1 = tf.keras.layers.Dropout(0.3)(c5_1) c5_2 = tf.keras.layers.Conv2D(256,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(c5_1) c5_3 = tf.keras.layers.Conv2D(256,(3,3),activation='relu',kernel_initializer='he_normal',padding='same',dilation_rate=2)(c5_2) c5_4 = tf.keras.layers.Conv2D(512,(3,3),activation='relu',kernel_initializer='he_normal',padding='same',dilation_rate=2)(c5_3 ) c5_5 = tf.keras.layers.concatenate([c5_1,c5_4]) #expanding path u4 = tf.keras.layers.Conv2DTranspose(128,(2,2),strides=(2,2),padding='same')(c5_5) u4 = tf.keras.layers.concatenate([u4,c4]) u4 = tf.keras.layers.Conv2D(128,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u4) u4 = tf.keras.layers.Dropout(0.2)(u4) u4 = tf.keras.layers.Conv2D(128,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u4) u3 = tf.keras.layers.Conv2DTranspose(64,(2,2),strides=(2,2),padding='same')(u4) u3 = tf.keras.layers.concatenate([u3,c3]) u3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u3) u3 = tf.keras.layers.Dropout(0.2)(u3) u3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u3) u2 = tf.keras.layers.Conv2DTranspose(32,(2,2),strides=(2,2),padding='same')(u3) u2 = tf.keras.layers.concatenate([u2,c2]) u2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u2) u2 = tf.keras.layers.Dropout(0.2)(u2) u2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u2) u1 = tf.keras.layers.Conv2DTranspose(16,(2,2),strides=(2,2),padding='same')(u2) u1 = tf.keras.layers.concatenate([u1,c1]) u1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u1) u1 = tf.keras.layers.Dropout(0.2)(u1) u1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',kernel_initializer='he_normal',padding='same')(u1) output = tf.keras.layers.Conv2D(1,(1,1),activation='sigmoid')(u1) model = tf.keras.Model(inputs=[inputs],outputs=[output]) model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']) model.summary()
- Here we are simply building the U-Net structure.
…
Step 6 – Train test split the data.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
Step 7 – Training and saving the model.
results = model.fit(X_train,y_train,batch_size=16,epochs=100) model.save('models/human_segmentation_non-aug_100_v2.h5')
Step 8 – Plot the loss and accuracy curves.
fig,(a1,a2) = plt.subplots(1,2,figsize=(17,8)) a1.plot(np.arange(0,100),results.history['loss'],label = 'loss') a2.plot(np.arange(0,100),results.history['accuracy'],label='accuracy') a1.legend() a2.legend() plt.savefig('losses_and_accuracies_100_v2.png')
Step 9 – Visualizing outputs.
k=np.random.randint(0,len(X_test)) fig,(a1,a2) = plt.subplots(1,2) a1.imshow(X_test[k]) (h,w,c) = X_test[k].shape i = X_test[k].reshape((1,h,w,c)) pred = model.predict(i) a2.imshow(pred.reshape(pred.shape[1:-1]),cmap='gray')
- Here we are checking the performance of our model.
- And see it’s performing very well (obviously not great :)).
Download Source Code…
Do let me know if there’s any query regarding Human Segmentation using U-Net by contacting me by email or LinkedIn. You can also comment down below for any queries.
So this is all for this blog folks, thanks for reading it and I hope you are taking something with you after reading this and till the next time …
Read my previous post: MILK PRODUCTION PREDICTION FOR NEXT YEAR USING LSTM
Check out my other machine learning projects, deep learning projects, computer vision projects, NLP projects, Flask projects at machinelearningprojects.net.