Faster-RCNN系列文章

近来研究的使用,想到用detection的东西了,就想着过来熟悉一下关于比较快速的faster-RCNN的东西,顺便把这么一整套都给整理了。
—————————————————————-————————————

一:R-CNN(Rich feature hierarchies for accurate object detection andsemantic segmentation 论文下载地址

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、或者f6、f7的特征,作为特征向量,然后进行训练svm,只不过这样精度会比较低。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择p5、f6、f7,这三层的神经元个数分别是9216、4096、4096。从p5到p6这层的参数个数是:4096*9216 ,从f6到f7的参数是4096*4096。那么具体是选择p5、还是f6,又或者是f7呢?

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

据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个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.

二、Fast R-CNN(论文下载地址
这里写图片描述

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:fine turning过程。SPP-Net在实现上无法同时tuning在SPP layer两边的卷积层和全连接层。

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

三、faster R-CNN(Faster R-CNN Towards Real-Time ObjectDetection with Region Proposal Networks 论文下载地址
相比于fastR-CNN,FasterR-CNN可以看做是对Fast R-CNN的进一步加速,最主要解决的如何快速获得proposal,一般的做法都是利用显著性目标检测(如Selectivesearch)过一遍待检测图,得到proposal。基于区域的深度卷积网络虽然使用了GPU进行加速,但是theregion proposal methods确却都是在CPU上实现的,这就大大地拖慢了整个系统的速度。然后作者提出,卷积后的特征图同样也是可以用来生成region proposals的。通过增加两个卷积层来实现Region Proposal Networks (RPNs) ,一个用来将每个特征图的位置编码成一个向量,另一个则是对每一个位置输出一个objectness score和regressed 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(左)以这个小网络在某个位置的情况举了个例子。注意,由于小网络是滑动窗口的形式,所以全连接的层(n*n的)被所有空间位置共享(指所有位置用来计算内积的nxn的层参数相同)。这种结构实现为n*n的卷积层,后接两个同级的1*1的卷积层(分别对应reg和cls),ReLU[15]应用于n*n卷积层的输出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章