rcnn中类别判断中分类器对每一类目标,使用一个线性SVM分类器进行判别。输入为深度网络输出的4096维特征,输出是否属于此类。由于负样本很多,使用hard negative mining方法。
关于hard mining,比较生动的例子是高中时期你准备的错题集。错题集不会是每次所有的题目你都往上放。放上去的都是你最没有掌握的那些知识点(错的最厉害的),而这一部分是对你学习最有帮助的。
一、为何难例挖掘? Why Hard Example Mining
难例挖掘与非极大值抑制 NMS 一样,都是为了解决目标检测老大难问题(样本不平衡+低召回率)及其带来的副作用。
目标检测与图像分类不同,图像分类往往只有一个输出,但目标检测的输出个数却是未知的。除了Ground-Truth(标注数据)训练时,模型永远无法百分百确信自己要在一张图上预测多少物体。
目标检测问题的老大难问题之一就是如何提高召回率。
为了提高这个值,很直观的想法是“宁肯错杀一千,绝不放过一个”。因此在目标检测中,模型往往会提出远高于实际数量的区域提议(Region Proposal,SSD等one-stage的Anchor也可以看作一种区域提议)。
但此时就会遇到一个问题,因为区域提议实在太多,导致在训练时绝大部分都是负样本,这导致了大量无意义负样本的梯度“淹没”了有意义的正样本。
为了让模型正常训练,我们必须要通过某种方法抑制大量的简单负例,挖掘所有难例的信息,这就是难例挖掘的初衷。
难负例挖掘(Hard Negative Mining)就是在训练时,尽量多挖掘些难负例(hard negative)加入负样本集,这样会比easy negative组成的负样本集效果更好。
二、R-CNN中的hard negative mining
而R-CNN中的难负例挖掘就是采用了这种自举法(bootstrap)的方法:
-
- 先用初始的正负样本训练分类器(此时为了平衡数据,使用的负样本也只是所有负样本的子集)
- 用(1)训练好的分类器对样本进行分类,把其中错误分类的那些样本(hard negative)放入负样本子集,
- 再继续训练分类器,
- 如此反复,直到达到停止条件(比如分类器性能不再提升)
也就是说,R-CNN的Hard Negative Mining相当于给模型定制一个错题集,在每轮训练中不断“记错题”,并把错题集加入到下一轮训练中,直到网络效果不能上升为止。
非首次负例采样时,要筛选出 难负例example,需要满足两个条件:
-
- 负例,即最大IOU 小于 阈值 d.overlap(:, cls_id) < neg_ovr_thresh
- 分类错误,既然是负例,那么SVM计算值wx+b 应该小于 1
以下图简单的回顾一下SVM,
位于H1和H2超平面上的实例就称为支持向量,对于y=1的正例点,有H1: wx + b =1
对于y=-1的负例点,H2: wx + b = -1
分类正确时应满足,
wx+b>=1, if y = 1
wx+b <=-1, if y = -1
但是,SVM为了处理非严格线性可分的数据集,引入了松弛变量,于是如下图,
于是 只要 wx+b>-1,都可以认为是正例,只不过 wx+b越小,置信度越低。
链接:https://www.zhihu.com/question/46292829/answer/794749025
来源:知乎