FocalLoss-ICCV2017
文章: Focal Loss for Dense Object Detection
作者: Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár
核心亮点
(1) 分析并指出了One Stage方法精度不高的原因:
- 极度不平衡的正负样本比例: anchor是一种类似sliding windows的选框方式, 这会使得正负样本的比例接近1000:1, 而且绝大部分负样本都是easy example.
- 梯度优化过程被easy example过度影响: 这些easy example的loss虽然不高, 但由于数量众多, 最终合起来会对loss有很大的贡献, 从而导致优化的时候过度关注这些easy example, 这样会收敛到一个不够好的结果.
(2) 提出了解决正负样本比例和easy example 问题的Focal loss:
核心思想很简单, 就是在优化过程中逐渐减低那些easy example的权重, 这样会使得训练优化过程对更有意义的样本有更高的偏置.
PS:
注一: 为什么Focal Loss没有用在Two Stage方法上面? 这是因为以RCNN为代表的一系列Two Stage会在区域候选推荐阶段采用两个问题来降低正负样本比例和easy example问题带来的影响:
- 采用NMS算法将物体位置候选框降低到一到两千个,更重要的是,这一到两千个可能位置并不是随机选取的,它们移除了大量的易分类负样本(背景框)
- 采用了biased-minibatch的采样策略, 比如,保证正样本和负样本的比例为1:3进行训练(这其实相当于起到了 因子的作用
Focal Loss 的两个重要性质:
- 当一个样本被分错的时候, 是很小的, 比如当 时, 要小于0.5才算是错分类, 此时 就比较小, 反之亦然, 因此调制系数就会趋近于1, 也就是说相比原来的loss没有太大的改变, 而当 趋近于1的时候, 说明此时分类正确而且是易分类样本, 调制系数就会趋近于0, 也就是该样本对总的loss的贡献度很小.
- 当 的时候, focal loss就是传统的交叉熵损失, 随着 的增加, 调制系数的影响力也会增加
论文细节
背景介绍
首先,Lin等人回顾了一下目前目标检测的发展概况,先进的目标检测算法目前大概分成两种,一种是one-stage的,一种是two-stage的。one-stage的代表作YOLO以一种简单统一的网络成功实现了实时检测的目的,但是它的准确率并不是best。相反的,two-stage的代表作RCNN系列则是在准确率方面完胜其他模型,但是它的检测速度真的是慢的有的可怜(相比于YOLO)。 于是,Lin他们就开始研究造成这种现象的原因,接着他们就发现原来是在训练的时候,后景数据相比于前景数据较少的缘故。为了解决这个问题,Lin等人对标准的交叉熵损失函数进行修改,降低那些已经分类很好的样例对loss的影响比重,称之为Focal Loss,也就是会特别关注某一些loss的意思。 最后,Lin等人实现了一个使用Focal Loss的简单的检测系统,最终在速度上几乎赶上了YOLO,并且在准确性了超过了现有的所有检测算法。源码可以在facebook的Detectron上取得:
https://github.com/facebookresearch/Detectron .
作者介绍了一下two-stage方法的简单流程以及相关的论文,然后又介绍了以下YOLO和SSD等one-stage方法的概况,然后,作者指出这one-stage方法精确度低的主要原因是源于训练集数据分布的不平衡导致的。 由此,作者就引出了自己的Focal Loss损失函数,指出Focal Loss函数在面对具有较高confidence的样例时,其影响因子会接近于0,直观上来说,就说Focal Loss更关注那些hard examples。另外,作者还提出,Focal Loss的形式不是唯一的,很多其他的实现方法也能达到相似的结果。(其实我觉得这说明损失函数这一块还有很多工作可以往下研究)
为了证明Focal Loss的有效性,作者实现了一个one-stage检测模型,命名为RetinaNet(Retina是视网膜的意思),基于ResNet-101-FPN实现,还用到了feature pramid和anchor boxes等思想。
传统检测系统
主要是基于sliding-window paradigm的一类方法:HOG, DPMs等等。虽然滑动窗口类的方法在目标检测领域处于一线地位,但是随着deep learning的出现和研究,滑动窗口方法渐渐失去光芒。
Two-stage Detectors
two-stage方法的先驱是Selective Search work,它会首先提取出一个稀疏的候选框集合(稀疏是指只有很少一部分包含物体),然后对这些候选框进行分类,看是否包含物体,或包含哪种物体。
之后,RCNN的诞生标志着深度学习技术成功引入目标检测领域,利用cnn网络对特征的高度抽象和提取,rcnn在物体检测的准确率上大幅度提高,后期的RCNN系列又不断的提出新的方法来提升准确率和速度,到Faster RCNN时,提出了RPN网络,将候选框选取阶段和分类阶段都放在了统一个网络,使之可以进行端到端训练。后续还有更多的关于这一系列的工作继续被人们研究着。
One-stage Detectors
OverFeat算是首个现代的基于深度学习的one-stage检测方法,而最近的SSD和YOLO更是激起了人名对one-stage方法的研究热情,但是one-stage方法最令人诟病的地方就在于它们较低的准确率。
为此,本文的工作就是想要知道是否one-stage检测算法可以在精确度上匹敌two-stage检测算法,同时还要保持一定的检测速度。
于是,作者提出了Focal Loss,一种新的损失函数,利用这个损失函数,可以在保持现在模型大框架不变的基础上,达到最好的检测水平!
样本类别不均衡 Class Imbalance
不管是传统的one-stage检测方法如boosted detectors, DMPs,还是最近的方法SSD,都会在训练阶段面临 个候选区域,这其中会包含大量的背景区域,也就是负样本,这种不平衡会造成两个问题:
- 在训练时,在大多数位置都是负样本,这样只会贡献更多无用的信号
- 大量的负样本会导致模型在一定程度上的退化
对于此问题,常用的解决方案是在训练阶段设计更复杂的样本抽取策略,但是这样速度就会受影响。而本文提出的Focal Loss,不仅解决了样本不均的问题,而且不需要增加额外的抽取策略,可以更快训练
Robust Estimation
有很多工作乐于设计健壮的损失函数,具体可以看看原文的参考文献,这里就不说了(主要因为没有什么好讨论的地方,作者也只是提了一下)
Focal Loss
为了便于理解,从交叉熵(CE)的二分类问题出发:
当二分类问题中的样本分布不均时,数量多的样本的损失值对最终函数的影响会淹没数量少的样本产生的影响。多分类问题也是如此。
为了便于表示,对上面的公式进行改写: ,于是有:
Balanced Cross Entropy
一个常用的解决办法就是引入一个权重因子 ,然后分别令 和 作为两个类别的权重, 的取值可以是根据类别出现的频率决定,也可以作为超参数,利用交叉验证来选取较好的值。我们使用这种方法作为baseline来与Focal loss进行比较:
Focal Loss Definition
本文的实验结果表明,类别分布不均会对交叉熵损失函数带来很大的影响。那些很容易被分类的负样本(背景等)贡献了损失函数及其梯度中的大部分影响力。尽管baseline方法的 因子可以平衡正负样本之间的比例,但它仍然不能把握好简单样本和困难样本的比例(应该困难样本多一些,简单样本少一些,这样有利于模型的健壮性)。于是,作者就提出了Focal Loss,主要引入了一个“调制因子” ,其中 ,具体的形式化表示如下:
直观上来讲,这个“调制因子”可以降低easy example对loss的contribution。同时,还应注意到,Focal Loss的形式不是唯一固定的,作者还在使用了其他不同形式的因子,比如结合了 因子:
后文的大部分实验都使用的是上面这个形式的Focal Loss。
imageClass Imbalance and Model Initialization
二值分类模型在初始的时候,对两个类别的预测概率是均等的,在这种初始化条件下,如果某一个类别出现的次数过多,就会对损失函数产生较大的影响。为了解决这个问题,作者特意提出了“先入为主”的概念,也就是使得模型在开始的时候,对稀有类别(如前景类别)的预测概率的初始值设置的低一些,如0.01 。 经过实验表明,这样的方法可以提升模型训练的稳定性。
Class Imbalance and Two-stage Detectors
Two-stage Detector 并没有使用类似 因此的方法来解决样本不均的问题。相反的,它们通过两个机制来降低这个问题带来的影响:(1)two-stage模式和(2)biased minibatch取样。首先,two-stage模式会在第一阶段就将近乎无限物体位置可能性降低到一到两千个,更重要的是,这一到两千个可能位置并不是随机选取的,它们移除了大量的易分类负样本(背景框)。第二,这些方法还设计了biased minibatch的取样策略,比如,保证正样本和负样本的比例为1:3进行训练(这其实相当于起到了 因子的作用。
RetinaNet Detector
RetinaNet是一个单一的、统一的网络,它由一个backbone网络和两个task-specific子网络组成。backbone网络是现成的,主要负责计算卷积特征图谱。第一个子网络负责物体分类任务,第二个子网络负责bounding box回归任务,它们都是在backbone网络输出的卷积图谱上进行计算的。
imageFeature Pyramid Network Backbone:
采用了FPN作为backbone网络。
Anchors:
和FPN一样,对P3到P7使用了不同大小的anchors
Classification Subnet:
该子网络是一个较小的FCN,连接在FPN的每一层。
值得注意的一点是,该子网络并不与Box Regression Subnet共享参数,二者是互相独立的。
Box Regresion Subnet:
与分类子网络并行,该子网络也是一个FCN网络,连接在FPN的每一层上。目标是让anchor通过位移回归到gt box附近。
Inference and Training
Inference: RetinaNet是有基于FPN和backbone和两个基于FCN的子网络组成的一个统一的单一网络,因此,在inference阶段,只需要简单的通过前向传播经过整个网络即可。为了提高速度,本文在每个FPN层级上,只会处理最多1000个box prediction。
Focal Loss: 使用了上文提到的Focal Loss。取 。在训练阶段,本文强调将focal loss应用到所有100k个anchors上,主要目的是为了与RPN和SSD等模型作对比。
从实验结果上看,当 的值取得较大时, 的值就应该取消一些(for , works best)。
Initialization: 本文分别实现了ResNet-50-FPN和ResNet-101-FPN。 对其中初始值可参见原文。
Optimization:
使用了SGD优化方法,在8个GPU上训练,每个minibatch有16张图片(一个GPU包含2张图片)。
损失函数为focal loss和标准smooth L1损失函数之和。