使用编码器 - 解码器CNN进行语义分割

时间:2017-02-07 15:27:44

标签: tensorflow deep-learning keras

对滥用技术术语表示道歉。 我正在通过CNN进行语义分割项目;尝试实现Encoder-Decoder类型的体系结构,因此输出与输入的大小相同。

您如何设计标签? 应该使用什么损失函数?特别是在重度失衡的情况下(但是类别之间的比例在图像之间是可变的)。

问题涉及两个类(感兴趣的对象和背景)。我正在使用带有张量流后端的Keras。

到目前为止,我将设计预期输出与输入图像的尺寸相同,应用按像素标记。模型的最后一层具有softmax激活(用于2个类)或sigmoid激活(用于表示像素属于对象类的概率)。我在为类似的任务设计合适的目标函数时遇到了麻烦:

功能(y_pred,y_true),

与Keras达成协议。

请尝试具体说明所涉及的张量尺寸(模型的输入/输出)。任何想法和建议都非常感谢。谢谢!

3 个答案:

答案 0 :(得分:1)

实际上,当您使用TensorFlow后端时,您只需按以下方式应用预定义的Keras目标:

output = Convolution2D(number_of_classes, # 1 for binary case
                       filter_height,
                       filter_width,
                       activation = "softmax")(input_to_output) # or "sigmoid" for binary
... 
model.compile(loss = "categorical_crossentropy", ...) # or "binary_crossentropy" for binary

然后使用整数编码的类提供单热编码特征映射或形状(image_height, image_width)矩阵(请记住,在这种情况下,您应该使用sparse_categorical_crossentropy作为丢失)。

为了处理类失衡(我猜它是由于背景类)我强烈建议你仔细阅读这个Stack Overflow question的答案。

答案 1 :(得分:1)

我建议从实践中使用的基础架构开始,例如神经分割中的基础架构:https://github.com/EdwardTyantov/ultrasound-nerve-segmentation。这里使用dice_loss作为损失函数。这对于两类问题非常有效,如文献中所示:https://arxiv.org/pdf/1608.04117.pdf

另一种广泛使用的损失函数是这种问题的交叉熵。对于像您这样的问题,最常见的是长短跳过连接以稳定训练,如上文所述。

答案 2 :(得分:1)

两种方式:

  1. 您可以尝试'展平':

    model.add(Reshape(NUM_CLASSES,HEIGHT*WIDTH))  #shape : HEIGHT x WIDTH x NUM_CLASSES
    model.add(Permute(2,1)) # now itll be NUM_CLASSES x HEIGHT x WIDTH
    #Use some activation here- model.activation()
    #You can use Global averaging or Softmax
    
  2. 对每个像素进行一次热编码:

    在这种情况下,最后一层应该是Upsample / Unpool / Deconvolve到HEIGHT x WIDTH x CLASSES。所以你的输出基本上是形状:( HEIGHT,WIDTH,NUM_CLASSES)。