论文连接:Training Region-based Object Detectors with Online Hard Example Mining
1. 提出问题
本文提出针对的问题:
我们都知道,目标检测的原理就是通过枚举大量的候选框,这些框会包括所有物体,同时也会有更加多的只包含背景的框,正负样例的比例大约在70:1,者很显然是不好的,如果能减小这个比例,那很显然会更快的训练,并且拥有更高的精度,但减小这个比例是个很早就存在的问题,被称为(hard negative mining),以前也被成为bootstrapping,利用已经有的样本统计量来推算总体统计量,也就是一个以局部推算总体的过程,也是采样的一种并不是什么很高端的东西,可以参见西瓜书2.2.3的bootstrapping 自助法。举个例子:
假定盒子中有蓝、黄共n个小球,自助样本可按如下步骤获得:
- 从盒中随机抽取一个小球并记录其颜色;
- 把小球放入盒中;混匀。再随机抽取一个小球,记下其颜色;
- 放回盒子中,混匀,重新抽取;
- 重复步骤③和④n次,便可得到一个自助样本。 重复上述抽样过程M次,便可得到M个自助样本。
而在RCNN中就是用了这种提升法,他的过程是这样的,先用初始的正负样本训练分类器(此时为了平衡数据,使用的负样本也只是所有负样本的子集);
用上一步训练好的分类器对样本进行分类,把其中错误分类的那些样本(hard negative)放入负样本子集,再继续训练分类器;
如此反复,直到达到停止条件(比如分类器性能不再提升).
也就是说,R-CNN的Hard Negative Mining相当于给模型定制一个错题集,在每轮训练中不断“记错题”,并把错题集加入到下一轮训练中,直到网络效果不能上升为止。
这个提升的过程是很费时间的,尤其是在使用SGD优化的神经网络中,因此不能使用。
OHEM
有两种方法:
- 其实这个原理很简单,将每个batch的所有ROIs同过网络,计算损失值,将损失值从大到小排序,如果损失值大于某一阀值,或者损失最大的若干作为hard RoIs,而其他的作为non-hard RoIs,其损失设置为0,当然也许会有这样个问题,某两个IOU很大的默认框都是hard RoIs,那样得到的损失不准确了,因此,需要进行一个NMS过程,弱两个hard RoIs的iou大于0.7,则舍去一个。
但效率是低下的,不仅要为所有RoI分配内存,还要对所有RoI进行反向 传播,即使有些RoI损失为0。
- 为了解决这个问题,作者提出了上面这样的架构。这个架构有两个相同 的RoI网络,不同的是其中一个只可读,另一个可读可写。我们看到(a) 是只可读的,只对所有RoI做前向计算,所以只需分配内存给前向计算 操作,(b)既可读也可写,对被选择的hard RoIs不仅做前向计算也做反向 传播计算。对于一次SGD迭代,计算过程如下:先计算出特征图,可读RoI网络对所 有RoI执行前向计算并计算每个RoI的损失,然后选择hard RoIs。把这 些hard RoIs输入到可读可写的RoI网络中执行前向前向计算和反向传播更新网络,并把可读可写的RoI网络的参数赋值给只可读的网络,一次 迭代就完成了这是一个迭代过程。
这个方式和第一种方式在内存空间是差不多的,但第二种方式的速度快 了两倍。
实验
- OHEM vs. heuristic sampling 为了检验hard example mining的重要性,我们做了两组实验,一组Fast R-CNN 带有hard example mining,bg_lo=0.1,另一组没有hard example mining,即 bg_lo=0。我们发现,对于VGGM网络,mAP降低2.4点,VGG16基本没变 化。而使用OHEM,相对于使用了hard example mining的Fast R-CNN,mAP 提高了2.4点,相对于没有使用hard example mining的Fast R-CNN,mAP提 高了4.8点。
- Robust gradient estimates 而在实验中,存在一个这样的疑虑,每个mini-batch只取两张图片会不会造 成梯度不稳定和收敛慢,因为在一张图片中选择RoI会使RoIs之间的相关性 很大。Fast R-CNN的作者认为在训练过程不存在这样的问题,而在OHEM中, 由于是在一张图片中选择损失大的RoI,这样可能造成RoIs之间的相关性更 大。为了解答这个疑虑,我们把N设置为1,通过做实验发现,传统的Fast R-CNN大概降低一个点,而OHEM却没有太大变化,这说明使用了OHEM的 Fast R-CNN是鲁棒的。
3. Why just hard examples, when you can use all? 那为什么只选择hard examples呢,因为easy examples的损失很小,对梯度 影响很小。为了用事实说话,作者做了一个这样的实验,把mini-batch的B 分别设置为128和2048,结果表明,B为2048的相对于128的,mAP提高 了一个点。不过,这提高的一个点对于使用了OHEM的Fast R-CNN来说是无 关紧要的,因为OHEM的mAP提高更大,并且用更小的mini-batch收敛速 度会更快。
- Better optimization 作者为了分析使用了不同训练方法的Fast R-CNN的训练损失的情况,做了这 样的实验,每优化20K步就记录一下所有RoIs的平均损失,结果显示, bg_lo=0(即没有使用hard example mining)的训练损失最高,bg_lo=0.1(使用 hard example mining)的损失有所降低,增大mini-batch(即设置bg_lo=0, B=2048),损失更低,最后,使用了OHEM的Fast R-CNN损失最低,这表明 Fast R-CNN使用了OHEM会训练得更好。
- Computational cost
使用了OHEM的Fast R-CNN相对于没有使用OHEM的Fast R-CNN在内存和每 迭代一次所花的时间都有所增加,不过,作者认为这一点增加影响不大。
思考
faster rcnn和fast rcnn中都是使用正负样例1:3,但是这个比例的大小对结果有影响,因此只是设定为固定大小并不好,faster rcnn和OHEM是同时期的论文,因此在faster rcnn中并没有借鉴这个想法,还有在我感觉这个过程和faster rcnn的两阶段很像,但是效果没有faster rcnn好,本文的方法只是一个小trick,关键能融到目标检测当中,并进行实验验证,这是目前深度学习论文的关键,实验非常重要。