基于区域提名的方法(这边还有其他分开介绍的)
本小节主要介绍基于区域提名的方法,包括R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN。
RCNN的训练与实现
以下是R-CNN的主要步骤:
1. 区域提名:通过Selective Search从原始图片提取2000个左右区域候选框;
2. 区域大小归一化:把所有侯选框缩放成固定大小(原文采用227×227);
3. 特征提取:通过CNN网络,提取特征;
4. 分类与回归:在特征层的基础上添加两个全连接层,再用SVM分类来做识别,用线性回归来微调边框位置与大小,其中每个类别单独训练一个边框回归器。
其中目标检测系统的结构如图6所示,注意,图中的第2步对应步骤中的1、2步,即包括区域提名和区域大小归一化。
Overfeat可以看做是R-CNN的一个特殊情况,只需要把Selective Search换成多尺度的滑动窗口,每个类别的边框回归器换成统一的边框回归器,SVM换为多层网络即可。但是Overfeat实际比R-CNN快9倍,这主要得益于卷积相关的共享计算。
事实上,R-CNN有很多缺点:
1. 重复计算:R-CNN虽然不再是穷举,但依然有两千个左右的候选框,这些候选框都需要进行CNN操作,计算量依然很大,其中有不少其实是重复计算;
2. SVM模型:而且还是线性模型,在标注数据不缺的时候显然不是最好的选择;
3. 训练测试分为多步:区域提名、特征提取、分类、回归都是断开的训练的过程,中间数据还需要单独保存;
4. 训练的空间和时间代价很高:卷积出来的特征需要先存在硬盘上,这些特征需要几百G的存储空间;
5. 慢:前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要13秒,CPU上则需要53秒[2]。
当然,R-CNN这次是冲着效果来的,其中ILSVRC 2013数据集上的mAP由Overfeat的24.3%提升到了31.4%,第一次有了质的改变。
同样可以参考:http://blog.csdn.net/shenxiaolu1984/article/details/51066975(写的非常好),我的总结如下:
训练:
1、预训练:先使用ILVCR 2012的全部数据进行预训练(应该是一张整的图,毕竟ImageNet的图片中物体一般都比较大),输入一张图片,输出1000维的类别标号。
2、调优训练:同样使用上述网络,最后一层换成4096->21的全连接网络。使用PASCAL VOC2007的训练集,输入一张图片(其实这里应该说是某些选定为正样本或者负样本的候选框,因为会考察一个候选框和当前图像上所有标定框重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别;否则认为此候选框为背景。),输出21维的类别标号,表示20类+背景。
3、分类器的训练:对每一类目标,使用一个线性SVM二类分类器进行判别。输入为深度网络输出的4096维特征,输出是否属于此类。 由于负样本很多,使用hard negative mining方法。(这里还不是用的网络来判定类别的)
正样本:本类的真值标定框。负样本:考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本
4、位置精修:目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
回归器(各类回归器不一样):对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
训练样本 :判定为本类的候选框中,和真值重叠面积大于0.6的候选框。
总结:实际上就是在做检测之前,找数据去训练好所有的网络啦,分类器啦,回归器啦,比如这里,检测用到的先是候选框,在就是候选框归一化大小送到网络里去得到深度特征(4096),最后就是深度特征要送到SVM里面分类(21类哪一类),最后将各类的候选框特征(4096)送到相应类的回归器中精修位置,所以这里要训练的就是提取特征的网络(先预训练,再调优,应该之前预训练的值还会跟着调优),以及SVM和回归器,而他们都可以用不同的数据集进行训练。
SPP-net的训练与实现
SPP-net[4,19]是MSRA何恺明等人提出的,其主要思想是去掉了原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP),如图7所示。为何要引入SPP层,主要原因是CNN的全连接层要求输入图片是大小一致的,而实际中的输入图片往往大小不一,如果直接缩放到同一尺寸,很可能有的物体会充满整个图片,而有的物体可能只能占到图片的一角。传统的解决方案是进行不同位置的裁剪,但是这些裁剪技术都可能会导致一些问题出现,比如图7中的crop会导致物体不全,warp导致物体被拉伸后形变严重,SPP就是为了解决这种问题的。SPP对整图提取固定维度的特征,再把图片均分成4份,每份提取相同维度的特征,再把图片均分为16份,以此类推。可以看出,无论图片大小如何,提取出来的维度数据都是一致的,这样就可以统一送至全连接层了。SPP思想在后来的R-CNN模型中也被广泛用到。
SPP-net的网络结构如图8所示,实质是最后一层卷积层后加了一个SPP层,将维度不一的卷积特征转换为维度一致的全连接输入。
SPP-net做目标检测的主要步骤为:
1. 区域提名:用Selective Search从原图中生成2000个左右的候选窗口;
2. 区域大小缩放:SPP-net不再做区域大小归一化,而是缩放到min(w,h)=s,即统一长宽的最短边长度,s选自{480,576,688,864,1200}中的一个,选择的标准是使得缩放后的候选框大小与224×224最接近;
3. 特征提取:利用SPP-net网络结构提取特征;
4. 分类与回归:类似R-CNN,利用SVM基于上面的特征训练分类器模型,用边框回归来微调候选框的位置。
SPP-net解决了R-CNN区域提名时crop/warp带来的偏差问题,提出了SPP层,使得输入的候选框可大可小,但其他方面依然和R-CNN一样,因而依然存在不少问题,这就有了后面的Fast R-CNN。
Fast R-CNN的训练与实现
Fast R-CNN是要解决R-CNN和SPP-net两千个左右候选框带来的重复计算问题,其主要思想为:
1. 使用一个简化的SPP层——RoI(Region of Interesting)Pooling层,操作与SPP类似;
2. 训练和测试是不再分多步:不再需要额外的硬盘来存储中间层的特征,梯度能够通过RoI Pooling层直接传播;此外,分类和回归用Multi-task的方式一起进行;
3. SVD:使用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。
如图9所示,Fast R-CNN的主要步骤如下:
1. 特征提取:以整张图片为输入利用CNN得到图片的特征层;
2. 区域提名:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框一一投影到最后的特征层;
3. 区域归一化:针对特征层上的每个区域候选框进行RoI Pooling操作,得到固定大小的特征表示;
4. 分类与回归:然后再通过两个全连接层,分别用softmax多分类做目标识别,用回归模型进行边框位置与大小微调。
Fast R-CNN比R-CNN的训练速度(大模型L)快8.8倍,测试时间快213倍,比SPP-net训练速度快2.6倍,测试速度快10倍左右。
http://blog.csdn.net/shenxiaolu1984/article/details/51036677(这里写的很好)
总结:应该是这样吧,图片,卷积,提取对应的候选框的特征,可以映射候选框对应的位置时,以候选框所在区域执行max-pooling,获得候选框特征后,再后面接两个全连接层用于分类(K+1)和回归出框(输出4×(K+1)个值,分别是缩放和平移,估计只是最后计算loss的时候算的是所属类别的框带来的loss),训练的时候也就是训练提取特征的网络(先是在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。再是用候选框去调优,前面初始化参数还是会被调优),以及后面的全连接层(后面有一个整体的loss去最小化训练)
Faster R-CNN的训练与实现
Fast R-CNN使用Selective Search来进行区域提名,速度依然不够快。Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域提名,每个区域对应一个目标分数和位置信息。Faster R-CNN中的RPN结构如图11所示。
Faster R-CNN的主要步骤如下:
1. 特征提取:同Fast R-CNN,以整张图片为输入,利用CNN得到图片的特征层;
2. 区域提名:在最终的卷积特征层上利用k个不同的矩形框(Anchor Box)进行提名,k一般取9;
3.分类与回归:对每个Anchor Box对应的区域进行object/non-object二分类,并用k个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标分类。
总之,Faster R-CNN抛弃了Selective Search,引入了RPN网络,使得区域提名、分类、回归一起共用卷积特征,从而得到了进一步的加速。但是,Faster R-CNN需要对两万个Anchor Box先判断是否是目标(目标判定),然后再进行目标识别,分成了两步。
http://blog.csdn.net/shenxiaolu1984/article/details/51152614(很好)
目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
faster RCNN可以简单地看做“区域生成网络+fast RCNN“的系统,用区域生成网络代替fast RCNN中的Selective Search方法。
本篇论文着重解决了这个系统中的三个问题:
1. 如何设计区域生成网络
2. 如何训练区域生成网络
3. 如何让区域生成网络和fast RCNN网络共享特征提取网络
总结:就是说输入一张图片,生成相应的特征map,在就是在这个map上用k个不同的矩形框进行提名(每个点都对应k个),相当于是提名区域的特征提取了,进入RPN网络,接着后面接二分类器与位置调优的,选择前景框并进行调整位置,最后生成候选框——RPN,再送进FastRCNN进行特征提取,分类
轮流训练
a. 从W0开始,训练RPN。用RPN提取训练集上的候选区域
b. 从W0开始,用候选区域训练Fast RCNN,参数记为W1
c. 从W1开始,训练RPN…
具体操作时,仅执行两次迭代,并在训练时冻结了部分层。论文中的实验使用此方法。如Ross Girshick在ICCV 15年的讲座Training R-CNNs of various velocities中所述,采用此方法没有什么根本原因,主要是因为”实现问题,以及截稿日期“。
R-FCN的训练与实现
前面的目标检测方法都可以细分为两个子网络:
1. 共享的全卷积网络;(mine:指的是前面)
2. 不共享计算的ROI相关的子网络(mine:指的是后面,针对不同的ROI去计算,比如全连接网络)。
R-FCN则将最后的全连接层之类换为了一个位置敏感的的卷积网络,从而让所有计算都可以共享。具体来说,先把每个提名区域划分为k×k个网格,比如R-FCN原文中k的取值为3,则对应的九个网格分别表示:左上top-left,上中top-center,……,右下bottom-right,对应图12中的九宫格及图13中的不同颜色的块,每个Grid都有对应的编码,但预测时候会有C+1个输出,C表示类别数目,+1是因为有背景类别,全部的输出通道数量为k2×(C+1)。
需要注意的是,图12、13中不同位置都存在一个九宫格,但是Pooling时候只有一个起作用,比如bottom-right层只有右下角的小块起作用。那么问题来了,这一层其他的8个框有什么作用呢?答案是它们可以作为其他ROI(偏左或偏上一些的ROI)的右下角。
R-FCN的步骤为:
1. 区域提名:使用RPN(Region Proposal Network,区域提名网络),RPN本身是全卷积网络结构;
2. 分类与回归:利用和RPN共享的特征进行分类。当做bbox回归时,则将C设置为4。
结合这里:http://www.cnblogs.com/lillylin/p/6277094.html
Backbone architecture: ResNet101——去掉原始ResNet101的最后一层全连接层,保留前100层,再接一个1*1*1024的全卷积层(100层输出是2048,为了降维,再引入了一个1*1的卷积层)。
k^2(C+1)的conv: ResNet101的输出是W*H*1024,用K^2(C+1)个1024*1*1的卷积核去卷积即可得到K^2(C+1)个大小为W*H的position sensitive的score map。这步的卷积操作就是在做prediction。k=3,表示把一个ROI划分成3*3,对应的9个位置分别是:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角),如图Figuire 3。
k^2(C+1)个feature map的物理意义:共有k*k = 9个颜色,每个颜色的立体块(W*H*(C+1))表示的是不同位置存在目标的概率值(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)个feature map。每个feature map,z(i,j,c)是第i+k(j-1)个立体块上的第c个map(1<= i,j <=3)。(i,j)决定了9种位置的某一种位置,假设为左上角位置(i=j=1),c决定了哪一类,假设为person类。在z(i,j,c)这个feature map上的某一个像素的位置是(x,y),像素值是value,则value表示的是原图对应的(x,y)这个位置上可能是人(c=‘person’)且是人的左上部位(i=j=1)的概率值。
ROI pooling:就是faster RCNN中的ROI pooling,也就是一层的SPP结构。主要用来将不同大小的ROI对应的feature map映射成同样维度的特征,思路是不论对多大的ROI,规定在上面画一个n*n个bin的网格,每个网格里的所有像素值做一个pooling(平均),这样不论图像多大,pooling后的ROI特征维度都是n*n。注意一点ROI pooling是每个feature map单独做,不是多个channel一起的。
ROI pooling的输入和输出:ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的宽度和高度)的score map上某ROI对应的那个立体块(mine:由此可见之前是统一对整张图像进行k^2*(C+1)个卷积的),且该立体块组成一个新的k^2*(C+1)*W' *H'的立体块:每个颜色的立体块(C+1)都只抠出对应位置的一个bin(就是说对应位置的那块,比如是左上角,则就抠出左上角对应的那个块),把这k*k个bin组成新的立体块,大小为 (C+1)*W'*H'.例如,下图中的第一块黄色只取左上角的bin,最后一块淡蓝色只取右下角的bin。所有的bin重新组合后就变成了类似右图的那个薄的立体块(图中的这个是池化后的输出,即每个面上的每个bin上已经是一个像素。池化前这个bin对应的是一个区域,是多个像素)。ROI pooling的输出为为一个(C+1)*k*k的立体块,如下图中的右图。更详细的有关ROI pooling的操作如公式(1)所示:
(感觉上面的pooling像是求那段的平均值)
vote投票:k*k个bin直接进行求和(每个类单独做)得到每一类的score,并进行softmax得到每类的最终得分,并用于计算损失
损失函数:和faster RCNN类似,由分类loss和回归loss组成,分类用交叉熵损失(log loss),回归用L1-smooth损失
训练的样本选择策略:online hard example mining (OHEM,参考文献1)。主要思想就是对样本按loss进行排序,选择前面loss较小的,这个策略主要用来对负样本进行筛选,使得正负样本更加平衡。