阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection

论文地址:Focal Loss for Dense Object Detection

Focal Loss for Dense Object Detection

一、 摘要

训练前后景分布极端不均衡容易导致单阶段检测训练精度不高,我们提出一种改变后的交叉熵来降低容易分类的目标带来的损失的权重,集中力量训练那些困难(硬)样本,从而解决这个问题。为了评估该损失的有效性,设计并且训练了一个简单的高密度检测器RetinaNet。实验表明,能够和单阶段的速度相匹配,超越已存在的二阶段的检测器速度。

创新:提出新的损失函数来解决单阶段检测的类不平衡问题。

二、 介绍

传统的二阶段检测方法是第一阶段生成候选对象位置的稀疏集,第二阶段使用卷积神经网络将每个候选位置分类为前景类或背景类。经过改进,这种双阶段的方法,准确度还是很高的。

单阶段检测器应用于目标位置、比例和高宽比的规则、密集采样。例如YOLO和SSD方法,虽然速度很快,但是精度却只有双阶段SOTA的10-40%。

我们认为训练阶段的样本类不平衡是对于单阶段精确度的主要的干扰,因此提出了这个新的损失函数。

类不平衡可以使用一个类似R-CNN的双阶段的级联和抽样启发的检测器来解决。首先快速的缩小候选目标位置,过滤掉大部分的背景样本。然后第二步是分类阶段,执行样本的启发,例如固定前景与背景比率(1:3),或在线硬样本挖掘,以保持前景和背景之间可管理的平衡。

但是单阶段的密集检测,必须要有足够的候选目标位置。实际中通常需要枚举约100k的位置,这些位置密集地覆盖所有的空间位置(包括伸缩和纵横比不同的位置)。以上的双阶段的简单分类前后背景的操作就会显得无效。

本论文提到的损失是一个动态缩放的交叉熵损失,当对正确类的置信度增加时,缩放因子衰减为零。缩放因子可以自动的下降简单样本在训练时的损失贡献,更加专注于硬样本的训练。

三、 相关工作

深度学习的复苏和双阶段检测成功代替了原有的滑动窗口式的经典模型。基于双阶段检测的高正确率,本次实验的目的是想要证明是否单阶段也可以拥有这样的高正确率。

类不平衡:主要由于候选框多,但是包含目标的很少造成。主要会造成两点问题:
1.训练效率低下,因为大多数地点都是简单的负样本,没有任何有用的标签学习。
2. 总体而言,简单的负样本会使训练不堪重负,并导致模型退化。

鲁棒性:不同于之前的降低硬样本带来的大损失,focal loss专注于解决类不平衡,通过降低简单样本对于整个损失的贡献。

四、 Focal Loss

阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection

该损失设计用来解决极端的前景背景不平衡问题(例如1:1000)。
首先以二分类问题引入交叉熵CE Loss:
C E ( p , y ) = { − log ⁡ ( p )  if  y = 1 − log ⁡ ( 1 − p )  otherwise  (1) \mathrm{CE}(p, y)=\left\{\begin{array}{ll} -\log (p) & \text { if } y=1 \\ -\log (1-p) & \text { otherwise } \end{array}\right. \tag{1} CE(p,y)={−log(p)−log(1−p)​ if y=1 otherwise ​(1)
其中 y ∈ { ± 1 } y \in \{±1\} y∈{±1}代表真实类, p ∈ [ 0 , 1 ] p∈[0,1] p∈[0,1]代表评估目标位类 y = 1 y=1 y=1的概率。
为了便于标记,定义 p t p_t pt​:
p t = { p  if  y = 1 1 − p  otherwise  (2) \mathrm{p_t}=\left\{\begin{array}{ll} p & \text { if } y=1 \\ 1-p & \text { otherwise } \end{array}\right. \tag{2} pt​={p1−p​ if y=1 otherwise ​(2)

那么重新定义 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​)。⁡ p t p_t pt​即为真实目标的概率。CE Loss就是图1中蓝色的曲线。并且从图上可以看到,即使是很容易分别的类,也会带来一些小损失,当这些小损失很多的时候,那也是很大的。

1. 平衡交叉熵

一个常见的解决类不平衡的方法是为每个类别引入一个权重因子,类 1 1 1为 α ∈ [ 0 , 1 ] α ∈ [0, 1] α∈[0,1],类 − 1 -1 −1为 1 − α 1-α 1−α 。实践中 α α α可以和类频率相反或者作为一个交叉验证的超参。类似于 p t p_t pt​定义 α t α_t αt​,则 α α α平衡交叉熵损失为:
C E ( P t ) = − α t l o g ⁡ ( p t ) (3) CE(P_t )=-α_tlog⁡(p_t )\tag{3} CE(Pt​)=−αt​log⁡(pt​)(3)

这个简单的损失作为我们focal loss的实验baseline。

2. Focal loss 定义

庞大的类不平衡会导致交叉熵的坍塌,容易分类的负样本构成了损失的大部分,并支配着梯度。α平衡交叉熵平衡了正负样本之间的重要性,但是无法区分简单和硬样本。

于是提出了一个带有调节因子 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt​)γ的交叉熵,通过聚焦因子 γ ≥ 0 \gamma ≥ 0 γ≥0来调节损失:
F L ( P t ) = − ( 1 − p t ) γ log ⁡ ( p t ) (4) FL(P_t)=-(1-p_t)^\gamma\log(p_t) \tag{4} FL(Pt​)=−(1−pt​)γlog(pt​)(4)
通过可视化图1,可以注意到:
1. 当一个样本被错误分类, p t p_t pt​很小(趋于0),调节因子接近1,损失几乎不受影响。当 P t → 1 P_t→1 Pt​→1时,调节因子接近0,容易分类的样本的损失趋于0,权重就被降低了。
2. 聚焦参数 γ γ γ平滑的调整了简单样本降权的比率。当 γ = 0 γ=0 γ=0的时候,FL等价于CE,随着 γ γ γ的增加,调节因子的作用也会增加。(本实验 γ = 2 γ=2 γ=2效果最好)
例如: γ = 2 γ=2 γ=2的时候,一个简单样本的 P t = 0.9 P_t=0.9 Pt​=0.9,那么他的损失相较于CE将会被缩放100倍, P t ≈ 0.968 P_t≈0.968 Pt​≈0.968的时候,损失大概缩放了1000倍。反过来就相当于增加了矫正错误分类的样本的重要性。

实验中,还使用一个超参来平衡Focal loss,效果有所提升:
F L ( P t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) (5) FL(P_t)=-α_t(1-p_t)^\gamma\log(p_t) \tag{5} FL(Pt​)=−αt​(1−pt​)γlog(pt​)(5)

五、 RetinaNet 检测器

RetinaNet由一个backbone 网络和两个具体任务的子网络组成单阶段的密集检测的网络。Backbone用于计算整个图片的卷积特征图,是一个现成的网络。第一个子网络用于对backbone的输出进行目标分类,第二个子网络用于边界框的回归。
阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection
主要成分如下:

1. FPN backbone

使用FPN作为RetinaNet的backbone,FPN通过一个自上而下的方式来有效的从一个单分辨率的输入图片提取不同尺度的特征金字塔。金字塔的每个级别用于检测不同大小规模的目标,图3(a-b)。本网络通过构建一个 P 3 P_3 P3​到 P 7 P_7 P7​的金字塔, l l l代表金字塔的层( P l P_l Pl​的分辨率是输入图片的 2 l 2^l 2l倍下采样),所有级别金字塔通道数 C = 256 C=256 C=256。

2. Anchors

定义锚框在 P 3 P_3 P3​到 P 7 P_7 P7​上的搜索区域大小为32² 到 512²个像素块区域。每层使用三种比例的锚:{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}的锚。因此每层有9个锚,对于输入图像在不同层次上覆盖像素范围为32-813。

每个锚点分配一个分类目标的长度为K的one-hot向量,其中K是目标类的数量,以及一个4维的目标回归框向量。锚通过大于或等于一个IoU阈值(0.5)从而分配一个GT框。 I o U ∈ [ 0 − 0.4 ) IoU\in [0-0.4) IoU∈[0−0.4)认为是背景, I o U ∈ [ 0.4 − 0.5 ) IoU\in [0.4-0.5) IoU∈[0.4−0.5)训练时直接丢弃。One-hot向量中,相应目标的标签行置位1,其余为0。

框回归目标被计算是每个锚与其指定对象GT框之间的偏移量,如果没有赋值则被省略。

3. 分类子网络

分类子网预测了A个锚点的每一个空间位置的存在目标类别(K类)的概率。通过一个小的FCN连接每个FPN层,共享参数(图3 c)。每个级别的带有C(C=256)个通道的输入特征图,使用四个3x3的卷积层+relu层,最后通过一个3x3的卷积变为KA(A=9)个通道,通过sigmoid激活作为每个空间位置的预测结果。

4. 框回归子网络

通过一个FCN 网络去回归每个锚框趋近他所属的GT框(若存在),图3 d。网络和分类子网络一样,除了最后的输出层为每个空间位置的4A的线性输出。对于每个空间位置的锚点,这4维输出预测每个锚点和GT框之间的相对偏移量。

六、 推导和训练

推导
从图可以看出,只是一个简单的前向传播。为了提升推理速度,在到达0.05阈值检测器置信度后,我们只解码来自每FPN每层最多1k的最高得分预测的预测框。所有级别的最高预测合并,并使用阈值为0.5的非最大抑制来产生最终的检测结果。

Focal loss
本损失引入作为分类子分支输出的损失,使用 γ = 2 γ = 2 γ=2,focal loss运用在每张图片的全部大概100k个锚上,图像的总焦点损失计算为所有约100k的锚点上的焦点损失之和(通过GT框的锚点数目进行归一化,因为绝大多数锚是容易的负的,是在焦点损失下为可忽略的损失值), α = 0.25是配合γ = 2工作最好。

七、 实验

RetinaNet 和 focal loss 的消融实验:
阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection
focal loss作用在前后景上的差距:对于前景CDF(Cumulative distribution functions)分布大概相似,大概20%的硬正样本的损失占据了50%的正样本损失,增加 γ γ γ效果不大。但是在背景上 γ = 0 γ=0 γ=0时候,CDF和前景相似,但是增加 γ = 2 γ=2 γ=2,更多的注意力集中在硬的负样本上。
阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection
SOTA对比:
阅读心得:Focal Loss and RetinaNet:Focal Loss for Dense Object Detection

八、 总结

在这项工作中,我们确定类不平衡是主要的障碍,阻止单阶段的物体探测器超越性能最好的两阶段的方法。为了解决这个问题,我们提出了focal loss,它对交叉熵损失应用一个调制项 ( 1 − p t ) γ (1-p_t)^γ (1−pt​)γ,以集中学习困难的例子,并减轻许多容易的负面影响。方法简单而高效。通过设计一个FCN检测器来证明它的有效性,并报告了大量的实验分析,表明它在具有挑战性的COCO数据集上实现了最先进的准确性和运行时间。

上一篇:爬虫登陆实战 --- QQ音乐扫码登陆!真不难!


下一篇:5.percona-toolkit工具介绍