При сегментации изображений машина должна создавать разделы в образе. Как показано на изображении выше, вы можете видеть, что изображение разделено на различные части, такие как автомобили, люди, дороги, поезда и т. д. Сегментация изображения полезна во многих областях, таких как беспилотные автомобили, спутники, но наиболее важной областью является сегментация медицинских изображений. .
Существует много доступных архитектур сегментации изображений, но 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 для сегментации рентгеновского изображения грудной клетки. Вы можете найти его по ссылке ниже.
Спасибо за прочтение статьи.
Счастливого обучения!!!