(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记2018

Abstract

目前最高准确率的目标检测器,都是基于two-stage的方法,使用一个分类器对一系列稀疏的候选位置框进行操作。与之相反,one-stage的检测器通常是对可能的目标位置进行regular、密集采样,再应用分类器,这样更快、更简单,但是准确率不足。本文中,我们探究这种现象出现的原因。**我们发现,最主要的原因在于,在dense检测训练过程中,出现了前景和背景数据的极度不平衡。**我们提出了一种解决方法,**将标准的交叉熵loss进行reshape,使得它降低well-classified样本对loss的权重。**我们新提出的FocalLoss聚焦于训练a sparse set of hard examples,并且在训练时防止大量的easy negatives使得网络不好学习。为了评估我们的loss的效果,我们设计训练了一个简单的dense检测器,叫做RetinaNet。我们的结果表明,当使用focal loss训练时,RetinaNet可以达到与one-stage检测器匹配的速度,同时取得超过目前two-stage SOTA方法的准确率。

1. Introduction

目前的SOTA目标检测器基于two-stage、proposal驱动的方法。第一阶段生成稀疏的一系列候选框,第二阶段对这些进行分类回归。通过一系列增强,two-stage的框架在COCO上持续取得top准确率。

目前的问题是:one-stage方法可以取得相近的准确率吗?one-stage检测器应用在目标位置、不同尺度、不同长宽比的regular、dense采样上。比如SSD和YOLO,取得了很好的效果,速度更快,但是准确率相对two-stage的方法,相对较差。

我们提出一种one-stage的检测器,并且第一次取得与更复杂的two-stage方法相匹配的准确率。为了达到这种效果,我们认为训练中的class imbalance识最主要的障碍,我们提出了一个新的loss函数来解决。

two-stage方法中,通过两阶段级联,解决了类不平衡的问题。proposal阶段将候选位置数量极大地降低,这就过滤掉了大部分背景样本。第二个分类阶段,通过固定正负样本比、或OHEM,取得了正负样本的平衡。

相反,one-stage检测器需要处理的候选目标位置数量远大于前者。实际上,通常需要考虑不同位置、长宽比、尺度的大约100k个候选。通常通过bootstrapping或hard example mining技术来进行采样处理,但是效果不够好,处理后训练数据仍被大量的背景样本所占据。

本文中,我们提出了一种新的loss函数,可以更好地解决类不平衡问题。这个loss函数是对交叉熵loss的动态缩放,当正确类别的confidence增长,缩放参数会衰减直到0,见图1。

(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

**直观上,在训练中缩放尺度参数可以自动的将降低easy example对loss的权重,对hard样本loss较大。**实验中表明,我们方法训练的one-stage检测器,超过了其他使用hard example mining方法的检测器。最后,我们注意到focal loss的具体形式并不重要,我们发现其他形式也可取得相似的效果。

为了检测效果,我们训练了RetinaNet,它的设计使用了特征金字塔和anchor box,并使用了许多最近的ideas。我们的网络既有效率又准确,基于ResNet-101-FPN作为backbone的网络,在COCO取得了39.1% AP,并且速度5fps,超过了之前SOTA,无论是one-stage还是two-stage,见图2。

(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

2. Related Work

Classic Object Detectors

标准的滑窗方法,即分类器应用在dense image grid,有着漫长的历史。最早的成功是LeCun的手写数字识别。之后是Viola和Jones用于面部检测。HOG的提出产生了一些列有效的行人检测模型,DPN使得dense检测器扩展到更多的类别。随着深度学习的出现,two-stage的检测器统治了目标检测领域。

Two-stage Detectors

two-stage方法随着SS的提出而兴起,第一阶段提出稀疏的一些候选框,第二阶段进行分类。从R-CNN到Faster R-CNN,现在也出现了更多的扩展。

One-stage Detectors

OverFeat是第一个现代基于深度网络的one-stage目标检测器。之后的SSD和YOLO取得了更好的效果,它们很快,但是准确了相对来说较低。

**最近的一些研究表明,two-stage检测器可以通过降低图像分辨率和proposal的数量来加速,但是one-stage方法即便使用更多的计算,降低了速度,也无法取得更好的准确了。**本文的目标就是使得one-stage的方法取得two-stage的准确率。

RetinaNet的设计保留了许多之前网络的相似设计,尤其是anchor和FPN。为的是强调我们的top效果是来自于我们的新loss,而不是其他优化。

Class Imbalance

所有的one-stage检测方法都面临着一个大的类不平衡的问题。每张图像有0000-100000个候选,但是只有很少一部分有目标。这种不平衡引发了两个问题。**一个是训练效率较低,大部分的候选都是easy negatives,对学习没有有益的影响。第二,这么多的easy negatives可能导致模型无法训练,收敛。**常用方法是使用hard negative mining,而我们的focal loss可以自动的解决这个问题,不耗费时间采样或计算梯度。

Robust Estimation

目前有很多研究设计鲁棒的loss函数,降低outliers对loss的贡献,即降低hard examples对loss的共享。相反,我们的focal loss是要降低inliers(easy examples)对loss的共享来解决类不平衡的问题。

3. Focal Loss

Focal loss用来解决one-stage检测方法在面对前景背景数据极度不平衡的问题。我们从标准二分类的交叉熵(CE)来引出Focal Loss:(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

上面的式子中,y取值为正负1,表示groundtruth的类和其他,p在0-1范围内,表示模型预测y=1类别的概率。为了标记方便,我们定义pt并重写了CE(p,y)=CE(pt)=-log(pt):(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

CE loss在图1中为上面的蓝色曲线,可以看出,一些pt>>0.5的的样本,同样对loss有共享,当easy样本非常多的时候,造成loss就很大,可能会影响正常训练。(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

3.1 Balanced Cross Entropy

处理类不平衡的一个常见方法是引入一个权重参数α,对于class1为α,对于class-1为1-α。实际中,可以把α当作一个超参数,在交叉验证中设置。为了简便,我们定义αt,与pt一致,我们重写了α-balanced CE loss:(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

这个loss是对CE的一个简单扩展,我们把它作为我们提出的focal loss的实验baseline。

3.2 Focal Loss Definition

如我们接下来的实验所示,很大的类不平衡导致大量很容易分类的负样本统治了loss,主导了梯度。α参数平衡了正负样本的重要性,但是它没有区分easy/hard样本。我们要提出的loss对简单样本降低权重,关注到困难的negatives上。

我们对CEloss中添加了一个调节参数(1pt)γ(1-p_t)^\gamma,γ参数大于等于0,我们将focal loss定义如下:

(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

图1中,使用了不同的γ可视化了我们的Focal Loss。我们注意到了Focal Loss的两个特性。

  • 当一个样本被分类错了,且pt较小,调节参数接近1,loss没有被影响。当pt接近1,参数就降到0,这种well-classified样本的权重就被降低了。
  • γ参数平滑调整了easy样本的权重降低率,当γ=0时,FL与CE相同,随着γ增大,调节参数的效果也提升了,实验中我们发现γ=2的时候,效果最好。

直观上,调节参数降低了简单样本的loss贡献,扩展了低loss的范围。**比如,对于γ=2,pt=0.9的一个样本有着比CE低100倍的loss,pt=0.968的一个样本,有着比CE低1000倍的loss。**这就提升了那些分类错的,pt较小的样本的loss,它最多也就降低了4倍。

实际操作中,我们使用α平衡的focal loss变体:(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

我们使用这种形式,因为它比之前的形式稍稍提升了准确率。最后,我们注意到,loss层将计算p的sigmoid操作和loss计算组合,可以获得更好的数值稳定性。

在我们的主要实验中,我们使用标准的Focal Loss定义,它的更精准形式不是必需的。附录中,我们考虑了几种focal loss的变体,验证了这些都很有效。

3.3 Class Imbalance and Model Initialization

二分类默认初始化有着相同概率的输出,对于两类y=1、-1。在这种初始化下,如果类不平衡,那么出现更多的那类会统治loss,导致早期训练的不稳定性。为了克服这个问题,我们提出了一个"prior"概念,来表示训练一开始模型对前景这类的估计概率p的值。我们将这个prior记作π,将它设定为使得p比较低,比如0.01。注意这是对模型初始化的改变,而不是对loss的改变。我们发现这会提升训练的稳定性。

3.4 Class Imbalance and Two-stage Detectors

two-stage检测器通过两种方法解决不平衡:两阶段级联和biased minibatch采样。通过第一阶段来将几乎无限的可能目标位置降低到一两千;第二阶段训练的时候,使用biased采样,将minibatch中的正负样本比例固定。

4. RetinaNet Detector

RetinaNet由backbone和两个处理不同任务的子网络组成。backbone进行特征提取计算特征图;第一个子网络进行目标分类,第二个子网络进行bbox回归。这两个子网络的设计很简单,如图3所示。同样,对网络成分有很多可能的选择来进行改造。(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

Feature Pyramid Network Backbone

我们使用FPN作为backbone,见图3a,b。金字塔的每个等级用来检测不同尺度的目标。FPN提升了网络的多尺度预测能力。

与FPN论文中一样,我们在ResNet结构上构建FPN,得到P3-P7的5层金字塔。l表示金字塔等级,即Pl层比输入图像的分辨率低2 ^ l倍,金字塔的所有等级均为256通道。我们对原FPN做了一点改变:

  • 没有使用高分辨率的P2,因为计算量较大。
  • P6通过带步长的卷积计算得到,而不是下采样
  • 引入了P7来提升大目标的检测。

这些改变在保持准确率的基础上,提升了速度。

Anchors

我们使用了与FPN论文中相似的anchor。anchor尺寸从32到512,对应金字塔等级P3到P7。与FPN中的不同,我们为了更密集的尺度,我们在每个等级的尺寸为上面尺寸的{2^0、2^(1/3)、2^(2/3)},长宽比与FPN中一样,{1:2、1:1、2:1}。因此我们在每个等级的每个位置,有A=9个anchor,总体上的尺度范围32-813像素。

每个anchor分配一个长度为K的one-hot向量,用来分类,一个四维的bbox回归向量。**与ground truth的IoU大于0.5,当作正样本,在0-0.4当作负样本(背景)。每个anchor最多分配到一个目标box,我们把K向量中对应的类设为1,其他为0。IoU在0.4-0.5之间的,忽略。**Box回归,通过每个anchor与其对应的box的offset计算,如果没有对应的ground truth box,就忽略。

Classification Subnet

分类子网络预测特征图上每个位置的A个anchor的K类目标可能性。这个子网络是一个小的FCN网络,与每个FPN等级向量,在所有等级上的子网络共享参数。假设特征图有C通道,子网络为四个3 * 3conv层,每层都是C通道,并接ReLU,最后接一个KA通道的3 * 3conv。对输出进行sigmoid,即得到每个位置A个anchor的结果,见图3c。我们实验中C=256,A=9。

与RPN相反,我们的分类子网络更深,只使用3 * 3conv,**且不与回归子网络共享参数。**我们发现这些高级设计决策比超参数的特定值更为重要。

Box Regression Subnet

平行于分类子网络,我们使用另一个小的FCN来连接每层金字塔,进行bbox回归,如果该anchor存在对应的groundtruth。这个子网络与分类子网络大致相同,只是最后一层conv的通道数为4A,直接输出,预测了相对的offset。我们使用的是class-agnostic的bbox回归方法,这样参数更少,同样也很有效。

4.1 Inference and Training

Inference

RetinaNet由一个FCN的backbone和两个子网络组成。因此,测试阶段就是将图像送入网络进行前向传播即可。为了提升速度,我们最多只产生1k个分数最高的预测。然后进行阈值0.5的NMS来获得最终的结果。

Focal Loss

在分类子网络的输出上,我们使用FocalLoss作为loss函数,后续实验发现γ=2时效果最好,γ在0.5-5范围内,网络相对比较鲁棒。

**我们要强调的是,我们的Focal Loss应用在了每个图像上的所有anchors上,这与RPN和OHEM的采样是完全不同的。图像的total focal loss由所有anchor的loss进行求和,然后再根据与groundtruth相匹配的anchor数进行归一化。**我们使用匹配的anchor数量而不是总体的anchor数量,因为大多数的anchor都是easy negatives,在focal loss中,这些anchor产生的loss很小,可以忽略。最后我们注意到α,也存在一个可靠的范围,但是它与γ连在一起作用,需要一起选择(见表1a和1b)。通常α在γ增大时要减小(对于γ=2时,α=0.25最佳)。

Initialization

实验使用ResNet-50-FPN和ResNet-101-FPN作为backbone。基础的ResNet在ImageNet上预训练,新的FPN层使用与原论文中相同的初始化。所有的新加的conv层使用0.01的高斯分布初始化,偏置为0。分类网络的最后一层。设置初始的偏置为(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

这里π为训练刚开始时,每个anchor的标签为前景的置信度(即上面说的prior),设为0.01。

Optimization

使用SGD进行训练,8个GPU同步使用SGD进行,每个minibatch16张图像,每个GPU2张。训练90k迭代,初始学习率为0.01,60k和80k时学习率除以10。使用水平图像翻转作为唯一的数据增强。使用0.0001的权值衰减和0.9的动量。训练的loss为focal loss和bbox回归的标准L1loss的和。

5. Experiments

5.1 Training Dense Detection

我们做了大量实验来分析loss函数对不同策略的表现。所有实验中,我们使用50或101的ResNet,带有FPN。我们都使用600像素作为图像的尺度,用于训练和测试。(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

Network Initialization

首先我们使用标准的CE来训练网络,这很快就失败了,训练时候网络无法收敛。然而,我们对最后一层卷积层进行prior设置之后,就可以训练了。训练的RetinaNet-50取得了30.2的AP,在COCO上。我们发现实验的结果对π的确切值不敏感,所以我们所有实验中π都设为0.01。

Balanced Cross Entropy

我们接下来使用平衡的CE来进行实验,如表1a所示,将α=0.75可以在AP上取得0.9%的提升。

Focal Loss

下面使用我们的Focal Loss进行实验,结果如表1b所示。当γ=0时,我们的loss与标准CE一致。随着γ提升,loss的形状改变,对于easy的样本有着更小的loss,如图1所示。随着γ提升,FL取得了更大的AP提升,γ=2时,相对于平衡的CE来说,取得了2.9%AP提升。

对于表1b中的实验,我们对每个γ找到最好的α。我们观察到对于更高的γ,选择的α更低(随着easy negatives权值下降,对于正样本的强调也可以降低了)。总体来说,改变γ的好处更大,最好的α在0.25-0.75范围内。我们使用γ=2.0,α=0.25。

Analysis of the Focal Loss

为了更好理解focal loss,我们分析一个收敛模型的loss分布。我们使用ResNet-101 600像素的模型,使用γ=2训练,模型AP为36.0%。我们把这个模型应用到很大数量的随机图像上,采样了接近10^7个负预测和10^5个正预测。然后,我们计算这些样本的focal loss,然后归一化,然后将结果从低到高排序,画出正样本和负样本的累计分布函数(CDF),对于不同的γ画出不同曲线(尽管使用2训练,计算出不同γ的loss)。(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

结果如图4所示,对于正样本的CDF曲线,我们观察到,对于不同的γ,曲线大致一致。比如,大约20%的最难的正样本占了大约一半的loss,随着γ增大,这20%的loss更加集中,但是效果不明显。

在负样本上的CDF曲线完全不同。对于γ=0,曲线与正样本的类似。然而随着γ增大,更多的全阿红聚集在困难的负样本上,在γ=2的时候,大部分的样本只占一点loss,这说明FL可以有效地忽略easy negatives,集中在hard negatives上。

Online Hard Example Mining (OHEM)

在OHEM中,每个样本通过loss进行评分,使用nms,然后将最高分数的一些样本作为minibatch。OHEM更关注misclassified样本,OHEM的一种变体是minibatch强制负正样本3:1。

我们测试了OHEM的变体的效果,见表1d,发现我们的focal loss的效果要超过OHEM。

Hinge Loss

最后,早期实验中,我们尝试在pt上使用hinge loss训练,它对一个特定的pt值将loss设为0。然而这时不可靠的,我们没有取得有意义的结果。

5.2 Model Architecture Design

Anchor Density

one-stage方法中一个最重要的设计就是检测的density。two-stage可以在任意的位置、尺度、长宽比使用proposal池化来进行检测;相反,one-stage使用固定的采样grid,一个流行的方法是在grid上每个空间点使用多个anchor来检测多种尺度和长宽比的目标。

我们考虑了多种anchor的尺度数量和长宽比数量,结果如表1c所示。令人惊讶的是,每个位置只使用一个尺度的正方向anchor取得了30.3%的AP,当每个位置使用3个尺度+3个长宽比共9个anchor时,AP提升到了34.0%,其他实验中我们使用这种设置。

最后,我们注意到,继续提升anchor的数量并没有取得进一步的效果提升。

Speed versus Accuracy

更大的backbone效果更好,但是更慢。对于输入图像尺寸来说也是如此。我们对这两个因素进行了对比,见表1e。图2中,我们画了RetinaNet和其他一些方法的speed/accuracy的平衡图(在COCO上进行)。图中表示RetinaNet效果超过了所有现存的方法。RetinaNet-101,600像素尺度的模型取得了与ResNet-101-FPN Faster R-CNN相匹配的准确率,而每张图运行时间122ms vs 172ms。使用更大的图像尺度效果更好,同样也比two-stage方法快。

相对来说如果要得到更高的FPS,可能需要对网络设计进行特殊设计,这超过了本文的范围。

5.2 Comparison to State of the Art

我们在COCO上与其他SOTA方法相比较,结果见表2,我们的RetinaNet-101-800训练时使用了尺度抖动。(RetinaNet)Focal Loss for Dense Object Detection论文阅读笔记

与目前的one-stage方法相比,我们和最接近的对手DSSD之间有一个5.9%的gap,而且比它快。与two-stage方法相比,我们的网络与最好的模型相比有一个2.3%的gap。将backbone改为ResNeXt之后,进一步提升了1.7点AP,超过了40%AP。

6. Conclusion

本文中,我们认为类不平衡问题是制约one-stage方法准确率超过two-stage方法的主要原因。为了解决这个问题,我们提出了focal loss。我们的方法简单高效,我们设计了一个模型,实验中取得了SOTA的准确率和速度。

相关文章: