python - 如何实现多类语义分割?

标签 python machine-learning deep-learning keras image-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)(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

对于如何修改模型的最终部分以成功训练,您有什么建议吗?我遇到了各种各样的形状不匹配错误,而且有几次我设法让它运行,损失在整个 epoch 中都没有改变。

最佳答案

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

目标的每个 channel 都应该是一个类。每个 channel 都是 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

关于python - 如何实现多类语义分割?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900125/

相关文章:

python - 自动化 REST 服务测试所需的建议

machine-learning - 线性回归中的零条件是什么?

deep-learning - Pytorch LSTM 文本生成器重复相同的单词

machine-learning - 如何在 pandas python 中以特定顺序重新排序某些行

audio - 我可以尝试从mp3文件中提取哪些功能进行分类?

tensorflow - 动量优化器的学习率变化

tensorflow - Keras - 自定义指标在控制台与 model.evaluate() 中产生不同的值

python - 当在循环中添加一个字符串时,我是如何减一的?

python - 如何动态加载 Python 类

python - 绘制由散点数据决定颜色的形状文件