论文笔记:Rich feature hierarchies for accurate object detection and semantic segmentation.
论文笔记:Rich feature hierarchies for accurate object detection and semantic segmentation.
简述
此算法用来做目标检测,主要结合了两个关键点:
1.应用了一个高容量的卷积神经网络模型来处理候选区域(region proposals);
2.当labeled data很稀缺的时候,采用预训练(pre-training)和特定微调(domain-specific fine-tunning)相结合的方式,能够有效的提高性能。
由于采用了候选区域(region proposals)和CNN的方式,所以这种方法叫做R-CNN。实现代码在:http://www.cs.berkeley.edu/˜rbg/rcnn
算法流程与与思想:
从图中可以看出算法的基本思路:
- 输入一张照片,用selective search代替传统的滑动窗口,提取出2k个候选region proposal
- 对与提取出的每个候选区域(region proposal),用一个较大的CNN来提出特征(feartures),即用去掉softmax层的AlexNet网络。
- 最后使用class-specific linear SVM来进行分类,并对每个类别用NMS(non-maximum-suppression)来舍弃掉一部分region,得到detection的结果(对得到的结果做针对boundingbox回归,用来修正预测的boundingbox的位置)
Object detection with R-CNN
下面将从Module design,Test-time detection,Training,Results以上三个方面详细的介绍。
Module design
region proposals: 在获的region proposals时,以往的paper提到了很多种方法,包括:objectness,selective search,CPMC,multi-scale combinatorial grouping等等,但是了后面方便做对比试验,选用了selective search方法。也就是说,在构建数据集时,先用Selective Search的方法在每个图像上生成较多的候选区域,然后在每张图上依次计算每个候选区域与图中目标的ground-truth box之前的重叠程度(IoU),如果重叠程度大于0.5,则标记这个区域为此目标的正样本;否则,为负样本.对所有的训练图像执行这样的操作,可以把得到的所有的候选区域保存下来以备使用.假如说有20个目标,对每个目标我们都有一些属于它这个类的正样本,统称为正样本,其他的不属于任何类的区域图像称之为负样本.
-
Feature extraction:采用了AlexNet的网络结构,来抽取候选区域深度特征。AlexNet网络结构如下图:
主要看它的输入和输出:输入是224*224(原文为:227*227)大小的图像,经过5层卷积神经网络和2层全连接网络,提取到的特征是一个4096维度的特征向量,由于是1000类的分类任务,因此最后一层的节点数目为1000.因此为满足输入size的需要,需要将region proposals 进行resize操作,原文中采用了最为简单的方式,就是:首先将原始的框向周围增加16的padding,在直接缩放。
在附录中,作者还指出了其他2中缩放方式:- 将包围盒的短边扩展为和长边一样大,使之成为正方形再缩放,这样做的好处是能保证目标的比例不会变化。
- 是将包围盒两边加上图像均值的padding,再缩放,同样保证了目标的比例不会变化。
Test-time detection
测试阶段,使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数。最后使用非极大值抑制算法去除相交的多余的框。
非极大值抑制算法:非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到一类的结果。
在运行时间的分析中发现,此算法的高效性能在于:
1. 卷积操作中,参数是共享的。参数共享使得计算特征和区域的时间摊销到每个类别上。 唯一需要点积相乘的是特征和SVM权重,非极大值抑制。
2. 特征向量的维度较少。(360k vs. 4k-dimensional)
Training
-
有监督预训练:
作者使用caffe框架利用ILSVRC 2012的数据集(imagenet)对网络模型进行了训练,使网络模型中的参数都是经过训练过的参数,而不是刚开始那样随机初始化的参数。
-
特定领域的fine-tuning
为了适应不同场合的识别需要,使用从VOC图片集上图片(已经使region proposals归一化)对网络继续进行训练。网络的结构,只需要将最后的1000类的分类层换成21类的分类层(20个VOC中的类别和1个背景类),其他都不需要改变(在VOC中,N=20,在ILSVRC中,N=200)。为了保证训练只是对网络的微调而不是大幅度的变化,网络的学习率只设置成了0.001。计算每个region proposal与人工标注的框的IoU,IoU重叠阈值设为0.5,大于这个阈值的作为正样本,其他的作为负样本,然后在训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练。
-
特定类别的分类器(SVM)
那么特定类别的正负样本该如何获得呢?
对每个类都训练一个线性的SVM分类器,训练SVM需要正负样本文件,这里的正样本就是ground-truth框中的图像作为正样本,完全不包含的region proposal应该是负样本.
对于部分包含某一类物体的region proposal该如何训练呢,作者同样是使用IoU阈值的方法,这次的阈值为0.3,计算每一个region proposal与标准框的IoU,小于0.3的作为负样本,其他的全都丢弃。
由于训练样本比较大,作者使用了standard hard negative mining method来训练分类器。注意:如何构造训练集来对预训练后的CNN进行微调,那里面与GT Boxes之间的IoU重叠程度大于0.5的都被标定为正样本.
现在到了这一步,CNN已经训练完成了,我们现在要为每个类别(比如猫,狗,…)单独训练一个二分类SVM分类器,比如”SVM_猫”就是专门来检测猫这个目标,”SVM_狗”就是专门来检测狗这个目标,这时候对每个二分类SVM分类器如何构造它的训练集呢?以猫这个目标为例,本文的做法就是以每张图像上猫这个目标的GT Boxes作为正样本,然后在图像上生成很多候选区域,考察每个区域与猫目标的GT boxes之间的IoU,如果IoU小于0.3,那么就认定这个区域为负样本,重叠度在0.3~1之间的不用做训练.
Results
结果就不详细说明了。
总结
将整个流程串联一下,会使思路更加清晰明了。
整个模型测试流程如下:
- 给定一张测试图像
- 利用selective search抽取大约2000个候选区域
- 将每个区域都resize到227*227大小
- 利用训练好的CNN,得到每个区域的深度特征
- 将每个区域对应的深度特征向量分别送到那几十个训练好的二分类SVM当中,输出每个区域属于每个类的概率(SVM软分类).假如类别数目N=20,就会得到一个2000*20的矩阵,每一行数据表示的是一个候选区域属于20个类的概率值.每一列表示所有的候选区域属于那一列类别的概率值(比如,一张图像上的2000个候选区域属于猫这个类别的概率).
- 对于每一类别(也就是每一列的数据)使用贪婪非最大值抑制的方法来对这些区域进行筛选.
- 对这2000个候选区域,用回归器预测bounding box.
上一篇: hexo博客快速搭建
下一篇: gin系列-文件上传