RetinaNet论文详解Focal Loss for Dense Object Detection
一、论文相关信息
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时函数退化为交叉熵损失。该损失函数有两个特性:
- 样本被错误分类时pt很小,整个调节因子接近于1,对loss值几乎无影响。而当样本被很好分类时,pt值趋近于1,调节因子接近于0,使得良好分类的样本loss降低,从而相对的变为关注难样本。
- γ增加,调节因子的影响也增加,实验中γ取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相关推荐
- RetinaNet——《Focal Loss for Dense Object Detection》论文翻译
<Focal Loss for Dense Object Detection> 摘要 迄今为止最高精度的对象检测器基于由R-CNN推广的 two-stage 方法,其中分类器应用于稀疏的候 ...
- 目标检测 | RetinaNet:Focal Loss for Dense Object Detection
论文分析了 one-stage 网络训练存在的类别不平衡问题,提出能根据 loss 大小自动调节权重的 focal loss,使得模型的训练更专注于困难样本.同时,基于 FPN 设计了 RetinaN ...
- 【翻译】Focal Loss for Dense Object Detection(RetinaNet)
[翻译]Focal Loss for Dense Object Detection(RetinaNet) 目录 摘要 1.介绍 2.相关工作 3.Focal Loss 3.1 平衡的交叉熵损失 3.2 ...
- Focal Loss for Dense Object Detection(整理后转载)
@[TOC](Focal Loss for Dense Object Detection 论文目标 核心思想 focal loss的提出 交叉熵损失函数 focal loss的重要性质 focal l ...
- 目标检测--Focal Loss for Dense Object Detection
Focal Loss for Dense Object Detection ICCV2017 https://arxiv.org/abs/1708.02002 本文算是用简单的方法解决复杂的问题了,好 ...
- Focal Loss for Dense Object Detection(RetinaNet)(代码解析)
转自:https://www.jianshu.com/p/db4ccd194109 转载于:https://www.cnblogs.com/leebxo/p/10485740.html
- 深度学习之目标检测(五)-- RetinaNet网络结构详解
深度学习之目标检测(五)-- RetinaNet网络结构详解 深度学习之目标检测(五)RetinaNet网络结构详解 1. RetinaNet 1.1 backbone 部分 1.2 预测器部分 1. ...
- [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 ...
- 如何理解 “Dense object detection“中的dense?
第一大类是 从非Deep时代就被广泛应用的dense detector ,例如DPM,YOLO,RetinaNet,FCOS.在dense detector中,大量的object candidates ...
最新文章
- 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
- MultipartFile 支持什么类型_公测首发 | vika 维格表: 支持 API 的连接型智能表格/新一代团队数据协作神器...
- css3加载图片淡入效果
- 思维导图一定要用计算机来完成吗,计算机绘制思维导图有什么优势
- 渝粤教育 陕西师范大学 《证券投资学[专升本]》作业
- 基于顺序存储结构的图书信息表的最爱图书的查找(C++)
- 测试linux和window下 jdk最大能使用多大内存
- ISA2000安装与设置
- Web前端初级问题—ajax登录跳转登录实现
- 模拟处理机作业调度---短作业优先调度算法
- 3D建模和处理软件以及相关的库(来自中科大老师)
- 极光笔记|极光推送在APICloud平台的使用教程
- JAVA文件上传限制
- linux管理员下安装网易云,在Ubuntu 18.10系统中安装网易云音乐的方法
- 基因家族鉴定分析实战操作手册
- 在Chrome中使用非应用商店安装的扩展程序
- Mirror for Samsung TV for mac(三星智能电视投屏软件)
- 变现 起航篇! 手把手交你用chatgpt快速生成视频!
- asc和desc的英文全称
- 模板类的特例化(具体化)