语义分割的那些loss(甚至还有ssim)

大家好,我是灿视。

今天我们看下关于语义分割的常规$loss$设计,其中还有多个$loss$联合一起用的,其中就如$BASNet$这种显著性检测的工作,我们也分析了它的$loss$设计。希望各位做分割的,可以在$loss$层面,有所启发~

交叉熵损失 Cross Entropy Loss Function

用于图像语义分割任务的最常用损失函数是像素级别的交叉熵损失,这种损失会逐个检查每个像素,将对每个像素类别的预测结果(概率分布向量)与我们的独热编码标签向量($one-hot$形式)进行比较。

每个像素对应的损失函数为

L=c=1Myclog(pc)L = -\sum_{c=1}^{M}y_c log(p_c)

其中,$M$代表类别数,$y_c$是one-hot向量,元素只有 $0$ 和 $1$ 两种取值,至于$p_c$表示预测样本属于 $c$ 类别的概率。假设我们需要对每个像素的预测类别有5个,则预测的概率分布向量长度为5:

整个图像的损失就是对每个像素的损失求平均值。

特别注意的是,binary entropy loss 是针对类别只有两个的情况,简称 bce loss,损失函数公式为:

bce loss=ytruelog(ypred)(1ytrue)log(1ypred)bce \ loss = -y_{true}log(y_{pred}) - (1-y_{true})log(1-y_{pred})

交叉熵$Loss$可以用在大多数语义分割场景中,但它有一个明显的缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,即 $y=0$ 的数量远大于 $y=1$ 的数量,损失函数中 $y=0$的成分就会占据主导,使得模型严重偏向背景,导致效果不好。

weighted loss

由于交叉熵损失会分别评估每个像素的类别预测,然后对所有像素的损失进行平均,因此我们实质上是在对图像中的每个像素进行平等地学习。如果多个类在图像中的分布不均衡,那么这可能导致训练过程由像素数量多的类所主导,即模型会主要学习数量多的类别样本的特征,并且学习出来的模型会更偏向将像素预测为该类别。

比如对于二分类,正负样本比例为1: 99,此时模型将所有样本都预测为负样本,那么准确率仍有99%这么高,但其实该模型没有任何使用价值。

为了平衡这个差距,就对正样本和负样本的损失赋予不同的权重,带权重的二分类损失函数公式如下:

loss=pos_weight×ytruelog(ypred)(1ytruelog(1ypred))loss = -pos\_weight \times y_{true}log(y_{pred}) - (1-y_{true}log(1-y_{pred}))
pos_weight=num_negnum_pospos\_weight = \frac{num\_neg}{num\_pos}

要减少假阴性样本的数量,设置 $pos_weight>1$;要减少假阳性样本的数量,设置 $pos_weight<1$。

Focal loss

何凯明团队在RetinaNet论文中引入了Focal Loss来解决难易样本数量不平衡,我们来回顾一下。 我们知道,One-Stage的目标检测器通常会产生10k数量级的框,但只有极少数是正样本,正负样本数量非常不平衡。为了解决正负样本不均衡的问题,经常在交叉熵损失前加入一个参数 $\alpha$

CE={αlog(p)if y=1(1α)log(1p)otherCE = \left\{\begin{matrix} -\alpha log(p) & if \ y =1\\ -(1-\alpha)log(1-p) & other \end{matrix}\right.

虽然 $\alpha$ 平衡了正负样本数量,但实际上,目标检测中大量的候选目标都是易分样本,这些样本会使损失很低,因此模型应关注那些难分样本,将高置信度的样本损失函数降低一些,就有了Focal loss

FL={α(1p)γlog(p)if y=1(1α)pγlog(1p)if y=0FL = \left\{\begin{matrix} -\alpha (1-p)^{\gamma} log(p) & if \ y =1\\ -(1-\alpha) p^{\gamma} log(1-p) & if \ y =0 \end{matrix}\right.

举个例子,当 $\gamma=2$,如果$p=0.968$,$(1-p)^2=0.001$,这时损失衰减了1000倍。 FL Loss对于简单样本(p比较大)回应较小的loss,标准的CE然后有较大的loss,这样就是对简单样本的一种decay。

论文的实验结果显示,当 $\gamma=2,\alpha=0.25$,效果最好,这样损失函数在训练的过程中关注的样本优先级就是正难> 负样本难例 > 正易 > 负易了。

Dice Loss

dice loss 是在医疗图像分割模型VNet中提出的,感兴趣的解剖结构仅占据扫描的非常小的区域,从而使学习过程陷入损失函数的局部最小值。所以要加大前景区域的权重。

Dice系数是一种集合相似度度量的函数,可以理解为是两个轮廓区域的相似程度,用A、B表示两个轮廓区域所包含的点集,公式为:

Dice(A,B)=2ABA+BDice(A,B)=2 \frac{|A⋂B|}{|A|+|B|}

其次Dice也可以表示为:

Dice(A,B)=2TP2TP+FN+FPDice(A, B) = \frac{2TP}{2TP+FN+FP}

其中TP,FP,FN分别是真阳性、假阳性、假阴性的个数。

dice loss=1Dicedice \ loss = 1- Dice

  • dice loss会使训练曲线有时不可信,很难看出收敛,而且dice loss好的模型并不一定在其他的评价标准上效果更好.

  • 属于直接在评价标准上进行优化。

  • 不均衡的场景下的确好使。

IOU Loss

可类比DICE LOSS,也是直接针对评价标准进行优化,公式如下:

IOU=1ABABIOU = 1 - \frac{A \bigcap B}{A \bigcup B}

它和Dice Loss一样仍然存在训练过程不稳定的问题,IOU Loss在分割任务中不常用。

几种多loss搭配方案

BCE + Dice Loss

即将BCE Loss和Dice Loss进行组合,在数据较为均衡的情况下有所改善,但是在数据极度不均衡的情况下交叉熵Loss会在迭代几个Epoch之后远远小于Dice Loss,这个组合Loss会退化为Dice Loss。

Focal Loss + Dice Loss

这个Loss的组合应该最早见于腾讯医疗AI实验室2018年在《Medical Physics》上发表的这篇论文:https://arxiv.org/pdf/1808.05238.pdf。论文提出了使用Focal Loss和Dice Loss来处理小器官的分割问题。同时也解决数据不平衡和难易样本的问题

Lovasz-Softmax Loss

Kaggle神器。这篇论文是CVPR 2018的,原地址为:https://arxiv.org/pdf/1705.08790.pdf。对原理感兴趣可以去看一下论文,这个损失是对Jaccard(IOU) Loss进行Lovaze扩展,表现更好。

BASNet

一种专注于边缘以及精细结构分割的网络,同时提出一种混合loss,对这篇论文感兴趣的同学,可以看一下本文的详细总结:https://share.mubu.com/doc/3XISi_xs1he

k=bcek+ssimk+iouk\ell^{k}=\ell^{k}_{bce}+\ell^{k}_{ssim}+\ell^{k}_{iou}

二元交叉熵BCE、结构相似性SSIM和IOU损失,分别指导网络学习三级(即像素级、补丁级和图像级)层次结构表示。在边缘结构分割以及精细结构分割方面,表现优秀。

BCE损失是二元分类和分割中使用最广泛的损失,作用:pixel-level

bce=(r,c)[G(r,c)log(S(r,c))+(1G(r,c))log(1S(r,c))]\ell_{bce} = -\sum_{(r, c)} [G(r,c)log(S(r,c)) + (1-G(r,c))log(1-S(r,c))]

$G(r,c)\in \left { 0,1 \right }$是像素$(r, c)$的标签;$S(r, c)$是分割对象的预测概率

SSIM最初设计用于图像质量评估。它可以捕获图像中的结构信息。因此,我们将其集成到训练损失中以学习标签的的结构信息。作用:patch-level

x={xj:j=1,...,N2}x = \left \{ x_j:j=1, ..., N^2 \right \}

$x$是预测概率图S中裁剪出来的两个对应的图像块$patch$(大小为$N \times N$)的像素值。

y={yj:j=1,...,N2}y= \left \{ y_j:j=1, ..., N^2 \right \}

$y$是二值GT标签掩码$G$中裁剪出的两个对应的图像path(大小:$N \times N$)的像素值

ssim=1(2μxμy+C1)(2σxy+C2)(μx2+μy2+C1)(μx2+μy2+C2)\ell _{ssim} = 1-\frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy} + C_2)}{(\mu^2_x+\mu^2_y +C_1)(\mu^2_x+\mu^2_y+C_2)}

其中$\mu_x$, $\mu_y$ 和 $\mu_x$, $\mu_y$ 分别是 $x$ 和 $y$ 的均值和标准差,$\sigma_{xy}$ 是协方差,为了避免除以 0,设置$C_1 = 0.01^2$ 和 $C_2 = 0.03^2$

IoU 最初被提出用于测量两个集合之间的相似性,并已成为目标检测和分割的标准评估措施。最近,它已被用作训练损失,是一种针对优化目标的损失函数,作用:map-level 为了确保其可区分性,我们采用了 的 IoU 损失:

iou=1r=1Hc=1WS(r,c)G(r,c)r=1Hc=1W[S(r,c)+G(r,c)S(r,c)G(r,c)]\ell_{iou} = 1- \frac{\sum_{r=1}^{H}\sum_{c=1}^{W}S(r,c)G(r,c)}{\sum_{r=1}^H\sum_{c=1}^W[S(r,c)+G(r,c)-S(r,c)G(r,c)]}

其中

G(r,c){0,1}G(r, c)\in \left \{ 0,1 \right \}

是像素的 $(r,c)$的GT 标签,$S(r, c)$ 是分割对象的预测概率。

SSIM模块

IOU LOSS

Last updated