繁体   English   中英

如何实现多类语义分割?

[英]How to implement multi-class semantic segmentation?

我能够训练带有二进制分类标记图像的U-net

但我很难弄清楚如何在Keras / Theano中配置最终层以进行多类分类(4类)。

我有634个图像和相应的634个面具,它们是unit8和64 x 64像素。

我的面具不是黑色(0)和白色(1),而是在3个类别加上背景的颜色标记对象,如下所示:

  • 黑色(0),背景
  • 红色(1),对象类1
  • 绿色(2),对象类2
  • 黄色(3),对象类3

在训练运行之前,包含掩码的数组是单热编码,如下所示:

mask_train = to_categorical(mask_train, 4)

这使得mask_train.shape(634, 1, 64, 64) mask_train.shape (634, 1, 64, 64)变为(2596864, 4)

我的模型紧跟Unet架构,但最终层似乎有问题,因为我无法展平结构以匹配单热编码阵列。

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

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

# here I used number classes = number of filters and softmax although
# not sure if a dense layer should be here instead
conv11 = Conv2D(4, (1, 1), activation='softmax')(conv10)

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

# here categorical cross entropy is being used but may not be correct
model.compile(optimizer='sgd', loss='categorical_crossentropy',
              metrics=['accuracy'])

return model

您对如何修改模型的最后部分有任何建议,以便成功训练吗? 我得到了各种各样的形状不匹配错误,而且我设法让它运行的几次,损失并没有在整个时代发生变化。

如果您使用channels_first,则应将目标设为(634,4,64,64)
或者(634,64,64,4)如果channels_last。

目标的每个频道都应该是一个类。 每个通道都是0和1的图像,其中1表示像素是该类,0表示像素不是该类。

然后,您的目标是634组,每组包含四个图像,每个图像具有64x64像素,其中像素1表示存在所需特征。

我不确定结果是否会正确排序,但您可以尝试:

mask_train = to_categorical(mask_train, 4)
mask_train = mask_train.reshape((634,64,64,4)) 
#I chose channels last here because to_categorical is outputing your classes last: (2596864,4)

#moving the channel:
mask_train = np.moveaxis(mask_train,-1,1)

如果订购无法正常运行,您可以手动执行:

newMask = np.zeros((634,4,64,64))

for samp in range(len(mask_train)):
    im = mask_train[samp,0]
    for x in range(len(im)):
        row = im[x]
        for y in range(len(row)):
            y_val = row[y]
            newMask[samp,y_val,x,y] = 1

有点迟,但你应该试试

mask_train = to_categorical(mask_train, num_classes=None)

这将导致在(634, 4, 64, 64)用于mask_train.shape和为每个单独的类(独热的编码)的二进制掩码。

最后的转换层,激活和丢失看起来很适合多类分段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM