U-Net 中的稀疏标注

Posted

技术标签:

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

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

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

谢谢

【问题讨论】:

只是一个澄清。这些未注释的区域是您想要注释的类的一部分,还是它们只是背景/无关? 【参考方案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')

【讨论】:

以上是关于U-Net 中的稀疏标注的主要内容,如果未能解决你的问题,请参考以下文章

scala 稀疏向量

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

如何有效地将稀疏矩阵列添加到另一个稀疏矩阵中的每一列?

为啥 PyTorch 中的嵌入实现为稀疏层?

理解JS里的稀疏数组与密集数组

Python中的稀疏3d矩阵/数组?