论文:《Focal Loss for Dense Object Detection》
论文地址:https://arxiv.org/abs/1708.02002
代码地址:
目前在目标检测领域里二阶段的方法精度是优于一阶段的,尽管一阶段的检测器处理的是更密集的样本,应该可以做到更快、更简单,作者认为没有实现这种期望的原因是在于正负样本的极度不平衡(前景和背景),所以作者提出了一个新的 loss,称为 Focal Loss,它通过修改标准的交叉熵函数,比如可以降低对识别很好的样本的权重,这样它会专注于训练少量困难样本,而不会被大量简单的样本所干扰。
另外,就是基于 FPN 提出了一个新的检测框架,称为 RetinaNet,实验表明它在精度上优于当前最好的二阶段检测算法,速度上好过一阶段的检测算法。
联系方式:
Github:https://github.com/ccc013/AI_algorithm_notes
知乎专栏:机器学习与计算机视觉,AI 论文笔记
微信公众号:AI 算法笔记
当前主流的目标检测方法是分为两阶段 two-stage 和 一阶段 one-stage:
作者认为一阶段检测算法的主要问题在于没有很好处理类别不平衡的问题:
作者希望结合一阶段和二阶段的优点,即做到又快又精准,所以提出了一个新的 loss 函数,称为 Focal Loss,其作用是动态调整交叉熵函数的大小,设置的缩放因子会随着样本是否容易区分而变化,如下图所示:
直观上来说,这个缩放因子会自动降低易区分样本的权重,让模型在训练的时候专注于训练少量的困难样本。
为了验证这个方法的有效性,作者使用 RPN 作为骨干网络,提出了一个一阶段检测框架,并成为 RetinaNet,其实验结果如下图所示,结果表明 RetinaNet 可以做到速度和精度之间的平衡,速度比二阶段检测算法更快,精度比一阶段检测算法更好。
另外,作者强调了 RetinaNet 取得这样的成果主要是依赖于 loss 的改进,在网络结构方面并没有创新。
Focal Loss 是为了解决一阶段检测算法中极度类别不平衡的情况(比如正负样本比 1:1000)所设计的 loss 函数,它是对标准的交叉熵函数的修改。
首先,标准的交叉熵函数公式如下:
C E ( p , y ) = C E ( p t ) = − l o g ( p t ) CE(p,y)=CE(p_t)=-log(p_t) CE(p,y)=CE(pt)=−log(pt)
其中 y 表示样本的真实标签,这里用二分类举例,所以 y 的取值就是 1 或者 -1,而 p 是模型预测的概率,取值范围是 [0,1],然后 p t p_t pt 是:
在第一节Introduction的 Figure1 里,最上边的蓝色曲线就是表示交叉熵损失函数面对不同样本的 loss,可以看到即便是非常容易区分的样本,即 p t p_t pt 远大于 0.5 的样本,交叉熵计算得到的 loss 依然是非常的大,如果把大量的这种样本的 loss 进行求和,会破坏少量的困难样本提供的信息。
之前也有人提出了一个平衡的交叉熵函数,如下所示:
这里引入了一个权重因子 α \alpha α ,它和类别数量成反比,也就是类别数量越少的类别,其 loss 权重会越大。这也是本文方法的 baseline。
不过这个 loss 函数的问题在于增加的权重因子只是区分了正负样本,但是并不能区分容易分类和很难分类的样本,因此本文是针对这点进行了改进,提出了 Focal Loss。
Focal Loss 的计算公式如下:
这里增加了一个超参数 γ \gamma γ ,作者称为聚焦参数(focusing parameter),在本文实验中 γ = 2 \gamma=2 γ=2 的效果最好,而它为 0 的时候就是标准的交叉熵函数。
对于 Focal loss,有两个特点:
在实际应用中,会结合平衡交叉熵,得到的 focal loss 如下所示,这样既可以调整正负样本的权重,又可以控制难易分类样本的权重:
实验中表明这个 loss 可以比不加入 α \alpha α 的 loss 提升一点精度。
在二分类中,默认二分类的输出概率都是相等的,但这种初始化会导致数量很多的类别的 loss 在整体 loss 中占据较大的比例,这会影响训练初期的稳定性。
对于这个问题,作者在初期训练中为少数类(即前景)的模型评估 p p p 引入了一个 prior
的概念,并用 π \pi π 表示它,然后将其设置为比较小的数值,实验表明无论是使用交叉熵还是 focal loss,在面对严重的类别不平衡的问题时,这个做法都能提高训练的稳定性。
两阶段的检测算法一般都是使用标准的交叉熵函数,很少使用平衡的交叉熵或者 focal loss,它们处理类别不平衡问题主要是依靠两个机制:
在第一阶段就会减少大量的候选 bbox,将数量降低到 1-2k,并且并非随机删除,而是可以删除了大量的负样本;在第二阶段会采用有选择的采样方法来构建 mini-batch,比如采用正负样本比是 1:3 的比例,这个比例的作用等同于平衡的交叉熵中加入的 α \alpha α 参数。
RetinaNet 的整体结构如下图所示:
RetinaNet 是一个一阶段检测框架,它包含了一个骨干网络以及两个特定任务的子网络,骨干网络是对输入图片计算其特征图,然后两个子网络分别骨干网络的输出做分类和候选框回归的工作。
RetinaNet 采用 FPN 作为骨干网络,FPN 的结构如上图的 a-b,这里是基于 ResNet 构建的 FPN,它是一个自顶向下,带有侧面连接的卷积神经网络,在输入是单种分辨率的情况下,它可以得到多种尺度的特征。
本文是构建了一个 P3 到 P7的金字塔,其中 l 表示金字塔的级别, P l P_l Pl 的分辨率是输入的分辨率的 1 / 2 l 1/2^l 1/2l ,每个级别的金字塔的通道数量都是 C = 256.
本文采用了 translation-invariant anchor boxes,每个 anchor 在金字塔的 P3 到 P7分别拥有 3 2 2 32^2 322 到 51 2 2 512^2 5122 的区域,并且在每个金字塔级别设置的高宽比是 {1:2, 1:1, 2:1} ,对应的设置缩放比例是 { 2 0 , 2 1 / 3 , 2 2 / 3 2^0, 2^{1/3}, 2^{2/3} 20,21/3,22/3} ,最终在每个金字塔层上是产生了 A=9 个 anchors,并且能覆盖对应网络输入图片上 32~813 像素的区域。
每个 anchor 都是 K 个分类目标的 one-hot 向量(K 表示类别数量)和 4 个 box regression 的目标。作者设定 anchor 的方式是和真实标签物体检测框的 IoU(intersection-over-union)的阈值为 0.5,和背景的 IoU 是 [0, 0.4),而如果是在 [0.4,0.5),训练的时候将被忽略;
回归检测框(Box regression)目标是计算每个 anchor 和其分配的物体框的偏移量,如果没有设定则是忽略。
分类子网络的作用是预测在每个空间位置上,A 个 anchor 和 K 个类别物体出现的概率。这个子网络是一个小型的 FCN,并且和 FPN 每层都连接,然后子网络的参数是在所有金字塔层中都共享的。
这个子网络的设计比较简单,给定某个金字塔层的通道数量是 C的输入特征图,然后会先通过 4 个卷积核为 3 × 3 3\times 3 3×3 ,数量是 C 的卷积层,并采用 ReLU 激活函数,接着是一个卷积核同样是 3 × 3 3\times3 3×3 ,但是数量是 K × A K\times A K×A 的卷积层,然后用 sigmoid 激活函数并对每个空间位置输出 KA 个二值预测,在本文实验中,C=256,A=9.
这里对比 RPN 网络,本文采用的分类子网络是层数更多,并且仅采用 3 × 3 3\times 3 3×3 的卷积核,同时并没有和下面介绍的 box regression 子网络共享参数,这是因为作者发现更高层的设计决定会比特定值的超参数更加重要。
跟分类子网络是并行的关系,作者同样采用一个小型的 FCN 网络,并且也是和FPN 每层相连接,目的是回归每个 anchor box 对相邻真实标签物体的偏移量。
在网络设计方面和分类子网络是类似的,不相同的是输出的是4A 个线性输出。对于每个空间位置上的 A 个 anchor,这 4 个输出预测的是 anchor 和真实标签检测框的偏移量,另外和现在大部分工作不同的是,作者采用了一个 class-agnostic bounding box regressor,即可以用更少的参数但更加高效。
分类子网络和回归检测框子网络是共享相同的网络结构,但是分别采用不同的参数。
实验结果如下:
a)在标准交叉熵 loss 基础上增加了参数 α \alpha α 的结果,其中 α = 0.5 \alpha=0.5 α=0.5 就是传统的交叉熵,表格中可以看出在 0.75 的时候效果最好,AP 提升了 0.9;
b)对比了不同 γ \gamma γ 和 α \alpha α 的实验结果,随着 γ \gamma γ 的增加,AP提升比较明显,另外当 γ = 2 \gamma =2 γ=2 的时候是效果最好的时候;
c)对比了 anchor 的大小 scale 和长宽比 aspect ratio 对于效果的影响,最好的结果是分别选择 2 和 3 的时候;
d)和采用 OHEM 方法的对比,这里看到最好的 OHEM 效果是 AP=32.8,而 Focal Loss 是 AP=36,提升了 3.2,另外这里 OHEM1:3 表示通过 OHEM 得到的 minibatch 中正负样本比是 1:3,但是这个做法并没有提升 AP;
e)对比了在不同网络模型深度和输入图像大小下的AP 和速度。
本文作者认为一阶段检测算法不能在性能上超过二阶段检测算法的根本原因是类别的极度不平衡问题,为了解决这个问题,提出了一个 focal loss,它对标准的交叉熵 loss 进行修改从而可以实现让网络模型更专注学习困难的负样本。本文的方法是简单但高效的,并且设计了一个全卷积的一阶段检测框架来验证其高效性,实验结果也表明了其可以达到 state-of-art 的精度和速度。