困难:类别不平衡,label size很小。

 

思路:

  • loss上给其加权,使其focus小区域(最简单直接)
  • loss合理优化,使其关注小区域
  • 网络结构

这有一个篇非常好的loss function 总结。[传送门]

0.评价指标

一般使用dice衡量区域的重合程度,使用95%的HD( Hausdorff Distance)去衡量边界的重合程度,之所以取95%,是因为要滤去5%的离群点。但其实,虽然有两个指标,95hd经常不是主动优化的【paper】。一般dice小了,95HD就小了,因此大多数人使用dice loss作为梯度下降的loss。

 

1.dice loss

我们先看看dice 系数定义。

语义分割边界分割模块 语义分割dice_语义分割边界分割模块

 看图非常好理解。dice loss根据其改编。

原paper地址:http://campar.in.tum.de/pub/milletari2016Vnet/milletari2016Vnet.pdf

语义分割边界分割模块 语义分割dice_语义分割边界分割模块_02

简单来说,相对于交叉熵,就是不用加了权重,而VNet中的改进的dice loss是基于IOU loss进行优化的,这样子改善了梯度传播。但是小物体训练的时候很敏感,训练比较震荡。

语义分割边界分割模块 语义分割dice_bc_03

2. cross-entropy loss

语义分割边界分割模块 语义分割dice_权重_04

上面就是CEloss,x[class]表示该类的得分,分母是整体的得分相加,这里使用了softmax做归一化。此时没有考虑类别不平衡。简而言之就是一个log softmax+NLLloss。 第二步是分子e的指数和log抵消了。

语义分割边界分割模块 语义分割dice_语义分割边界分割模块_05

 加权了之后得到的最终式子。

公式 From:https://pytorch.org/docs/stable/nn.html?highlight=bce#torch.nn.CrossEntropyLoss

3. focal loss

语义分割边界分割模块 语义分割dice_语义分割边界分割模块_06

仔细看与CEloss区别,这个gamma目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。首先pt的范围是0到1,所以不管γ是多少,这个调制系数都是大于等于0的。易分类的样本再多,你的权重很小,那么对于total loss的共享也就不会太大。那么怎么控制样本权重呢?举个例子,假设一个二分类,样本x1属于类别1的pt=0.9,样本x2属于类别1的pt=0.6,显然前者更可能是类别1,假设γ=1,那么对于pt=0.9,调制系数则为0.1;对于pt=0.6,调制系数则为0.4,这个调制系数就是这个样本对loss的贡献程度,也就是权重,所以难分的样本(pt=0.6)的权重更大。

实际调focal loss时候,发现其处理类别不均衡效果很差,与原文初衷相抵,其中weight我是用label的逆样本频率,gamma=2。1:100时候效果还行,当1:1000时,效果较差。这一矛盾尚待补充。  

4.Generalized Dice Loss (GDL)

paper:Generalised Dice overlap as a deep learning loss function for highly unbalanced segmentations

语义分割边界分割模块 语义分割dice_语义分割边界分割模块_07

rln指的是类别l在第n个像素的标准值(GT),pln为相应的预测概率,wl为每个类别权重。可以从pixel-wise这么理解分子,

  • 该像素GT1的值 x 该像素预测为GT1的概率 + 该像素GT2的值 x 该像素预测为GT2的概率

个人觉得分母的出现是因为把loss右边式子控制到0-1,因为x+y>=2xy,然后负号就是因为右边式子越大越好,加上后,整个loss越小越好。

注意:一个类的体素至少比其他类高3个数量级。否则,在大多数情况下,使用标准的DiceLoss比GDL工作得更好

reference