loss functions for semantic segmentation

motivation

最近在做一个二分类的semantic segmentation项目,内容大致是把每帧中属于一个特定物体的pixel标注出来。经过统计,数据集中负类的像素数目比正类多200多倍,存在这种数据偏斜的情况下,选择哪种loss function会影响模型的收敛速度及效果,因此在这里大致总结一下几种语义分割常用的loss function和它们适用的场景。

pixel-wise cross entropy

期望的预测结果是对于每一个属于物体的像素都预测其为正类,而不属于物体的像素为负类。因此本质上这是一个像素级别的二分类问题,可以借鉴普通的二分类问题,对每个像素位置的预测值计算交叉熵。
C E = − Σ i = 0 n ∗ n ( p   l o g ( p ^ ) + ( 1 − p ) l o g ( 1 − p ^ ) ) CE=-\Sigma^{n*n}_{i=0}( p\ log(\hat{p}) + (1- p) log(1-\hat{p})) CE=Σi=0nn(p log(p^)+(1p)log(1p^))

其中i为像素的index,假设最后输出的mask的尺寸为n*n。
但是像文章一开头提到的,由于样本偏斜问题,如果直接把所有像素的交叉熵和作为loss,那么正类会因为样本比较少,而导致模型对正类的关注不够。

weighted pixel-wise cross entropy

此方法与上面的pixel-wise cross entropy很类似,不过它在公式中对正类的loss加入了权值。通过调整权值的大小,可以调整模型的关注点。
W C E = − Σ i = 0 n ∗ n ( β   p   l o g ( p ^ ) + ( 1 − p ) l o g ( 1 − p ^ ) ) WCE=-\Sigma^{n*n}_{i=0}(\beta\ p\ log(\hat{p}) + (1- p) log(1-\hat{p})) WCE=Σi=0nn(β p log(p^)+(1p)log(1p^))

β \beta β:这里仅对正类加权。若:

  • β < 1 \beta<1 β<1: 越小,模型越关注负类数据的正确性,因此可以降低False Positive (本为负类,却被错误地分到了正类)
  • β > 1 \beta>1 β>1: 越大,模型越关注正类数据的正确性,因此可以降低False Negative(本为正类,却被错误地分到了负类)

balanced pixel-wise cross entropy

本方法和weighted pixel-wise cross entropy非常类似,不同的是它同时给正负类加权,并使权值之和为1。
B C E = − Σ i = 0 n ∗ n ( β   p   l o g ( p ^ ) + ( 1 − β ) ( 1 − p ) l o g ( 1 − p ^ ) ) BCE=-\Sigma^{n*n}_{i=0}(\beta\ p\ log(\hat{p}) +(1-\beta) (1- p) log(1-\hat{p})) BCE=Σi=0nn(β p log(p^)+(1β)(1p)log(1p^))

focal loss

此方法的核心是动态增大困难sample的权重,迫使模型集中学习困难的cases。

f o c a l   l o s s = − Σ i = 0 n ∗ n ( β   ( 1 − p ^ ) γ p   l o g ( p ^ ) + ( 1 − β )   p γ   ( 1 − p ) l o g ( 1 − p ^ ) ) focal\ loss=-\Sigma^{n*n}_{i=0}(\beta\ (1-\hat{p})^\gamma p\ log(\hat{p}) +(1-\beta)\ p^\gamma\ (1- p) log(1-\hat{p})) focal loss=Σi=0nn(β (1p^)γp log(p^)+(1β) pγ (1p)log(1p^))

可以看到与balanced pixel-wise cross entropy不同的是,正类项和负类项都多乘了一个因子:
( 1 − p ^ ) γ (1-\hat{p})^\gamma (1p^)γ: 当ground truth 为正类时,预测值越小(越偏离正确分类),则对应sample的权重越大。
p γ p^\gamma pγ: 同上,预测值越偏离正确分类,代表这个sample对于模型来说越困难,则增加它的权重,加大其对模型更新的影响。

dice loss

与之前的几种损失函数不同,dice loss是直接从IOU的角度来设计。对于分割问题,其一般目标就是尽量提高IOU,因此dice loss对于metric更有针对性。

d i c e   l o s s = 1 − 2   ∗   Σ i = 0 n ∗ n ( e l e m e n t _ a n d ( g r o u n d   t r u t h   m a s k   ,   p r e d i c t e d   m a s k ) ) Σ i = 0 n ∗ n ( e l e m e n t _ a d d ( g r o u n d   t r u t h   m a s k   ,   p r e d i c t e d   m a s k ) ) = 1 − 2 ∗ T P 2 ∗ T P + T P + F N dice\ loss=1-\frac{2\ *\ \Sigma^{n*n}_{i=0}(element\_and(ground\ truth\ mask\ ,\ predicted\ mask))}{\Sigma^{n*n}_{i=0}(element\_add(ground\ truth\ mask\ ,\ predicted\ mask))}=1-\frac{2*TP}{2*TP+TP+FN} dice loss=1Σi=0nn(element_add(ground truth mask , predicted mask))2  Σi=0nn(element_and(ground truth mask , predicted mask))=12TP+TP+FN2TP

I O U = I n t e r s a c t i o n ( g r o u n d   t r u t h   m a s k   ,   p r e d i c t e d   m a s k ) U n i o n ( g r o u n d   t r u t h   m a s k   ,   p r e d i c t e d   m a s k ) = T P T P + F P + F N IOU=\frac{ Intersaction(ground\ truth\ mask\ ,\ predicted\ mask)}{Union(ground\ truth\ mask\ ,\ predicted\ mask)}=\frac{TP}{TP+FP+FN} IOU=Union(ground truth mask , predicted mask)Intersaction(ground truth mask , predicted mask)=TP+FP+FNTP

Reference

https://lars76.github.io/neural-networks/object-detection/losses-for-segmentation/
https://stats.stackexchange.com/questions/321460/dice-coefficient-loss-function-vs-cross-entropy

你可能感兴趣的:(深度学习)