最近在做一个二分类的semantic segmentation项目,内容大致是把每帧中属于一个特定物体的pixel标注出来。经过统计,数据集中负类的像素数目比正类多200多倍,存在这种数据偏斜的情况下,选择哪种loss function会影响模型的收敛速度及效果,因此在这里大致总结一下几种语义分割常用的loss function和它们适用的场景。
期望的预测结果是对于每一个属于物体的像素都预测其为正类,而不属于物体的像素为负类。因此本质上这是一个像素级别的二分类问题,可以借鉴普通的二分类问题,对每个像素位置的预测值计算交叉熵。
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=0n∗n(p log(p^)+(1−p)log(1−p^))
其中i为像素的index,假设最后输出的mask的尺寸为n*n。
但是像文章一开头提到的,由于样本偏斜问题,如果直接把所有像素的交叉熵和作为loss,那么正类会因为样本比较少,而导致模型对正类的关注不够。
此方法与上面的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=0n∗n(β p log(p^)+(1−p)log(1−p^))
β \beta β:这里仅对正类加权。若:
本方法和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=0n∗n(β p log(p^)+(1−β)(1−p)log(1−p^))
此方法的核心是动态增大困难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=0n∗n(β (1−p^)γp log(p^)+(1−β) pγ (1−p)log(1−p^))
可以看到与balanced pixel-wise cross entropy不同的是,正类项和负类项都多乘了一个因子:
( 1 − p ^ ) γ (1-\hat{p})^\gamma (1−p^)γ: 当ground truth 为正类时,预测值越小(越偏离正确分类),则对应sample的权重越大。
p γ p^\gamma pγ: 同上,预测值越偏离正确分类,代表这个sample对于模型来说越困难,则增加它的权重,加大其对模型更新的影响。
与之前的几种损失函数不同,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=0n∗n(element_add(ground truth mask , predicted mask))2 ∗ Σi=0n∗n(element_and(ground truth mask , predicted mask))=1−2∗TP+TP+FN2∗TP
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
https://lars76.github.io/neural-networks/object-detection/losses-for-segmentation/
https://stats.stackexchange.com/questions/321460/dice-coefficient-loss-function-vs-cross-entropy