【论文阅读笔记】 Focal Loss for Dense Object Detection

论文名称:《Focal Loss for Dense Object Detection》
论文链接:https://arxiv.org/abs/1708.02002
参考代码:Detectron,https://github.com/fizyr/keras-retinanet(Keras实现)

综述

背景介绍

在深度学习之前,经典的物体检测方法为滑动窗口+人工设计的特征。而目前主流的检测算法可以分为两类:one-state和two-stage。前者以YOLO和SSD为代表,后者以RCNN系列为代表。

R-CNN系的方法是目前最为流行的物体检测方法之一,同时也是目前精度最高的方法。在R-CNN系方法中,正负类别不平衡这个问题通过处理第一阶段产生的候选区域解决了。使用EdgeBoxes,Selective Search,DeepMask,RPN等处理方法,可以过滤掉大多数的背景,将比较少的、包含物体的候选区域(1-2K)传到下一个阶段。

但在YOLO,SSD等方法中,由于对计算速度提升的要求,需要直接对特征图的产生的大量候选区域(100K)进行检测,而且这些区域很多都在特征图上重叠,是为简单的负样本。大量的这些简单负样本造成了样本不均衡,会给训练带来以下两个问题:

  1. 训练效率降低。大多数的样本都是简单负样本(容易区分的背景),提供的有效信息少;
  2. 简单的负样本在训练过程中压倒性优势,使得模型发生退化。大量的这些负样本在loss中占据了很大比重,使得有用的loss不能回传回来。

常见的处理这些负样本的方法之一是SSD中用到的OHEM(online hard example mining)。OHEM通过对样本进行loss评估,再使用NMS舍弃了这些简单无用的负样本,但同时也丢失了其中许多可以利用的信息。

总体思路

作者明确指出,one-stage检测器之所以在精度上不如two-stage检测器,核心问题(central issus)是大量的负样本造成的样本不均衡。因此,作者提出了Focal Loss,希望使one-stage检测器在不影响原有速度的情况下,达到two-stage检测器的准确率。

Focal Loss是是在标准交叉熵损失基础上修改得到的一种新的损失函数。这个函数可以通过减少易分类样本的loss权重,使得模型在训练时更专注于难分类的样本。

为了证明Focal Loss的有效性,作者还设计了一个one-stage的检测器:RetinaNet,在训练时采用Focal Loss。实验证明RetinaNet不仅可以达到one-stage 检测器的速度,也能达到two-stage检测器的准确率。

Focal Loss

  • Cross Entropy Loss
    CE(pt)=−log(pt)CE(pt)=−log(pt)
  • Balanced Cross Entropy (作为比较的baseline)
    CE(pt)=−αtlog(pt)CE(pt)=−αtlog(pt)
  • Focal Loss
    FL(pt)=−(1−pt)γlog(pt)FL(pt)=−(1−pt)γlog(pt)
  • 实际使用的Focal Loss (提升了一些性能)
    FL(pt)=−αt(1−pt)γlog(pt)FL(pt)=−αt(1−pt)γlog(pt)

简单分析Focal Loss,首先看这张对比图:
image_1crmdurjr1nls17jhdulpotiui16.png-122.7kB

从这张对比图可以看出,在PtPt很高的区域,简单负样本仍然占据了loss的一部分比重,因此在包含大量简单负样本的情况下,会影响到loss的准确性。

Focal Loss其实是在Cross Entropy Loss的基础上加上了一个自适应调节的权重:当样本为错样本,置信度接近为0,权重接近为1,对loss没有影响。随着置信度的提升,样本在loss中所占的权重会逐渐减小;当样本为正确样本,这个权重会接近于0.

由上图还可以看到γ取不同值的时候的函数值变化。作者实验发现,γ=2时能够获得最佳的效果提升。

RetinaNet

RetinaNet的网络结构图如下图所示:
image_1ci415gok4c016hr1cknttt16669.png-109.7kB

其中包含的ResNet和FPN都是常规操作了,值得注意的地方有以下几点:

  • Anchors
    对于FPN的每一层,都使用了20,21/3,22/320,21/3,22/3三种不同尺寸的Anchors,因此每一层共有3*3=9个anchor;此外,后续在计算所有anchor的和,并用anchors的数量做normalized的时候,只用了匹配为正样本的anchor的数量,原因很有可能是大量负样本的anchor的loss已经几乎为0。
  • Classification Subnet
    Classification Subnet由连接在FPN的每一层后面的小型的FCN网络组成,它的参数在金字塔所有层级共享。与RPN相比,这个子网络更深,使用到的全是3*3的卷积,并且不与接下来要介绍的Box Regression Subnet共享参数。
    Focal Loss在这里被采用。

  • Box Regression Subnet
    这个子网络与Classification Subnet平行,只是最后一层的输出稍有不同。
    使用的loss是普通的光滑L1-loss,使用的回归是class-agnostic的。

  • 初始化
    作者提到了由于样本不均衡的原因,常规的随机初始化在训练初期会对loss有影响(主要是frequent class造成)。因此作者使用了新型的初始化方法,设置一个bias ,使初始化rare class即foreground输出的概率非常低。
    b=−log((1−p)/p)b=−log((1−p)/p)

实验结果

使用不同的策略:
image_1crmiekbb11f8b4qqo31mce1cn29.png-186.7kB

模型比较:
image_1cjj7543skqj1rban754159rl9.png-163.7kB

参考

1 https://zhuanlan.zhihu.com/p/29345436
2 http://www.cnblogs.com/xuanyuyt/p/7444468.html

发布了11 篇原创文章 · 获赞 4 · 访问量 558

猜你喜欢

转载自blog.csdn.net/sanshibayuan/article/details/103645427