RCNN--对象检测的又一伟大跨越
最近在实验室和师兄师姐在做有关RCNN的研究,发现这里面坑很深呀,在网上找了一个大牛的博客,准备下来继追OPENCV同时,再来追一个RCNN的学习笔记的博文,博文地址如下:http://blog.csdn.net/column/details/ym-alanyannick.html,真的很感谢原作者提供这么好的学习资料,我就站在巨人的肩膀上总结学习下。
------------------------------------------------------------
二次编辑:
继上次对RCNN的研究,下来继续追博文,因为中间有一些毕设答辩之类的事情把思路给打断了,现在重新沉下心来,安心做学术。
加油! 2016年6月3日
为什么感觉所谓的对象检测,并不是字面意义上的直接探测一副图片中的对象,而是对框出的区域中的对象进行像素的对比统计。
就像医生看病,不是从一些症状思考患者是什么病,而是从感冒发烧开始一一排除。
感觉这就像之前知乎上一个问题:现在的人工智能大部分基于统计学方法,那人工智能就看似不是那么智能了。
本想对这篇RCNN学习笔记进行扩充,但是发现我需要另外学习一个叫SPPnet的网络,故这篇文章到此结束。
下篇:Fast RCNN(包括SPPnet、Fast RCNN)
-------------------------------------------------------------
在我的上一篇文章中转载了一个介绍DPM方法的文章,在DPM方法到达瓶颈期的时候,RCNN横空出世,一统天下。
多说几句,经典的对象检测是提取一些人工设定的特征(Haar,HOG,SIFT,LBP,BoW,DPM等,这个专题在http://blog.csdn.net/zouxy09/article/details/7929570/有详细解释)
本文的RCNN学习笔记主要是对几篇论文的总结理解和对网上学习笔记的总结,关于RCNN的几篇论文我也发下链接,有兴趣可以去下载:
论文下载传送门:
https://files.cnblogs.com/files/soulmate1023/RCNN.pdf (RCNN)
https://files.cnblogs.com/files/soulmate1023/RCNN.zip (Fast rcnn, Faster rcnn)
RCNN论文所使用的数据库:
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
废话不多说,走起。
文章简要介绍RCNN的框架,主要包含:
原图--》候选区域生成--》对每个候选区域利用深度学习网络进行特征提取--》特征送入每一类SVM分类器中判别--》回归器修正候选框位置
经典图:
下面对每一个步骤详细分析:
1.候选区域生成:
使用Selective Search(选择性搜索)方法从一张图片中生成许多小图,Selective Search是先用过分割手段将图片完全分割成小图(小图生成途径1),再通过一些合并规则,将小图均匀的合并,这是合并的小图相比原图还是小图(小图生成途径2),这样合并若干次,直到合并成整张原图,至此,将所有生成小图的途径过程中的小图全部输出,就产生了region proposals, 原作者很形象的说道:
例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。
不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。
这里的a,b,c,d,e,f,g,h,ab,cd,ef,gh,abcd,efgh都是region proposals。这样的小图生成策略就叫做Selective Search。为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。作者提供了Selective Search的源码。
2.图片resize:
因为CNN分类器需要输入的图片大小一致,所以这一步将图片都resize成为227*227大小的,论文中试验了两种不同的resize处理方法:
@各向异性缩放:
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示
@各项同性缩放:
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法:
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值);如下图(C)所示;
对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高;
3.CNN网络训练:(这一节只解释训练部分,关于CNN的内部结构先当做黑盒使用,下一节再解释CNN的具体结构)
RCNN网络训练包括两部分:预训练 & 调优训练
@预训练:
网络结构是基本借鉴Hinton 2012年在Image Net上的分类网络Alexnet,略作简化。这样避免了直接从随机初始化的参数进行训练,使得网络开始之前参数都是经过训练过的参数,该技巧可以大大提高精度,这种方法叫有监督的训练方式(也称为迁移学习)。此网络提取的特征为4096维,之后送入一个4096->1000的全连接(fc)层进行分类。
使用ILVCR 2012的全部数据进行训练,输入一张图片,输出1000维的类别标号,学习率0.01。
@调优训练:
网络结构同样使用上述网络,最后一层换成4096->21的全连接网络。因为RBG大神说了,通过他们的实验得出,一般的CNN网络(eg,S1-S5,F6,F7),前5层是用于特征提取的,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。所以这里可以将后面的层修改用于对象检测。 学习率0.001,每一个batch包含32个正样本(属于20类)和96个背景的负样本。
训练数据为使用PASCAL VOC 2007的训练集,输入一张图片,输出21维的类别标号,表示20类+背景。
考察一个候选框和当前图像上所有标定框(人工标注的候选框)重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别;否则认为此候选框为背景。(或者这样说:在前一步的区域提出中产生的2K+的候选框将作为后面的CNN训练数据和SVM的训练数据,将selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。这样训练样本的答案就标出来了,构成训练数据,直接用于训练,反复迭代几次,CNN就训练好了)
???这里当时我看的时候,有一个疑问,就是既然这里CNN已经训练好了,可以用于20类+1个背景的分类的,那为什么还需要再把提取的特征用于训练svm分类器?
这里原作者也给出了解释:
这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。
事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);
然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。
总的来说,就是加上一个SVM分类器,识别精度更高了!
4.CNN特征提取:(主要解释CNN内部具体结构)
网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。
5.SVM分类器的训练:
我们都知道SVM分类器是需要正负样本的,但这里由于负样本远远大于正样本的数量,所以采用hard negative mining的方法,其中,正样本就是原图中真正标定bounding box的样本,而负样本是通过考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本。
6.SVM类别判断:
从特征提取步骤中,生成一个4096维特征,将这个向量分别放入每一个SVM分类器中进行二值分类,并输出对每一个region proposal的4096维特征的得分.(这里的详细过程为:当我们用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N矩阵乘,得到2000*N的矩阵,就是每一个类对2000个候选框的打分,N为分类类别数目,就可以得到结果了)
最后将得到所有region proposals的对于每一类的分数,再使用贪心的非极大值抑制方法对每一个SVM分类器类去除相交的多余的框。
@非极大值抑制方法(NMS):(这里直接COPY原作者的博文,因为真心觉得原文已经很棒,没有一个字废话):
SVM分类器的每一类,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框打分:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
7.利用回归器进行bounding box的修复
目标检测问题的衡量标准是重叠面积(IoU),许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
如上图,IOU=(A∩B)/(A∪B)
回归器
对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。
输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
训练样本
判定为本类的候选框中,和真值重叠面积大于0.6的候选框。