Focal Loss for Dense Object Detection 阅读总结
Focal Loss for Dense Object Detection ICCV.2017
密集目标检测中的焦距损失
1.本文解决办法
- 作者提出通过重塑交叉熵损失的标准来解决类别不平衡的问题,该函数通过减少容易分类的样本的权重,使得模型在训练时更专注难分类的样本,从而改善样本的类别不均衡问题,改善模型的优化方向。
- Focal loss能动态地缩放交叉熵,随着正确类别的置信度(confidence in correct class)增加, 其中的阈值因子衰减到零。直观感受,这个缩放因子可以自动降低训练时easy example贡献的比重,防止大量easy examples在训练期间损害检测器,并快速地集中于hard examples进行学习。
- 实验表明,通过使用Focal Loss方法训练出的高性能的one-stage检测器RetinaNet,作为一种one-stage检测器能够超过现有的所有最先进的two-stage检测器的精度,并与以往的one-stage检测器的速度相当。
- 目前,基于r-cnn的two-stage检测器比one-stage检测器的精度更好,one-stage检测被应用到目标进行规则、密集采样时,它具有更快更简单的特点。作者发现,在密集检测器训练过程中所遇到的极端前景背景类别不平衡是造成这种现象的主要原因。
2. 相关工作的局限性
2.1 传统方法
方法名称 | 主要贡献 | 局限性 | 本文解决方法 | 文献索引 | 备注 | 我的观点 |
---|---|---|---|---|---|---|
经典目标检测器 | 使用滑动窗口方法来进行目标检测 | 1分类器尺度固定,对大小不同的物体检测时,效率非常低下。2执行较复杂的分类器时,比较费时。 | 训练好对应目标的分类器,不断移动窗口,并将窗口喂给分类器,使用IOU,NMS机制可获得最终概率最大的分类结果。 | 4,5,8,37 | 包括HOG,DPMs等 | |
one-stage检测器 | 速度较快 | 准确率较低 | 1直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果。 | 22,26,27 | 包括YOLO,SSD,YOLOv2,YOLOv3,RetinaNet | |
twe-stage检测器 | 准确率较高,识别错误率较低 | 速度较慢,不能满足实时检测场景 | 检测问题划分为两个阶段:首先产生候选区域(region proposals),然后使用卷积神经网络对候选区域分类(一般还需要对位置精修) | 11,35 | 包括R-CNN, Fast R-CNN, Faster R-CNN,Mask R-CNN家族。 | 本文在于研究一级探测器在以相近或更快的速度运行时,其是否性能是否能与二级检测器相当或超越它。 |
2.2 提及到的其他相关工作
两大问题
工作名称 | 工作阐述 | 面临困难 | 一般解决方案 | 本文解决方法 | 文献索引 | 我的观点 |
---|---|---|---|---|---|---|
前景背景比例严重失衡 | 检测器在图片中评估大量候选位置,但只有极少量的位置包含正确目标。 | 1学习效率低下。因为大多数位置都是easy negative,而它们不会产生有用的学习信号。2这些easy negative会淹没训练,并导致模型退化。 | 困难样本挖掘或采用更有效的采样方法,但是方法不够自然。 | 本文提出的Focal Loss能更自然地处理类别不平衡问题,并允许在没有采样的情况下有效训练所有的样本,不容易导致easy example淹没损失和计算梯度消失。 | 33、37、8、31、22、2 | |
抗差评估(Rubost Estimation) | 在误差不可避免的情况下,选择适当的估计方法使未知量估值得出最准确的估值。 | 误差损失较大 | 通过降低困难样本损失的权重,来设计稳健损失函数,(如Huber损失)。 | 本文提出的Focal Loss不是来处理outliers,而是通过降低easy examples的权重来处理类别不平衡,这样即使它们的数量很大,它们对总损失的贡献也很小。 | 13 | Focal Loss扮演者与稳健损失相反的角色:它将训练集中在一组稀疏的hard examples上。 |
正负样本不平衡问题
由于大多数都是简单易分的负样本(属于背景的样本),使得训练过程不能充分学习到属于那些有类别样本的信息;其次简单易分的负样本太多,可能掩盖其他有类别样本的作用(简单易分的负样本仍产生一定幅度的loss,见下图蓝色曲线,数量多会对loss起主要贡献作用,因此就主导了梯度的更新方向,掩盖重要的信息)
现有算法来解决正负样本不平衡
OHEM (online hard example mining)
思想:在OHEM中,利用每个样本的loss对其进行从大到小排序,然后采用非最大性抑制,选取前N个loss最高的样本。
缺点:OHEM算法虽然增加了错分类样本的权重,但是忽略了easy example。也就是说,loss高的样本同时包括难分类样本和容易分类的样本,应该更多的去保留hard example,而不是easy example。
two-stage检测器
一般的Two-stage 检测器利用交叉熵损失方法,通过以下两个机制来解决正负样本不平衡问题:
- two-stage cascade (two-stage级联)
- biased minibatch sampling(偏差批量采样)
具体步骤为:
- 利用候选区域机制:从无限个对象区域位置中选出前1K或2K个与真实目标区域相匹配的候选区域,消除绝大多数easy negatives的影响。
- 利用偏差采样机制:使用偏差采样来构造minibatch,比如,构造1:3的正负样本比率。该比率类似于通过采样实现的隐式α平衡因子。
- 本文提出的Focal Loss是直接通过构造损失函数在one-stage检测器的效果。
第一个stage是一个object proposal机理,将几乎无穷个可能的object locations减少到一两千个。重要的是,这种方法的选择不是随机的,是跟true object locations(标签的框)相关的,能够除掉大部分的easy negative。
3. 主要贡献
贡献名称 | 贡献方法 | 输入 | 输出 | 图片索引 | 我的观点 |
---|---|---|---|---|---|
Focal Loss | Focal loss能动态地缩放交叉熵,使模型能更多地集中于hard examples进行学习。 | pt | pt的Focal loss | Eq.4 |
4. 算法框架
RetinaNet由一个骨干网和两个特定任务的子网组成。主干网负责计算整个输入图像上的卷积特征映射。第一个子网对骨干网的输出进行对象分类;第二个子网进行边框回归。
RetinaNet框架如下图:
主干网部分:
- RetinaNet网络架构在ResNet架构之上使用特征金字塔网络(FPN)构造骨干王,以生成丰富的多尺度卷积特征金字塔。FPN通过自上而下的路径和横向连接来增强标准卷积网络,因此该网络有效地从单分辨率输入图像构建丰富的多尺度特征金字塔。
- 金字塔的每一层都可以用来检测不同尺度的物体。FPN改进了来自完全卷积网络(FCN)的多尺度预测。
- RetinaNet在ResNet架构的基础上构建FPN,造了一个P3到P7层的金字塔,其中l表示金字塔层(RetinaNet的骨干网络)
- 作者说道:虽然许多设计并不重要,但我们仍强调使用FPN主干网原因是:实验中,若仅使用最终ResNet层的特性,则最终AP较低。
子网部分
1. 对象分类子网
- 分类子网的功能是:预测每个A锚和K对象类在每个空间位置的对象存在概率。此子网是通过在每个FPN层上附加一个FCN网络,此子网的参数在所有金字塔层上共享。
- 其主要步骤为:
(1)分类子网从相应的金字塔层中获取一个C通道的输入特征映射。
(2)经过四个3×3 conv层,每个层都有C过滤器且被ReLU激活,再经过一个3×3 conv层KA过滤器。
(3)最后,在每个空间位置利用sigmoid函数激活,输出KA二进制预测。如Fig.3©可见。
与RPN相比,此对象分类子网更深,使用3*3个卷积层,并且不与边框回归子网共享参数。作者说这些更高级别的设计决策比超参数的特定值更重要。
2. 边框回归子网
利用一个非参数边框回归器,用更少的参数同时能得到良好的性能。方法步骤为:对于每个空间位置的A锚,利用每个金字塔层上的FCN网络,对于每个空间位置的每个A个锚点,这4个输出预测锚和ground-truth框之间的相对偏移,获得其(x,y,w,h)值,即可完成定位。与其他工作不同,本文使用类不可知的边界框回归量,它使用更少的参数并且同样有效。对象分类子网和边框回归子网虽然共享一个共同的结构,但使用单独的参数。
5. 实现细节
1. 引入交叉熵CE
焦点损失旨在解决一阶段对象检测场景,其中在训练期间前景和背景类之间存在极端不平衡(例如,1:1000)。从二元分类的交叉熵(CE)损失开始引入焦点损失:
在上面的y 属于正负1中指定了地面实况类并且p 属于[0; 1]是模型的标签y = 1的类的估计概率。为了符号方便,我们定义了pt:
联合以上两式,CE可写做为:
2. 平衡交叉熵
解决类不平衡的常用方法是引入加权因子a对于类别1属于[0; 1],对于类别2属于类别-1。在实践中 a 可以通过逆类频率设置或者作为超参数来设置以通过交叉验证来设置。为了符号方便,我们定义类似于我们如何定义pt。我们将 a-balanced CE损失写为:
这种损失是CE的简单扩展,作为Focal loss的baseline。
5.1 Focal Loss
解决问题
Focal Loss是为了解决训练期间前景类和背景类之间存在极端不平衡(例如1:1000)的one-stage目标检测问题。
其公式如下:
- 当对于easy examples,其Pt会比较大,所以权重自然减小。针对hard example,Pt比较小,则权重比较大,Focal loss可以让网络倾向于利用这样的样本来进行参数的更新。且这个权重是动态变化的,如果复杂的样本逐渐变得容易分类,则它的影响也会逐渐的下降。
- 虽然交叉熵中引入了α平衡了正负样本的权重,但是它不区分easy/hard样本。相反,通过重塑交叉熵损失函数,以减少easy样本的权重,重点训练hard negative样本。
- 作者在分类子网络的最后一层卷积层使用focal loss,发现在γ为2的时候效果比较好。
5.2 正负样本不平衡与模型初始化
Binary分类模型是默认初始化为对于y=-1和y=1有相同的概率。在这样的初始化之下,由于正负样本类别不平衡,会导致频率高的类别主导总的损失,在训练早期结果不稳定的问题。
为了解决此问题,作者提出“优先”的概念,在训练开始时,每个锚都应标记为前景,其置信度为0.01。这样,防止大量背景锚在第一次迭代训练中产生较大的、不稳定的损失值。
这是模型初始化的改变,而不是损失函数的改变。作者发现这点能改进训练的稳定性(在负样本极不平衡时,这能提高交叉熵和focal loss的训练稳定性)。
5.3 锚
作者利用translation-invariant锚定框(与RPN的变体相似),这个anchor在金字塔层P3到P7有相对应的的区域。在每个金字塔层,作者用的长宽比是 {1:2, 1:1, 2:1}。在每层,对于三个长宽比上,添加 {20,21/3, 22/3}倍大小anchor。这些锚服务于后面的分类和回归任务。
6. 实验
6.1 数据集
使用COCO数据集
6.2 初始化
本文在ResNet-50-FPN和ResNet-101-FPN为主干网络的基础上做实验。
- 对于最后一层的分类子网卷积层,设置偏置量b=−log((1 − π)/π,π表示每个anchor在开始训练的时候应该被标记为背景的置信度,其防止在第一次迭代训练时大量背景锚产生较大的、不稳定的损失值。
- 其他所有卷积层都设置偏置量为0,高斯分布的σ = 0.01。
RetinaNet的inference涉及把图片简单地在网络中前向传播。为了提升速度,作者只在每个FPN,从1k个top-scoring预测中提取box预测(在置信度阈值0.05处理之后)。多个层来的Top prediction聚在一起然后用NMS(非极大值抑制)以0.5为阈值。
6.3 优化方法
RetinaNet是用SGD训练的。使用SGD在8个GPU上面同步训练,每个minibatch16张图,每个GPU2张图。所有模型都90K次迭代训练,初始学习率是0.01。
6.4 Focal Loss分析
在大量随机图片中采用约107 个负样本和105个正样本;随后计算FL值,并归一化。对归一化的FL值排序并分别画出正负样本的累积分布函数图。
a) 20%的困难正样本贡献了约一半的损失值;当γ增加时,20%的贡献度更加明显;但是影响不是很大。
b) γ对于负样本的影响完全不同;γ = 0时CDF与正样本类似;当γ增加时,迅速的聚焦于困难负样本,当γ=2时,大量的易分类负样本仅仅贡献了少量损失。
实验结果如下图:
6.5 实验结果
RetinaNet最好能在coco test-dev上达到 39.1AP,5Fps。
1. 模型简化测试结果
模型简化测试结果如下图所示
实验结果分析如下:
- 使用 a-balanced CE的RetinaNet最多可达到31.1AP。
- 相比之下,使用FL的完全相同网络可获得2.9 AP增益。
- 当使用2-3倍scale和纵横比为3时,锚产生良好的结果,之后性能饱和。
- FL优于在线困难样本挖掘(OHEM)方法的最佳变体,超过3个点AP。
- RetinaNet对各种网络深度和图像尺度的测试/开发的准确性/速度权衡如(e)。
- 更大更深的主干网有更好的准确率,但速度更慢;输入图像的尺寸也如此。
2. RetinaNet与其他模型性能对比
RetinaNet与其他模型性能对比图如下:
RetinaNet与其他模型性能对比图分析:
- RetinaNet与最接近的竞争对手DSSD的AP差距达到了5.9点(39.1对33.2)。
- 与two-stage检测器相比,RetinaNet比性能最好的基于Inception-ResNet-v2-TDM的R-CNN模型高出2.3个点。
- RetinaNet使用ResNeXt32x8d-101-FPN作为骨干网络进一步改善结果1.7ap,超过40ap。
RetinaNet与其他方法在coco数据集上的AP与时间测试图如下:
- 上图展示RetinaNet和其它方法在速度/精度的比较;RetinaNet 使用FL超过所有的方法,打破低精度的限制。ResNet-101-FPN在600像素尺寸时的精确度超过ResNet101-FPN Faster R-CNN,同时检测时间为122ms,Faster R-CNN为172ms。
- 追求速度需要特殊的网络设计如Yolo 9000。
7. 总结
本文将类不平衡确定为阻碍one-stage物体探测器超越最佳性能的two-stage检测器的主要障碍。为了解决这个问题,提出了Focal Loss方法,它将调制项应用于交叉熵损失,以便将学习重点放在hard negatives上。此方法简单而有效。通过设计一个完全卷积的one-stage检测器来证明其功效,表明它实现的最先进的精度和速度。
8. 我的看法
- 作者提出一种新的损失函数:focal loss。该函数通过减少容易分类的样本的权重,使得模型在训练时更专注难分类的样本,从而改善样本的类别不均衡问题,改善模型的优化方向。
- 通过使用Focal Loss方法训练出的高性能的one-stage检测器RetinaNet,作为一种one-stage检测器能够超过现有的所有最先进的two-stage检测器的精度,同时与one-stage方法的速度相当。
- 该Focal loss方法不仅解决了正负样本之间的平衡问题,而且能区分easy example/hard example,有区别地动态缩放交叉熵,使模型能更多地集中于hard examples进行学习,真精彩!
9. 其他前置知识
(可不看,此知识点供本人学习使用,与文章无关)
Fast R-CNN
框架图
Fast R-CNN可将整个图像归一化后直接送入CNN网络,卷积层不进行候选区的特征提取,而是在最后一个池化层加入候选区域坐标信息,进行特征提取的计算。
残差网络ResNet
对于普通网络,任意堆叠的两层网络,我们希望找到的是一个映射H(x)对应的残差元,添加一个快捷连接,从输入到输出,这里的快捷连接默认为恒等映射,此时的问题就从寻找映射H(x)到F(x);这里类似于在数学上,直接去解一个方程较为复杂,你就把它分解成两个简单问题和的形式,分别去解决。
ResNet的主要思想是在网络中增加了直连通道,即Highway Network的思想。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出。ResNet的思想和Highway Network的思想也非常类似,允许原始输入信息直接传到后面的层中,如下图所示。
这一层的神经网络可以不用学习整个的输出,而是学习上一个网络输出的残差,因此ResNet又叫做残差网络。
ResNet如图:
对conv(stride=2) 和conv(stride=1) +maxpooling(stride=2)的深刻理解
- conv(stride=2) 和conv(stride=1) +maxpooling(stride=2)之后的特征都下采样了同样的倍数
- conv(stride=2)是直接在卷积的时候扔了一半的特征,减少了一半的卷积操作,速度更快,但是某些位置的特征就永远丢掉。
- conv(stride=1) +maxpooling(stride=2)在卷积的时候保留了所有特征,然后通过池化只保留局部区域最“重要的”特征来达到下采样的目的,显然耗时比前一种情况多了一倍多,但是得到的特征直观上会更加精确。
上采样、下采样
简单讲,上采样、下采样就是采取某种让图像缩小或放大。细节…
IOU
IoU 的全称为交并比(Intersection over Union)。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。
通俗理解卷积
如图:
FCN网络
CNN的输入是图像,输出是一个结果,或者说是一个值,一个概率值。
FCN提出所追求的是,输入是一张图片是,输出也是一张图片, 学习像素到像素的映射 。
归一化、标准化
归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。
在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,减少收敛所需要的迭代次数,提升模型的收敛速度。
神经网络中每一层的理解
神经网络是由一层一层构建的,每一层升维/降维、放大/缩小、旋转、平移、 “弯曲” 这 5 种操作,将输入空间投向另一个空间。
公式为:
其转换如图所示:
梯度消失和梯度爆炸原因及其解决方案
- Sigmoid函数有一个缺点:当x较大或较小时,导数接近0;并且Sigmoid函数导数的最大值是0.25。
- 我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。那么当神经网络特别深的时候,梯度呈指数级衰减,导数在每一层至少会被压缩为原来的1/4,当z值绝对值特别大时,导数趋于0。
- 正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致神经网络无法被优化,训练永远不会收敛到良好的解决方案。 这被称为梯度消失问题。
- 当神经网络有很多层,每个隐藏层都使用Sigmoid函数作为激励函数时,很容易引起梯度消失的问题。
sigmoid函数如图:
解决方案:
- 好的参数初始化方式,如He初始化
- 非饱和的激活函数(如 ReLU)
- 批量规范化(Batch Normalization)
- 梯度截断(Gradient Clipping)
- 更快的优化器
ablation study(模型简化测试)
目的其实就是为了控制变量。ablation study在同时提出多个思路提升某个模型的时候,为了验证这几个思路分别都是有效的,做的控制变量实验的工作。
CNN中的feature map的理解
输入层:
在输入层,如果是灰度图片,那就只有一个feature map;如果是彩色图片(RGB),一般就是3个feature map(红绿蓝)。
每层有多少个卷积核,经过卷积就会产生多少个feature map。
如下图:
因为随着网络的加深,feature map的长宽尺寸缩小,本卷积层的每个map提取的特征越具有代表性(精华部分),所以后一层卷积层需要增加feature map的数量,才能更充分的提取出前一层的特征,一般是成倍增加
feature map的目的:我们希望构造一组基,这组基能够形成对于一个事物完备的描述,具体来讲就是用多种不同的卷积核对图像进行卷积,得到不同核(这里的核可以理解为描述)上的响应,作为图像的特征。他们的联系在于形成图像在同一层次不同基上的描述。
ROI (Region of interest pooling) Pooling 层的理解
roi pooling具体操作如下:
1)输入image,将roi映射到feature map对应位置;
2)将映射后的区域划分为相同大小的sections(sections 数量与输出唯独相同);
3)对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应的feature maps。
值得一提的是,输出的feature maps的大小取决于ROI 和卷积feature maps大小,roi pooling最大的好处就在于极大地提高了处理速度。
信息量
信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。
交叉熵公式的理解
交叉熵公式如下:
H(x) = E[I(xi)] = E[ log(1/p(xi)) ] = -∑p(xi)log(p(xi))
其中,x表示随机变量,与之相对应的是所有可能输出的集合,定义为符号集,随机变量的输出用x表示。P(x)表示输出概率函数。变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。为了保证有效性,这里约定当p(x)→0时,有p(x)logp(x)→0 。
抗差估计(Robust Estimation)
抗差估计(Robust Estimation,有人译成“稳健估计”),实际是在粗差不可避免的情况下,选择适当的估计方法使未知量估值尽可能减免粗差的影响,得出正常模式下的最佳估值。