首页 文章

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

提问于
浏览
4

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

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

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

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

功能(y_pred,y_true),

与Keras达成协议 .

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

3 回答

  • 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

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

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

  • 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
    
    • 每个像素一个热编码:

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

相关问题