目标检测模型-RetinaNet

[TOC]

RetinaNet

这里主要介绍采用了新的Loss函数Focal Loss的单阶段目标检测器,RetinaNet。

背景

目前单阶段检测器已经广泛的应用到了常规的、密集目标的检测任务,但还是无法达到两阶段方法的精度。作者认为,主要原因是前景和背景类别的极度不平衡所导致的。因此,本文中提出了一种新的损失函数来解决这个问题。

什么是easy/hard positive/negtive example

目标检测模型-RetinaNet_第1张图片

如上图所示,候选框可以分类positive和negtive两类,与真实框的iou大于指定阈值比如0.5的归为positive, 与真实框的iou小于指定阈值比如0.4的归为negative。

两阶段模型为何精度高

类R-CNN模型通过两阶段的级联和启发式采样来解决类别不平衡问题,候选阶段会将目标候选的数量大幅下降到一个很小的数目1-2k,从而过滤掉大部分背景候选。

在第二阶段分类器中,通过使用启发式采样,比如前景-背景比率(1:3)修正,或者在线难样本挖掘(Online hard example mining, OHEM)来保持前景-背景的可控平衡。

单阶段模型为何精度偏低

单阶段方法中,会产生大量的目标框候选。通常它们也会使用相同的启发式采样策,然而它们并不起效,训练过程中仍然被容易分类的背景样本所主导。

  1. 针对所有的negtive example,数量过多造成它的loss太大,以至于主导了损失函数,不利于收敛。
  2. 针对单个negtive example来说,大多数的negative example不在前景和背景的过渡区域上,分类很明确(这种易分类的negative称为easy negative),训练时对应的背景类score会很大,换句话说就是单个example的loss很小,反向计算时梯度小。梯度小造成easy negative example对参数的收敛作用很有限,我们更需要loss大的对参数收敛影响也更大的example,即hard positive/negative example。

目前流行的单阶段检测器,比如Yolo对正负样本的误差给予不同的权重,降低负样本的权重。SSD使用Hard negative mining对负样本的数量进行限制(3:1)。它们可以有效的解决第1个问题。但无法解决第2个问题。

Focal loss

首先来回顾一下二分类的交叉熵误差,$y=1$表示正类

$$CE(p, y) =\begin{cases} -log(p)&if \quad y=1 \\ -log(1-p)\quad &otherwise\end{cases}\tag{1}$$

写成另外一种形式

$$p_t =\begin{cases} p&if \quad y=1 \\ 1-p\quad &otherwise\end{cases}$$

$$CE(p,y)=CE(p_t)=-log(p_t)\tag{2}$$

从上面的公式可以看出,大量容易分类的样本的误差累计求和,会产生巨大的误差,从而淹没掉稀少的类别(物体)的误差。

一种常用的解决类别不平衡的方式是,引入权重因子$\alpha$,$ \alpha \in [0, 1]$,$\alpha$平衡的交叉熵误差如下所示

$$CE(p_t)= -\alpha_t log(p_t)\tag{3}$$

这是交叉熵函数的简单扩展。

上述的改进,考虑了类别之间(positive sample和negative sample)的不平衡问题,但它并没有区分难样本(Hard sample)和容易样本(easy sample)。而通常easy sample是占目标候选的绝大多数的,它们对Loss function的贡献最大,具有大的梯度,因此它们会主导网络的训练。

但这些容易分类的样本对于网络的训练帮助并不大,

因此作者下调了交叉熵损失函数中easy sample的权重,提高hard sample的权重,使得网络更加关注hard sample。

在式3的基础上,增加了一个新的因子$(1-p_t)^\gamma$,包含一个可调节的关注参数$\gamma\geq0$,定义focal loss(FL)函数为

$$FL(p_t)= -(1-p_t)^\gamma log(p_t)\tag{4}$$

下图展示了不同$\gamma$取值下,FL的变化

目标检测模型-RetinaNet_第2张图片

从上图可以得出Focal loss的两个属性

  1. 当一个样本误分类时,它的概率$p_t$较小,$(1-p_t)^\gamma$接近于1,它的误差将不会受到太大影响。相反的,如果一个样本的概率特别大,比如一个负样本的预测概率为0.9(simple sample),$(1-0.9)^2=1e-2$,FL比与CE缩小了$10^2$倍。使用FL后,easy sample所带来的误差大大降低。
  2. ”关注“参数$\gamma$可以平滑调节easy sample的权重,$\gamma=0$时等同于CE。作者在论文中表示,$\gamma=2$在试验中取得了最好的效果。

通常,FL中也会加入类别权重参数$\alpha$,于是FL可以写成

$$FL(p_t)= -\alpha (1-p_t)^\gamma log(p_t)\tag{5}$$

RetinaNet

RetinaNet是一个单阶段的目标检测模型,网络结果如下图所示。整个网络使用Resnet作为backbone,在Resnet的基础上使用了FPN网络的结构,金字塔的每一个层级的特征图都可以在不同尺度上进行目标检测。在FPN之上,每个检测层分别对应一个目标检测子网络。子网络内,包含了2个分支,上方用于分类,下方用于回归。

在每个检测层,都是用了(1:1, 1:2, 2:1)3种长宽比,以及$(2^0,2^{\frac{1}{3}},2^{\frac{2}{3}})$3种尺寸的的anchor,即每层共有9种anchor。

  • 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练。
  • 测试时FPN每一级只选取score最大的1000个example来做nms。
  • 整个结构不同层的head部分(上图中的c和d部分)共享参数,但分类和回归分支间的参数不共享。

目标检测模型-RetinaNet_第3张图片

Online hard example mining

在线难样本挖掘(OHEM)是一种通过选择难样本来降低计算成本的方式,可以在边界条件下提高网络性能。主要用在目标检测。比如我们想要训练一个检测汽车的模型。在实践过程中,你发现负样本比正样本的数目多得多,为了解决这个问题,一种聪明的做法是选择一个对网络训练最有效的负样本子集来训练网络。OHEM就是实现样本子集选择的方式。

通常,为了选择负样本子集,需要迭代训练网络若干次,然后在你选择的负样本子集上运行你的网络,然后选择那些具有较大误差的负样本。这个过程非常耗时,因为你可能有大量的影像数据

OHEM通过分批执行难样本选择来解决上述的问题。给定批处理大小的K,它将执行常规前向传播并按实例计算损失。然后,它在具有高损失值的批次中找到M

Reference

Focal Loss for Dense Object Detection

目标检测算法之RetinaNet(引入Focal Loss)

RetinaNet with pytorch

Online Hard Example Mining on PyTorch

你可能感兴趣的:(神经网络,目标检测)