不放过每一个学习的机会,关注微信公众号:AI算法爱好者
或扫描二维码:
Paper Title: Focal Loss for Dense Object Detection
论文链接:https://arxiv.org/abs/1708.02002
代码地址1:https://github.com/facebookresearch/Detectron
代码地址2:https://github.com/tensorflow/models/tree/master/research/object_detection
1. 概 述 1. 概述 1.概述
目前目标检测基本上可以分为两大类:one-stage和two-stage目标检测。单阶段检测网络通常速度比较快,但是精度赶不上两阶段的。两阶段的反过来,通常精度比较高,速度赶不上单阶段的。
two-stage检测网络
two-stage检测网络的典型代表是Faster-RCNN。第一阶段是使用候选框提取网络(region proposal network),简称RPN,来缩小候选目标位置的数量,剔除掉大部分的背景样本。第二阶段对上一阶段得到的候选目标位置做分类,样本使用的前景背景比例为1:3,或者使用OHEM(online hard example mining)从一个minibatch中挑选出一小部分anchors。因此这种two-stage的检测网络是存在前景-背景类平衡的。
one-stage检测网络
如上图所示,one-stage检测网络中有很多类似图像右上方所示的负例背景样本,他们基本上分布在整副图片上,而且有不同长宽比和大小。他们对训练的贡献很小,而且其数量上又占据主导地位。通常,可以采用bootstrapping或hard example mining来解决这种问题,但是这两种方法效率都不够高。
上面想要说的其实就是one-stage检测网络相对于two-stage检测网络存在的问题是:类别不平衡。那么问题来了,为什么会类别不平衡?为什么类别不平衡就会导致检测精度下降?
首先来看一些经典网络的候选框数量比较:
-
YOLOv1: 98 boxes
-
YOLOv2: ~1k
-
OverFeat: ~1–2k
-
SSD: ~8–26k
-
RetinaNet: ~100k
一张图像中有这么多的候选框,但是真正的正例目标通常只有几个,算上与正例交并比大于某个阈值的候选框也会比这总共的少很多很多。这就是不平衡,数量上差别太大。而这些大量的负例大部分都属于简单样本,即对分类器来说很容易分类,并取得较高的confidence,这种情况对训练阶段是非常不好的,通俗的说,它会让你误以为你的检测质量很高,然而并不是,你一旦换了正负比例不同的数据集你会发现检测精度差异很大,而且可能非常低。更严谨的解释可以看下面讲到的交叉熵。
Focal loss的出现正是为了解决在one-stage检测网络中类别不平衡导致的训练精度不够高的问题。简单来说,Focal loss主要是在标准交叉熵的基础上增加了调制因子和平衡因子,从而降低了简单易分类样本的的损失贡献。为了验证Focal loss的巨大作用,作者还设计并训练了一个网络:RetinaNet。结果显示RetinaNet不仅具有one-stage检测网络的速度,而且在精度上超过了所有SOTA(state-of-the-art)two-stage检测网络。
2. 交 叉 熵 ( c r o s s e n t r o p y ) 2. 交叉熵(cross entropy) 2.交叉熵(crossentropy)
标准交叉熵
先来看下标准的二分类交叉熵:
上式中,y ∈ {±1}表示是否为ground-truth的分类,p ∈ [0, 1]为模型预测标签y=1的概率。为了简单起见,作者定义了pt:
这样一来,交叉熵就可以写为:CE(p, y) = CE(pt) = − log(pt)。标准交叉熵损失函数可以看做如图Figure 1所示的蓝色曲线,从图中可以看出,对于容易分类的样本(well-classified examples)也会产生一部分损失,当这样的样本数量占据主导位置时,那么这些损失值虽小,由于数量大却能淹没数量较小的样本的损失,这也就是前面说的类别不平衡所带来的问题。
平衡交叉熵
一种解决类别不平衡的常用方法是加入权重因子α ∈ [0, 1]。类别1的权重因子为α,-1的为1 − α。实际应用中,α可能会被设置为类别频率的倒数,或作为超参数通过交叉验证来设置。类似于pt的定义,平衡交叉熵可以表示为:
在前面讲到的两阶段检测网络中所说的前景背景比为 1:3 其实就是实现了此处α效果。
3. F o c a l L o s s 3. Focal Loss 3.FocalLoss
平衡交叉熵中的α虽然平衡了正负样本的重要性,但是它并没有区分简单和困难样本。作者改变了loss函数的表现形式,使得降低了简单样本的loss权重,将训练聚焦在困难样本上。方法是在交叉熵损失函数中加入一个调制因子:
其中,γ ≥ 0 是一个可调节的聚焦参数。
因此,Focal loss的定义为:
在图Figure 1中我们可以看到γ取[0, 5]之间不同值时Focal loss的曲线。
Focal loss的两点属性:
-
当样本被误分类时并且pt很小,此时调制因子接近于1,loss不会被影响。如果pt趋近于1,调制因子就趋近于0,简单易分类样本的loss就会被降低权重。
-
聚焦参数γ平滑地调整简单样本被加权的比率。 当γ=0 时,FL(Focal loss) 等同于CE。 当γ增加时,调制因子的影响同样增加。(γ=2在实验中效果最好。)
例如当γ=2 时,与CE相比,分类为pt=0.9的样本将具有100倍低的损失,对于pt=0.968,其将具有1000倍低的损失。反过来,这种机制又增加了纠正错误分类的样本的重要性。对于 pt≤0.5和γ=2,损失按比例缩小至最多4倍。
Focal loss的变体
在实际应用中,作者使用的其实是Focal loss的α平衡(α-Balanced)变体,公式如下:
之所以采用这种形式的Focal loss,是因为作者在实验中发现带有α平衡因子比不带会带来一点点的精度提升。另外,在计算p的时候加入了sigmoid激活函数,这种操作大幅增加了数值稳定。
注意:Focal loss的表达形式并不一定要跟上面的保持一致,在paper的附录当中作者也给出了其他的表现形式,感兴趣的可以查阅。
类别不平衡和模型初始化
通常情况下,二分类模型在初始化的时候把两类输出的概率设置为相等。然而,在类别不平衡的情况下,数量较多的样本对loss的贡献会占据主导地位,这会导致在模型训练早期的不稳定。为了解决这个问题,作者提出了在训练开始时,为模型对稀有类别预测的p值引入一个“先验”概念,并将这个先验表示为π。通过对这个值的设置,如0.01,模型对稀有类别的预测值p就会相对比较小。作者发现这样做的结果是,在类别严重不平衡时,不管是标准交叉熵,还是这里提出的Focal loss,模型训练的稳定性都得到了提高。
注意:这仅仅是对模型初始化做出的变化,跟损失函数没关系。
4. R e n t i n a N e t D e t e c t o r 4. RentinaNet Detector 4.RentinaNetDetector
RetinaNet是一个one-stage的网络,主要用来验证Focal loss的作用。它由一个backbone骨干网络和两个特定任务的子网络构成。骨干网络主要负责对输入图像的feature map的提取。第一个子网络对骨干网络的输出做目标分类(object classification),第二个子网络做包围框回归(bounding box regression)。
Feature Pyramid Network Backbone
RetinaNet的骨干网络是将FPN应用在ResNet之上,用于从单个分辨率输入图像构建丰富的多尺度特征金字塔。FPN是多尺度的,在所有尺度上都具有强大的语义,并且计算速度快。另外,这里的FPN有一些适度的变化。 金字塔是从P3到P7生成的。 一些主要的变化是:(i)由于计算原因,现在不使用P2。(ii)P6是通过带stride的卷积而不是下采样计算得到的。(iii)另外包括P7以提高大物体检测的精度。
Anchors
作者使用具有平移不变性的anchor框,类似于在RPN文献中的变体。这些anchors的尺寸从32x32到512x512不等,对应到金字塔的P3到P7。对金字塔每一层的anchors,使用三种比例的aspect ratio:1:2,1:1,2:1。对于密集的尺度覆盖,每一层的anchor尺寸添加2^0, 2^1/3, 2^2/3三个,相当于3种尺寸,每种尺寸对应3种比例。所以总体来看,每层有A=9个anchors。对所有层,这些尺寸覆盖了相对于网络输入图像32-813范围的像素。
对每一个anchor,用一个长度为K的one-hot向量表示,和一个4维向量表示包围框的回归坐标。其中,K为类别数目。使用IoU为0.5来确定anchors是否为ground-truth目标框,[0, 0.4) 来确定是否为背景框。每个anchor至多有一个目标框,并在one-hot编码的K维向量中将该类别对应的位置置1,其余位置置0。如果IoU的值在[0.4,0.5) 之间并且在训练期间被忽略,则取消该anchor的分配。
Classification Subnet
分类子网络是预测每个位置处目标存在的概率(每个位置有A个anchors和K个目标分类)。
这个子网络是对金字塔的每一层应用一个FCN的小网络,子网络的参数在金字塔的层间是共享的。拿一个有C个channel的输入feature map来说,它应用四个3×3卷积层,每个卷积层都有C个卷积核,每层卷积后跟着ReLU激活层,然后是带有KA卷积核的3×3卷积层,紧随着是sigmoid激活层。如图 Figure 3© 所示,K个类别,A = 9,C = 256。
Box Regression Subnet
包围框回归子网络与分类子网络类似,也是在金字塔的每一层连接一个小的FCN,用来回归anchor和对应的ground-truth之间的偏移。对每个空间位置它有4A个输出,对应于每个位置A个anchors的偏移,如图Figure 3(d) 所示,偏移是指anchor和ground-truth box之间的偏移。
有一点跟其他人研究工作不同的是,作者使用了一个叫类别未知的边框回归器,这种方式使用的参数会更少,但却发现可以取得同样的效果。
目标分类子网络和包围框回归子网络的结构结构相同,使用相互独立的参数。
Inference
为了提高预测速度,在将检测器置信度设置为0.05后,对每一层FPN,网络最多只对 1k 个top-scoring的包围框预测做解码处理。然后合并所有的top预测,并应用阈值为0.5的非最大抑制(NMS)以产生最终检测结果。
Training
在训练期间,一张图片总的Focal loss是所有大约100k个anchors的Focal loss之和,通过分配给gound-truth box的anchors的数量做归一化。关于训练期间的一些参数初始化可以参考论文,不过多介绍了。
5. 实 验 对 比 5. 实验对比 5.实验对比
AP对比:
6. 总 结 6. 总结 6.总结
这篇文章主要是通过引入了Focal loss和其中的两个参数α和γ分别用于抑制正负样本和难易样本的不平衡,解决了one-stage检测网络的类别不平衡问题,并通过设计的网络RetinaNet验证了Focal loss的作用。通过实验对比,AP值超过了所有one-stage和two-stage的网络。
如图Figure 2所示是这篇文章给出的网络和预测时间图,不过如果你看过YOLOv3的论文你会知道RetinaNet的速度还不够快,下图是YOLOv3给出的,可以看到RetinaNet还是慢了一些。
Y
O
L
O
v
3
S
p
e
e
d
−
a
c
c
u
r
a
c
y
t
r
a
d
e
o
f
f
YOLOv3 Speed-accuracy tradeoff
YOLOv3Speed−accuracytradeoff
参考:
https://arxiv.org/abs/1708.02002
− E N D − - END - −END−