При сегментации изображений машина должна создавать разделы в образе. Как показано на изображении выше, вы можете видеть, что изображение разделено на различные части, такие как автомобили, люди, дороги, поезда и т. д. Сегментация изображения полезна во многих областях, таких как беспилотные автомобили, спутники, но наиболее важной областью является сегментация медицинских изображений. .

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

Архитектура U-Net в основном состоит из двух частей: Сужающийся путь и Расширяющийся путь. Мы подробно рассмотрим каждую часть.

Контрактный путь

Этот путь состоит из 2 сверточных слоев (3x3) и одного слоя MaxPool. В нашем коде мы использовали входную форму = (256,256,1) и начали с ряда признаков от 64 до 1024.

На изображении ниже представлена ​​первая половина архитектуры сжатия U-Net. Где желтая стрелка представляет слой Conv 3x3 с ReLu, а красная стрелка представляет слой MaxPool 2x2.

Код Python для пути контрактации с использованием Tensorflow

inputs = layers.Input(shape=(256,256,1))
c0 = layers.Conv2D(64, activation='relu', kernel_size=(3,3), padding='same', name = 'C0')(inputs)
Drop = layers.Dropout(0.1)(c0)
c1 = layers.Conv2D(64, activation='relu', kernel_size=(3,3), padding='same', name = 'C1')(Drop)
c2 = layers.MaxPool2D(pool_size=(2, 2), name = 'MaxPool_1')(c1)

c3 = layers.Conv2D(128, activation='relu', kernel_size=(3,3), padding='same', name = 'C3')(c2)
Drop = layers.Dropout(0.1)(c3)
c4 = layers.Conv2D(128, activation='relu', kernel_size=(3,3), padding='same', name = 'C4')(Drop)
c5 = layers.MaxPool2D(pool_size=(2, 2), name = 'MaxPool_2')(c4)

c6 = layers.Conv2D(256, activation='relu', kernel_size=(3,3), padding='same', name = 'C6')(c5)
Drop = layers.Dropout(0.2)(c6)
c7 = layers.Conv2D(256, activation='relu', kernel_size=(3,3), padding='same', name = 'C7')(Drop)
c8 = layers.MaxPool2D(pool_size=(2, 2), name = 'MaxPool_3')(c7)

c9 = layers.Conv2D(512, activation='relu', kernel_size=(3,3),padding='same',  name = 'C9')(c8)
Drop = layers.Dropout(0.2)(c9)
c10 = layers.Conv2D(512, activation='relu', kernel_size=(3,3), padding='same', name = 'C10')(Drop)
c11 = layers.MaxPool2D(pool_size=(2, 2), name = 'MaxPool_4')(c10)

c12 = layers.Conv2D(1024, activation='relu', kernel_size=(3,3), padding='same', name = 'C12')(c11)
Drop = layers.Dropout(0.3)(c12)
c13 = layers.Conv2D(1024, activation='relu', kernel_size=(3,3), padding='same', name = 'C13')(Drop)

Я надеюсь, что приведенное выше изображение и код прояснят идею, лежащую в основе контрактного пути.

Экспансивный путь

Мы соединим выходной слой Conv2D из пути сжатия с путем расширения.

На этом пути мы переместим предыдущий слой с объектами 512 и соединим его со слоем Conv2D, имеющим 512 объектов «C10».

t01 = layers.Conv2DTranspose(512, kernel_size=(2,2), strides=(2,2), padding='same', name = 'Transpose_T01')(c13)
concat01 = layers.concatenate([t01, c10], axis=3, name= 'Concat_1')

После этого мы применим Convolution к слою «Concat01». мы будем повторять ту же процедуру, пока не получим наш обычный размер изображения (256 256,1).

Код Python для расширенного пути с использованием Tensorflow

t01 = layers.Conv2DTranspose(512, kernel_size=(2,2), strides=(2,2), padding='same', name = 'Transpose_T01')(c13)
concat01 = layers.concatenate([t01, c10], axis=3, name= 'Concat_1')
c14 = layers.Conv2D(512, activation='relu', kernel_size=(3,3), padding='same', name = 'C14')(concat01)
Drop = layers.Dropout(0.3)(c14)
c15 = layers.Conv2D(512, activation='relu', kernel_size=(3,3), padding='same', name = 'C15')(Drop)
t02 = layers.Conv2DTranspose(256, kernel_size=(2,2), strides=(2,2), padding='same', name = 'Transpose_T02')(c15)
concat02 = layers.concatenate([t02, c7], axis=3, name= 'Concat_2')
c16 = layers.Conv2D(256, activation='relu', kernel_size=(3,3), padding='same', name = 'C16')(concat02)
Drop = layers.Dropout(0.2)(c16)
c17 = layers.Conv2D(256, activation='relu', kernel_size=(3,3), padding='same', name = 'C17')(Drop)
t03 = layers.Conv2DTranspose(128, kernel_size=(2,2), strides=(2, 2), name = 'Transpose_T03')(c17)
concat03 = layers.concatenate([t03, c4], axis=3, name= 'Concat_3')
c18 = layers.Conv2D(128, activation='relu', kernel_size=(3,3), padding='same', name = 'C18')(concat03)
Drop = layers.Dropout(0.2)(c18)
c19 = layers.Conv2D(128, activation='relu', kernel_size=(3,3), padding='same', name = 'C19')(Drop)
t04 = layers.Conv2DTranspose(64, kernel_size=(2,2), strides=(2, 2), padding='same', name = 'Transpose_T04')(c19)
concat04 = layers.concatenate([t04, c1], axis=3, name= 'Concat_4')
c20 = layers.Conv2D(64, activation='relu', kernel_size=(3,3), name = 'C20', padding = 'same')(concat04)
Drop = layers.Dropout(0.1)(c20)
c21 = layers.Conv2D(64, activation='relu', kernel_size=(3,3), name = 'C21', padding = 'same')(Drop)
output = layers.Conv2D(1, activation='sigmoid', kernel_size=(1,1), name = 'O/P')(c21)
model_UNet = tf.keras.Model(inputs=inputs, outputs=output, name='UNet')

Когда вы рисуете, модель дает U-образную форму, как показано ниже.

tf.keras.utils.plot_model(model_UNet)

Если вы используете изображение в оттенках серого, входное изображение будет иметь 1 канал, а если вы используете изображение RGB, то оно будет иметь 3 канала. Здесь я использовал изображение в оттенках серого, поэтому моя входная форма (256 256,1).

Пример

Я использовал алгоритм U-Net для сегментации рентгеновского изображения грудной клетки. Вы можете найти его по ссылке ниже.



Спасибо за прочтение статьи.

Счастливого обучения!!!