RetinaNet论文详解Focal Loss for Dense Object Detection

一、论文相关信息

​ 1.论文题目:Focal Loss for Dense Object Detection

​ 2.发表时间:2017

​ 3.文献地址:https://arxiv.org/pdf/1708.02002.pdf

4.论文作者: Tsung-Yi Lin, Kaiming He

​ 5.论文源码:code:https://github.com/facebookresearch/Detectron.

二、论文详情

背景与简介

目前最高的检测器是以R-CNN开启的two-stage检测方法,这种方法把分类器应用在离散的目标候选区。而one-stage检测器则是通过在可能出现目标的地方做规则、密集的采样,然后将检测器用于这些地方。
one-stage检测器更快和更简单的,但是在精度是却落后two-stage,导致one-stage detector精度较低的主要原因是训练时样本存在极端的正负样本类(foreground & background class)不平衡现象,即class imbalance。大致可以理解为由于训练时出现大量的容易negative样本,使得损失函数绝大部分由不含信息的负样本构成,进而得到的loss无法为模型训练提供好的指导。
eg:在二分类中正负样本比例存在较大差距,导致模型的预测偏向某一类别。如果正样本占据1%,而负样本占据99%,那么模型只需要对所有样本输出预测为负样本,那么模型轻松可以达到99%的正确率,所以这样的样本训练出来的模型是不准确的。

解决类别不平衡(class imbalance):
  • R-CNN这样的two stage detecors,在其第一个stage——proposal stage的时候就缩小了候选区域的数量,过滤了大多数的background 样本(负样本);第二stage的时候,通过一些启发式的采样,如保持正负样本1:3比例,以及onem在线难样本挖掘等操作,很好的保持了class balance。

  • one-stage detectors则需要处理大的多的候选区,密集的涵盖了每个spatial location,scale,和ratio,虽然也能使用启发式的采样,但是效果很差,因为训练被大量易区分的background样本所支配着,这是检测中的经典问题,通常以难样本挖掘等技术来解决。

作者提出以一个新损失函数Focus loss来解决class imbalance现象,该loss函数重新改造了标准的交叉熵损失(standard cross entropy loss),是一个动态尺度的交叉熵损失(dynamically scaled cross entropy loss),随着正确样本的置信度上升scale会降低至0。这个损失函数能减小分配给良好分类的样本的损失权重,并聚焦于那些难样本这些损失在后面会细讲~

所谓难样本,可以简单理解为不容易区分他是否含有目标物,比如只包含一条腿的一个anchor,难以判断是否为人这个目标。

为了评估这个损失函数Focus loss的有效性,作者设计并训练了一个one-stage的样本密度检测器——RetinaNet,结果表明Focus loss来解决class imbalance的方案远远好于启发式采样或者难样本挖掘等以往应用在one-stage中的方案,使用focus loss时RetinaNet既有one-stage的速度,还超过了当时所有最好的two-stage detector的精度。

Note:focus loss 的具体形式并不是很关键。

Focal Loss

为了介绍Focal loss,首先引入用于二分类的cross entropy(CE) 交叉熵的概念

cross entropy(CE):

在这里插入图片描述
上式中y取值+1或-1,+1代表为ground truth class,-1则不是。p则代表y为groud truth的情况下,估计其为该class的概率。按照惯例,我们令:
在这里插入图片描述
则有CE(p, y) = CE(pt) = − log(pt) 。pt可以看作样本被正确分类的一个概率值,包括被正确分类为background的错误样本和被正确分类为gt class的正确样本。

CE(pt) 损失的曲线可以被看作下图中的蓝色曲线,该曲线具有的一个显著特征是,即使样本很容易分辨(即pt>0.5,属于easy sample),仍然会造成较大的损失。当大量的easy examples loss 相加起来就会得到一个很大的loss值,其他样本的loss就会被overwhelm掉。

Balanced Cross Entropy

解决class imbalance的一个方法是为正样本添加一个权重因子α ∈ [0, 1],为负样本添加一个权重因子1-α。在实践中,α可以通过逆类频率来设置,也可以作为一个超参数通过交叉验证来设置。为了方便,以类似定义pt的方式定义αt。然后得到α-balanced CE loss:
在这里插入图片描述
这是交叉熵的一个简单扩展,通过该α权值,我们可以解决正负样本的不平衡。

Focal Loss Definition

α解决了正负样本的不平衡,但是却不能区分easy/hard examples。因此,focal loss 改造cross loss,使之降低对easy examples的权重,聚焦于hard examples的训练。
具体来讲,给交叉熵增加了一个调节因子(modulating factor)——(1 − pt)γ,其中可调节的参数γ>0。
于是我们的focal loss为:
在这里插入图片描述

在这里插入图片描述

不同γ取值对应的曲线上图中有显示,其中γ为0时函数退化为交叉熵损失。该损失函数有两个特性:

  1. 样本被错误分类时pt很小,整个调节因子接近于1,对loss值几乎无影响。而当样本被很好分类时,pt值趋近于1,调节因子接近于0,使得良好分类的样本loss降低,从而相对的变为关注难样本。
  2. γ增加,调节因子的影响也增加,实验中γ取2最好。
  • 在计算 [公式] 时用sigmoid方法比softmax准确度更高;
  • Focal Loss的公式并不是固定的,也可以有其它形式,性能差异不大,所以说Focal Loss的表达式并不关键。

直观地看,调节因子减小了简单样本的损失贡献,扩展了简单样本的低损失范围。

实践中,使用带α-balance 变量的focal loss 精度会有小的提升,α和γ是有关系的,γ增加时,α应该稍微减小,最佳的取值为γ=2,α=0.25:
在这里插入图片描述

Model Initialization

在有显著的class imbalance时,即background examples远大于foreground examples,但是网络初始化时,对于任何输入,其判断为positive和negative的概率是一样的,而我们focal loss对判断为正确的样本损失会降权重,所以谁被误判的多,谁造成的loss更大。
可认为一半负样本被误分为正,一半正样本被误分为负,但由于负样本基数远大于正样本,于是负样本几乎贡献了loss绝大部分,于是在训练初期,函数会不稳定,模型会偏向于去把样本分为负样本。
为了缓解这个偏差,作者对最后一级用于分类的卷积的bias(具体位置见图2)作了下小修改,把它初始化成一个特殊的值 b = − log((1 − π)/π) 。π在论文中取0.01,这样做能在训练初始阶段提高positive的分类概率。

RetinaNet Detector

RetinaNet Detector由backbone和两个用于特定任务的subnetworks组成,backbone提取整张图片的特征。然后两个subnetworks在backbone输出的特征图上做卷积计算,第一个subnetworks卷积计算object classification 结果,第二个subnetworks做bounding box regression.
结构图:
在这里插入图片描述
backbone使用的是RenNet+FPN,每个使用的三个特征层都为256channel。
注意,这里的FPN是和FCOS一样的,图上画的是只有3层,实际上是在FPN的输出上进一步连接得到p3-p7的5层。
下面对代码运行流程进行描述:

将 ResNet的c3、c4 和 c5 三个特征图全部经过各自 1x1 卷积进行通道变换得到 m3~m5,输出通道统一为 256
从 m5(特征图最小)开始,先进行 2 倍最近邻上采样,然后和 m4 进行 add 操作,得到新的 m4
将新 m4 进行 2 倍最近邻上采样,然后和 m3 进行 add 操作,得到新的 m3
对 m5 和新融合后的 m4、m3,都进行各自的 3x3 卷积,得到 3 个尺度的最终输出 P5~P3
将 c5 进行 3x3 且 stride=2 的卷积操作,得到 P6
将 P6 再一次进行 3x3 且 stride=2 的卷积操作,得到 P7
P6 和 P7 目的是提供一个大感受野强语义的特征图,有利于大物体和超大物体检测。 在 RetinaNet 的 FPN 模块中只包括卷积,不包括 BN 和 ReLU。

总结:FPN 模块接收 c3, c4, c5 三个特征图,输出 P2-P7 五个特征图,通道数都是 256, stride 为 (8,16,32,64,128),其中大 stride (特征图小)用于检测大物体,小 stride (特征图大)用于检测小物体。

每个特征层用三个不同比例,三个尺寸的anchor,总共9个anchor。每个anchor得到一个k维的分类向量和一个4维的box回归向量。IoU>0.5的anchor为positive,被分配到对应的Ground Truth,IoU 在[0,0.4]的为negative,即background,IoU为[0.4,0.5]的忽略。

分类分支和边框回归分支都是FCN子网络,网络的参数对于FPN的每层特征都共享。

  • 分类分支最后输出的channel是A×k,即anchor数×num_class。
  • 边框回归分支输出的channel是4A,每个anchor对应4个参数预测了anchor和ground truth的相对位移。使用RCNN中的参数化方法来回归。

Total loss

训练的总损失由分类的Focal loss 和边框回归的smooth L1 loss组成,其中Focal loss 要计算所有anchor的loss,这一点与其他方法不同,其他方法只是选择一部分的anchor。并且做normalization时除以的是被分配到groud truth的那些anchor的数量。

Inference

inference只需简单前向传播就行,为了加速,每个FPN层只选择检测阈值0.05筛选后得分前1000的anchor做decode(还原得到anchor在原图上的位置),最后所有RPN的预测做merge,然后非极大值抑制nms得到最终结果。

实验结果:

速度与时间的trade off
在这里插入图片描述
和其他detector的比较:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yanghao201607030101/article/details/110083394
今日推荐