Итак, ребята, в сегодняшнем блоге мы увидим, как мы можем выполнять сегментацию человека с помощью U-Net. U-Net — это особая архитектура CNN, специально созданная для сегментации в основном в медицинской сфере. Он называется U-Net из-за своей особой архитектуры, форма которой напоминает букву U. Так что без лишних слов.
Прочитайте полную статью с исходным кодом здесь —https://machinelearningprojects.net/human-segmentation-using-u-net/
Давай сделаем это…
Шаг 1 — Импорт необходимых библиотек.
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
Шаг 2 — Создайте массивы X и Y.
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))
- Здесь мы просто создаем массивы X и Y, инициализированные нулями.
- На следующем шаге мы заполним эти массивы.
Шаг 3 — Заполните массивы X и Y.
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
- На этом шаге мы будем заполнять массивы X и y.
- В X мы заполним 256 * 256 изображений с измененным размером.
- В y мы заполним 256*256 масок с измененным размером.
Шаг 4 — Произвольно нарисуйте изображение и его маску.
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')
- Берем случайный индекс и строим его изображение и маску.
Шаг 5 — Создание 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()
- Здесь мы просто строим структуру U-Net.
Шаг 6 — Тренировочный тест разделил данные.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
Шаг 7 — Обучение и сохранение модели.
results = model.fit(X_train,y_train,batch_size=16,epochs=100) model.save('models/human_segmentation_non-aug_100_v2.h5')
Шаг 8 — Постройте кривые потерь и точности.
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')
Шаг 9 — Визуализация результатов.
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')
- Здесь мы проверяем производительность нашей модели.
- И видите, что он работает очень хорошо (очевидно, не отлично :)).
Дайте мне знать, если у вас есть какие-либо вопросы относительно прогноза производства молока, связавшись со мной по электронной почте или в LinkedIn. Вы также можете прокомментировать ниже любые вопросы.
Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог — Проекты машинного обучения
Для дальнейшего объяснения кода и исходного кода посетите здесь — https://machinelearningprojects.net/human-segmentation-using-u-net/
Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза…
Прочитайте мой предыдущий пост: ПРОГНОЗ ПРОДУКЦИИ МОЛОКА НА СЛЕДУЮЩИЙ ГОД С ИСПОЛЬЗОВАНИЕМ LSTM