Focal Loss 论文笔记

Focal LossFocal Loss for Dense Object Detection

摘要
\quad    \; 到目前为止(2017年8月),目标检测的最高准确率都由R-CNN的衍生算法(two-stage)引领。在该类算法中,会在稀疏的目标候选位置(可能存在目标的位置)上使用一个分类器。相比之下,one-stage目标检测算法直接对原始图像进行密集的检测,这种算法可能更快,更简单,但准确率却一直没有超过two-stage目标检测算法。在本文,我们对该现象进行了研究,发现训练中“目标和背景类别的极度不均衡”(the extreme foreground-background class imbalance encountered)是最主要原因。本文提出通过对标准交叉熵损失函数的改进来解决类别不均衡的问题,改进后的损失函数会降低容易分类的example的权重。本文提出的Focal Loss会重点在难分类的example上训练,防止算法一直停留在对容易分类的example的训练上(Our novel Focal Loss focuses training on a sparse set of hard examples and prevents the vast number of easy negatives from overwhelming the detector during training.)。为了评估本文提出的损失函数的有效性,我们设计并训练了一个简单的密集检测网络----RetinaNet。我们的结果表明:通过使用Focal Loss,RetinaNet超越了现存的two-stage目标检测算法,并且也保持了one-stage检测算法的速度优势。本文相关的代码详见:https://github.com/facebookresearch/Detectron

1. 简介

\quad    \; 当前准确率最高的目标检测算法都是基于 two-stage 算法(基于候选区)。与R-CNN [11] 框架类似,第一阶段产生一组稀疏的对象候选位置,第二阶段使用一个卷积神经网络对候选区域进行分类(一个目标类别或背景)。尽管通过一系列的改进 [10, 28, 20, 14],two-stage 框架连续在COCO比赛中获胜。

\quad    \; 虽然 two-stage 算法已经取得了较大地成功,但人们不禁要问:一个简单的 one-stage 检测算法能不能达到相似的准确率呢?one-stage 检测算法直接将图片作为输入(检测算法考虑了目标的“位置”、“尺度”、“宽高比”)。最近,one-stage 检测算法的相关研究(YOLO、SSD)提高了检测准确率,并且速度比最好的 two-stage 方法快10%~40%。

\quad    \; 我们提出了一个 one-stage 目标检测算法,该算法第一次在COCO上达到了 two-stage 算法(FPN, Mask R-CNN)的准确率。在研究中,我们确定训练过程中的类别不均衡是阻碍 one-stage 检测算法准确率的主要因素,并提出了一个新的损失函数来消除该问题。

\quad    \; 类别不均衡可以通过类似R-CNN的two-stage级联及启发式采样来解决。proposal 生成技术(例如 Selective Search [35], EdgeBoxes [39], DeepMask [24, 25], RPN [28])快速缩小候选对象位置的数量到一个非常小的数字(1-2k),过滤掉绝大部分背景采样。第二个阶段为分类阶段,启发式采样(例如固定的目标,背景比(1:3))或在线hard example mining (OHEM [31]) 被用来处理目标,背景之间的平衡。

\quad    \; 与 two-stage 算法不同,one-stage 检测算法必须处理输入图像的大量的候选目标位置(~100k位置(不同空间位置,尺度、宽高比))。虽然也可以采用启发式采样来进行类别均衡,但其是非常低效的,因为训练过程仍主要由容易分类的背景主导。

\quad    \; 而类似抽样启发式也可能被应用,他们效率低下的训练程序仍由容易分类背景的例子。启发式采样的低效是目标检测算法的经典问题,该问题一般通过 bootstrapping [33, 29] 或 hard example mining [37, 8, 31] 等技术来解决。

\quad    \; 在本文,我们提出了一种新的损失函数(相比前述技术,提出的技术在解决类别不均衡方面更加高效)。提出的损失函数是一种动态缩放的交叉熵损失函数,如图1所示,随着正确类别的置信度的增加,其的缩放系数会逐渐退化到零。直观地说,该缩放系数能够自动降低训练过程中容易分类的 example 的权重,并快速地使模型集中在 hard example。实验表明我们提出的 Focal Loss 可以训练出一个高准确率的one-stage检测算法,并且性能超过了前述的启发式抽样和hard example mining及最好的one-stage检测算法。
在这里插入图片描述
\quad    \; 为了说明提出的 Focal Loss 的作用,我们设计了一个简单的 one-stage 目标检测算法(名为RetinaNet)。其采取了特征金字塔并使用了锚点框。其借鉴了 [22, 6, 28, 20] 的思想。RetinaNet不仅高效,而且准确;我们最好的模型(基于 ResNet-101-FPN backbone)在COCO的test-dev上取得了39.1的AP,同时速度也有5fps,超过了到目前为止的所有one-stage及two-stage检测算法(见图2)。
在这里插入图片描述

2. 相关研究(目标检测的常用方法)

经典目标检测算法:
\quad    \; 滑动窗检测算法。其以滑动的形式对整张图像进行检测,这种方法有着悠久、丰富的历史。Viola and Jones [37]使用boosted 目标检测算法来进行人脸检测,这推动了该种模型的广泛使用。HOG [4] 和通道特征积分 [5] 的引入产生了高效的行人检测算法。DPMs [8] 有助于 dense 检测器扩展到更通用的目标类别并且在PASCAL上有着非常好的结果。滑动窗方法是计算机视觉中的主要检测范式,随着深度学习的复兴、two-stage检测算法的发展,滑动窗方法很快就主导了目标检测算法。

Two-stage检测算法:
\quad    \; 现代目标检测的主流范式基于 two-stage 方法。正如 Selective Search 的研究一样,第一阶段生成一组稀疏的候选 proposal(应该包含所有的目标,同时过滤掉绝大数背景),第二阶段将 proposal 分类为 foreground classes 或 background。R-CNN [11] 将第二阶段的分类器升级为了一个卷积网络,从而使得准确率有了较大提高并且引领了当前的目标检测算法。通过不断的改进,R-CNN 在速度[15, 10]和目标proposal的生成(通过学习来进行proposal的生成)[6, 24, 28]上都有了很大的提高。Region Proposal Networks (RPN) 将proposal 的生成过程和第二阶段集成为单个卷积网络,从而产生了 Faster R-CNN 框架 [28]。另外,已经有很多人对此框架进行了扩展,例如 [20, 31, 32, 16, 14]。

One-stage检测算法:
\quad    \; OverFeat [30]是第一个现代one-stage目标检测算法(基于深度网络)。最近的 SSD [22, 9] 和 YOLO [26, 27] 使得人们又开始关注 one-stage 检测方法。这些算法对检测速度进行了优化(更快),但是它们的准确率却一直低于 two-stage 检测方法。SSD 的 AP 比 two-stage 方法低10-20%,而 YOLO 希望在极致的检测速度和准确率之间找到平衡(见图2)。最近的研究表明,two-stage检测算法可以通过减小输入图像的分辨率和 proposal 的数量来简单地加速检测方法,但是 one-stage 方法的准确率却一直低于 two-stage 方法(即使计算量更大)[17]。本文旨在研究:one-stage检测算法的准确率能否达到或超过two-stage方法,并有相似或更快的检测速度。

\quad    \; RetinaNet检测算法的网络结构与之前的dense检测算法有很多相似之处,尤其是RPN [28]中引入的“anchors”概念、SSD [22]中使用的特征金字塔。这里强调下:RetinaNet检测算法的高准确率不是由于算法在网络结构设计方面的创新,而是由于本文提出的新损失函数。

类别不均衡(Class Imbalance):
\quad    \; 经典的 one-stage 目标检测算法(比如boosted检测算法)、DPMs 及最近的一些研究(比如SSD检测算法)在训练过程中面临类别不均衡的问题(class imbalance)。这些检测算法会给每张图像生成104-105个候选位置,但是只有几个位置含有目标。类别不均衡导致了以下两个问题:(1). 因为大多数位置都是容易分类的背景(不包含有用的学习信息),所以训练时不充分的。(2). 容易分类的背景会主导训练过程并导致训练出的模型性能不高(lead to degenerate model)。一个常见的解决方案是使用某种形式的 hard negative mining [33, 37, 8, 31, 22],这些方法通过对 hard example 进行采样或更复杂的采样/重新赋权重策略 [2]。本文证明了,提出的 focal loss 自然地处理了 one-stage 检测算法中的类别不均衡问题,并允许我们去有效地在所有 example 上训练,而不需要抽样、同时不会出现容易分类的背景主导 loss 和梯度的情况出现。

鲁棒估计(Robust Estimation):
\quad    \; 现在已经有了很多关于鲁棒损失函数的研究(例如:Huber loss)。这些函数通过减小离群值(hard example (with large error))在损失函数中的权重。与之相反,Focal loss 旨在通过降低群内值(easy example (容易分类的背景))在 loss 中的权重(即使这些点很多)来解决类别不均衡问题。换句话说,Focal loss 与之前的鲁棒损失相反:其使得优化算法始终聚焦在一组稀疏的 hard example 上。

3. Focal Loss

\quad    \; Focal Loss 被用来解决 one-stage 检测算法的问题(在 one-stage 检测算法中,foreground 类和 background 类极度不均衡 (例如1:1000))。让我们从二分类交叉熵(CE)损失函数开始 focal loss 的介绍:将 Focal loss 扩展到多分类任务不仅非常简单并且工作的非常好。为了简单,本文将以二分类问题为例进行研究。
(1) CE ( p , y ) = { − log ( p ) if   y = 1 − log ( 1 − p )  otherwise \text{CE}(p,y)= \begin{cases} -\text{log}(p) \qquad \quad \text{if} \ \ y=1 \\ -\text{log}(1-p) \quad \ \text{otherwise}\end{cases} \tag{1} CE(p,y)={ log(p)if  y=1log(1p) otherwise(1)上式中, y ∈ { ± 1 } y\in\{\pm1\} y{ ±1} 用来表明 ground truth 类别, p ∈ [ 0 , 1 ] p\in[0,1] p[0,1] 是模型预测的 y = 1 y=1 y=1 的概率。为了标记方便,我们定义 p t p_{t} pt 为: (2) p t = { p    if   y = 1 1 − p otherwise p_{t}= \begin{cases} p \qquad \ \ \ \text{if} \ \ y=1 \\ 1-p \quad \text{otherwise}\end{cases} \tag{2} pt={ p   if  y=11potherwise(2)然后交叉熵就可以重写为: CE ( p , y ) = CE ( p t ) = − log ( p t ) \text{CE}(p,y)=\text{CE}(p_{t})=-\text{log}(p_{t}) CE(p,y)=CE(pt)=log(pt)

\

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值