前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Focal Loss for Dense Object Detection(文献阅读)

Focal Loss for Dense Object Detection(文献阅读)

作者头像
狼啸风云
修改2022-09-04 21:56:36
1.4K0
修改2022-09-04 21:56:36
举报

动机

尽管两阶段检测器取得了成功,那么问题就是:一个简单的单阶段能达到类似的精度吗?单阶段应用于目标位置、尺度和纵横比的常规、密集采样。最近在YOLO和SSD等单阶段上的研究显示出了很有前景的结果,与最先进的两阶段方法相比,能产生精度在10-40%以内的更快的探测器。本文进一步拓展了这一领域:首次提出了一种单阶段目标检测器,与更复杂的两阶段检测器的最先进的COCO AP相匹配。为了达到这一结果,确定了训练过程中的类不平衡是阻碍单阶段检测器达到最高精度的主要障碍,并提出了一种新的损失函数来消除这一障碍。

思路

类不平衡问题是通过两阶段级联和采样启发式算法来解决的。提proposal阶段(例如Selective Search算法、EdgeBoxes、DeepMask、RPN)快速地将候选对象位置的数量减少到一个小数目,过滤掉大部分背景样本。在第二个分类阶段,执行采样启发式,例如固定的前背景比(1:3)或在线硬示例挖掘(OHEM)[31],以保持前景和背景之间的可管理的平衡。

相比之下,单阶段检测器必须处理大量在图像中均匀采样候选框位置。在实践中,这通常相当于枚举约100k个位置,这些位置密集地覆盖了空间位置、尺度和纵横比。虽然也可以使用类似的抽样启发法,但是效率很低,因为训练过程仍然很容易的分类成背景类。这种低效率是对象检测中的一个经典问题,通常通过bootstrapping[33,29]或hard example mining[37,8,31]等技术来解决。

在本文中,我们提出了一个新的损失函数,它比以往处理类不平衡的方法更有效。损失函数是一个动态缩放的交叉熵损失,当对正确类的置信度增加时,比例因子衰减为零,如下图所示。

直观地,这个比例因子可以自动降低训练过程中简单示例的权重,并快速地将模型集中在困难示例上。实验表明,焦损失使能够训练一个高精度的单阶段检测器,该检测器的性能显著优于使用采样启发式或硬示例挖掘,以前最先进的单级检测器训练技术。最后,我们注意到焦距损失的确切形式并不重要,我们还展示了其他实例化可以获得类似的结果。

为了证明所提出的焦损耗的有效性,我们设计了一个简单的单级目标检测器,称为Retinanet,它的名字来源于对输入图像中目标位置的密集采样。它的设计特点是高效的网络内特征金字塔和anchor box的使用。借鉴了来自的各种最新观点。RetinaNet高效、准确;我们的最佳模型基于ResNet-101-FPN主干,在运行速度为5 fps的情况下,实现了COCO test-dev AP 39.1,超过了之前发布的单模型最好的单阶段检测器和两阶段检测器的结果,如下图所示。

创新点

(1)Focal loss的详细推导

Focal loss的设计是为了解决一个阶段的目标检测场景,在训练阶段有一个极端不平衡的前景和背景类。从二分类的交叉熵开始引出Focal loss,

C E=\left\{\begin{array}{c} -\log (p) \text { if } y=1 \\ -\log (1-p) \text { otherwise } \end{array}\right.

在上述式子中y \in\{\pm 1\} 指定了标签类,并且p \in[0,1] 是当标签y=1时模型对类的估计概率。为了便于标注,定义p_t

p_{t}=\left\{\begin{array}{r} p \text { if } y=1 \\ 1-p \text { otherwise } \end{array}\right.

并且重写C E(p, y)=C E\left(p_{t}\right)=-\log \left(p_{t}\right)

CE是上图中的蓝色曲线,这种损失的一个值得注意的性质是,即使是容易分类的例子也会造成非平凡的损失,这一点在其图中很容易看出\left(p_{t} \gg .5\right) 。当对大量简单的示例进行求和时,这些小的损失值可能会淹没很少的类。

解决类不平衡问题的常见方法是引入一个因子\alpha \in[0,1] 对类1和1-\alpha 对类-1。在实践中α可以设置通过逆类频率或视为通过交叉验证设置的超参数。为了便于标记,把\alpha-balanced

CE损失写为:C E\left(p_{t}\right)=-\alpha_{t} \log \left(p_{t}\right)

这个损失是CE损失的一个简单延伸,为我们提出的Focal loss考虑一个实验的baseline。

实验结果表明,在稠密探测器训练过程中所遇到的较大的类不平衡抵消了交叉熵损失。容易分类的负样本构成了大部分的损失,并主导梯度。而α平衡正面/负面例子的重要性,不区分容易/难的例子。相反,我们建议重塑损失函数,减少简单例子的权重,从而将训练重点放在困难的负面因素上。

更一般的,我们提出对交叉熵损失增加一个调制因子\left(1-p_{t}\right)^{\gamma} ,利用可调焦虑的参数\gamma \geqslant 0 ,将focal loss定义为:

F L\left(p_{t}\right)=-\left(1-p_{t}\right)^{\gamma} \log \left(p_{t}\right)

Focal loss可以用若干个值来表示\gamma \in[0,5] ,如最上图所示。注意Focal loss的两个性质:(1)当一个例子被误分类并且p_t 比较小的时候,调制系数接近1并且损失无影响。因为p_t 趋近于1,并且因子趋近于0,分类良好的示例的损失是向下加权的。(2)聚焦参数\gamma 平滑的调整速度,在这种情况下,简单的例子就会被减权。当\gamma = 0时,FL相当于CE,当γ增加调制的影响因素是同样增加(在实验中发现\gamma=2 是最佳的)。

直观地说,调制因子减少了来自简单示例的损失贡献,并扩展了示例接受低损失的范围。例如,使用\gamma=2p_t=9 时例子的分类相比于CE损失降低了100倍,p_t=0.968 时损失降低了1000倍。这反过来又增加了纠正错误分类示例的重要性,对p_{t} \leq .5\gamma=2 ,损失最多降低了4倍。

在实际中使用Focal loss的\alpha-balanced 变体:

F L\left(p_{t}\right)=-\alpha_{t}\left(1-p_{t}\right)^{\gamma} \log \left(p_{t}\right)

在实验中采用这种方法和非\alpha-balanced 相比精度有略微的提升。最后,我们注意到,损失层的实现结合了计算p的sigmoid操作和损失计算,使得数值更加稳定。

默认情况下,二值分类模型初始化为输出y = - 1或1的概率相等。在这样的初始化下,在类不平衡的情况下,由于类频率而造成的损失会主导全员损失,导致早期训练的不稳定。为了解决这一问题,在训练开始时引入了“先验”的概念,即稀有类(前景)的模型估计的p值。我们通过π表示先验,这样模型的估计p稀有类的例子很低,例如0.01。我们注意到这是模型初始化的一个变化(参见§4.1),而不是损失函数的变化。我们发现,在严重严重不平衡的情况下,这种方法可以提高交叉熵和焦点损失的训练稳定性。

两阶段检测器通常通常用交叉熵损失来训练不用\alpha-balanced 或Focal loss。相反,两阶段检测器通过两种机制来解决类不平衡问题:(1)两级联和(2)有偏的小批量抽样。第一个级联阶段是一个目标建议机制,它将几乎无限的可能目标位置集减少到1000或2000个。重要的是,所选择的建议不是随机的,而是可能与真实的对象位置相对应的,这消除了绝大多数容易产生的负面影响。在培训第二阶段时,偏置抽样通常用于构建包含正、负样本比例为1:3的minibatch。这个比例是一个隐式实现通过抽样\alpha-balanced 因素。我们提出的Focal loss是通过损失函数在一阶段检测器中直接解决这个问题。

(2)Retinanet

Retinanet是由一个主干网和两个特定于任务的子网组成的单一、统一的网络。主干负责计算整个输入图像上的卷积特征图,是一个自定义卷积网络。第一子网对骨干网的输出进行卷积对象分类;第二个子网络执行卷积边界盒回归。这两个子网具有一个简单的设计,我们特别针对单阶段密集检测提出了这个设计,如下图所示。虽然对于这些组件的细节有许多可能的选择,但是大多数设计参数对实验中显示的精确值并不特别敏感。接下来我们将描述Retinanet的各个组成部分。

FPN骨干网:采用特征金字塔网络(FPN)作为支持网络的骨干网络。简而言之,FPN通过自顶向下的路径和横向连接扩展了一个标准的卷积网络,使得该网络能够有效地从一个分辨率输入图像构建一个丰富的多尺度特征金字塔,如上图(a)-(b)所示。金字塔的每一层都可以用来探测不同尺度的物体。FPN改进了全卷积网络(FCN)的多尺度预测,这可以从RPN和深度掩码(DeepMask-style)方案以及两级检测器(Fast R-CNN或Mask R-CNN)的改进中看出。接下来,我们在ResNet架构的基础上构建FPN。构建了一个从P3级到P7级的金字塔,其中l表示金字塔级(P_l 的分辨率比输入低2^l )。在所有金字塔级别有C = 256通道。金字塔的细节通常会有一些细微的差别。虽然很多设计选择并不重要,但我们强调使用FPN主干网是至关重要的;仅使用最后一层ResNet的特征进行的初步实验获得了较低的AP。 

Anchor:使用平移不变的锚框,类似于Fast R-CNN中的RPN变体。在P3 ~ P7层,锚点的面积分别为32^{2} \sim 512^{2} 。就像Fast R-CNN中一样,在每个金字塔级别,使用三个纵横比(1:2,1:1,2:1)的锚。对于比Fast R-CNN更密集的尺度覆盖,在每一层我们都添加了原3个纵横比锚的尺寸\left\{2^{0}, 2^{1 / 3}, 2^{2 / 3}\right\} 的锚。这在我们的设置中改进了AP。每层总共有一个A=9个锚点,它们覆盖了32 -813像素范围内的网络输入图像。每个锚点都有一个长度为K的分类目标的一个hot向量,其中K为对象类的数量,一个box regression目标的4个向量。我们使用了来自RPN的赋值规则,但修改了多类检测和调整阈值。具体来说,锚点使用相交IoU阈值0.5分配到背景对象框;如果groundtruth个背景的IoU在[0,0.4]则被归为背景类。由于每个锚点最多分配给一个对象框,我们将其长度K label向量中的对应条目设置为1,所有其他条目设置为0。如果一个锚没有被分配,这可能发生在重叠的[0.4,0.5],它在训练期间被忽略。盒回归目标计算为每个锚点与其分配的对象盒之间的偏移量,如果没有分配,则省略。

分类子网络:分类子网为每个A锚和k对象类预测对象在每个空间位置出现的概率。这个子网是一个小的FCN附加到每个FPN级;此子网的参数在所有金字塔级别上共享。它的设计很简单。子网从一个给定的金字塔级获取一个带有C通道的输入特征图,应用4个3×3 conv层,每个层都有C个滤波器,每个滤波器后面都有ReLU激活,然后是一个带有K A滤波器的3×3 conv层。最后,sigmoid激活被附加到每个空间位置的KA二进制预测输出中,见上图 (c)。在大多数实验中使用C = 256和A = 9。与RPN相比,对象分类子网更深,只使用3×3 卷积层,并且不与box regression子网共享参数。我们发现这些高层次的设计决策比超参数的特定值更重要。

回归子网络:与对象分类子网并行,我们将另一个小FCN附加到每个金字塔级别,以便将每个锚框的偏移量回归到附近的ground-truth对象(如果存在的话)。盒子的设计回归子网与分类相同子网除了它终止在4线性输出/空间位置,如上图 (d)所示。对每个空间位置的A个锚,这四个输出预测锚和groundtruth框之间的相对偏移量(使用R-CNN的标准box参数)。我们注意到,与最近的工作不同,我们使用了一个类无关的边界框回归器,它使用较少的参数,并且我们发现同样有效。对象分类子网和箱形回归子网虽然具有相同的结构,但使用不同的参数。

训练和测试

推论:RetinaNet形成一个单一的FCN,由一个ResNet-FPN主干、一个分类子网和一个box regression子网组成,如上图所示。因此,推理只涉及通过网络前向传播图像。为了提高速度,我们在阈值检测器置信度为0.05后,只对每个FPN级别的最高1k得分预测进行解码。将各个级别的最高预测进行合并,并使用阈值为0.5的NMS来产生最终的检测结果。

Focal loss:我们使用本文介绍的焦损耗作为分类子网输出的损耗。§5中我们将展示,我们发现\gamma=2 工作在实践和RetinaNet相对强劲的\gamma \in[0.5,5] 。我们强调,当训练RetinaNet时,Focal loss应用于每个采样图像中的所有∼100k锚点。这与通常使用启发式抽样(RPN)或硬示例挖掘(OHEM, SSD)来为每个小批选择一组锚(例如,256)的做法形成了对比。图像的总Focal loss计算为所有∼100k锚点上的Focal loss之和,由分配给ground-truth框的锚点数量标准化。由于绝大多数锚都是易负性的,且在Focal loss下损失值可以忽略不计,所以我们用所分配的锚的个数而不是总锚的个数来进行归一化。最后我们注意\alpha ,权重分配到罕见的类,也有一个稳定的范围内,但它与\gamma 使得有必要选择这两个在一起(见表1 a和1 b)。一般\alpha 应该稍微降低\gamma 增加(\gamma=2\alpha=0.25 的效果最好)。

初始化:使用ResNet-50-FPN和ResNet-101-FPN骨干进行实验。在ImageNet1k上对基础ResNet-50和ResNet-101模型进行预训练。使用原始的残差网络模型。对FPN添加的新层初始化方式和原始FPN一样。所有新conv层RetinaNet子网中除了最后一层用bias b= 0和\sigma=0.01 的高斯权重进行初始化。分类子网络的最后一个卷积层,把bias初始化为b=-\log ((1-\pi) / \pi)\pi 指定在开始训练的时候每个anchor被标记为\pi 的置信度。在所有实验中使用\pi=.01 ,虽然结果对精确值是鲁邦的。这种初始化可以防止大量的背景anchor在训练的第一次迭代中产生较大的、不稳定的损失值。

优化:用随机梯度下降法(SGD)训练Retinanet。在8个GPU上使用同步SGD,每个小批处理共有16个图像(每个GPU 2个图像)。除非另有说明,所有模型都经过90k迭代训练,初始学习率为0.01,然后在60k时除以10,在80k迭代时再除以10。除非另有说明,否则我们使用水平图像翻转作为唯一的数据增强形式。重量衰减为0.0001,动量为0.9。训练损失是box regression中焦距损失与标准光滑L1损失之和。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动机
  • 思路
  • 创新点
  • 训练和测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档