用于深度目标检测的focal loss
0 .摘要
目前最受欢迎的目标探测器是基于RNN推广的two-stage方法,其中候选对象位置的稀疏集使用分类器。相反,对可能的目标位置进行有规律、密集采样的one-stage探测器有可能更快更简单,但准确率远远落后于two-stage探测器。我们调查此原因,发现深度探测器训练时发生的前背景分类的极度不平衡是主要原因。我们通过重塑标准交叉熵损失来解决,这样它就能降低分配给易分类样本的损失。我们的Focal Loss专注于在一组稀疏的困难样本上训练,并组织大量的易负样本在训练的时候带偏方向。为了评估我们损失的有效性,我们设计了Retina,结果显示我们使用focal loss时,Retina既有one-stage的速度同时兼有超过目前最先进的two-stage 探测器的准确率。代码在https://github.com/facebookresearch/Detectron
1.介绍
第一个阶段产生候选目标位置的稀疏集,第二分类每个侯选位置作为一个前景类或者一个背景类使用全连接层网络工作。two-stage的框架在CoCo基准上持续产生 。one-stage探测器,比如YOLO和SSD,two-stage探测器如:FPN(特征金字网络),或Mask-RCNN。训练过程中的类不平衡是主要原因。快速缩小候选对象位置的数目,过滤大部分的背景样本。固定的前背景比率(1:3),或OHEM(在线困难样本挖掘)。被易分类的背景样本支配是效率低的原因,通过bootstrapping(引导)和困难样本挖掘解决。
提出新的损失函数解决分类不平衡问题,是一个动态缩放的交叉熵损失。当正确的分类增加时,比例因子系数衰减至0,比例因子可以自动降低易分类因子的权重并关注困难样本。
设计one-stage目标检测Retina证明有效性。它的设计特点是一个有效的网络内特征金字塔和锚盒的使用。 基于ResNet-101-FPN骨干,以5帧每秒的速度运行,实现COCO测试集39.1%的准确率。
2.相关工作
经典的目标探测器
滑动窗口范例,其中分类器被应用在一个密集的图像网格上。HOG和通道特征促进行人检测。深度学习的复兴,two-stage主宰了目标检测。
two-stage 探测器
首先产生一组过滤了大部分负位置样本的候选目标的稀疏集,其次分成前景类和背景类。RPN(区域候选网络)将 proposal generation与第二代分类器合并到卷积网络,组成Fast-RCNN。
one-stage探测器
速度很快但是精度落后于two-stage。two-stage通过减少输入图像以及proposal的数量也很快,但one-stage即便有大量的计算开支在准确度上表现依然不好,这项工作就是去理解当以相同的速度运行时,one-stage是否能够达到或者超过two-stage的准确率。
RetinaNet的锚框来自RPN,使用SSD和FPN的特征金字塔。
类平衡
经典的one-stage目标探测每张照片会估计出10^4 至10^5个候选目标但是只有很少的位置会包含目标。这种不平衡造成了两个问题:(1)由于很多位置时是easy negatives造成学习的无效性高(2)easy negatives会把训练的方向带偏(退化模型)。普遍的解决方法是执行困难样本挖掘,取样复杂样本或者更复杂的取样/调整计划。我们的focal loss可以解决类不平衡的问题并且允许我们有效地训练所有样本,而不需要采样和easy negatives。
鲁棒性估计
在设计鲁棒性的损失算法中,可以通过减少错误大的例子(困难样本)的损失减少outliers(离群值)的贡献。与此相对,我们的focal loss并不针对异常值,而是通过降低inliers(简单样本)的权重解决类不平衡问题,即使它们的数量很大,但是对整体损失的贡献也会很小。换句话说,focal loss 执行一个和鲁棒性损失相反的作用,它专注于在困难样本稀疏集上的训练。
3.Focal loss
Focal loss被设计以解决one-stage目标检测场景,因为训练时前背景之间有一种极度的不平衡(如:1:1000),我们从二分类的交叉熵损失**(CE)**引入介绍。
在上面y∈ {±1}指定了ground-truth类和p ∈ [0, 1] 是对于标签y = 1的类,模型的估计概率。为了使用符号方便,我们定义pt.
并重写 CE(p, y) = CE(pt) = = log(pt)。这个损失有一个值得注意的点,即便样本很容易被分类, (pt >>5),也会造成重大的损失。简单样本大量聚集,很小的损失值也会埋没一些罕见的类。
3.1平衡的交叉熵
解决类不平衡问题的共同模型都有一个权重因子α ∈ [0, 1]为类1,1-α为类-1。实际中的α 可以通过倒转类出现的频率或者交叉验证的而得出的超参数设置,为了方便地使用符号,我们定义αt :
CE(pt) = =αt log(pt)
这是CE的一个简单扩展,我们为提出的focal loss提出一个简单的基准线。
3.2 focal loss 定义
深度探测器训练时发生的类不平衡问题带偏了交叉熵损失,易分类的负样本组成了损失的大部分并主导者梯度的方向。α平衡正负样本之间的重要性,但是没有区分开容易/困难样本,我们提出了重构损失函数降低简单样本的权重并集中训练困难样本。
我们提出了对交叉熵增加一个调节因子(1-pt)γ,调节焦参数γ ≥ 0.
focal loss 的两个特性:
(1)如果一个东西错误分类并且pt很小时,调节参数接近于1并且损失不会被影响。pt->1时,因子趋近于0,易分类样本的损失权重会降低。(2)当简单样本加权时,焦参数γ会平稳地调整速度。γ = 0时,FL与CE相等;γ增加时,调节因子的影响也会相对的增加。我们在实验中发现γ = 2时效果最好。
影响因子会减少简单样本的损失贡献并扩展简单样本接受低损失的范围。例如,γ = 2时,一个 pt = 0.9的分类样本相比CE会有100倍更低的损失,而pt ≈ 0.968时会有1000倍更低的损失。这反过来增加了修改错误分类样本的重要性。pt≤5且γ = 2时,减小的最大为4倍。
实际中我们使用focal loss的变式α-平衡。
我们在实验中接受这种形式是因为它会逐渐地提升准确率比起没有α的形式。最后我们指出结合sigmoid函数计算p的损失层的应用,产生了更好地数值稳定性。
3.3类不平衡以及模型初始化
二分类模型通过初始化有着同样输出1、-1的可能性,一些出现频率高的类可以支配总体的损失走向并造成早期的数值不稳定性。因此我们介绍稀有类(前景)评估出的p值的优先的内容。我们以π表示优先级并设置它,使得对于稀有类评估出的p的值低。我们注意到这在初始化过程中是一个挑战,而不是损失函数中。我们发现,在严重的类不平衡情况下,这可以提高交叉熵和focal loss损失的训练稳定性。
3.4 类不平衡以及two-stage探测器
two-stage探测器往往使用没有α平衡的交叉熵或预先设定的损失函数。相反地,它们通过两种机制解决类不平衡:(1)两级联(2)偏差minibatch抽样。第一个级联阶段是一个目标建议机制,可以将最近的目标可能位置降至1000-2000.最重要的是,被挑选出的建议不是无序的,但有可能对应着真实的目标位置。它移除了大量的简单负样本,训练的第二阶段,偏差负样本被应用于构建包含1:3正负样本比例的minibatches,这个比例像一个通过取样被应用的隐式的α调节因子
4.RetinaNet 探测器
RetinaNet由一个骨干网络和特定任务的子网络构成,骨干网络负责计算一个输入图像的卷积特征图,第一个子网络在骨干网络输出的基础上执行目标分类,第二个执行卷积的边界框回归。虽然对于这些组件的细节有很多可能的选择,许多的设计参数对于提取值也不是特别的敏感。
特征金字塔网络骨干
FPN作为RetinaNet的骨干网络,FPN增强一个标准的卷积网络以一种自上而下的路径并横向连接,使得网络可以有效地构建一个丰富、多尺度的特征金字塔。金字塔的每一层都可以用于以不同的规模探测目标。FPN提升了多尺度的预测。
我们在ResNet结构的顶部建立FPN,我们构建了一个P3到P7的金字塔,l表示金字塔的层数,pl比起输入要有低于2^l的分辨率。所有的金字塔层都有C=256个通道,金子塔的细节一般都有一些不同。仅使用来自最终ResNet层的特征的初步实验产生了低AP。
Anchors
我们使用平移不变的锚框,锚点在金字塔P3至P7有32^2至 512^2个区域。在每一个金字塔层我们使用的锚框有3种宽高比:{1:2,1:1,2:1}。最后每一层有9个锚框,覆盖范围从32-813像素。
每个锚点被分配一个长度为K的分类目标的one-hot向量,K为目标种类数量,以及边界框回归的4个向量。锚框被分配到一个使用IoU为0.5的真实值对象边框。对于背景,如果它们的IoU在[0,0.4)。每个锚框会被分配至多一个对象框,我们将其长度K标记向量中对应的项设为1,其他所有项设为0。框回归目标被计算为每个锚与其指定对象盒之间的偏移量,没分配就省略了。
分类子网
分类子网预测目标对A个锚框和K个分类,在每个空间位置出现的可能性。子网的参数对所有的金字塔层都是共享的,在一个给定的金字塔层采用一个通道为C的输入特征图,子网运用一个3X3的conv层,每个跟着C个过滤和ReLU激活。最后每个sigmoid激活连接着输出的KA个二分类预测空间位置。C=256,A=9。
边界框回归子网
我们在每个金子塔层后所加的FCN是为了将每个锚定框的偏移量回归到附近的ground-truth对象。它以每个空间位置4A个线性输出的形式终止。它们使用仅用少量超参数的class-agnostic边界框回归。两个子网使用不同的超参数。
4.1 推理和训练
RetinaNet骨干网络由ResNet-FPN骨干组成,推理涉及在网络中前向便利一张图片。为了提高速度,每个FPN层我们只解码最多1k个最高得分的预测。顶级预测所有层都被合并,无最大值抑制阈值0.5给出最终的探测结果。最高预测值组成的所有层被合并,具有阈值0.5的非最大抑制被应用去解决最终的探测。
Focal loss
Focal loss 作为分类子网输出的损失,γ =2时工作最好,γ ∈ [0.5, 5]时鲁棒性很好。我们通过被分配的锚框的数量执行归一化而不是所有的锚框,因为大部分锚框都是易负样本,并且在focal loss下收到的是可以忽略的损失值。最后我们注意到α ,赋予给稀有类的权值同样有一个稳定的范围,但它与γ 有关联意味着这两个都要选择。当γ=2,α=0.25时工作效果最好。
初始化
ResNet-50-FPN 和ResNet-101-FPN 骨干网络,先在ImageNet 1K上预训练,所有的全连接层除了最后一个在RetinaNet中的以偏差b=0被初始化,一个高斯权重σ = 0.01。最后一个卷积层的分类子网,我们初始化偏差b = − log((1 − π)/π),π 意味着在每次训练初始,每个锚框都被看作前景,π =0.01。
优化
5.实验
5.1训练深度探测
我们使用带有FPN的深度为50-100的ResNets。
网络初始化
首先使用没有任何修改的标准CE,很快失败了。结果对π值不敏感所以对所有的实验都设π=0.01。
平衡交叉熵
α-平衡的CE, α = .75 时得到0.9的准确率。
Focal loss
Focal loss 引出了一个新的超参数γ。γ=0时,我们的损失等同于CE 损失。
易负样本被降低权值。α的取值我们测试的是0.01-0.999,而实际是0.25-0.75。所以所有的实验中我们使用α=0.25,γ=2.0。
focal loss分析
取样10^7个负样本窗, 10^5个正样本窗,然后为了分离他们,我们对每个取样应用FL并归一化,将损失按照从最低到最高分类以及按照不同的设置γ。
正负样本的累积贡献函数如图四。
γ在正样本上的影响差不多而在负样本上的影响十分不同。
FL可以有效地降低易负样本的影响,注重于困难样本那里。
在线困难样本挖掘
使用高损失样本构建minibatch 。每个样本都会根据其损失被评分,随后应用nms(非最大值抑制),minibatch以损失最高的样本构建。nms阈值和batch块的大小都是可以微调的参数,OHEM更加强调未分类的样本,并且完全丢弃了简单样本,我们同样在SSD中应用OHEM的一个变式,miniatch在此有3:1的宽高比以确保每个minibatch有足够多的正样本。
FL比OHEM是更适合训练深度探测器。
Hinge loss
在pt上训练hinge loss,在pt的某个值以上,将损失设置为0。但是这并不稳定,研究交替损失函数的结果在附录中。
5.2模型架构设计
锚框密集度
对于可能图片框的空间它覆盖的有多深,two-stage可以在任意的位置、规模、宽高比使用一个区域池化操作分类,而相反地,由于one-stage使用的是固定的图像网格,在每个空间位置使用多个锚框来覆盖各种各样的规模和宽高比。
当每个位置使用3个尺度、3个宽高比时。
速度和准确性
骨干网络越大,准确度就越高,但推理速度也会变慢。
6.总结
为了解决这个问题,我们提出了focal loss,它对交叉熵损失应用一个调节部分,以集中学习困难样本。