Focal Loss for Dense Object Detection

tags: FPN, ResNet, Focal Loss, RetinaNet

前言

何凯明,RBG等人一直是Two-Stage方向的领军人,在这篇论文中,他们也开始涉足One-Stage的物体检测算法。大牛就是牛,一次就刷新了精度。下面我们就来分析这几个大牛的作品。

目前主流的检测算法分为两个方向:(1)以R-CNN系列为代表的two-stage方向;(2)以YOLO系列为代表的one-stage方向。虽然one-stage方向的速度更快,但是其精度往往比较低。究其原因,有两个方面:

  1. 正样本(Positive Example)和负样本(Negative Example)的不平衡;

  2. 难样本(Hard Example)和易样本(Easy Example)的不平衡。

这些不平衡造成模型的效果不准确的原因如下:

  1. Negative example的数量过多,导致Postive example的loss被覆盖,就算Postive example的loss非常大也会被数量庞大的 negative example中和掉,这这些positive example往往是我们要检测的前景区域;

  2. Hard example往往是前景和背景区域的过渡部分,因为这些样本很难区分,所以叫做Hard Example。剩下的那些Easy example往往很好计算,导致模型非常容易就收敛了。但是损失函数收敛了并不代表模型效果好,因为我们其实更需要把那些hard example训练好。

四种example的情况见图1。

Faster R-CNN之所以能解决两个不平衡问题是因为其采用了下面两个策略:

  1. 根据IoU采样候选区域,并将正负样本的比例设置成1:1。这样就解决了正负样本不平衡的问题;

  2. 根据score过滤掉easy example,避免了训练loss被easy example所支配的问题。

而在这篇论文中他们采用的解决方案是基于交叉熵提出了一个新的损失函数Focal Loss(FL)。

最后,作者基于残差网络FPN搭建了检测网络RetinaNet,该网络使用的策略都是他们自己提出的而且目前效果非常好的基础结构,再结合Focal Loss,刷新检测算法的精度也不意外。

1. Focal Loss

Focal Loss是交叉熵损失的改进版本,一个二分类交叉熵可以表示为:

上面公式可以简写成:

其中:

从图2的曲线中我们可以看出对于一些well-classified examples (easy examples)虽然它们单个example的loss可以收敛到很小,但是由于它们的数量过于庞大,把一些hard example的loss覆盖掉。导致求和之后他们依然会支配整个批次样本的收敛方向。

FL的求导结果如公式(7):

1.3 FL的最终形式

最后作者指出如果将单标签softmax换成多标签的sigmoid效果会更好,这里应该和我们在YOLOv3中分析的情况类似。

2. RetinaNet

算法使用的检测框架RetinaNet并没有特别大的创新点,基本上是残差网络+FPN的最state-of-the-art的方法,如图4。

对于残差网络和FPN不清楚的参考论文或者我之前的分析。这里我们列出RetinaNet的几个重点:

  1. 融合的特征层是P3-P7;

  2. 每个尺度的Feature Map有一组锚点(3*3=9);

  3. 分类任务和预测任务的FPN部分的参数共享,其它参数不共享。

3. 测试

测试的时候计算所有锚点的score,再从其中选出top-1000个进行NMS,NMS的阈值是0.5。

4. 总结

Focal Loss几乎可以应用到很多imbalance数据的领域,还是非常有实用价值的。

最后更新于