Сегментация изображений при помощи нейронной сети: U-Net


Пример работы U-Net для детектирования
U-Net — это архитектура свёрточной нейронной сети, предназначенная для сегментации изображений (первоначально, для биомедицинских изображений).

Архитектура U-Net
Архитектура U-Net
Архитектура сети представляет собой последовательность слоёв свёртка+пулинг, которые сначала уменьшают пространственное разрешение картинки, а потом увеличивают его, предварительно объединив с данными картинки и пропустив через другие слои свёртки. Таким образом, сеть выполняет роль своеобразного фильтра.

Для обучения сети, считается коэффициент Дайса (Dice coefficient) (так же называется коэффициент Сёренсена — Sorensen–Dice coefficient) или Жаккара (Jaccard similarity coefficient), который показывает меру сходства — в данном случае, показывающий меру площади правильно отмеченных сегментов (отношение площади пересечения к площади объединения).

Примеры реализации U-net
Deep Learning Tutorial for Kaggle Ultrasound Nerve Segmentation competition, using Keras
End-to-end baseline with U-net (keras)
ZF_UNET_224_Pretrained_Model

Код U-Net для Keras (Python 3.*, Keras 2.*, Theano 0.9)

from keras.models import Model
from keras import backend as K

from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, UpSampling2D, Convolution2D, ZeroPadding2D
from keras.optimizers import Adam

#For 2D data (e.g. image), "channels_last" assumes (rows, cols, channels) while "channels_first" assumes  (channels, rows, cols).
K.set_image_data_format('channels_first')


def dice_coef(y_true, y_pred):
	y_true_f = K.flatten(y_true)
	y_pred_f = K.flatten(y_pred)
	intersection = K.sum(y_true_f * y_pred_f)
	return (2. * intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.0)


def dice_coef_loss(y_true, y_pred):
	return -dice_coef(y_true, y_pred)


def unet4(img_channels, image_rows, image_cols):
	# th - (channels, height, width), tf - (height, width, channels)
	inputs = Input((img_channels, image_rows, image_cols))
	conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
	conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
	pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

	conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
	conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
	pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

	conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
	conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
	pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

	conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
	conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
	pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

	conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
	conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

	up6 = concatenate([UpSampling2D(size=(2, 2))(conv5), conv4], axis=1)
	conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
	conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

	up7 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv3], axis=1)
	conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
	conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

	up8 = concatenate([UpSampling2D(size=(2, 2))(conv7), conv2], axis=1)
	conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
	conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

	up9 = concatenate([UpSampling2D(size=(2, 2))(conv8), conv1], axis=1)
	conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
	conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)

	conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)

	model = Model(inputs=[inputs], outputs=[conv10])

	model.compile(optimizer=Adam(lr=1e-4), loss=dice_coef_loss, metrics=[dice_coef])

	return model

Примеры работы
Пример работы U-Net для детектирования
Левая верхняя — исходное изображение. Правая верхняя — исходная маска (для обучения).
Левая нижняя — предсказанная маска. Правая нижняя — маска, наложенная на исходную картинку.

Другие сети для сегментации
Mask R-CNN
Mask R-CNN (PDF)

SegNet

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation (PDF)
SegNet — A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labelling

Заключение
Архитектура свёрточной сети U-Net — простая и популярная. Очень хорошо показывает себя в соревнованиях по машинному обучению. Может использоваться не только для сегментации, но и для детектирования объектов на изображениях.

Статьи
U-Net: Convolutional Networks for Biomedical Image Segmentation (PDF)

Ссылки
Deep learning for satellite imagery via image segmentation
https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/
Deep Learning Tutorial for Kaggle Ultrasound Nerve Segmentation competition, using Keras
End-to-end baseline with U-net (keras)
ZF_UNET_224_Pretrained_Model
https://github.com/mrgloom/awesome-semantic-segmentation

По теме
Детектирование объектов — нейросетевой подход

Нейронная сеть
Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения
Пример работы самоорганизующейся инкрементной нейронной сети SOINN


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение