OHEM online hard example mining 这是CVPR2016的一篇paper,相较于 负难例挖掘,其主要是不需要人为设定正负样本的比例。算法的核心思想是对样本进行训练,选择其中loss较高的N个样本作为难例,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本采用反向传播进行loss下降。实际操作中是将原来的一个ROI NetWork扩充为两个ROI NetWork,这两个ROI NetWork共享参数。其中前面一个ROI NetWork只有前向操作,主要用于计算损失;后面一个ROI NetWork包括前向和后向操作,以hard example作为输入,计算loss并且回传梯度。作者将该算法应用在Fast RCNN中,网络结构还是采用VGG16和VGG_CNN_M_1024,数据集主要采用VOC2007,VOC2012和COCO数据集。
算法优点:1、对于数据的类别不平衡问题不需要采用设置正负样本比例的方式来解决,这种在线选择方式针对性更强。2、随着数据集的增大,算法的提升更加明显(作者是通过在COCO数据集上做实验和VOC数据集做对比,因为前者的数据集更大,而且提升更明显,所以有这个结论)。
算法的测试结果:在pascal VOC2007上的mAP为78.9%,在pascal VOC2012上的mAP为76.3%。注意,这些结果的得到包含了一些小tricks,比如multi-scale test(测试时候采用多尺度输入),bounding box的不断迭代回归。
代码的github地址:https://github.com/abhi2610/ohem
如前所述,OHEM算法的核心是选择一些hard example作为训练的样本,那么什么样的样本是hard example呢?答案是:有多样性和高损失的样本。
在论文中作者主要是将OHEM算法用在Fast RCNN结构中。因此可以先回顾下Fast RCNN的结构。
Fast RCNN的结构图如下,主要包含两个部分:1、卷积网络。主要由多个卷积层和max pooling层组成;2、ROI pooling网络。主要包括ROI pooling层,一些全连接层和两个损失层。
hard example是根据每个ROI的损失来选择的,选择损失最大的一些ROI。但是这里有一个问题:重合率比较大的ROI之间的损失也比较相似。因此这里作者采用NMS(non-maximum suppresison)去除重合率较大的ROI,这里作者给的阈值是当IOU大于0.7就认为重合率较高,需去除。
注意,这里作者没有采用设定背景和目标样本数的比例方式处理数据的类别不平衡问题。因为如果哪个类别不平衡,那么这个类别的损失就会比较大,这样被采样的可能性也比较大。
那么具体要怎么把OHEM放在Fast RCNN网络结构中呢?可能首先会想到的做法是修改损失层,将没选择的ROI的loss设置为0。但是这种做法并不高效,因为即便很多ROI的loss都是0,也就是不需要更新梯度,但是这样仍需要给每个ROI都分配存储空间,并且每个ROI都需要后向传播。
因此就有了作者将OHEM应用在Fast RCNN的网络结构,如下图。这里包含两个ROI network,上面一个ROI network是只读的,为所有的ROI在前向传递的时候分配空间。下面一个ROI network则同时为前向和后向分配空间。
首先,ROI经过ROI plooling层生成feature map,然后进入只读的ROI network得到所有ROI的loss;然后是hard ROI sampler结构根据损失排序选出hard example,并把这些hard example作为下面那个ROI network的输入。
实际训练的时候,每个mini-batch包含N个图像,共|R|个ROI,也就是每张图像包含|R|/N个ROI。经过hard ROI sampler筛选后得到B个hard example。作者在文中采用N=2,|R|=4000,B=128。
另外关于正负样本的选择:当一个ROI和一个ground truth的IOU大于0.5,则为正样本;当一个ROI和所有ground truth的IOU的最大值小于0.5时为负样本。
为什么要hard mining:
1 减少fg和bg的ratio,而且不需要人为设计这个ratio;
2 加速收敛,减少显存需要这些硬件的条件依赖;
3 hard mining已经证实了是一种booststrapping的方式, 尤其当数据集较大而且较难的时候;
4 eliminates several heuristics and hyperparameters in common use by automatically selecting hard examples, thus simplifying training。
放宽了定义negative example的bg_lo threshold,即从[0.1, 0.5)变化到[0, 0.5)。
取消了正负样本在mini-batch里的ratio(原Fast-RCNN的ratio为1:3)
参考blogs:
https://blog.csdn.net/u010678153/article/details/52639185
https://blog.csdn.net/u014380165/article/details/73148073