一、相关概念
对于分类来说:
- 正样本:正确分类出的类别对应的样本
- 负样本:不是正样本的所有样本
- 难分正样本(hard positives):错分成负样本的正样本,也可以是训练过程中损失最高的正样本
- 难分负样本(hard negatives):错分成正样本的负样本,也可以是训练过程中损失最高的负样本
- 易分正样本(easy positive):容易正确分类的正样本,该类的概率最高。也可以是训练过程中损失最低的正样本
- 易分负样本(easy negatives):容易正确分类的负样本,该类的概率最高。也可以是训练过程中损失最低的负样本
二、OHEM方法
1. 核心思想
用分类器对样本进行分类,把其中错误分类的样本(hard negative)放入负样本集合再继续训练分类器。
2. 具体方法
关键是找出影响网络性能的一些训练样本,针对性的进行处理
简单来说就是把难分的样本,剔除出来,放到另一个地方里面。最后将难分样本,给负样本,加强训练分类器。但是,这样又会造成数据不平衡的问题
- 方法:离线和在线
– 离线
在样本训练过程中,会将训练结果与GroundTruth计算IOU。通常会设定一个阈值(0.5),结果超过阈值认为是正样本,低于一定阈值则认为是负样本,然后扔进网络中训练。但是,随着训练的进行,这样的策略也许会出现一个问题,那就是正样本的数量会远远小于负样本,这样会导致数据的分布不平衡,使得网络的训练结果不是很好。当然有些论文作者对这种导致不平衡的数据,提出了一种对称的模型。就是类似上图,将Hard Positive也重新赋给正样本
– 在线
CVPR2016的Training Region-based Objec Detectors with Online Hard Exanple Mining(oral)将难分样本挖掘(Hard example minning)机制嵌入到SGD算法中,使得Fast R-CNN在训练的过程中根据region proposal的损失自动选取合适的Region Proposal作为正负例训练。该方法即为OHEM,实验结果表明使用OHEM(Online Hard Example Mining)机制可以使得Fast R-CNN算法在VOC2007和VOC2012上mAP提高4%左右
即:训练的时候选择hard negative来进行迭代,从而提高训练的效果。简单来说就是ROI中选择hard,而不是简单的采样
Forward:全部的ROI通过网络,根据loss排序
Backward:根据排序,选择B/N个loss值最大的(worst)样本来后向传播更新mode的weights
这里会有一个问题,即位置相近的ROI在map中可能对应的是同一个位置,loss值是相近的,所以针对这个问题,提出的解决方法是:对hard做nms,然后再选择B/N个ROI反向传播,这里nms选择IOU=0.7
在后向传播时,直觉想到的方法就是将那些未被选中的ROI的loss直接设置为0即可,但这实际上还是将所有的ROI进行反向传播,时间和空间消耗都很大,所以作者在这里提出了本文的网络框架,用两个网络,一个只用来前向传播,另一个则根据选择ROIs进行后向传播,的确增加了空间消耗,但是有效减少了时间消耗,实际的实验结果也是可以接受的。
给定图像和选择性搜索ROI,卷积网络计算转换特征映射。在a中,只读ROI网络在特征映射和所有ROI上运行正向传递(绿色箭头显示)。然后Hard RoI模块使用这些ROI损失选择B个样本。在b中,ROI网络使用这些硬性示例来计算前向和后向通道(以红色箭头标出)。
想法很类似新扩展一个空间,错放错误样本,然后单独训练这些样本,更新权重。
三、loss方法
OHEM是近年兴起的另一种筛选example的方法,它通过对loss排序,选出loss最大的example来进行训练,这样就能保证训练的区域都是hard example。这个方法有个缺陷,它把所有的easyexample都去除掉了,造成easy positive example无法进一步提升训练的精度。
-
RetinaNet
作者提出一种使用Focal Loss的全新结构RetinaNet,使用ResNet+FPN作为backbone,再利用单极的目标识别法+Focal Loss。这个结构在COCO数据集上达到了39.1的mAP。它的基本结构:
这个结构要注意几点:
1、训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
2、测试时FPN每一级只选取score最大的1000个example来做nms
3、整个结构不同层的head部分(c和d)共享参数,但分类和回归分支间的参数不共享
4、分类分支的最后一级卷积的bias初始化成前面提到的-log((1-Π)/Π); -
Focal loss
Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可以理解为一种困难样本挖掘
Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉熵损失:
y‘是经过激活函数的输出,所以在0-1之间。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
Focal Loss通过调整loss的计算公式使单极结构达到和Faster RCNN一样的准确度。
pt是不同类别的分类概率,γ是个大于0的值,αt是个[0,1]间的小数,γ和αt都是固定值,不参与训练。从表达式可以看出:
1、无论是前景还是背景,pt越大,权重(1-pt)就越小。也就是说easy example可以通过权重进行抑制。换言之,当某样本类别比较明确些,它对整体loss的贡献就比较少;而若某样本类别不易区分,则对整体loss的贡献就相对偏大。这样得到的loss最终将集中精力去诱导模型去努力分辨那些难分的目标类别,于是就有效提升了整体的目标检测准度。
2、αt用于调节positive和negative的比例,前景类别使用αt时,对应的背景类别使用1-αt;
3、γ和α的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出γ=2、αt=0.25时,ResNet-101+FPN作为backbone的结构有最优的性能。
此外作者还给了几个实验结果:
1、在计算Pt时用sigmoid方法比softmax准确度更高;
2、Focal Loss的公式并不是固定的,也可以有其他形式,性能差异不大,所以说Focal Loss的表达式并不crucial
在训练初始阶段因为positive和negative的分类概率基本一致,会造成公式1起不到抑制easy example的作用,为了打破这种情况,作者对最后一级用于分类的卷积的bias作了下小修改,把它初始化成一个特殊的值b=-log((1-Π)/Π)。Π在论文中取0.01,这样做能在训练初始阶段提高positive的分类概率。
四、参考
https://zhuanlan.zhihu.com/p/51708428
https://zhuanlan.zhihu.com/p/59910080