yolov3(one-state)和faster-rcnn(two-stage)的表现差异主要原因是:

                1、大量前景(positive)和背景(negative)数量不平衡导致。

                2、yolov3这种one-stage既要做定位又要做分类,在最后的损失函数中混在一起进行计算,这样没有专门做分类或者专门做bbox regression的参数,那每个参数的学习难度就大一点。

1、在faster-rcnn中,rpn层会通过2分类来判断哪些anchor box是positive,哪些anchor box是negative(计算二分类损失的标签值是通过预测框与真实框的iou来判断哪些是positive,哪些是negative)。只有postive会输入到后面的roi pooling层。(Two stage detector 的第一个stage相当于先拿一个one stage detector 来做一次前景后景的classification + detection。这个任务比 one stage detector 的直接上手N class classification + detection 要简单很多。有了前景后景,就可以选择性的挑选样本使得正负样本更加均衡,然后拿着一些参数重点训练classification。训练classification的难度也比直接做混合的classification 和 regression 简单很多。)

 

2、正负样本不均衡问题也可以通过focal loss来解决。

先说总结:针对yolov3中交叉熵损失,大量的负样本会是损失函数迭代缓慢甚至无法优化到最优。

针对这种情况提出了focal loss损失函数。这个损失函数减少了易分类样本的损失,更关注困难的、错分的样本。

 

Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:

Yolo与fastrcnn比较 faster rcnn比yolo好的原因_Yolo与fastrcnn比较

是经过激活函数的输出,所以在0-1之间。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。那么Focal loss是怎么改进的呢?

Yolo与fastrcnn比较 faster rcnn比yolo好的原因_损失函数_02

首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。

例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。

此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分。

Yolo与fastrcnn比较 faster rcnn比yolo好的原因_二分类_03

只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。

gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优。