一、论文相关信息

​ 1.论文题目:Focal Loss for Dense Object Detection

​ 2.发表时间:2017

​ 3.文献地址:https://arxiv.org/pdf/1708.02002.pdf

4.论文作者: Tsung-Yi Lin, Kaiming He

​ 5.论文源码:code:https://github.com/facebookresearch/Detectron.

二、论文详情

背景与简介

目前最高的检测器是以R-CNN开启的two-stage检测方法,这种方法把分类器应用在离散的目标候选区。而one-stage检测器则是通过在可能出现目标的地方做规则、密集的采样,然后将检测器用于这些地方。
one-stage检测器更快和更简单的,但是在精度是却落后two-stage,导致one-stage detector精度较低的主要原因是训练时样本存在极端的正负样本类(foreground & background class)不平衡现象,即class imbalance。大致可以理解为由于训练时出现大量的容易negative样本,使得损失函数绝大部分由不含信息的负样本构成,进而得到的loss无法为模型训练提供好的指导。
eg:在二分类中正负样本比例存在较大差距,导致模型的预测偏向某一类别。如果正样本占据1%,而负样本占据99%,那么模型只需要对所有样本输出预测为负样本,那么模型轻松可以达到99%的正确率,所以这样的样本训练出来的模型是不准确的。

解决类别不平衡(class imbalance):
  • R-CNN这样的two stage detecors,在其第一个stage——proposal stage的时候就缩小了候选区域的数量,过滤了大多数的background 样本(负样本);第二stage的时候,通过一些启发式的采样,如保持正负样本1:3比例,以及onem在线难样本挖掘等操作,很好的保持了class balance。

  • one-stage detectors则需要处理大的多的候选区,密集的涵盖了每个spatial location,scale,和ratio,虽然也能使用启发式的采样,但是效果很差,因为训练被大量易区分的background样本所支配着,这是检测中的经典问题,通常以难样本挖掘等技术来解决。

作者提出以一个新损失函数Focus loss来解决class imbalance现象,该loss函数重新改造了标准的交叉熵损失(standard cross entropy loss),是一个动态尺度的交叉熵损失(dynamically scaled cross entropy loss),随着正确样本的置信度上升scale会降低至0。这个损失函数能减小分配给良好分类的样本的损失权重,并聚焦于那些难样本这些损失在后面会细讲~

所谓难样本,可以简单理解为不容易区分他是否含有目标物,比如只包含一条腿的一个anchor,难以判断是否为人这个目标。

为了评估这个损失函数Focus loss的有效性,作者设计并训练了一个one-stage的样本密度检测器——RetinaNet,结果表明Focus loss来解决class imbalance的方案远远好于启发式采样或者难样本挖掘等以往应用在one-stage中的方案,使用focus loss时RetinaNet既有one-stage的速度,还超过了当时所有最好的two-stage detector的精度。

Note:focus loss 的具体形式并不是很关键。

Focal Loss

为了介绍Focal loss,首先引入用于二分类的cross entropy(CE) 交叉熵的概念

cross entropy(CE):


上式中y取值+1或-1,+1代表为ground truth class,-1则不是。p则代表y为groud truth的情况下,估计其为该class的概率。按照惯例,我们令:

则有CE(p, y) = CE(pt) = − log(pt) 。pt可以看作样本被正确分类的一个概率值,包括被正确分类为background的错误样本和被正确分类为gt class的正确样本。

CE(pt) 损失的曲线可以被看作下图中的蓝色曲线,该曲线具有的一个显著特征是,即使样本很容易分辨(即pt>0.5,属于easy sample),仍然会造成较大的损失。当大量的easy examples loss 相加起来就会得到一个很大的loss值,其他样本的loss就会被overwhelm掉。

Balanced Cross Entropy

解决class imbalance的一个方法是为正样本添加一个权重因子α ∈ [0, 1],为负样本添加一个权重因子1-α。在实践中,α可以通过逆类频率来设置,也可以作为一个超参数通过交叉验证来设置。为了方便,以类似定义pt的方式定义αt。即有:
αt=α\alpha_t = \alphaαt​=α if positive else 1−α1 - \alpha1−α

然后得到α-balanced CE loss:

这是交叉熵的一个简单扩展,通过该α权值,我们可以解决正负样本的不平衡。

Focal Loss Definition

α解决了正负样本的不平衡,但是却不能区分easy/hard examples。因此,focal loss 改造cross loss,使之降低对easy examples的权重,聚焦于hard examples的训练。
具体来讲,给交叉熵增加了一个调节因子(modulating factor)——(1 − pt)γ,其中可调节的参数γ>0。
于是我们的focal loss为:

不同γ取值对应的曲线上图中有显示,其中γ为0时函数退化为交叉熵损失。该损失函数有两个特性:

  1. 样本被错误分类时pt很小,整个调节因子接近于1,对loss值几乎无影响。而当样本被很好分类时,pt值趋近于1,调节因子接近于0,使得良好分类的样本loss降低,从而相对的变为关注难样本。
  2. γ增加,调节因子的影响也增加,实验中γ取2最好。
  • 在计算 [公式] 时用sigmoid方法比softmax准确度更高;
  • Focal Loss的公式并不是固定的,也可以有其它形式,性能差异不大,所以说Focal Loss的表达式并不关键。

直观地看,调节因子减小了简单样本的损失贡献,扩展了简单样本的低损失范围。

实践中,使用带α-balance 变量的focal loss 精度会有小的提升,α和γ是有关系的,γ增加时,α应该稍微减小,最佳的取值为γ=2,α=0.25:

Model Initialization

在有显著的class imbalance时,即background examples远大于foreground examples,但是网络初始化时,对于任何输入,其判断为positive和negative的概率是一样的,而我们focal loss对判断为正确的样本损失会降权重,所以谁被误判的多,谁造成的loss更大。
可认为一半负样本被误分为正,一半正样本被误分为负,但由于负样本基数远大于正样本,于是负样本几乎贡献了loss绝大部分,于是在训练初期,函数会不稳定,模型会偏向于去把样本分为负样本。
为了缓解这个偏差,作者对最后一级用于分类的卷积的bias(具体位置见图2)作了下小修改,把它初始化成一个特殊的值 b = − log((1 − π)/π) 。π在论文中取0.01,这样做能在训练初始阶段提高positive的分类概率。

RetinaNet Detector

RetinaNet Detector由backbone和两个用于特定任务的subnetworks组成,backbone提取整张图片的特征。然后两个subnetworks在backbone输出的特征图上做卷积计算,第一个subnetworks卷积计算object classification 结果,第二个subnetworks做bounding box regression.
结构图:

backbone使用的是RenNet+FPN,每个使用的三个特征层都为256channel。
注意,这里的FPN是和FCOS一样的,图上画的是只有3层,实际上是在FPN的输出上进一步连接得到p3-p7的5层。
下面对代码运行流程进行描述:

将 ResNet的c3、c4 和 c5 三个特征图全部经过各自 1x1 卷积进行通道变换得到 m3~m5,输出通道统一为 256
从 m5(特征图最小)开始,先进行 2 倍最近邻上采样,然后和 m4 进行 add 操作,得到新的 m4
将新 m4 进行 2 倍最近邻上采样,然后和 m3 进行 add 操作,得到新的 m3
对 m5 和新融合后的 m4、m3,都进行各自的 3x3 卷积,得到 3 个尺度的最终输出 P5~P3
将 c5 进行 3x3 且 stride=2 的卷积操作,得到 P6
将 P6 再一次进行 3x3 且 stride=2 的卷积操作,得到 P7
P6 和 P7 目的是提供一个大感受野强语义的特征图,有利于大物体和超大物体检测。 在 RetinaNet 的 FPN 模块中只包括卷积,不包括 BN 和 ReLU。

总结:FPN 模块接收 c3, c4, c5 三个特征图,输出 P2-P7 五个特征图,通道数都是 256, stride 为 (8,16,32,64,128),其中大 stride (特征图小)用于检测大物体,小 stride (特征图大)用于检测小物体。

每个特征层用三个不同比例,三个尺寸的anchor,总共9个anchor。每个anchor得到一个k维的分类向量和一个4维的box回归向量。IoU>0.5的anchor为positive,被分配到对应的Ground Truth,IoU 在[0,0.4]的为negative,即background,IoU为[0.4,0.5]的忽略。

分类分支和边框回归分支都是FCN子网络,网络的参数对于FPN的每层特征都共享。

  • 分类分支最后输出的channel是A×k,即anchor数×num_class。
  • 边框回归分支输出的channel是4A,每个anchor对应4个参数预测了anchor和ground truth的相对位移。使用RCNN中的参数化方法来回归。

Total loss

训练的总损失由分类的Focal loss 和边框回归的smooth L1 loss组成,其中Focal loss 要计算所有anchor的loss,这一点与其他方法不同,其他方法只是选择一部分的anchor。并且做normalization时除以的是被分配到groud truth的那些anchor的数量。

Inference

inference只需简单前向传播就行,为了加速,每个FPN层只选择检测阈值0.05筛选后得分前1000的anchor做decode(还原得到anchor在原图上的位置),最后所有RPN的预测做merge,然后非极大值抑制nms得到最终结果。

实验结果:

速度与时间的trade off

和其他detector的比较:

RetinaNet论文详解Focal Loss for Dense Object Detection相关推荐

  1. RetinaNet——《Focal Loss for Dense Object Detection》论文翻译

    <Focal Loss for Dense Object Detection> 摘要 迄今为止最高精度的对象检测器基于由R-CNN推广的 two-stage 方法,其中分类器应用于稀疏的候 ...

  2. 目标检测 | RetinaNet:Focal Loss for Dense Object Detection

    论文分析了 one-stage 网络训练存在的类别不平衡问题,提出能根据 loss 大小自动调节权重的 focal loss,使得模型的训练更专注于困难样本.同时,基于 FPN 设计了 RetinaN ...

  3. 【翻译】Focal Loss for Dense Object Detection(RetinaNet)

    [翻译]Focal Loss for Dense Object Detection(RetinaNet) 目录 摘要 1.介绍 2.相关工作 3.Focal Loss 3.1 平衡的交叉熵损失 3.2 ...

  4. Focal Loss for Dense Object Detection(整理后转载)

    @[TOC](Focal Loss for Dense Object Detection 论文目标 核心思想 focal loss的提出 交叉熵损失函数 focal loss的重要性质 focal l ...

  5. 目标检测--Focal Loss for Dense Object Detection

    Focal Loss for Dense Object Detection ICCV2017 https://arxiv.org/abs/1708.02002 本文算是用简单的方法解决复杂的问题了,好 ...

  6. Focal Loss for Dense Object Detection(RetinaNet)(代码解析)

    转自:https://www.jianshu.com/p/db4ccd194109 转载于:https://www.cnblogs.com/leebxo/p/10485740.html

  7. 深度学习之目标检测(五)-- RetinaNet网络结构详解

    深度学习之目标检测(五)-- RetinaNet网络结构详解 深度学习之目标检测(五)RetinaNet网络结构详解 1. RetinaNet 1.1 backbone 部分 1.2 预测器部分 1. ...

  8. [3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现、包含官网PV-RCNN预训练权重及报错问题

    [3D检测系列-PV-RCNN] PV-RCNN论文详解.PV-RCNN代码复现 一.论文详解 1.3D voxel CNN 2.体素到关键点场景编码 2.1.关键点抽样 2.2.体素抽象 3.VSA ...

  9. 如何理解 “Dense object detection“中的dense?

    第一大类是 从非Deep时代就被广泛应用的dense detector ,例如DPM,YOLO,RetinaNet,FCOS.在dense detector中,大量的object candidates ...

最新文章

  1. 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
  2. MultipartFile 支持什么类型_公测首发 | vika 维格表: 支持 API 的连接型智能表格/新一代团队数据协作神器...
  3. css3加载图片淡入效果
  4. 思维导图一定要用计算机来完成吗,计算机绘制思维导图有什么优势
  5. 渝粤教育 陕西师范大学 《证券投资学[专升本]》作业
  6. 基于顺序存储结构的图书信息表的最爱图书的查找(C++)
  7. 测试linux和window下 jdk最大能使用多大内存
  8. ISA2000安装与设置
  9. Web前端初级问题—ajax登录跳转登录实现
  10. 模拟处理机作业调度---短作业优先调度算法
  11. 3D建模和处理软件以及相关的库(来自中科大老师)
  12. 极光笔记|极光推送在APICloud平台的使用教程
  13. JAVA文件上传限制
  14. linux管理员下安装网易云,在Ubuntu 18.10系统中安装网易云音乐的方法
  15. 基因家族鉴定分析实战操作手册
  16. 在Chrome中使用非应用商店安装的扩展程序
  17. Mirror for Samsung TV for mac(三星智能电视投屏软件)
  18. 变现 起航篇! 手把手交你用chatgpt快速生成视频!
  19. asc和desc的英文全称
  20. 模板类的特例化(具体化)

热门文章

  1. git忽略已加入版本控制的文件
  2. 做题两大解题思想 by zyz on 2021/4/11
  3. 前端页面字体小于12px
  4. vscode配置基于maven的Javaweb开发
  5. C盘不够了怎么办!将其他盘空间怎么分给C盘!
  6. C语言入门——自我介绍
  7. iPhone为什么要登录苹果ID才能下载软件?
  8. 生成带logo图像的二维码
  9. Is it going on-------------Docker容器的安装以及基本的操作指令
  10. Mirai僵尸网络+DDoS 攻击+常用端口号大全