RetinaNet

论文: 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)(1y)log(1p)={log(p),     if y=1log(1p), 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=11p, 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)=(1pt)γ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} (1pt)γ越小,损失越小。
  • 对于大量的easy examples(easy negative或easy positive),网络较容易实现正确分类,这时网络将产生大量的well-classified examples( p t ≥ 0.6 p_t \geq0.6 pt0.6)。focal loss通过对CE loss添加一个很小的权重因子,减小了well-classified examples的损失;
  • 对于bad-classified examples,权重因子 ( 1 − p t ) γ (1-p_t)^{\gamma} (1pt)γ接近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(1pt)γ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. 实验

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值