原文链接:R-CNN论文详解
参考链接点我
R-CNN论文详解 (这个讲的很好)
摘要
R-CNN之前,在权威数据集PASCAL上,物体检测的效果已经达到一个稳定水平。效果最好的方法是融合了多种低维图像特征和高维上下文环境的复杂融合系统。R-CNN则是一种简单并且可扩展的检测算法,可以将mAP在VOC2012最好结果的基础上提高30%以上——达到了53.3%。它结合了两个关键的因素:
- 在候选区域上自下而上使用大型卷积神经网络(CNNs),用以定位和分割物体。
- 当带标签的训练数据不足时,先针对辅助任务进行有监督预训练,再进行特定任务的调优,就可以产生明显的性能提升。
介绍:
特征很重要,过去十年,各类视觉识别任务基本都建立在对SIFT和HOG特征的使用。
SIFT和HOG是块方向直方图(blockwise orientation histograms),一种类似大脑初级皮层V1层复杂细胞的表示方法。但我们知道识别发生在多个下游阶段,(我们是先看到了一些特征,然后才意识到这是什么东西)也就是说对于视觉识别来说,更有价值的信息,是层次化的,多个阶段的特征。
R-CNN主要关注两个问题:使用深度网络定位物体和在小规模的标注数据集上进行大型网络模型的训练。
与图像分类不同的是,检测需要定位一个图像内的许多物体。
-
一个方法是将框定位看做回归问题。但Szegedy等人的工作说明这种策略并不好(VOC2007上mAP是30.5%,R-CNN是58.5%)。
-
另一个方法是滑动窗口探测器(yolo那篇有提到,数据量太大)。
R-CNN通过操作”recognition using regions”范式,解决了CNN的定位问题(第一个挑战)。
检测中面对的第二个挑战是标签数据太少,可获得的数据远远不够用来训练一个大型卷积网络。传统方法多采用无监督与训练,再进行有监督调优。本文的第二个核心贡献是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。这是在训练数据稀少的情况下一个非常有效的训练大型卷积神经网络的方法。实验中,针对检测的调优将mAP提高了8个百分点。调优后,系统在VOC2010上达到了54%的mAP,远远超过高度优化的基于HOG的可变性部件模型(deformable part model,DPM)
【DPM:多尺度形变部件模型,把物体看成了多个组成的部件(比如人脸的鼻子、嘴巴等),用部件间的关系来描述物体,这个特性非常符合自然界很多物体的非刚体特征。DPM可以看做是HOG+SVM的扩展,很好的继承了两者的优点,在人脸检测、行人检测等任务上取得了不错的效果,但是DPM相对复杂,检测速度也较慢,从而也出现了很多改进的方法。】
先考虑R-CNN的 测试过程:
-
对输入图像,selective search算法(ss算法)提取约2000个建议框(跑在CPU上,是比较耗时的环节,后来模型要改进);
-
在每个建议框周围加上16个像素值为建议框像素平均值的边框,再直接resize为227×227(因为神经网络的输入固定,其实卷积操作输入可以不固定,全连接层输入才固定,这也是后面几个模型会改进的);
-
将所有建议框像素减去该建议框像素平均值【预处理操作】,再依次将每个227×227的建议框输入AlexNet网络提出两套特征,一个是fc7层的(4096维的特征),一个是con5层的(2000个建议框的CNN特征),组合成2000×4096维矩阵;
-
fc7层的特征,分别过20个SVM分类器,哪个分类器给的分数最高(就对于哪个类别),具体操作为:将2000×4096维特征与20个SVM的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分(现在2000个框都有对应的类别了(有不同label));
-
分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠(冗余)建议框,得到该列即该类中得分最高的一些建议框;
-
con5层的特征,送入Bounding box模型,根据模型的输出做出一次修正:分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box;
-
根据SVM的结果打标签,根据修正的结果画框。
R-CNN模块介绍
R-CNN物体检测系统有四个模块:
- 第一,区域建议算法(ss),产生类别无关的region proposal。
- 第二,特征提取算法(AlexNet),大型卷积神经网络,用于从每个区域抽取特定大小的特征向量;
- 第三,线性分类器(线性SVM),指定类别。
- 第四,边界框修正回归模型(Bounding box)
区域推荐(region proposal)
ss(selective search)算法,一种根据图像自身信息产生推荐区域的算法,大概会产生2000个潜在目标区域:
采取过分割手段,将图像分割成小区域,再通过颜色直方图,梯度直方图相近等规则进行合并,最后生成约2000个建议框的操作。
特征提取(Feature extraction)
特征提取算法其实就是卷积神经网络,R-CNN中使用的是AlexNet,但是并没有把AlexNet当做分类器来使用,而是只用了网络的特征层做ss算法输出的图像的特征提取工作,第7层特征给了SVM分类器,第五次特征给了Bounding Box回归模型。
为了计算region proposal的特征,先要对图像进行转换,使得它符合CNNC的输入(277*277)。这个变换有很多办法,使用最简单的一种,无论候选区域是什么尺寸和宽高比,都把候选框变形成想要的尺寸。具体的,变形之前,在候选框周围加上16的padding,再进行各向异性缩放。 这种变换使得mAp提高了3到5个百分点。
链接:R-CNN中的各项同性 各向异性。
线性分类器SVM
R-CNN使用了线性SVM分类器,目标检测任务是有分类的功能的,比如一个任务是检测猫和狗,除了要框出猫和狗的位置之外,也需要判断是猫还是狗,这也是SVM在R-CNN中的作用。所以待检测物体有几类,就应该有几个二分类的SVM分类器,上面的例子中,就需要两个二分类分类器了,分别是“猫-非猫”模型和“狗-非狗”模型,在R-CNN中,分类器有20个,它的输入特征是AlexNet提取到的fc7层特征。
边界框修正回归模型
R-CNN中,Bounding box的作用是修正ss算法推荐的区域的边界,输入的特征是AlexNet的第五层特征,与SVM分类器一样,也是每一个类别都有一个模型,一共20个。回归模型如何设计?(与yolo、ssd均类似)
R-CNN训练
R-CNN训练了CNN,SVM与Bounding box三个模型,ss算法用不着训练,ss在生成了1000-2000个推荐区域之后,就和训练任务没啥关系了,训练样本是由ss区域生成出来的子图构建起来的。 而且三个部分的训练时独立的,没有整合在一起。
1.训练CNN模型
CNN是在ImageNet上pre-train(即有监督预训练)的AlexNet模型(learning_rate为0.01),在R-CNN中进行fine-tune,fine-tune的过程是将AlexNet的Softmax改为任务需要的类别数(替换掉了ImageNet的1000-way分类层,换成了一个随机初始化的21-way分类层)。
- 有监督预训练
样本 | 来源 |
---|---|
正样本 | ILSVRC2012 |
负样本 | ILSVRC2012 |
ILSVRC样本集上仅有图像类别标签,没有图像物体位置标注;
采用AlexNet CNN网络进行有监督预训练,学习率=0.01;
该网络输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征–>1000类的映射,训练的是网络参数。
- 特定样本下的微调
样本 | 来源 |
---|---|
正样本 | Ground Truth+与Ground Truth相交IoU>0.5的建议框【Ground Truth太少】 |
负样本 | 与Ground Truth相交IoU≤0.5的建议框 |
样本的构建使用ss生成的子图;
PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签;
采用训练好的AlexNet CNN网络进行PASCAL VOC 2007样本集下的微调,学习率=0.001【0.01/10为了在学习新东西时不至于忘记之前的记忆】;
mini-batch为32个正样本和96个负样本(比例1:3)【由于正样本太稀疏】;
该网络输入为建议框【由selective search而来】变形后的227×227的图像,修改了原来的1000为类别输出,改为21维【20类+背景】输出,训练的是网络参数。
2、训练分类器SVM
SVM训练
样本 | 来源 |
---|---|
正样本 | Ground Truth |
负样本 | 与Ground Truth相交IoU<0.3的建议框 |
由于SVM是二分类器,需要为每个类别训练单独的SVM;
SVM训练时输入正负样本在AlexNet CNN网络计算下的4096维特征(AlexNet fc7的输出),输出为该类的得分,训练的是SVM权重向量;
由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。
【难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止.这一个过程就叫做’hard negative mining’】
高难负例挖掘算法收敛很快,实践中只要在所有图像上经过一轮训练,mAP就可以基本停止增加了。
思考一下检测汽车的二分类器,一个图像区域紧紧包裹着汽车应该就是正例,同样,没有汽车的就是背景区域,也就是负例。不明确的是怎样标注那些和汽车部分重叠的区域,R-CNN使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值选择了0.3,是在验证集上基于{0, 0.1, … 0.5}通过网格搜索得到的。认真选择这个阈值很重要。如果设置为0.5,可以降低mAP5个点,设置为0,就会降低4个点。正例就严格的是标注的框。
【IOU<0.3被作为负例,ground-truth是正例,其余的全部丢弃】
在fine-tunning和SVM训练这两个阶段,定义的正负样例是不同的:
【fine-tunning阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松: IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:只有Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。】
为什么训练一个分类器是必要的,而不只是简单地使用来自调优后的CNN的最终fc8层的输出。
【作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度】。
因为微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的;导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。
3、训练Bounding box回归模型
Bounding-box regression训练
样本 | 来源 |
---|---|
正样本 | 与Ground Truth相交IoU最大的Region Proposal,并且IoU>0.6的Region Proposal |
消融研究(Ablation studies)
ablation study 就是为了研究模型中所提出的一些结构是否有效而设计的实验。如你提出了某某结构,但是要想确定这个结构是否有利于最终的效果,那就要将去掉该结构的网络与加上该结构的网络所得到的结果进行对比,这就是ablation study。也就是(控制变量法)
没有调优的各层性能。
没有调优是指所有的CNN参数就是在ILSVRC2012上训练后的状态。分析每一层的性能显示,来自fc7的特征泛化能力不如fc6的特征。这意味29%的CNN参数,也就是1680万的参数可以移除掉,而且不影响mAP。即使同时移除fc6和fc7,仅仅使用pool5的特征,只使用CNN参数的6%也能有非常好的结果。可见CNN的主要表达力来自于卷积层,而不是全连接层。这个发现提醒我们也许可以在计算一个任意尺寸的图片的稠密特征图(dense feature map)时使仅仅使用CNN的卷积层。
调优后的各层性能。
调优后在VOC2007上的结果表现,提升非常明显,mAP提升了8个百分点,达到了54.2%。fc6和fc7的提升明显优于pool5,这说明pool5从ImageNet学习的特征通用性很强,在它之上层的大部分提升主要是在学习领域相关的非线性分类器。
还存在什么问题
-
最大的缺点是对一张图片的处理速度慢,这是由于一张图片中由selective search算法得出的约2k个建议框都需要经过变形处理后由CNN前向网络计算一次特征,这其中涵盖了对一张图片中多个重复区域的重复计算,很累赘;
-
知乎上有人说R-CNN网络需要两次CNN前向计算,第一次得到建议框特征给SVM分类识别,第二次对非极大值抑制后的建议框再次进行CNN前向计算获得Pool5特征,以便对建议框进行回归得到更精确的bounding-box,这里文中并没有说是怎么做的,博主认为也可能在计算2k个建议框的CNN特征时,在硬盘上保留了2k个建议框的Pool5特征,虽然这样做只需要一次CNN前向网络运算,但是耗费大量磁盘空间;
-
训练时间长,虽然文中没有明确指出具体训练时间,但由于采用RoI-centric sampling【从所有图片的所有建议框中均匀取样】进行训练,那么每次都需要计算不同图片中不同建议框CNN特征,无法共享同一张图的CNN特征,训练速度很慢;
-
测试过程很复杂,先提取建议框,之后提取每个建议框CNN特征,再SVM分类,非极大值抑制,最后bounding-box回归才能得到图片中物体的种类以及位置信息;同样训练过程也很复杂,ILSVRC 2012上预训练CNN,PASCAL VOC 2007上微调CNN,做20类SVM分类器的训练和20类bounding-box回归器的训练;这些不连续过程必然涉及到特征存储、浪费磁盘空间等问题。