[Paper:Focal Loss for Dense Object Detection]
[https://arxiv.org/abs/1708.02002]
关于目标检测主要分为两大类别:one stage,two stage
one stage 代表:yolo系列,ssd(特点:检测精度低,但检测速度快)
two stage 代表:R-CNN系列,SPPNet(特点:检测精度高,但检测速度慢)
在论文中作者去探讨了造成one stage精度低的原因,发现在训练密集目标检测器的过程中出现了严重的foreground-background类别不平衡。
首先,什么是“类别不平衡”呢?
检测算法在早期会生成很多bbox,而在一幅正常的图像中需要检测的object不会很多,这就意味着多数的bbox是属于background,使得foreground-background类别不平衡。
存在类别平衡问题为什么会导致检测精度低呢?
因为bbox数量很多,而属于background的bbox太多了,假设分类器将所有的bbox全部归为background,那么精度也会很高,而这样的分类器是一个失败的分类器,所以导致目标检测的精度很低。
那么,为什么two stage机制的目标检测器可以达到很高的精度呢?
因为two stage的第一个阶段生成一个候选目标位置组成的稀疏样本集,即RPN简单的对anchor进行二分类(只是区分是foreground和background,并不会区别细类),这样,属于background类别的bbox会大量减少,虽然其数量依然远大于foreground的bbox(例如3:1),但已不像最初生成anchor差别那么大了,这一阶段最终结果是从“类别极不平衡”到“类别较不平衡”转变,也就是说two stage并不能完全解决类别不平衡问题,第二个阶段使用一个卷积神经网络将各候选位置归置foreground类别或者background类别,即在初步筛选后的bbox上进行难度小得多的分类(细分类),这样分类器便得到了较好的训练,从而精度提高了。但因为是经过了两个阶段的处理,操作复杂,使得检测速度变慢了。
为什么one stage系列无法避免这个问题呢?
因为one stage系列的检测器直接在“类别极不平衡”的bbox中进行难度极大的细分类,直接输出bbox和标签,而原有的交叉熵损失(CE)作为分类任务的损失函数,无法抗衡“类别极不平衡”(会在另一篇文章中详细讲解交叉熵损失),容易导致分类器训练失败。因此,one stage检测虽然速度快,但检测精度低。
既然one stage中的交叉熵损失函数无法抗衡“类别极不平衡”,所以retinanet作者何恺明及其团队提出Focal Loss替换交叉熵损失来提高检测精度。
Focal Loss的形式是怎样的,有什么含义?
首先介绍一下二分类的交叉熵损失:
公式(1)中,y∈{±1} 指定了ground-true class,p∈[0,1] 是模型对于标签y = 1的类的估计概率。为了方便,我们定义Pt:
公式(2)可以转换为:
解决类别不平衡的常见方法是分别为class1和class-1加入加权因子α∈[0; 1]、1-α。所以α-balanced 的CE损耗可写为:
鉴于以上的改进过程的思想,可以将交叉熵损失增加一个调节因子(1 - pt)γ,其中γ≥0。这样便出现了Focal Loss,其定义为:
在实践过程中使用的Focal Loss形式为: