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.
Table of Contents
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 plotting 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 the Milk Production prediction by contacting me on 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.