R-CNN,SSP-Net,fast-RCNN,faster-RCNN论文读后笔记

来源:互联网 发布:mysql去重函数 编辑:程序博客网 时间:2024/06/05 14:10

一:R-CNNRich feature hierarchies for accurate object detection andsemantic segmentation v5.pdf

R指的是region,也就是在数据进入深度网络(CNNs)之前进行预处理,在预训练图像中生成若干个regionproposals,再将这些regionproposals进行resize,因为CNN网络要求输入数据维度相同。


训练过程:

supervised pre-training,使用传统的CNN来训练大规模数据集ImageNet,获得初始化权重。

所谓的有监督预训练,我们也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务是:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。

图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇paper采用了迁移学习的思想。文献就先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络的图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段cnn模型的输出是1000个神经元,或者我们也直接可以采用Alexnet训练好的模型参数。

这点在微调过程能够看得出来:原文:Aside from replacing the CNN’s ImageNetspecific 1000-wayclassification layer with a randomly initialized (N+ 1)-way classification layer (whereNis the
number of object classes, plus 1 for background),将最后的分类器部分替换掉。

为什么要进行预训练呢?

物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

Domain-specific fine-tuning. 使用与检测任务相关的较小的数据集对CNN进行微调。

为什么要进行微调呢?

首先,反正CNN都是用于提取特征,那么我直接用Alexnet做特征提取,省去fine-tuning阶段可以吗?这个是可以的,你可以不需重新训练CNN,直接采用Alexnet模型,提取出p5、或者f6f7的特征,作为特征向量,然后进行训练svm,只不过这样精度会比较低。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择p5f6f7,这三层的神经元个数分别是921640964096。从p5p6这层的参数个数是:4096*9216 ,从f6f7的参数是4096*4096。那么具体是选择p5、还是f6,又或者是f7呢?

文献paper给我们证明了一个理论,如果你不进行fine-tuning,也就是你直接把Alexnet模型当做万金油使用,类似于HOGSIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现p5的精度竟然跟f6f7差不多,而且f6提取到的特征还比f7的精度略高;如果你进行fine-tuning了,那么f7f6的提取到的特征最会训练的svm分类器的精度就会飙涨。

据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。

 

疑问:CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层,那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNNsoftmax输出比采用svm精度还低。

事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Boundingbox的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了)

然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm.

 

二:SPP-netSpatial Pyramid Pooling in Deep Convolutional Networks forVisual Recognition.pdf


与经典的R-CNN相比,在目标检测方面,SPP-Net主要解决了几个存在的问题:

1:不需要对每一个Regioncandidatewindow)进行单独训练

2:不需要重复训练CNN网络多次

3:解决了corp/wrap过程中造成的图像失真或者剪切不完全的问题

解决方案:

1:将经过SS处理后(含有2kregion proposal)的整幅图像输入CNNs,不需要对图像中的每一个proposal进行训练,然后得到整个featuremap,大大减少了计算proposal的特征时候的运算开销。然后Mapping aWindow to Feature Maps.具体做法:

In ourimplementation, we project the corner point of a window onto a pixel inthefeature maps, such that this corner point in the image domain isclosest tothe center of the receptive field of that featuremap pixel

不太理解,目前理解是:想要得到feature map path,要确定角点(论文中用的左上角点和右下角点),用已知的imageregionwindowROI)的角点来确定特征图上的角点。步骤:

具体过程:

前提:我们已经知道了ROI位置,我们的目的是要在卷积层上得到对应的候选窗口。

①  取得ROI中心点位置(x,y

②   则对应的feature map path的左上角点为右下角点为 


补充:


看上图在conv5的时候提取的特征已经具有较好的响应能力了,这些filter的位置已经确定,这里感觉就是中心点了,只是要确定其大小,那么我们就可以知道其中心点(x’,y’),则根据论文说的公式相对应ROI的中心点就为,这里是不是就对应了这句话such that this corner point in the imagedomain is closest tothe center of 

the receptive field of that featuremap pixel。互相来确认?论文也没说,不是很确定。

 

论文中也用了多尺寸的图像也即将一副图像resize为多个尺寸(480, 576, 688,864, 1200)进行训练,这就增加了特征提取的准确性,在微调过程中也只需要微调FC层即可,提高训练效率。


2:由于第一步的功劳,对于每一副图像不需要训练CNN网络多次。只需要训练一次CNN,从特征图中得到候选窗口。

3:通过SS等方法得到的Region proposalcandidate windows不需要进行crop/wrap了,因为convolution layerPooling layer并没有对图像尺寸大小的约束,而是在FC层有要求,因此论文在FC层之前在最后的卷积层之后pool5层采用SSP,替代常规的Pooling,这也是其核心之处。如下图:


具体做法:将得到的region proposal,进行SSP算法,通过pyramid -level n*n bins,一般取(1*1,2*2,3*3,4*4,6*6),bin代表分割后的小方格,看下图:

 

上图采用的比例是(1*12*24*4),level=3的金字塔。到FC层时feature vector长度为(16+1+4*256


三:Fast R-CNN


从图中可以看出与SPP-net的区别主要有以下三点:

1:输入数据由单输入改为双输入,分别是a list of images and a list of RoIs in those images.

2:引入了ROI Pooling层,将最后一层Pooling层替换为ROI Pooling层,这次相当于SPP-Net中的single-scale模式,从feature map上提取一个固定的特征向量到FC层。

3:输出包含了2层分支输出,一层分支为classification层,用来估计K类object与一类背景的概率(softmax);另一层为Regression层(为每一类输出一个4实值,其实也是bounding box的位置,通常用(x,y,w,h)表示,x,y代表中心点位置,w,h代表长宽)

其他改变:

1.    1fine turning过程。SPP-Net在实现上无法同时tuningSPP layer两边的卷积层和全连接层。

2.    SPP-Net后面的需要将第二层FC的特征放到硬盘上训练SVM,之后再额外训练bbox regressor


四:faster R-CNNFaster R-CNN Towards Real-Time ObjectDetection with Region Proposal Networks v3.pdf

相比于fastR-CNNFasterR-CNN可以看做是对Fast R-CNN的进一步加速,最主要解决的如何快速获得proposal,一般的做法都是利用显著性目标检测(如Selectivesearch)过一遍待检测图,得到proposal。基于区域的深度卷积网络虽然使用了GPU进行加速,但是theregion proposal methods确却都是在CPU上实现的,这就大大地拖慢了整个系统的速度。然后作者提出,卷积后的特征图同样也是可以用来生成region proposals的。通过增加两个卷积层来实现Region Proposal Networks (RPNs) ,一个用来将每个特征图的位置编码成一个向量,另一个则是对每一个位置输出一个objectness scoreregressed bounds for k region proposals。如图:


RPNs 是一种 fully-convolutional network (FCN),为了与 Fast R-CNN相结合,作者给出了一种简单的训练方法:固定 proposal为生成 proposal目标检测这两个task交替微调网络

RPN网络是怎样训练的呢?


区域建议网络(RPN)将一个图像(任意大小)作为输入,输出矩形目标建议框的集合,每个框有一个objectness得分。我们用全卷积网络[14]对这个过程构建模型。因为我们的最终目标是和Fast R-CNN目标检测网络[15]共享计算,所以假设这两个网络共享一系列卷积层。在实验中,详细研究Zeiler和Fergus的模型[23](ZF),它有5个可共享的卷积层,以及Simonyan和Zisserman的模型[19](VGG),它有13个可共享的卷积层。 
为了生成区域建议框,我们在最后一个共享的卷积层输出的卷积特征映射上滑动小网络,这个网络全连接到输入卷积特征映射的nxn的空间窗口上。每个滑动窗口映射到一个低维向量上(对于ZF是256-d,对于VGG是512-d,每个特征映射的一个滑动窗口对应一个数值)。这个向量输出给两个同级的全连接的层——Bounding Box Regression Layer(reg)和softmaxLayer(cls)。本文中n=3,注意图像的有效感受野很大(ZF是171像素,VGG是228像素)。图1(左)以这个小网络在某个位置的情况举了个例子。注意,由于小网络是滑动窗口的形式,所以全连接的层(nxn的)被所有空间位置共享(指所有位置用来计算内积的nxn的层参数相同)。这种结构实现为nxn的卷积层,后接两个同级的1x1的卷积层(分别对应reg和cls),ReLU[15]应用于nxn卷积层的输出。



相关链接:http://blog.csdn.net/liumaolincycle/article/details/48804687

http://www.myexception.cn/mobile/2085948.html

http://www.cnblogs.com/rocbomb/p/4428946.html

http://www.360doc.com/content/16/0313/16/1317564_541854712.shtml

http://blog.csdn.net/u011534057/article/details/51235964


 

0 0
原创粉丝点击