目前主流的检测算法分为两个方向:
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训练好。
Faster R-CNN之所以能解决两个不平衡问题是因为其采用了下面两个策略:
- 根据IoU采样候选区域,并将正负样本的比例设置成1:1。这样就解决了正负样本不平衡的问题;
- 根据score过滤掉easy example,避免了训练loss被easy example所支配的问题。
而在这篇论文中他们采用的解决方案是基于交叉熵提出了一个新的损失函数Focal Loss(FL)。
FL是一个尺度动态可调的交叉熵损失函数,在FL中有两个参数 和 ,其中 主要作用是解决正负样本的不平衡, 主要是解决难易样本的不平衡。
最后,作者基于残差网络,FPN搭建了检测网络RetinaNet,该网络使用的策略都是他们自己提出的而且目前效果非常好的基础结构,再结合Focal Loss,刷新检测算法的精度也不意外。
2. Focal Loss是交叉熵损失的改进版本,一个二分类交叉熵可以表示为:
上面公式可以简写成:
其中:
2.1 :解决正负样本不平衡
平衡交叉熵的提出是为了解决正负样本不平衡的问题的。它的原理很简单,为正负样本分配不同的权重比值 ,当 时取 ,为 时取 。我们使用和 类似的方法将上面 的情况表示为 ,即:
那么这个 交叉熵损失可以表示为式(6)。
的值往往需要根据验证集进行调整,论文中给出的是0.25。
2.2 :解决难易样本不平衡
FL中 的引入是为了解决难易样本不平衡的问题的。图是FL中example预测概率和loss值之间的关系。其中蓝色曲线是交叉熵( 时Focal Loss退化为交叉熵损失)的曲线。图2:CE损失和FL损失曲线图
从图2的曲线中我们可以看出对于一些well-classified examples (easy examples)虽然它们单个example的loss可以收敛到很小,但是由于它们的数量过于庞大,把一些hard example的loss覆盖掉。导致求和之后他们依然会支配整个批次样本的收敛方向。
一个非常简单的策略是继续缩小easy examples的训练比重。作者的思路很简单,给每个乘以 。因为easy example的score 往往接近1,那么 值会比较小,因此example得到了抑制,相对的hard example得到了放大,例如图2中 的那四条曲线.
3. RetinaNet
算法使用的检测框架RetinaNet并没有特别大的创新点,基本上是残差网络+FPN的最state-of-the-art的方法,如图
RetinaNet网络结构图
这里我们列出RetinaNet的几个重点:
3.1 融合的特征层是P3-P7;
3.2 每个尺度的Feature Map有一组锚点(3*3=9);
3.3 分类任务和预测任务的FPN部分的参数共享,其它参数不共享。