RetinaNet:Focal Loss for Dense Object Detection

一、前言

  • 目前的深度学习目标检测器中,One-stage的精度始终落后于two-stage
  • 本文发现其中心原因为训练过程中前景与背景类别极端的不平衡
  • 为解决该问题,本文重塑了标准交叉熵损失函数,即减少易分类样本的权重来进行平衡,提出了Focal Loss
  • 为评估所提出的损失函数的有效性,本文设计并训练了一个简单的目标检测器——RetinaNet

1.1 类别不平衡

1.1.1 类别不平衡问题是什么?

目标检测算法在训练过程中,会生成成千上万个候选区域,这些候选区域是用于确定输入图像中目标的位置的,但是一张图像中目标物体顶多也就只有几个,所以,这就意味有大量的候选区域属于背景,只有极少量的候选区域属于目标物体,这就是所谓的前景-背景类别极端不平衡问题。

注意:

  • 属于背景的候选区域为负样本,属于前景的候选区域为正样本
  • 这里的类别不平衡既有正负样本的不平衡,也包括易分类负样本和难分类负样本的不平衡。

1.1.2 为什么类别不平衡会导致精度降低?

因为负样本的数量占据了总样本中的绝大部分,这就会造成最终算出的training loss为占绝对多数但包含信息量却很少的负样本所支配,少样正样本提供的关键信息却不能在一般所用的training loss中发挥正常作用,从而无法得出一个能对模型训练提供正确指导的loss。

换句话说,就是类别不平衡问题的出现,导致了模型更多地学习了背景的特征而没有很好的学习要检测的目标的特征

1.2 One-stage VS Two-stage

1.2.1 结构对比

基于深度学习的目标检测算法有两类经典的结构:Two Stage 和 One Stage

Two Stage: 例如Faster-RCNN算法。
第一级专注于proposal的提取,第二级对提取出的proposal进行分类和精确坐标回归。两级结构准确度较高,但因为第二级需要单独对每个proposal进行分类/回归,速度上就打了折扣

One Stage: 例如SSD,YOLO算法。
此类算法摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构

1.2.2 精度差异分析

由上述可知,One-stage和Two-stage的目标检测算法,其精度差异是由正负样本类别不平衡问题所造成的,下面来进行详细分析:

Two Stage:
该系列算法在生成候选区域的阶段,使用的Selective Search, EdgeBoxes, RPN的结构极大的减少了背景框的数量,最终得到的候选区域大约为1k~2k。在分类阶段,使用一些策略,如使前景背景的比例为1:3,或者OHEM算法,这样就使得正负样本达到了一个平衡

One Stage:
One-Stage算法在进行下采样的同时产生预选框,在实际中经常会产生很多框,如SSD300产生了8732个预选框,SSD512产生了2万多个,但是真正的正样本的框却很少,就造成了样本间的类别极度不平衡,虽然有时会使用bootstrapping和hard example mining,但是效率很低

二、模型与方法

2.1 设计思路

  • 为了解决类别不平衡问题——提出了Focal Loss
  • 为了评估Focal Loss的有效性——提出了RetinaNet

2.2 Focal Loss

2.2.1 CE(cross-entropy) loss

作者从标准交叉熵损失函数出发,其公式为:
CE(p,y)={log(p),        if  y=1log(1p), otherwiseCE(p, y)=\begin{cases} -log(p),~~~~~~~~if ~~y =1 \\ -log(1-p),~otherwise \end{cases}其中:

  • y{±1}y\in \{ ±1\},y=1表示正样本,y=-1表示负样本
  • p[0,1]p\in[0,1],p表示模型预测的正样本属于不同类别的概率

为方便标记,将交叉熵二分类损失函数定义如下:
CE(p,y)=CE(pt)=log(pt)CE(p,y)=CE(p_t)=log(p_t)其中:

  • pt={p,        if y=11p, otherwisep_t=\begin{cases} p,~~~~~~~~if~y=1 \\ 1-p, ~otherwise \end{cases}

2.2.2 Balanced CE loss

考虑到上述提到的正负样本类别不平衡问题对最终的损失函数的影响,自然能想到通过在loss公式中使用与目标存在概率成反比的权重系数对其进行较正,从而得到改进的损失函数Balanced CE loss,公式如下:
CE(pt)=αtlog(pt)={αtlog(p),                 if  y=1(1αt)log(1p), otherwiseCE(p_t)=-\alpha_t log(p_t)=\begin{cases} -\alpha_tlog(p),~~~~~~~~~~~~~~~~~if ~~y =1 \\ -(1-\alpha_t)log(1-p),~otherwise \end{cases}其中:

  • αt[0,1]\alpha_t\in[0,1]αt\alpha_t为超参,通过交叉验证来设置
  • 正样本使用权重系数αt\alpha_t,负样本使用1αt1-\alpha_t

2.2.3 Focal Loss

由上述的定义可知,Balanced CE loss能平衡正负样本的重要性,但无法区分易分类样本和难分类样本,因此作者提出提出在交叉熵损失函数前增加一个调节因子(1pt)γ(1-p_t)^\gamma,从而得到Focal Loss,其公式如下:
FL(pt)=(1pt)γlog(pt)={(1p)γlog(p),    if  y=1pγlog(1p),      otherwiseFL(p_t)=-(1-p_t)^\gamma log(p_t)=\begin{cases} -(1-p)^\gamma log(p),~~~~if ~~y =1 \\ -p^\gamma log(1-p),~~~~~~otherwise \end{cases}其中:

  • γ0\gamma ≥0,为可调节的超参,用来降低易分类样本的权重
  • γ=0\gamma =0 时,FL(pt)=CE(pt)FL(p_t)=CE(p_t)

ptp_t趋于1的时候,说明该样本为易分类样本,则调节因子(1pt)γ(1-p_t)^\gamma趋于0,对Loss的贡献就会很小
ptp_t趋于0的时候,说明该样本为难分类样本,则调节因子(1pt)γ(1-p_t)^\gamma趋于1,对Loss的贡献相对来说就会更大,从而有效地易分类样本和难分类样本

举例:
设定γ=2\gamma=2,假设现在有一个样本
若其ptp_t=0.9,则其FL损失项要比原来的CE损失项100多倍
若其ptp_t=0.968,则会小1000多倍

为观察不同的γ\gamma的取值对FL的影响,作者进行一系列的实验,如下图所示
RetinaNet:Focal Loss for Dense Object Detection
结果:

  • 随着γ\gamma值的增加,调节因子所带的影响也随之增加
  • γ=2\gamma=2 时,产生的效果最佳
  • γ=0\gamma=0 时,Focal Loss的效果与CE Loss一致

在后续的实验中,作者将αt\alpha_t添加到Focal Loss中,得到的Focal Loss的另外一种形式:
FL(pt)=αt(1pt)γlog(pt)={αt(1p)γlog(p),        if  y=1(1αt)pγlog(1p), otherwiseFL(p_t)=-\alpha_t(1-p_t)^\gamma log(p_t)=\begin{cases} -\alpha_t(1-p)^\gamma log(p),~~~~~~~~if ~~y =1 \\ -(1-\alpha_t)p^\gamma log(1-p),~otherwise \end{cases}

实验结果表明:

  • 它比原始的Focal Loss效果更好,产生了轻微的精度提升
  • γ=2,αt=0.25\gamma=2, \alpha_t=0.25 时,ResNet-101+FPN作为backbone的结构具有最佳的性能

2.3 RetinaNet

RetinaNet:Focal Loss for Dense Object Detection

RetinaNet的总体结构: ResNet + FPN + 分类和回归的Subnet

2.3.1 BackBone

RetinaNet采用构建在ResNet基础上的FPN作为主干网络,提取得到的特征金字塔有5个level——P3P7P_3—P_7,其中:

  • P3P5P_3—P_5 是从相应的ResNet的 C3C5C_3—C_5 经过自上而下和横向连接的结构得到的
  • P6P_6C5C_5经过步长为2、卷积核大小为3x3的卷积操作得到的
  • P7P_7P6P_6经过ReLU**函数后,再经过步长为2、卷积核大小为3x3的卷积操作得到的
  • PlP_l中的下标l表示level,每个level意味着对原图进行了2l2^l的缩放,且每个level通道均为256

与FPN原文中的不同点:

  • 介于计算量的考虑,本文没有使用FPN原文中得到的特征金字塔总高分辨率的P2P_2
  • P6P_6通过步长为2的卷积操作得到的,没有用FPN原文中的下采样方法
  • 为了提升对大目标的检测性能,本文将P7P_7纳入使用,而FPN原文中没有用

2.3.2 Anchors

Anchors的设置:

  • level P3P_3P7P_7 对应的anchor尺寸为32232^25122512^2
  • 每个level的的长宽比均为{1:2,1:1,2:1}\{1:2,1:1,2:1\}
  • 为了能够预测出更密集的目标,每个长宽比的anchor添加原设定尺寸的{20,21/3,22/3}\{2^0 ,2^{1/3},2^{2/3}\}大小的尺寸,所以每个level总共有9个anchor
  • 每个anchor赋予长度为K的one-hot向量和长度为4的向量,K为类别数,4为box的坐标,与RPN类似
  • IoU大于等于0.5的anchor视为正样本,设定其one-hot向量的对应值为1
  • [0, 0.4)的anchor视为背景,[0.4, 0.5)的anchor不参与训练

2.3.3 分类和回归的Subnet

RetinaNet:Focal Loss for Dense Object Detection
Classification Subnet:

  • 分类子网是一个FCN连接FPN的每一level,分类子网是权值共享的,即共用一个FPN
  • 四层3x3xC的卷积,最后一层的卷积3x3xKA,其中C=256,A=9,K为类别数
  • 最后经过Sigmoid**函数,输出的feature map上的每一个点对应的一个KA维的预测向量

Box Regression Subnet

  • 定位子网结构与分类子网类似,只是将最后的卷积大小改为4xAx3x3
  • 每个anchor学习4个参数,代表当前Anchor box与Ground Truth间的偏移量,这个与R-CNN类似
  • 这里的定位子网是类不可知的(class-agnostic),它参数量更少,但是一样有效

三、总结

3.1 解决的问题

问题:

  • 目标检测模型训练过程中前景与背景类别极端不平衡问题

解决:

  • 重塑了标准交叉熵损失函数,即减少易分类样本的权重来进行平衡,提出了Focal Loss

3.2 主要创新点

  • 提出了能解决类别不平衡问题的损失函数——Focal Loss
  • 结合了并应用了FPN和Focal Loss,设计出了一个精度可以媲美Two Stage算法的One Stage算法模型–RetinaNet

四、参考文献

[1] https://zhuanlan.zhihu.com/p/98913633
[2] https://zhuanlan.zhihu.com/p/59910080
[3] https://zhuanlan.zhihu.com/p/53259174
[4] https://www.jianshu.com/p/8e501a159b28
[5] https://blog.csdn.net/JNingWei/article/details/80038594