目录
论文: Focal Loss for Dense Object Detection.
代码:https://github.com/facebookresearch/Detectron.
来源:IEEE 2018
1. 概述
- 本文提出了新的one-stage anchor-based detector:RetinaNet。RetinaNet采用ResNet-FPN作为backbone来提取多尺度特征,后续分别采用分类子网络和边界框回归子网络来实现分类和回归。对于分类任务,作者设计了新的分类损失函数Focal Loss来训练分类子网路,目的是解决类别不平衡问题,Focal Loss是论文的重点内容。最终RetinaNet在保证速度的同时也能达到two-stage的accuracy。
2. Motivation
现阶段(2018年),one-stage detector的检测准确度不如two-stage detector,其原因是:one-stage detector存在非常严重的正负样本不平衡(foreground-background class imbalance)。
- two-stage detector由于区域候选的存在,大大减少了负样本的数量,并且第2阶段在分类时还采用了不同的正负样本采样策略(如固定正负样本比例或OHEM)。实验证明了focal loss 对 two-stage detector的效果不明显;
- one-stage detector为了提高召回率,在图像中密集均匀地设置了很多不同大小不同比率的anchor,所以存在着大量的负样本,造成样本类别不平衡。
为此,本文提出了Fcoal loss来解决样本类别不平衡的问题,即对不同样本产生的损失添加一个因子,动态调整loss的大小。
2.1 样本类别、正负样本不平衡、难易样本不平衡
通常,我们所说的样本类别有以下两种:
-
正样本(positive example):当bbox与ground truth之间的IOU大于上限阈值时(一般是0.5),会认为该bbox属于positive example。
-
负样本(negative example):如果bbox与ground truth之间的IOU小于下限阈值(可以是0.4,如RetinaNet)就认为该bbox属于negative example。
有时候,我们将IOU位于下限阈值和上限阈值之间的样本称为忽略样本,有的算法直接将其忽略掉(如RetinaNet),有的算法令下限阈值=上限阈值,于是只有正负样本,没有忽略样本(如SSD)。
我们还可以根据样本对训练的贡献程度,将正负样本细分为如图所示的4种类型:
为了更好地说明上图所示的四种样本类型,我们将bbox与ground truth之间的IOU大致分为4段区间:[ 0,
a
1
a_1
a1)、[
a
1
a_1
a1,
a
2
a_2
a2)、[
a
3
a_3
a3,
a
4
a_4
a4)、[
a
4
a_4
a4, 1]。其中,
a
2
a_2
a2和
a
3
a_3
a3即为以上所说的用于区分正负样本的下限阈值和上限阈值;通常
a
1
a_1
a1很接近于0,而
a
4
a_4
a4很接近于1。
- easy negative example:IOU位于区间 [ 0, a 1 a_1 a1)的样本;通常远离ground truth;
- hard negative example:IOU位于区间 [ a 1 a_1 a1, a 2 a_2 a2)的样本;通常处于ground truth和background之间的过渡带
- hard positive example:IOU位于区间 [ a 3 a_3 a3, a 4 a_4 a4) 的样本;通常处于ground truth和background之间的过渡带
- easy positive example:IOU位于区间 [ a 4 a_4 a4, 1] 的样本;通常跟ground truth匹配得很好
我们认为,负样本的难易程度随着其IOU在[ 0, a 2 a_2 a2)范围内的增加而越难,正样本的难易程度随着其IOU在[ a 3 a_3 a3, 1]范围内的增加而越易。
为什么以样本对训练的贡献程度作为样本类别的划分依据?对于单个example来说,easy example的loss很小,使得其对参数的收敛作用很有限;而hard example和hard example的loss很大,使得其对参数收敛的作用比较大。
注意:以上所说的loss是对于单个example来说的,而不是对于输入图像中的所有example。在一张输入图像中,目标占的比例一般都远小于背景占的比例,所以正负样本中以negative example为主,更进一步说,由于大多数negative不在目标和背景之间的过渡带,而是处在距离目标很远的位置,所以大多数的negative example属于easy negative example,也就是说easy negative example的数量是非常多的。在不考虑其他正负样本匹配策略下,所有easy negative example的loss之和是很大的,而所有hard negative example的loss之和也是很大的;相比之下,所有hard positive example的loss之和就很小,所有easy positive example的loss之和就更小了。
一张图片中我们可能获得成千上万的candidate locations 但是positive examples却很少(具有类别信息的examples很少),这是不利于模型对具有类别信息的positive examples的学习的。其次,hard examples也很少,这就导致easy examples由于数量多,它产生的梯度会主导模型的学习过程,会削弱hard examples的作用,降低模型对hard examples 的判别能力。
2. Focal loss
- 对于二元交叉熵损失
C E ( p , y ) = − y l o g ( p ) − ( 1 − y ) l o g ( 1 − p ) = { − l o g ( p ) , i f y = 1 − l o g ( 1 − p ) , o t h e r w i s e CE(p,y)=-ylog(p)-(1-y)log(1-p)= \left\{ \begin{aligned} -log(p),\ \ \ \ \ if\ y=1 \\ -log(1-p),\ otherwise\\ \end{aligned} \right. CE(p,y)=−ylog(p)−(1−y)log(1−p)={−log(p), if y=1−log(1−p), otherwise记 p t = { p , i f y = 1 1 − p , o t h e r w i s e p_t= \left\{ \begin{aligned} p,\ \ \ \ \ if\ y=1 \\ 1-p,\ otherwise\\ \end{aligned} \right. pt={p, if y=11−p, otherwise,则 C E ( p , y ) = C E ( p t ) = − l o g ( p t ) CE(p,y)=CE(p_t)=-log(p_t) CE(p,y)=CE(pt)=−log(pt)
p t p_t pt越大,表明分类结果越正确,样本难易程度就越easy; p t p_t pt越小,表明分类结果越不正确,样本难易程度就越hard。于是可以根据 p t p_t pt的大小来调整难易样本的损失权重,得到如下形式的Focal loss
F L ( p t ) = − ( 1 − p t ) γ l o g ( p t ) , γ ≥ 0 FL(p_t)=-(1-p_t)^{\gamma}log(p_t),\ \ \gamma \geq0 FL(pt)=−(1−pt)γlog(pt), γ≥0
讨论:
- 当 γ = 0 \gamma =0 γ=0时, F L ( p t ) = C E ( p t ) FL(p_t)=CE(p_t) FL(pt)=CE(pt);
- p t p_t pt越大,表示分类越正确,此时权重因子 ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ越小,损失越小。
- 对于大量的easy examples(easy negative或easy positive),网络较容易实现正确分类,这时网络将产生大量的well-classified examples( p t ≥ 0.6 p_t \geq0.6 pt≥0.6)。focal loss通过对CE loss添加一个很小的权重因子,减小了well-classified examples的损失;
- 对于bad-classified examples,权重因子 ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ接近1,CE loss基本不减小。
- focal loss使网络更加注重hard and misclassified examples,而减小对well-classified examples的学习。
注:论文使用了
α
\alpha
α-balanced CE loss:
C
E
(
p
t
)
=
−
α
t
l
o
g
(
p
t
)
CE(p_t)=-\alpha_tlog(p_t)
CE(pt)=−αtlog(pt),其中,
α
t
=
{
α
,
i
f
y
=
1
1
−
α
,
o
t
h
e
r
w
i
s
e
\alpha_t= \left\{ \begin{aligned} \alpha,\ \ \ \ \ if\ y=1 \\ 1-\alpha,\ otherwise\\ \end{aligned} \right.
αt={α, if y=11−α, otherwise,表示对正负样本添加一个权重。则相应的focal loss为:
F
L
(
p
t
)
=
−
α
t
(
1
−
p
t
)
γ
l
o
g
(
p
t
)
FL(p_t)=-\alpha_t(1-p_t)^{\gamma}log(p_t)
FL(pt)=−αt(1−pt)γlog(pt)论文指出,
γ
=
2
\gamma=2
γ=2,
α
=
0.5
\alpha=0.5
α=0.5时,效果最好。
α
=
0.5
\alpha=0.5
α=0.5时,正负样本权重相等,结果退化为最原始的focal loss。
3. RetinaNet
3.1 整体结构
-
RetinaNet的网络结构是在ResNet-FPN的每个特征层后面接两个子网络,分别是 Classification Subnet 和 Bbox Regression Subnet。整体结构如下:
-
Classification Subnet 结构为: 4 × 4\times 4×conv ( 3 × 3 3\times3 3×3的卷积核,卷积核深度为 C=256,ReLu激活)+ 1 × 1\times 1×conv( 3 × 3 3\times3 3×3的卷积核,卷积核深度为 KA,激活函数为sigmoid函数),KA表示K种类别A个anchor。
-
Bbox Regression Subnet 的结构与Classification Subnet 差不多,区别在于Bbox Regression Subnet 最后一层卷积层的卷积核深度为4A,且不使用激活函数,其结构为: 4 × 4\times 4× conv ( 3 × 3 3\times3 3×3的卷积核,卷积核深度为 C=256,ReLu激活)+ 1 × 1\times 1×conv 3 × 3 3\times3 3×3的卷积核,卷积核深度为 4A,无激活函数)。
这个结构要注意几点:
- 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
- 测试时FPN每一级只选取score最大的1000个example来做nms;
- 分类分支的最后一层卷积的bias初始化成 − l o g ( ( 1 − π ) / π ) -log((1-\pi)/\pi) −log((1−π)/π),其中 π = 0.01 \pi=0.01 π=0.01。目的是防止在训练初期,大量的背景样本导致模型不稳定(如果不存在严重的正负样本不平衡问题,则可初始化为0)。
3.2 与FPN相比
ResNet的conv stage的output分别为 C 1 , C 2 , C 3 , C 4 , C 5 C_1,C_2,C_3,C_4,C_5 C1,C2,C3,C4,C5,其尺寸分别为: N / 2 l , l = 1 , 2 , 3 , 4 , 5 N/{2^l},\ l=1,2,3,4,5 N/2l, l=1,2,3,4,5, N N N是输入图像大小。
FPN利用
C
2
,
C
3
,
C
4
,
C
5
C_2,C_3,C_4,C_5
C2,C3,C4,C5分别生成
{
P
2
,
P
3
,
P
4
,
P
5
}
\{P_2,P_3,P_4,P_5\}
{P2,P3,P4,P5},再由
P
5
P_5
P5经卷积
3
×
3
/
s
2
3\times3/s2
3×3/s2生成
P
6
P_6
P6;
RetinaNet利用
C
3
,
C
4
,
C
5
C_3,C_4,C_5
C3,C4,C5分别生成
{
P
3
,
P
4
,
P
5
}
\{P_3,P_4,P_5\}
{P3,P4,P5},再由
C
5
C_5
C5经卷积
3
×
3
/
s
2
3\times3/s2
3×3/s2生成
P
6
P_6
P6,由
P
6
P_6
P6经ReLU+卷积
3
×
3
/
s
2
3\times3/s2
3×3/s2生成
P
7
P_7
P7;
-
使用了多少层特征:
(1)FPN中的RPN head连接在 { P 2 , P 3 , P 4 , P 5 , P 6 } \{P_2,P_3,P_4,P_5,P_6\} {P2,P3,P4,P5,P6}之后;
(2)FPN中的Fast R-CNN head连接在 { P 2 , P 3 , P 4 , P 5 } \{P_2,P_3,P_4,P_5\} {P2,P3,P4,P5}之后;
(3)RetinaNet的head连接在 { P 3 , P 4 , P 5 , P 6 , P 7 } \{P_3,P_4,P_5,P_6,P_7\} {P3,P4,P5,P6,P7}之后; -
head中的分类分支和回归分支是否有共用的神经层:RetinaNet无,FPN有(RPN head和Fast R-CNNhead均有)。
-
不同层级之间的分类分支是否参数共享:RetinaNet有,FPN无
-
不同层级之间的回归分支是否参数共享:RetinaNet有,FPN无
-
不同层级之间anchor的设置:RPN在特定的层级只设置一种特定scale的anchor,RetinaNet在不同层级均设置了不同scale的anchor(e.g.,每一层级均设置了3种scale的anchor),YOLOv3和YOLOv4沿用了RetinaNet的这种做法。
3.3 与OHEM的对比
OHEM原理:https://blog.csdn.net/weixin_41560402/article/details/106357608
- 相同点:都更加注重hard,misclassified examples
- 不同点:OHEM直接舍弃了部分easy examples(相当于直接将该部分loss设置为0),而Focal loss只是减小easy examples的loss,并没有将其设置为0。
注:OHEM 1:3是SSD的做法,保留正样本的loss,对负样本的loss进行排序,选择合适的top-k个loss,保证正负样本比例为1:3。
- 可以看出Focal loss更加有效,并且其对batch_size和nms thr不那么敏感。
4. 实验