【论文笔记(6)】Focal Loss for Dense Object Detection

时间:2024-03-14 15:42:06

摘要

迄今为止精度最高的目标检测器是基于R-CNN推广的两阶段方法,其中分类器被应用于候选目标位置的稀疏集合。相比之下,对可能的目标位置进行常规密集采样的单级探测器具有更快和更简单的潜力,但到目前为止,其精度落后于两级探测器。在这篇文章中,我们调查了为什么会出现这种情况。我们发现,在密集检测器的训练过程中遇到的极端的前景-背景类不平衡是主要原因。我们建议通过重新定义标准交叉熵损失来解决这类不平衡问题,使其减少分类清晰的样本的损失的权重。我们的Focal Loss将训练重点放在一组稀疏的困难示例上,并防止大量容易的负样本在训练过程中主导探测器。为了评估损失的有效性,我们设计并训练了一个简单的高密度探测器,我们称之为RetinanNet。我们的结果表明,当使用Focal Loss进行训练时,RetinanNet能够与以前的单级检测器的速度相匹配,同时超过所有现有的最先进的两级检测器的精度。代码在:https://github.com/facebookresearch/Detectron.

简介

当前最先进的目标检测器是基于两阶段的、proposal 驱动的机制。如R-CNN框架[11]中所普及的,第一阶段生成候选目标位置的稀疏集合,第二阶段使用卷积神经网络将每个候选位置分类为前景类或背景类。通过一系列的改进[10,28,20,14],这个两阶段框架在具有挑战性的COCO基准上始终如一地达到最高精度[21]。

尽管两级探测器取得了成功,一个自然的问题是:一个简单的单级探测器能达到同样的精度吗?单级探测器用于对目标位置、尺度和长宽比进行有规则的密集采样。最近在单级探测器上的工作,如YOLO[26,27]和SSD[22,9],显示了有希望的结果,与最先进的两级方法相比,产生的探测器速度更快,精度在10-40%以内。

本文进一步推进了这一领域:我们提出了一种单级目标检测器,它能实现两级检测器的最先进的COCO 平均精度,例如特征金字塔网络(FPN)[20]或更快的R-CNN的MASK R-CNN[14]变体[28]。为了达到这一结果,我们确定训练过程中的类别失衡是阻碍一级检测器达到最高精度的主要障碍,并提出了一种新的损失函数来消除这一障碍。

在类R-CNN检测器中,通过两级级联(two-stage cascade )和抽样启发式(sampling heuristics)解决了类不平衡问题。候选阶段(例如,选择性搜索[35]、EdgeBox[39]、深度掩码[24,25]、RPN[28])迅速将候选对象位置的数量缩小到少量(例如,1-2k),过滤掉大多数背景样本。在第二分类阶段,执行抽样启发式(sampling heuristics)方法,例如固定的前景背景比(1:3)或在线困难样本挖掘法(online hard example mining),在 foreground 样本和 background 样本之间维持可控的平衡。

相反,one-stage 检测器则必须处理一个由图像中规则分布的候选目标位置组成的大样本集。在实践中,目标位置的总数目通常可达 10 万左右,并且密集覆盖空间位置、尺度和长宽比。但它们的效率很低,因为训练过程仍然由容易分类的背景例子主导。这种低效率是目标检测中的一个经典问题,通常使用 bootstrapping 或困难样本挖掘来解决。

在本文中,我们提出了一个新的损失函数,它可以替代以往用于解决类别失衡问题的方法。这个损失函数是一个动态缩放的交叉熵损失函数,随着正确分类的置信度增加,函数中的比例因子缩减至零,见图1。在训练过程中,这个比例因子可以自动地减小简单样本的影响,并快速地将模型集中在困难样本上。实验表明,我们提出的ocal Loss使我们能够训练一个高精度的,单阶段检测器,显著优于抽样启发式或困难示例挖掘训练的替代方法,这是训练单阶段检测器的前一个最先进的技术。最后,我们注意到Focal Loss的确切形式并不重要,并且证明了其他实例(instantiations)也可以实现类似的结果。

【论文笔记(6)】Focal Loss for Dense Object Detection图1:我们提出了一种新的损失函数 Focal Loss,在标准的交叉熵标准上添加了一个因子 。设定 γ > 0 可以减小分类清晰的样本的相对损失(pt > .5),使模型集中于困难的错误分类的样本。试验证明,在存在大量简单背景样本(background example)的情况下,我们提出的 Focal Loss 函数可以训练出准确度很高的密集对象检测器。

为了证明所提出的Focal Loss的有效性,我们设计了一个简单的一级目标检测器,称为RetinanNet,因其在输入图像中对目标位置进行密集采样而得名。它的设计特点是有效的in_network特征金字塔和锚盒的使用。它借鉴了[22,6,28,20]的各种最新想法。RetinaNet高效准确,我们最好的模型基于 ResNet-101- FPN 骨干网,在 5fps 的运行速度下,我们在 COCO test-dev 上取得了 39.1 AP 的成绩,如图2 所示,超过目前公开的单一模型在 one-stage 和 two-stage 检测器上取得的最好成绩。

【论文笔记(6)】Focal Loss for Dense Object Detection图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 变体。

相关工作

经典的物体检测器:滑动窗口范式,在稠密的图像网格上应用分类器,有着悠久而丰富的历史。LeCun等人将卷积神经网络应用于手写数字识别的经典工作是最早的成功之一[19,36]。Viola和Jones[37]使用增强型物体探测器进行人脸检测,导致这类模型被广泛采用。HOG[4]和集成通道特征[5]的引入为行人检测提供了有效的方法。DPMS[8]帮助将密集探测器扩展到更一般的物体类别,并且多年来在Pascal[7]上取得了最好的结果。虽然滑动窗口方法是经典计算机视觉中的主要检测范例,但随着深度学习的复兴[18],下面描述的两阶段检测器很快就占据了目标检测的主导地位。

两阶段检测器:现代目标检测的主流模式是基于两阶段的方法。如选择性搜索工作中所开创的那样[35],第一阶段生成应包含所有对象的候选提案的稀疏集合,同时过滤掉大多数负面位置,而第二阶段将提案分类为前景类/背景。R-CNN[11]将第二级分类器升级为卷积网络,大大提高了准确率,并开启了目标检测的现代时代。多年来,R-CNN在速度[15,10]和使用学习对象提议[6,24,28]方面都得到了改进。区域提案网络(RPN)将提案生成与第二阶段分类器集成到单个卷积网络中,形成了速度更快的RCNN框架[28]。[20,31,32,16,14]提出了对该框架的许多扩展。

单级探测器:OverFeat[30]是最早的现代基于深度网络的单级目标探测器之一。最近SSD[22,9]和YOLO[26,27]重新引起了人们对单阶段方法的兴趣。这些探测器已经在速度上进行了调整,但它们的准确度落后于两阶段法。SSD的AP降低了10%-20%,而YOLO专注于更极端的速度/精度权衡。参见图2。最近的研究表明,只需降低输入图像分辨率和建议数量,两级检测器就可以变得更快,但即使算力更大,单级方法的准确度也会落后[17]。相比之下,这项工作的目的是了解一级检测器在以类似或更快的速度运行时,是否能赶上或超过两级检测器的精度。
我们的RetinaNet的设计与以前的稠密检测器有许多相似之处,特别是RPN[28]引入的“锚”概念和SSD[22]和FPN[20]中使用的特征金字塔。我们要强调的是,我们的简易检测器之所以能取得如此优异的成绩,并不是基于网络设计上的创新,而是由于我们的Focal Loss。

类别不平衡:经典的单级目标检测方法,如增强型检测器[37,5]和DPM[8],以及较新的方法,如SSD[22],在训练过程中都面临较大的类别不平衡。这些检测器评估每幅图像的10K~100K个候选位置,但只有几个位置包含对象。这种不平衡导致了两个问题:(1)训练效率低下,因为大多数地点都是容易的负样本,没有提供有用的学习信号;(2)集中在一起,容易学习的负样本可能会主宰训练,导致模型退化。一种常见的解决方案是执行某种形式的复杂负样本挖掘[33,37,8,31,22],在训练期间或更复杂的采样/重新加权方案中对复杂样本进行采样[2]。相反,我们证明了我们提出的Focal Loss自然地处理了单级检测器面临的类别不平衡,并允许我们有效地对所有示例进行训练,而不需要采样,也不会有超过损失和计算出的梯度的简单负样本。

鲁棒估计:设计鲁棒损失函数(如Huber loss[13])有很大的兴趣,它通过降低误差较大的例子(硬例子)的损失的权重来减少异常值的贡献。相反,我们的Focal Loss不是解决离群值,而是通过降低内部值(简单的例子)的权重来解决类别不平衡问题,这样即使它们的数量很多,它们对总损失的贡献也很小。

Focal Loss

Focal Loss 被设计为解决其中在训练期间前景和背景类之间存在极端不平衡(例如,1:1000)的单级目标检测场景。介绍Focal Loss之前,我们先从对于二值分类中的交叉熵(CE)损失开始:
【论文笔记(6)】Focal Loss for Dense Object Detection
y的取值在+1或者-1对应的ground-truth,p取值在0到1之间,对应的是属于类别1的概率值,pt定义如下:
【论文笔记(6)】Focal Loss for Dense Object Detection
对应的交叉熵损失如下:
【论文笔记(6)】Focal Loss for Dense Object Detection
CE损失可以在图1中的蓝色(顶部)曲线中看到。这种损失的一个值得注意的属性是,即使是容易归类的例子(pt >0.5)也会有一定的损失,如果将大量简单的例子加起来,这些微小的损失值就会淹没稀有类。

balanced Cross Entropy

解决样本不均衡的常见方法是分别为 类别1 和 -1 引入加权因子 α∈[0; 1]、1-α。 在实践中,α可以通过类频率的倒数来设置,或者被视为通过交叉验证来设置的超参数。为了符号上的方便,我们按照定义pt的方式对α进行了严格的定义。我们将α平衡的CE损失写成:【论文笔记(6)】Focal Loss for Dense Object Detection

这一损失是CE的一个简单扩展,我们认为这是我们提出的Focal Loss的实验基线。

Focal Loss Definition

我们的实验表明,在密集检测器的训练过程中遇到的大型的类不平衡超过了交叉熵损失。容易归类的负样本构成了损失的主要部分,并主导了梯度。虽然α平衡了正负两个样本的重要性,但它并不区分简单的样本和困难的样本。相反,我们建议重新损失函数,以减轻简单样本的权重,从而将训练重点放在困难样本上。

我们建议为交叉熵损失增加一个调节因子(1 - pt)γ,其中 γ≥0。于是 Focal Loss 可定义为:
【论文笔记(6)】Focal Loss for Dense Object Detection
图1中显示了γ∈[0,5]的几个值的Focal Loss。我们注意到Focal Loss的两个属性。(1)当一个例子分类错误且Pt值较小时,调制因子接近1,Loss不受影响。当pt→1时,因子变为0,分类良好的例子的损失被降低。(2)参数γ平滑地调整简单示例的降权速率。当γ=0时,FL相当于CE,并且随着γ的增加,调制因子的影响也同样增加(我们发现γ=2在我们的实验中效果最好)。

直观地说,调制因子降低了简单样本的损耗贡献,并扩展了样本接收低损耗的范围。例如,在γ=2的情况下,与CE相比,被分类为pt=0.9的样本的损耗将降低100倍,而在pt≈0.968的情况下,其损耗将降低1000倍。这进而增加了纠正错误分类样本的重要性(对于pt≤0.5和γ=2,其损失最多减少4倍)。

在实践中,我们使用α平衡的Focal Loss变体:
【论文笔记(6)】Focal Loss for Dense Object Detection
我们在实验中采用了这种形式,因为与非α平衡形式相比,它的精确度略有提高。最后,我们注意到损耗层结合了Sigmoid运算的实现,为了利用损失计算来计算p,会产生更大的数值稳定性。虽然在我们的主要实验结果中我们使用了上面的损失定义,但它的精确形式并不重要。在附录中,我们考虑了Focal Loss的其他实例,并证明这些实例也同样有效。

类别失衡与模型初始化

默认情况下,二分类模型被初始化为输出y=−1或1的概率相等。在这样的初始状态下,在类别失衡的情况下,多数类别造成的损失可能主导损失,并导致早期训练中的不稳定。为了解决这一问题,我们在训练开始时为前景类(少数)的模型估计的p的值引入了“先验”的概念。我们用π表示先验,并将其设置为使得模型对于少数类的例子的估计p是低的,例如0.01。我们注意到,这是模型初始化的变化,而不是损失函数的变化。我们发现,在严重类别不平衡的情况下,这可以提高交叉熵和Focal Loss的训练稳定性。

类不平衡与两级检测器

Retinanet是一个单一的统一网络,由一个主干网络和两个特定于任务的子网络组成。主干负责计算整个输入图像上的卷积特征映射,并且是一个非自卷积网络。第一子网对主干的输出进行卷积对象分类;第二子网对主干输出进行卷积包围盒回归。这两个子网的特点是我们专门为一级密集检测提出的简单设计,请参见图3。虽然这些组件的详细信息有很多可能的选择,但大多数设计参数对实验中显示的精确值并不特别敏感。接下来,我们将描述Retinanet的每个组件。

RetinaNet Detector

【论文笔记(6)】Focal Loss for Dense Object Detection
特征金字塔网络骨干网:我们采用[20]的特征金字塔网络(FPN)作为RetinaNet的主干网络。简而言之,FPN增加了一个具有自上而下路径和横向连接的标准卷积网络,因此该网络可以从单一分辨率的输入图像高效地构建丰富的多尺度特征金字塔,见图3(A)-(B)。金字塔的每一层都可以用来检测不同尺度的物体。
在[20]之后,我们在ResNet架构之上构建FPN[16]。我们构造一个从P3到P7级别的金字塔,其中l表示金字塔级别。与[20]中一样,所有金字塔级别都有C=256个通道。金字塔的细节通常遵循[20],但略有不同。2虽然许多设计选择并不重要,但我们强调使用FPN作为主干;仅使用最终ResNet层的特征进行初步实验,可获得较低的AP。

这个anchor在金字塔层P3到P7有相应的32的平方到512的平方 的区域。在每个金字塔层,作者用的长宽比是{ 1:2,1:1,2:1 }。在每层,对于三个长宽比的anchor,加了anchor的形状的{ 20,2{1/3},2^{2/3} }的anchor。这能够增加AP。对于每层,有A=9个anchor,穿过这些层,它们可以覆盖32-813个输入图片中的像素。每个Anchor都是K个分类目标的one-hot向量(K是目标类别数)和4个box regression目标。作者设定anchor的方式是与ground-truth 的intersection-over-union (IoU) 阈值0.5,与背景IOU [0,0.4) 。所有的anchor都被设定为一个box,在预测向量的对应的类位置设1,其他的设为0。如果没有被设定,那么 IoU在[0.4,0.5) ,它是在训练时候被忽略的。Box regression targets是计算出来的每个anchor和它设定的object box的偏移量,如果没有设定那么忽略。

分类子网络在每个空间位置,为A个anchor和K个类别,预测object presence的概率。这个子网络是小的FCN(全卷积网络),与FPN中的每层相接;这个子网络的参数在整个金字塔的层间共享。设计方法是:如果一个从金字塔某个层里来的feature map是C个通道,子网络使用 四个33 的卷积层,C个滤波器,每个都接着ReLU**函数;接下来用 33 的卷积层,有 KA 个滤波器。最后用sigmoid**函数对于每个空间位置,输出 KA 个binary预测。作者用实验中 C=256 A=9 。与RPN对比,作者的object classification子网络更深,只用 3*3 卷积,且不和box regression子网络共享参数。作者发现这种higer-level设计决定比超参数的特定值要重要。

与object classification子网络平行,作者在金字塔每个层都接到一个小的FCN上,意图回归每个anchor box对邻近ground truth object的偏移量。回归子网络的设计和分类相同,不同的是它为每个空间位置输出4A个线性输出。对于每个空间位置的A个anchor,4个输出预测anchor和ground-truth box的相对偏移。与现在大多数工作不同的是,作者用了一个class-agnostic bounding box regressor,这样能用更少的参数更高效。Object classification和bounding box regression两个网络共享一个网络结构,但是分别用不同的参数。

推理和训练

RetinaNet形成了一个由ResNet-FPN主干网、分类子网和box回归子网组成的FCN,见图3。同样地,推理包括简单地通过网络传播图像。为了提高速度,我们只从每FPN级别最多1k的最高得分预测解码盒预测,阈值检测置信度为0.05。将所有级别的最高预测进行合并,并使用阈值为0.5的非极大值抑制来产生最终的检测结果。

Focal Loss:我们使用本文中引入的Focal Loss作为分类子网输出的损失。正如我们将在§5中展示的,我们发现γ=2在实践中工作得很好,并且Retinanet对γ∈[0.5,5]是相对健壮的。我们强调,在训练Retinanet时,Focal Loss应用于每个采样图像中的所有∼100k锚。这与使用启发式采样(RPN)或困难样本挖掘(OHEM、SSD)为每个小批量选择一小组锚(例如256个)的常见做法形成对比。图像的总Focal Loss计算为所有∼100k锚的Focal Loss之和,并由分配给地面实况框的锚的数量进行归一化。我们通过分配锚点的数量来进行归一化,而不是通过总锚点来进行归一化,因为绝大多数锚点是容易负样本的,并且在Focal Loss下得到的损失值可以忽略不计。最后,我们注意到分配给稀有类的权重α也有一个稳定的范围,但它与γ相互作用,因此有必要同时选择两者(参见表1a和1b)。一般来说,α应该随着γ的增加而略微降低(当γ=2时,α=0.25时效果最好)。

初始化:我们使用ResNet-50-FPN和ResNet-101-FPN主干进行实验[20]。基本的ResNet-50和ResNet-101型号是在ImageNet1k上预先训练的;我们使用的是[16]发布的型号。为FPN添加的新层被初始化,如[20]所示。除了Retinanet子网中的最后一个之外的所有新的卷积层都用偏置b=0和用σ=0.01的高斯权重填充来初始化。对于分类子网的最后一个Conv层,我们将偏差初始化设置为b=−log((1−π)/π),其中π指定在训练开始时每个锚应该被标记为具有∼π置信度的前景。我们在所有实验中都使用π=0.01,尽管结果与精确值非常接近。如§3.3所述,此初始化可防止大量背景锚在第一次训练迭代中产生大的、不稳定的损失值。

优化:RetinanNet采用随机梯度下降(SGD)算法进行训练。我们在8个GPU上使用同步的SGD,每个小批量总共有16个图像(每个GPU 2个图像)。除非另有说明,否则所有模型都将接受90k迭代的训练,初始学习率为0.01,然后在60k时除以10,然后在80k迭代时再除以10。除非另有说明,否则我们使用水平图像翻转作为唯一的数据增强形式。使用0.0001的权重衰减和0.9%的动量。训练损失是Focal Loss和用于盒回归的标准平滑L1损失之和[10]。表1e所示型号的培训时间从10小时到35小时不等。

实验

【论文笔记(6)】Focal Loss for Dense Object Detection表1: RetinaNet 和 Focal Loss 剥离试验(ablation experiment)

【论文笔记(6)】Focal Loss for Dense Object Detection图4:收敛模型的不同 γ 值的正、负样本的归一化损失的累积分布函数。 改变 γ 对于正样本的损失分布的影响很小。 然而,对于负样本来说,大幅增加 γ 会将损失集中在困难的样本上,而不是容易的负样本上。
【论文笔记(6)】Focal Loss for Dense Object Detection
图5: 作为 xt = yx 的函数,Focal Loss 变体与交叉熵相比较。原来的 FL(Focal Loss)和替代变体 FL* 都减少了较好分类样本的相对损失(xt> 0)。

【论文笔记(6)】Focal Loss for Dense Object Detection
表3:FL 和 FL* VS CE(交叉熵) 的结果