Rich feature hierarchies for accurate object detection and semantic segmentationhtml
做者: Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malikgit
引用: Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.github
引用次数: 2027(Google Scholar, By 2016/11/23).算法
项目地址: https://github.com/rbgirshick/rcnn (基于MATLAB)网络
1 介绍
学习
这篇文章是2014年CVPR的一篇文章,就是很出名的RCNN(Regions with CNN Features),利用了深度学习的方法来作目标检测.测试
本模型主要包含了3 + 1个模块:spa
模块一: 生成类别独立的候选区域翻译
何为类别独立的(category-independent,CI)区域? 好比说咱们想识别一张图像上的猫和狗,生成的CI区域不能横跨猫和狗,而只能属于它们之一,或者干脆是背景.在一张图像上生成CI区域的方式有不少,本文采用的是Selective Search的方法,关于这个方法,请参考个人另外一篇博文<论文阅读笔记--Selective Search for Object Recognition>.3d
模块二: 利用一个大CNN来提取每一个候选区域的特征向量
模块三: 利用CNN特征为每一个类别训练一个二分类线性SVMs
可选模块: 利用CNN特征来作Bounding-box回归
2 训练和测试流程图
2.1 本文模型训练流程图
训练的过程从前到后可分红五个部分:
第一部分: 训练集构造(用于对CNN进行微调)
给定一系列的输入图像,如何构造训练集?我认为也是先用Selective Search的方法在每一个图像上生成不少的候选区域(具体多少文中好像没有讲),而后在每张图上依次计算每一个候选区域与图中目标的ground-truth box以前的重叠程度(IoU),若是重叠程度大于0.5则标记这个区域为此目标的正样本,不然,为负样本.对全部的训练图像执行这样的操做,能够把获得的全部的候选区域保存下来以备使用.假如说有20个目标,对每一个目标咱们都有一些属于它这个类的正样本,统称为正样本,其余的不属于任何类的区域图像称之为负样本.
第二部分: 训练CNN来抽取候选区域深度特征
CNN采用了AlexNet的网络结构,模型使用Caffe来实现;AlexNet网络的结构以下图所示:中间层咱们不关注,咱们主要看它的输入和输出.输入是224*224大小的图像,提取到的特征是一个4096维度的特征向量,因为是1000类的分类任务,所以最后一层的节点数目为1000.
OK,上面回顾了一下典型的AlexNet网络,如今咱们看做者是如何借鉴这个网络的.首先是输入,本文的输入固然是第一部分里面提取到的候选区域,可是这些候选区域的大小都是不相同的,所以首先要把每一个区域都resize到规定大小(224*224);对于每一个区域提取的深度特征的维度依旧是4096维;最后一层的输出要根据任务的不一样作出相应的改变,本来AlexNet中最后一层的1000的含义是1000类的分类任务,到了这里,若是是对VOC数据集,则要把最后一层的节点数目设置为20+1(20表示有20个待识别目标,1表示背景类);对ILSVRC2013来讲,要设置为200+1.
假如说对于VOC数据集,第一部分已经把训练数据集构造好了,共有21个类,每一个类都有本身对应的样本区域,并且这些区域是类别独立的.而后就能够输入到改进版的AlexNet进行训练了,AlexNet的最后一层依旧是Softmax层,这个时候的训练能够看作有监督地训练一个21-way的图像分类网络.
CNN网络的具体训练方法是:先用ILSCRC2012数据集对网络进行有监督预训练,而后使用第一部分里面提取的训练集进行微调;微调的时候采用SGD的方法,学习率设置为预训练时候的十分之一(具体为0.001),这样使得网络慢慢地收敛.mini-batch的大小为128(从第一部分保存下来的候选区域里,每次随机抽取32个正样本(在全部类别上),96个负样本(背景类)).
第三部分: 训练集构造(用于训练多个SVM分类器)
第一部分介绍了如何构造训练集来对预训练后的CNN进行微调,那里面与GT Boxes之间的IoU重叠程度大于0.5的都被标定为正样本.如今到了这一步,CNN已经训练完成了,咱们如今要为每一个类别(好比猫,狗,...)单独训练一个二分类SVM分类器,好比"SVM_猫"就是专门来检测猫这个目标,"SVM_狗"就是专门来检测狗这个目标,这时候对每一个二分类SVM分类器如何构造它的训练集呢? 以猫这个目标为例,本文的作法就是以每张图像上猫这个目标的GT Boxes做为正样本,而后在图像上生成不少候选区域,考察每一个区域与猫目标的GT boxes之间的IoU,若是IoU小于0.3,那么就认定这个区域为负样本,重叠度在0.3~1之间的不用作训练.能够想象,对于训练"SVM_猫"来讲,正样本都是包含猫的区域,负样本有多是背景,也有可能包含了其余目标,好比狗,可是不管怎么样,这个区域只要不包含猫,或者讲包含了一部分猫,可是重叠度小于0.3,都会被标记为负样本.
第四部分: 为每一个类训练一个binary SVM分类器
假若有20个类,那么就要训练20个binary分类器,第三部分讲述了如何为每个两分类SVM构造相应的训练集,训练集里面的正样本和负样本都要使用上面已经训练好的CNN来提取各自的4.96维度的特征向量,而后再对分类器进行训练.
第五部分: 进行Bounding-box回归
相似于第四部分中为每一个类别训练一个二分类SVM,本文这里为每一个类别构造一个Bounding-box回归器来提高检测的准确率.
具体作法:假以下图中的绿色box用P来表示,P=(Px,Py,Pw,Ph),这四个值分别表示这个box的中心点横坐标,中心点纵坐标,box宽度以及box高度.红色框为目标的真实box,设为G,G=(Gx,Gy,Gw,Gh),每一个元素的含义和P中相同,如今的目的就是想学习到一种变换,这个变换能够将P映射到G.
如何对这个变换进行建模? 做者给出了一种变换关系以下图所示:
训练回归器的时候,对于输入: 训练box的P=(Px,Py,Pw,Ph)确定是要参与的,可是不只仅是这个.前面咱们训练获得了CNN,咱们这里可使用已经训练的CNN计算区域的pool5层的特征(即Φ5(P))来参与训练,w_{x,y,h,w}为待学习的回归器参数,所以,咱们的问题变得很直接: 就是经过必定的方法把w_{x,y,h,w}求出来,就获得了回归器.思路讲清楚了,具体的求解过程见论文中所述.
注意事项:我在想,就好比上面那个检测狼的那张图,真实的边缘box就一个,而候选的box却可能有不少,那么也就是说,对于这张图像上的样本,它们的输入虽然不同,可是输出确实相同的,这合理吗?可是转念一想,训练的时候图像的数目是不少的,从这些图像上抽取的全部样本一块儿参与训练,一张图像上的影响可能并不那么大.文中提示咱们须要注意的一点也在训练集的构造上面,若是P这个区域距离G太远的话,那么回归可能变得没有意义,一次构造训练集时候要选择哪些距离G比较近的候选区域,怎么考量这个近的程度呢? 固然仍是使用IoU了,文章中选择那些与GTbox的IoU在0.6以上的区域来进行回归(0.6这个值使用交叉验证肯定的),至于其余的候选区域,直接丢掉就是了.
2.2 本文模型测试过程
测试过程基本上和训练的过程是相同的: 给定一张测试图像 --> 利用SS方法抽取大约2000个候选区域 --> 将每一个区域都resize到224*224大小 --> 利用训练好的CNN获得每一个区域的深度特征 --> 将每一个区域对应的深度特征向量分别送到那几十个训练好的二分类SVM当中,输出每一个区域属于每一个类的几率(SVM软分类).假如类别数目N=20,就会获得一个2000*20的矩阵,每一行数据表示的是一个候选区域属于20个类的几率值.每一列表示全部的候选区域属于那一列类别的几率值(好比,一张图像上的2000个候选区域属于猫这个类别的几率). --> 对于每一类别(也就是每一列的数据)使用贪婪非最大值抑制的方法来对这些区域进行筛选. --> 对这2000个候选区域,用回归器预测bounding box.
(问题1: 贪婪非最大值抑制这点尚未彻底理解,具体是怎么进行的?)
(问题2: 最后怎么获得最终结果的?)
总结
1. 上面的模型,即便把第三部分和第四部分去掉也能获得检测的结果,也就是说,直接运用CNN的softmax分类器就能够当作是一个目标检测器,那么为何还要再构造训练集,再训练多个SVM分类器呢? 若是只是用CNN+Softmax来作目标检测器,那么这篇论文的思路就和<论文阅读笔记--Selective Search for Object Recognition>差很少了,就是把Selective Search算法里面的HOG+BOW特征换成了CNN特征,SVM分类器换成了Softmax,这样的话,这篇论文的创新性便不能体现!并且,据做者文中所说,若是只使用第一和第二部分的话,在VOC2007数据集上的表现将从54.2%降低到50.9%.
每一个模型都有本身的优势和缺点,这篇为人所道的缺点就是它须要训练多个SVM分类器,计算复杂度较高,这一点在那些只须要训练一个分类器的文章中常常能看到.
2. Ross Girshick大神在RCNN改进版<Fast RCNN>里面对RCNN的几个缺点进行了阐述,只要包括:
(1) RCNN的训练是一个multi-stage pipeline.这句话的意思是说RCNN的三个模块是一条流水线下来,而不是有机地结合在了一块儿;具体来讲就是: RCNN首先利用object proposals样本,借助log loss(Softmax)来微调一个ConvNet --> 而后使用ConvNet的特征来训练多个二分类SVMs --> 最后再训练一个bounding-box回归器.
(2) 训练在空间和时间上都耗费巨大.RCNN须要训练多个SVM分类器,也要训练多个回归器,训练所用的特征向量都是深度特征向量,维度是很高的,这些特征保存到硬盘上很占空间,并且训练比较耗时.
(3) 测试的时候速度很慢. 测试的时候,先在图像上生成region proposal,而后提取每一个proposal的深度特征,而后再分类,在GPU上测试是47s/image,达不到实时的要求.
本博文不是对文章的逐字翻译,而是尽可能对其思想进行理解,所以不免有一些误解或者不当之处, 敬请留言指教, 谢谢!
参考文献:
[1] 项目的MATLAB源码:https://github.com/rbgirshick/rcnn