【问题标题】:Sparse annotation in U-NetU-Net 中的稀疏标注
【发布时间】:2020-09-23 22:44:09
【问题描述】:

我正在对整个幻灯片病理图像进行 U-Net 图像分割训练。我想知道如何处理未注释的区域?我正在处理巨大的组织,不可能注释所有或绝大多数组织,所以我有一位病理学家的注释,他注释了我们感兴趣的选定组织结构。这意味着在我生成的许多图块中,有一段没有注释。

它是否会通过间接表明未注释区域对一个类别或另一个类别产生负面影响而对 U-Net 产生负面影响,尽管它不是负面的?我该如何处理这个重要案件?将图像仅遮盖注释部分是否有意义,使得未注释区域为黑色?

谢谢

【问题讨论】:

  • 只是一个澄清。这些未注释的区域是您想要注释的类的一部分,还是它们只是背景/无关?

标签: tensorflow image-processing semantic-segmentation


【解决方案1】:

解决此问题的一种方法是使用加权损失函数,您只需将零权重分配给您不想包含的类。本质上,您将未注释区域视为对损失函数没有贡献的附加类。您可以在 GitHub 存储库中找到功能齐全的 Keras 实现 here

具体来说,我会使用加权分类交叉熵损失函数。你可以找到 Keras 的实现here

from keras import backend as K

def weighted_categorical_crossentropy(weights):
    """
    A weighted version of keras.objectives.categorical_crossentropy
    
    Variables:
        weights: numpy array of shape (C,) where C is the number of classes
    
    Usage:
        weights = np.array([0.5,2,10]) # Class one at 0.5, class 2 twice the normal weights, class 3 10x.
        loss = weighted_categorical_crossentropy(weights)
        model.compile(loss=loss,optimizer='adam')
    """
    
    weights = K.variable(weights)
        
    def loss(y_true, y_pred):
        # scale predictions so that the class probas of each sample sum to 1
        y_pred /= K.sum(y_pred, axis=-1, keepdims=True)
        # clip to prevent NaN's and Inf's
        y_pred = K.clip(y_pred, K.epsilon(), 1 - K.epsilon())
        # calc
        loss = y_true * K.log(y_pred) * weights
        loss = -K.sum(loss, -1)
        return loss
    
    return loss

然后您可以像这样编译您的模型进行训练:

model.compile(optimizer='adam', loss=weighted_categorical_crossentropy(np.array([background_weight, foreground_weight, 0])), metrics='accuracy')

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2015-08-27
    • 1970-01-01
    • 2019-04-11
    • 2010-11-07
    相关资源
    最近更新 更多