首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现多类语义分割?

如何实现多类语义分割?
EN

Stack Overflow用户
提问于 2017-05-10 18:27:03
回答 2查看 16.4K关注 0票数 15

我能够训练一个带有标签图像的U-网,该图像具有二值分类。

但我很难弄清楚如何为多类分类(4个类)配置Keras/Theano中的最终层。

我有634张图片和相应的634个掩码,它们是unit8和64x64像素。

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

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

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

代码语言:javascript
复制
mask_train = to_categorical(mask_train, 4)

这使得mask_train.shape(634, 1, 64, 64)转到(2596864, 4)

我的模型非常遵循Unet的体系结构,但是最后的层似乎是有问题的,因为我无法将结构扁平化,以匹配一个热编码的数组。

代码语言:javascript
复制
[...]
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

您对如何修改模型的最后部分有什么建议吗?这样就可以成功地进行培训了?我得到了各种形状不匹配的错误,而我设法使它运行的几次,损失并没有随着时代的变化而改变。

EN

回答 2

Stack Overflow用户

发布于 2017-05-10 19:37:23

如果您使用的是(634,4,64,64),那么您的目标应该是channels_first。

或者(634,64,64,4),如果channels_last.

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

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

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

代码语言:javascript
复制
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)

如果订单不能正常工作,您可以手动完成:

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2018-10-10 16:51:57

有点晚了,但你应该试试

代码语言:javascript
复制
mask_train = to_categorical(mask_train, num_classes=None)

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

最后一层,激活和丢失看起来很好的多类分割。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43900125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档