Несоответствующее измерение канала ввода / вывода в Keras

#python #tensorflow #keras #image-segmentation

#python #тензорный поток #keras #сегментация изображения

Вопрос:

В настоящее время я работаю над сегментацией изображений нескольких классов с помощью Keras. Мои входные изображения представлены в формате RGB. Я пытаюсь сегментировать 4 типа объектов на изображении.

Моя нейронная сеть выглядит следующим образом:

 inputs = Input((patch_size, patch_size,nb_chan))

#
conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D((2, 2))(conv1)

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

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

conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)

#
merge1 = UpSampling2D(size=(2, 2))(conv4)
merge1 = concatenate([conv3,merge1],axis=3)
conv5 = Conv2D(256, (3, 3), activation='relu', padding='same')(merge1)
conv5 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv5)

#
merge2 = UpSampling2D(size=(2, 2))(conv5)
merge2 = concatenate([conv2,merge2], axis=3)
conv6 = Conv2D(128, (3, 3), activation='relu', padding='same')(merge2)
conv6 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv6)

#
merge3 = UpSampling2D(size=(2, 2))(conv6)
merge3 = concatenate([conv1,merge3], axis=3)
conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(merge3)
conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv7)


conv8 = Conv2D(nbClass, (1, 1), activation='softmax',padding='same')(conv7)
model = Model(inputs=inputs, outputs=conv8)
model.summary()
model.compile(optimizer=Adam(lr=1e-5), loss='categorical_crossentropy', metrics=['categorical_accuracy'])
  

Мой размер входного изображения 256 * 256
nb_chan — это размер входного канала, в моем случае он равен 3.
nbClass — это номер объекта для сегментации, в моем случае это 4.

Но когда я хочу скомпилировать свою модель, я получаю эту ошибку:

 ValueError: Error when checking target: expected conv2d_15 to have shape (256, 256, 4) but got array with shape (256, 256, 3)
  

Я попытался изменить последний уровень моей сети с помощью функции изменения формы:

 conv8 = Conv2D(nbClass, (1, 1), activation='softmax',padding='same')(conv7)
conv8 = Reshape((patch_size*patch_size,nbClass))(conv8)
conv8 = core.Permute((2,1))(conv8)
  

Но я получаю эту ошибку:

 ValueError: Error when checking target: expected permute_1 to have 3 dimensions, but got array with shape (8, 256, 256, 3)
  

Я немного заблудился, я что-то забыл?

Комментарии:

1. Первая ошибка возникает при подгонке, а не при компиляции, и в ней ясно сказано, что ожидается 4-канальное выходное изображение, в то время как вы предоставили 3-канальное изображение, звучит так, что либо у вас есть только 3 класса объектов (а не 4), либо есть проблема в коде, который создает целевые объекты для вашей модели.

2. проверьте форму ввода и сводку модели. Где-то определенно есть несоответствие.

3. Да, я думаю, вы правы. Проблема в том, что я действительно не знаю, как выполнить мультисегментацию. На самом деле, мои изображения ground truth — это также изображения RGB с 4 разными цветами (черный, синий, зеленый, красный) для каждого сегментируемого объекта. И я наивно думал, что результатом предсказания был бы массив размером 4 с процентом принадлежности каждого пикселя к классу.

4. Нет, вам нужно преобразовать ваше «изображение с цветовой кодировкой» в изображение с односторонней кодировкой, которое будет иметь форму (256, 256, 4), где каждый канал будет кодировать один из классов.

5. Я попробую это, спасибо за вашу помощь!