2019-03-28 11:16

[翻译] RetinaNet: Focal Loss for Dense Object Detection

摘要

迄今为止最高精度的物体检测器是由两级组成的检测器,典型代表是R-CNN,其中R-CNN的分类器被应用于有很少元素的预选框集。相反,一级检测器被更加广泛地使用,密集的区域预选使网络有可能变得更快更简单,但到目前为止,其检测的准确性仍落后于两级检测器。在本文中,我们讨论了为什么会出现这样的情况。我们发现在训练密集检测器的过程中遇到的极端的前景 - 背景类不平衡是造成一级检测器准确性较差的主要原因。我们提出解决这一类不平衡问题的方法:通过重塑标准交叉熵损失,以降低分配给分类良好的样本的损失。在训练阶段,我们新颖的Focal Loss专注于那些很少但很难被分类的样本上,以防止大量的容易被分类的负样本在训练期间主导检测器的训练。为了评估我们损失函数的有效性,我们设计并训练了一个简单的密集检测器,我们称之为RetinaNet。我们的结果表明,在用焦点损失训练时,RetinaNet能够匹配以前的一级检测器的速度,同时精度超过所有现有的最先进的两级检测器。

一、介绍

当前最优秀的目标检测器使用的都是一种由 proposal 驱动的 two-stage 机制。和在 R-CNN 框架中一样,第一个阶段生成一个候选目标位置组成的稀疏样本集,第二个阶段使用一个卷积神经网络将各候选位置归至 foreground 类别或 background 类别。随着这些文字的改进[10,28,20,14],two-stage 框架可以在难度极高的 COCO benchmark 上一直保持很高的准确度。

既然 two-stage 检测器的结果这么好,那么一个很自然的问题是:简单的 one-stage 检测器是否也能实现类似的准确度? one-stage 检测器主要应用在由目标位置(object locations)、尺度(scales)和长宽比(aspect ration)组成的规则密集样本集上。最近对 one-stage 检测器(如 YOLO 和 SSD)进行的试验都得出了优秀的结果,相比最优秀的 two-stage 方法,one-stage 检测器速度更快,而且能实现 10%- 40% 的准确度。

本文进一步提高了 one-stage 检测器的性能:我们设计出了一个 one-stage 目标检测器,并首次达到了更复杂的 two-stage 检测器所能实现的最高 COCO 平均精度,例如FPN(特征金字塔网络,Feature Pyramid Network) 或 Mask R-CNN(Faster R-CNN的变体)。我们发现训练过程中的类别失衡是阻碍单阶段检测器实现这个结果的主要障碍,并提出了一种新的损失函数来消除这个障碍。

R-CNN 检测器通过两阶段的级联(cascade)和启发式采样(sampling heuristics)解决类别失衡问题。Proposal 阶段(如Selective Search、EdgeBoxes 、DeepMask 和 RPN)可以快速地将候选目标位置的数目缩至更小(例如 1000-2000),过滤掉大多数背景样本。在接下来的分类阶段中,应用启发式抽样法(sampling heuristics),例如一个固定的前景样本背景样本比(1:3),或者在线困难样本挖掘法(online hard example mining),在 foreground 样本和 background 样本之间维持可控的平衡。

相反,one-stage 检测器则必须处理一个由图像中规则分布的候选目标位置组成的大样本集。在实践中,目标位置的总数目通常可达 10 万左右,并且密集覆盖空间位置、尺度和长宽比。虽然还可以应用类似的抽样启发法,但是这些方法在易分类的背景样本支配训练过程的情况下依然会失效。这种失效是目标识别中的一个典型问题,通常使用 bootstrapping 或困难样本挖掘来解决。

在本文中,我们提出了一个新的损失函数,它可以替代以往用于解决类别失衡问题的方法。这个损失函数是一个动态缩放的交叉熵损失函数,随着正确分类的置信度增加,函数中的比例因子缩减至零,见图1。在训练过程中,这个比例因子可以自动地减小简单样本的影响,并快速地将模型集中在困难样本上。试验证明,Focal Loss 函数可以使我们训练出准确度很高的 one-stage 检测器,并且在性能上超越使用抽样启发法或困难样本挖掘法等以往优秀方法训练出的 one-stage 检测器。最后,我们发现 Focal Loss 函数的确切形式并不重要,并且证明了其他实例(instantiations)也可以实现类似的结果。
RetinaNet-1.jpg
图1:我们提出了一种新的损失函数 Focal Loss(焦点损失),这个损失函数在标准的交叉熵标准上添加了一个因子 (1- pt) γ 。设定 γ > 0 可以减小分类清晰的样本的相对损失(pt > .5),使模型更加集中于困难的错误分类的样本。试验证明,在存在大量简单背景样本(background example)的情况下,我们提出的 Focal Loss 函数可以训练出准确度很高的密集对象检测器。

为了证明这个 Focal Loss 函数的有效性,我们设计了一个简单的 one-stage 目标检测器—RetinaNet,它会对输入图像中目标位置进行密集抽样。这个检测器有一个高效的 in-network 特征金字塔(feature pyramid),并使用了锚点盒(anchor box)。我们在设计它时借鉴了很多种想法[22,6,28,20]。RetinaNet 的检测既高效又准确。我们最好的模型基于 ResNet-101- FPN 骨干网,在 5fps 的运行速度下,我们在 COCO test-dev 上取得了 39.1 AP 的成绩,如图2 所示,超过目前公开的单一模型在 one-stage 和 two-stage 检测器上取得的最好成绩。
RetinaNet-2.jpg
图2:横坐标是检测器在COCO test-dev 上的检测速度(ms),纵坐标是准确度(AP: average precision)的比值。在 Focal Loss 的作用下,我们简单的 one-stage RetinaNet 检测器打败了先前所有的 one-stage 检测器和 two-stage 检测器,包括目前成绩最好的 Faster R-CNN系统。我们在图 2 中按 5 scales(400-800 像素)分别用蓝色圆圈和橙色菱形表示了 ResNet-50-FPN 和 ResNet-101-FPN 的 RetinaNet 变体。忽略准确度较低的情况(AP < 25),RetinaNet 的表现优于当前所有的检测器,训练时间更长时的检测器达到了 39.1 AP 的成绩。

二、相关工作

2.1 目标分类器(略)

2.2 两阶段检测器(略)

2.3 一阶段检测器(略)

2.4 类不平衡

像 boosted detectors、DPMs 这样的经典一阶段检测器以及SSD在训练中都面临类极不平衡问题。这些检测器对每张候选图产生10e4-10e5个候选框,但只有极少数内存在物体。这种类不平衡导致两个问题:

  1. 由于绝大多数候选框定位是简单负样本贡献了无用的学习信号,对它们的训练是无效的
  2. 同时简单负样本主导训练使得模型degenerate
    主流解决思路是做一些困难样本挖掘的工作[33,37,8,31,22],例如训练时在困难样本中抽样或更复杂的抽样、重设权重策略[2]。相反,我们...

2.5 稳健估计

人们对设计鲁棒损失函数(如Huber损失[13])非常感兴趣,这些函数通过降低outliers(难样本)的loss来降低离散值的对网络的贡献。相反,我们设计的焦点损失不是解决异常值,而是通过降低inliers(简单样本)的权重来解决类不平衡问题,使得即使它们的数量很大,它们对总损失的贡献也很小。换句话说,focal损失与稳健损失起着相反的作用:它将训练集中在一组稀疏的难样本上。

三、Focal loss

3.1 Balanced Cross Entropy

Focal loss旨在解决在训练期间前景和背景类别之间存在极端不平衡(例如,1:1000)的单阶段对象检测场景。我们从二元分类的交叉熵(CE, cross entropy for binary classification)损失开始介绍:
RetinaNet-CE.jpg

3.2 Focal Loss 定义

CE损失可以看作是图1中的蓝色(顶部)曲线。这种损失的一个值得注意的特性,是很容易分类的样本也会带来非平凡的损失。当大量简单的样本求和时, 这些小的损失值的和可以压倒那些很少出现的困难样本的损失值。
为了解决类不平衡问题,就意味着要抑制与真实值差别较小的样本,常见方法是引入加权因子 α∈[0; 1],为每个类加入超参数α,为了符号方便将平衡CE损失写为,即 &- CE = - \alpha_t log(p_t) -&

正如我们的实验所表明的那样,在密集型探测器训练期间遇到的大类失衡压倒了交叉熵损失。容易分类的负面因素包括大部分的损失,并且主宰着梯度。 虽然 α 平衡正/负样本的重要性,但它并没有区分简单/困难的样本。我们建议重塑损失函数来减轻简单的例子比重从而将训练集中在难以消除的问题上。

更正式的,我们建议给交叉熵损失增加一个调节因子&- (1 - p_t)_\gamma -&
其中γ具有可调焦距参数,γ≥0,我们定义Focal Loss 为
&=- FL(p_t) = -(1-p_t)\gamma log(p_t) -=&
在图1中,焦点损失可视化出几个值: γ∈[1,5] 。我们注意到焦点损失的两个性质。当一个例子被错误分类并且 &- p_t -&很小时,调制因子接近1,损失不受影响。当&- p_t\rightarrow1 -& ,该因子变为0,良好分类的例子的损失权重被降低。聚焦参数γ可以平滑调整简单样本下降的速率。
当 γ = 0时,FL等同于CE,并且随着 γ 增加,调节因子的作用也增加(我们发现 γ = 2在我们的实验中最佳)。
RetinaNet-1.jpg

最终在实验中使用的Focal Loss 如下公式,同时发现若计算p的loss层结合sigmoid操作会使得结果更加稳定。
&=- FL(p_t) = -\alpha_t (1-p_t)\gamma log(p_t) -=&

虽然在我们的主要实验结果中我们使用上面的焦点损失定义,但其确切形式并不重要。在附录中,我们考虑焦点损失的其他实例并证明这些可以同样有效。

3.3 类不平衡和模型初始化

二元分类模型默认初始化为具有输出 y = -1 or 1 的相等概率。在这种初始化下,如果存在类别失衡,频繁类造成的损失可能会主宰总损失,并导致早期训练不稳定。 为了对抗这一点,对最后一级用于分类的卷积的bias作了下小修改,把它初始化成一个特殊的值b=-log((1-π)/π),π在论文中取0.01。这样做能在训练初始阶段提高positive的分类概率。我们注意到这是模型初始化的改变(见4.1)而不是损失函数。 我们发现这可以提高交叉熵和重度失衡情况下焦点损失的训练稳定性。

3.4 类不平衡和 two stage 探测器

两阶段探测器的训练经常使用交叉熵损失,而不使用“平衡交叉熵损失”或我们建议的损失。相反,他们通过两种机制解决阶级失衡问题:(1)两阶段级联和(2)偏置小批量采样。第一个级联阶段是一个对象建议机制,它将几乎无限的可能对象位置集合减少到一两千个。重要的是,选定的提案并非随机的,但很可能对应于真实的物体位置,这消除了绝大多数简单的否定。 在训练第二阶段时,偏置采样通常用于构造包含,例如,1:3的正反比例。这个比例就像一个隐含的“平衡因素”,通过抽样来实现。我们提出的焦点损失旨在直接通过损失函数在一个阶段的检测系统中解决这些机制。

四、RetinaNet Detector

RetinaNet是由骨干网和两个特定任务子网组成的一阶段联合网络。主干负责计算整个输入图像上的卷积特征映射,并且是一种通用(off-the-shelf)的卷积网络。第一个子网在骨干的输出上执行卷积对象分类;第二个子网执行卷积BBox回归。这两个子网具有一个简单的设计,我们专门为一阶段密集检测而提出,参见图3。虽然这些组件的细节有很多可能的选择,如实验所示,大多数设计参数对精确值不是特别敏感。我们接下来描述RetinaNet的每个组件。
RetinaNet-Model.jpg

特征金字塔网络主干

我们采用[20]中的特征金字塔网络(FPN)作为RetinaNet的主干网。简而言之,FPN通过自上而下的路径和横向连接增强了标准卷积网络,因此网络可以从一个单一的分辨率输入图像有效地构建一个丰富,多尺度特征金字塔,见图3(a)-(b)。金字塔的每个级别都可以用于检测不同比例的对象。FPN是改进了完全卷积网络(FCN)的多尺度预测[23],在RPN [28]和DeepMask-style proposals[24],以及two stage 检测器如 Fast R-CNN [10]或Mask R-CNN [14]都有体现。

在[20]之后,我们在ResNet架构之上构建FPN[16]。我们构建了一个P3到P7的金字塔, 其中 l 表示金字塔等级(P1的分辨率是输入分辨率的2^l分之一)。正如[20]中一样,所有金字塔层都有C = 256个通道。金字塔的细节通常遵循[20],并有一些适度的差异。虽然许多设计选择并不重要,但我们强调使用FPN主干网;仅使用最终ResNet层的特征的初步实验AP低。

Anchors

我们使用类似于[20]中RPN变体的有平移不变性的锚点框。在金字塔等级P3到P7上,锚点的面积分别为3232到512512。如[20]中所述,在每个金字塔等级,我们使用三个长宽比{1:2,1:1,2:1},为了比[20]更密集的比例覆盖,我们在每个级别添加六个长宽比 &- \{2^0,2^{1/3},2^{2/3}\} -&。这在我们的设置中提高了AP。总共有在每个层级有A = 9个锚点,综合所有层级它们覆盖输入图像 32-813 的像素范围。

每个锚点分配一个长度为K的 one-hot 的分类对象,其中K是对象类的数量,以及4个回归框的回归目标。我们使用RPN [28]中设定的规则,但修改成了多类别检测和并调整阈值。特别是,使用 IoU=0.5 的阈值将 Anchor 分配给ground truth 对象框;如果他们的IoU位于[0,0.4),则为背景。由于每个锚点至多分配一个对象框,因此我们将其长度K标签矢量中的对应条目设置为1,所有其他条目设置为0。如果锚点未分配,可能会在[0.4,0.5]中发生重叠,则在训练期间将忽略它。BBox的回归目标被计算为每个锚点之间的偏移量及其分配的对象框,如果没有分配则省略。

分类子网

分类子网预测 A个Anchor 所在位置存在物体的可能性和K个分类概率。 该子网是接在每个FPN层后的小型FCN;该子网的参数在所有金字塔级别共享。它的设计很简单。从给定的金字塔层的输入有C个通道的特征,子网实现了4个3x3个conv层(每个conv层带有C滤波器接ReLU激活),接着是带有KA通道的3*3 conv层。最后用sigmoid激活来输出每个空间位置的KA二进制预测,参见图3(c)。在大多数实验中我们使用C = 256和A = 9。与RPN [28]相比,我们的对象分类子网更深入,仅使用3x3卷积层,并且不与bbox regression子网共享参数。我们发现这些更高层次的设计决策比超参数的特定值更重要。

bbox regression 子网

与对象分类子网并行,我们为每个金字塔层附加另一个小FCN,以便从每个锚箱到附近的真实物体(如果存在)进行回归。框回归子网的设计与分类子网相同,只是它在每个空间位置以4A线性输出终止,见图3(d)。对于每个空间位置的每个A锚点,这4个输出预测锚点和实体之间的相对偏移量框(我们使用RCNN [11]中的标准框参数化)。我们注意到,与最近的工作不同,我们使用类别不可知的框回归器,它使用较少的参数,我们发现它们同样有效。对象分类子网和bbox regression 子网,尽管共享一个共同的结构,但使用独立的参数。

五、结论和训练

Inference

RetinaNet是由ResNet-FPN主网络,一个分类子网络和一个边框回归子网络所组成的,如图2。预测是简单地通过网络将一张图片进行前向传播。为了提高速度,设置检测器置信度为0.05后,我们仅仅从每一个FPN级的最多1k top-scoring预测中进行边框预测解码。将所有级的top预测合并起来,然后应用0.5阈值的NMS来生成最终检测结果。

Focal Loss

我们使用本文引入的focal loss作为分类子网络的输出的loss。我们发现γ=2在实验中效果最好,而且RetinaNet在γ∈[0.5,5]的范围内相对鲁棒。我们强调在训练RetinaNet时,focal loss是应用于一张采用图片的所有的 ~100k个anchors的。这就与使用了启发式采样(RPN)或者难例挖掘(OHEM,SSD)来选择小部分anchors(如256)来构成minibatch相反。一张图像的总共的focal loss是所有~100k个anchors的focal loss的和,然后再使用被赋予gt框的anchors的数量来进行标准化。我们使用被赋予gt框的anchors的数量来进行归一化,而非所有的anchors的原因是大量的anchors是easy negatives,它们的loss在focal loss下是可以忽略不计的。最后我们注意到α,赋予少类的权重,同样具有相对稳定的范围,但是它与γ相互影响所以有必要同时对它们两个进行选择。普遍来看,α增加一点γ就增加一点(实验中γ=2和α=0.25效果最好)。

Initialization

我们使用ResNet-50-FPN和ResNet-101-FPN进行了实验。基础的ResNet-50和ResNet-101模型是在ImageNet1k上进行了预训练。新增的FPN层由FPN论文中的方式进行初始化。除了RetinaNet子网络的最后一层,其他所有新增的层都采用σ=0.01的高斯分布和b=0进行初始化。对于分类子网络的最后一层卷积层,我们设置初始偏置项为b=−log((1−π)/π),这里π被指定在训练开始时,所有的anchor都需要被标注为带有~π置信率的前景。在所有的实验中,我们使用π=.01,尽管结果对于这个值相对鲁棒。就像3.4节中介绍的一样,这个初始化是为了防止在训练的第一个周期大量的背景anchors生成一个巨大的不稳定的loss值。

Optimization

RetinaNet通过SGD进行训练。我们同时使用8个GPU对一个minibatch16张图片(1个GPU两张图)进行同步SGD。除非有特别指定,所有的模型都使用初始学习率0.01进行90k周期的训练,然后在60k和80k周期时进行10倍的学习率衰减。我们使用图像水平翻转作为唯一数据增广手段。0.0001的权值衰减和0.9的momentum。训练loss是focal loss和边框回归的标准smooth L1 loss的和。训练时间在10-35个小时之间。

六、经验

我们给出了在COCO的边框检测任务的实验结果。对于训练,我们使用了FPN中的一些实际操作,然后使用了COCO trainval35k 的划分。对于我们主要的结果,我们报告了在 test-dev 上的 COCO AP。

6.1 Training Dense Detection

我们跑了大量实验来分析对于密集检测使用各种优化策略的损失函数的行为。对于所有实验我们都使用带有FPN的ResNet50或101。对于所有的模型简化实验,我们使用尺度为600像素的图像进行训练和测试。

Network Initialization

首先尝试使用标准CE loss来训练 RetinaNet,不进行任何初始化或者学习策略的修改。这个方法失败,网络在训练时无法收敛。然而,简单地将模型的最后一层加入物体预测先验概率π=.01 就能够使网络有效的训练。使用这个初始化和ResNet-50已经能在COCO上生成30.2的AP。模型对于π的数值并不敏感。

Balanced Cross Entropy

我们接下来尝试使用α-balanced CE loss。设置α=.75,AP增加了0.9。

Focal loss

focal loss引入了一个新的超参数,聚焦参数γ,用来控制调整项的强度。如果γ=0,我们的loss和CE loss相同。当γ增加,loss在好分类例子上的变化使得好分类例子被大打折扣,如图1。γ=2的FL在AP上相对于α-balanced CE loss上升2.9。

Analysis of the Focal Loss

为了更好的理解focal loss,我们分析了收敛模型的损失函数的经验分布。我们使用默认的采用600像素作为输入,γ=2训练出的ResNet-101模型。我们对模型输入大量的随机的图像,然后采样了 107个负窗口的预测概率和 105个正窗口的预测概率。然后,分别对于这些正负样本,我们计算FL,然后对它们进行标准化,使它们和为1。有了归一化后的值,我们可以分别对正负样本从低到高的按loss进行排序,然后画出不同γ下的CDF(累积分布函数)。

正负样本的CDF(如图4)。如果我们观察正样本,会发现CDF对于不同γ值来说大致是相似的。大约20%的正样本难例占了大约一半的正损失,当γ增加,损失会越来越集中于top 20%的样本,但是这种效果是微小的。对于负样本,γ的影响就非常不同,如γ=2,FL能够非常有效的折扣负样本简单例的效果,使得模型所有注意力都在负难例上。
RetinaNet-ft.jpg

Online Hard Example Mining (OHEM) 在线难样本挖掘

OHEM中所有样本经过计算损失值,然后使用NMS过滤,最后在minibatch时选择损失值最大的那些样本。OHEM关注误分类样本,不同于FL,OHEM完全忽略的易分类样本。如Table 1d所示,最好的OHEM与FL有3.2点AP差距。

Hinge Loss

先前使用中尝试对 pt 使用Hinge Loss;对 pt 值大于某个阈值的样本,损失函数置为零。但是训练过程不稳定,并且也达不到有价值的效果。
RetinaNet-ohem.jpg

6.2 Model Architecture Design

Anchor密度

one-stage检测器的anchor密度到底多少才能覆盖任意图像边框。Two-stage检测器通过Region Pooling(ROI Pooling)可以对边框的任何位置、尺寸、长宽比归类。相比之下,one-stage 检测器使用一个固定的采样网格,一个常用的方法是在每个空间位置使用多个anchors来覆盖不同的尺寸和长宽比边框。

我们在FPN每一层的每个空间位置使用不同个数的尺寸和长宽比anchors。在ResNet-50从使用1个方形anchor到12个anchors(尺寸为&- 2^{k/4} -&, k ≤ 3,长宽比为 [0.5, 1, 2],见Table 1c)。令人惊讶的是只使用1个anchor情况下AP就有30.3;当使用3中尺寸和3中长宽比时可以到达34.0。
RetinaNet-anchor.jpg

最终,我们发现再增加6~9个anchors也没有更多的提升。虽然two-stage检测器可以识别图片中任意的边框;性能的饱和度w.r.t. 密度意味着较高潜在密度的two-stage系统的可能不具有优势。

速度VS准确率

RetinaNet-speed.jpg
a) 更大的主干网有更好的准确率,但速度更慢;输入图像的尺寸也是如此,见Table 1e。

b) 图Figure 2 展示RetinaNet和其它方法在速度/精度的比较;RetinaNet 使用FL超过所有的方法,打破低精度的限制。ResNet-101-FPN在600像素尺寸时的精确度超过ResNet101-FPN Faster R-CNN,同时检测时间为122ms,Faster R-CNN为172ms。

c) 追求速度需要特殊的网络设计如Yolo 9000。

总结

类别不均衡是导致one-stage检测器超越two-stage检测器的主要障碍。我们提出 focal loss在交叉熵损失函数中使用一个调节项来聚焦于困难负样本。方法简单有效。通过一个one-stage的FCN检测器在速度和精度同时达到stage-of-the-art。

感谢及参考

知乎深度学习论文翻译专栏
掘金AI科技大本营
CSDNmike112233
Githubyizt/cv-papers

volica

原创文章,欢迎转载。转载请注明:转载自 我家Ai智障,谢谢!
原文链接:http://www.mclover.cn/blog/index.php/archives/375.html

你可能还喜欢...

添加新评论

icon_question.gificon_razz.gificon_sad.gificon_evil.gificon_exclaim.gificon_smile.gificon_redface.gificon_biggrin.gificon_surprised.gificon_eek.gificon_confused.gificon_cool.gificon_lol.gificon_mad.gificon_twisted.gificon_rolleyes.gificon_wink.gificon_idea.gificon_arrow.gificon_neutral.gificon_cry.gificon_mrgreen.gif

captcha
请输入验证码