在计算机视觉的众多技术领域中,目标检测(物体检测,object detection)是一项非常基础的任务,图像分割、物体追踪、关键点检测都依赖于目标检测,广泛应用于自动驾驶、机器人导航、智能视频监控、工业检测、航空航天等诸多领域,通过计算机视觉减少对人力资本的消耗,具有重要的现实意义。
目标检测技术,就是在给定的图片中精确找到物体所在的位置,并识别出物体的类别。要求检测器输出5个量:物体类别、 xmin、ymin、xmax与ymax(左上和右下点的坐标)。当然,对于目标边框,也也可以是x_center、y_center,w与h(目标中点坐标和目标框的长和高)。
基于深度学习的两种目标检测算法思路,分别为One-Stage目标检测算法和Two-Stage目标检测算法
本篇主要介绍Two-Stage方式的RCNN系列,包括:R-CNN、Fast R-CNN、Faster R-CNN
一、传统的目标检测算法
在介绍RCNN之前,我们先来了解下传统目标检测,传统的目标检测算法通常可分为三个阶段:区域选取、特征提取与特征分类。
- 区域选取:首先选取图像中可能出现物体的位置,由于物体位 置、大小都不固定,因此传统算法通常使用穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,但这种算法会存在大量的冗余框,并且计算复杂度高。
- 特征提取:在得到物体位置后,通常使用人工精心设计的提取器 进行特征提取,如SIFT和HOG等。由于提取器包含的参数较少,并且人工设计的鲁棒性较低,因此特征提取的质量并不高。
- 特征分类:最后,对上一步得到的特征进行分类,通常使用如SVM、AdaBoost的分类器。
传统目标检测的主要问题是:
- 基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
- 手工设计的特征对于多样性的变化没有很好的鲁棒性
二、RCNN系列
针对基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余的问题,有人提出:预先找出图中目标可能出现的位置,即候选区域(Region Proposal)。利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千甚至几百)的情况下保持较高的召回率(Recall)。
那么,如何找出图中目标可能出现的位置呢。对此,大牛们发明了很多选定候选框Region Proposal的方法:
- Selective Search(选择性搜索):贪婪地合并超像素来产生提案。该方法不需要学习参数,而是手工设计用于合并超像素的特征和相似度函数。
- EdgeBoxes
关于选定候选框Region Proposal的方法,在《What makes for effective detection proposals》中从不同角度分析了12种不同Proposal Methods的性能。
有了候选区域,接下来的工作就是对候选区域进行图像分类(特征提取+分类)。对于图像分类,不得不提2012年,AlexNet 在 ImageNet 图像分类任务竞赛中获得冠军,一鸣惊人,此后,卷积神经网络CNN占据了图像分类任务的绝对统治地位。
深度神经网络大量的参数可以提取出鲁棒性和语义性更好的特征,并且分类器性能也更优越。
2014年,RBG(Ross B. Girshick)使用Region Proposal + CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了R-CNN框架,使得目标检测取得巨大突破,并开启了基于深度学习目标检测的热潮。
2.1 R-CNN
测试大体流程如下:
1、分类
(1)输入测试图像
(2)利用选择性搜索(Selective Search)算法在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal
(3)因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征
(4)将每个Region Proposal提取到的CNN特征输入到SVM进行打分(每类都有一个SVM,21类就有21个SVM分类器)
(5)对打好分的区域使用NMS即非极大抑制(每类都单独使用)
2、回归
(1)将CNN对候选区域提取出的特征输入训练好的线形回归器中,得到更为精确的位置定位
回归器是按照类来训练的,即每类分类完后进行回归
具体流程:
(1)训练(或下载)一个图像分类模型
- 例如:AlexNet
- 该网络输入为227×227,输出最后一层为4096维特征->1000类的映射,训练的是网络参数
(2)对该模型做fine-tuning,
- 修改原来的1000为类别输出,对于VOC数据集,改为21维【20类+背景】输出,训练的是网络参数
- 去掉最后一个全连接层
(3)特征提取
- 提取图像的所有候选框(选择性搜索Selective Search)
- 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
(4)训练一个SVM分类器(二分类)来判断这个候选框里物体的类别
- SVM是二分类器,需要为每个类别训练单独的SVM
- 每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative。
- SVM训练时输入正负样本在AlexNet CNN网络计算下的4096维特征,输出为该类的得分,训练的是SVM权重向量
在训练SVM时,正样本为groundtruth,负样本定义为与ground truth的IoU小于0.3的候选区域为负样本,介于0.3与0.7之间的样本忽略
为什么不直接用softmax的输出结果:因为在训练softmax的时候数据本来就不是很准确,而SVM的训练使用的是hard negative也就是样本比较严格,所以SVM效果会更好。
(5)Bounding-box regression训练
- 使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美
- 输入数据为某类型样本对N个 { ( P i , G i ) } i = 1 , 2 , 3 , . . . , N \{(P^i,G^i)\}_{i=1,2,3,...,N} {(Pi,Gi)}i=1,2,3,...,N:分别为候选区域的框坐标和真实的框坐标
选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本
在分类之后得到候选框 ( P x , P y , P w , P h ) (P_x,P_y,P_w,P_h) (Px,Py,Pw,Ph),其中 P x P_x Px和 P y P_y Py为候选框的中心点, P w P_w Pw和 P h P_h Ph为候选框的宽高
知道候选框的表示,那么只要估计出出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了
- a.先求平移量( Δ x , Δ y \Delta x, \Delta y Δx,Δy)
- Δ x = P w d x ( P ) \Delta x = P_w d_x(P) Δx=Pwdx(P), Δ y = P h d y ( P ) \Delta y = P_h d_y(P) Δy=Phdy(P)
即R-CNN论文里面的: G ^ x = P w d x ( P ) + P x \hat{G}_x=P_wd_x(P)+P_x G^x=Pwdx(P)+Px, G ^ y = P h d y ( P ) + P y \hat{G}_y=P_hd_y(P)+P_y G^y=Phdy(P)+Py- b.算尺度放缩量( S w , S h S_w,S_h Sw,Sh)
- S w = P w d w ( P ) S_w=P_wd_w(P) Sw=Pwdw(P), S h = P h d h ( P ) S_h=P_hd_h(P) Sh=Phdh(P)
即R-CNN论文里面的: G ^ w = P w exp ( d w ( P ) ) \hat{G}_w=P_w\exp(d_w(P)) G^w=Pwexp(dw(P)), G ^ h = P h exp ( d y ( P ) ) \hat{G}_h=P_h\exp(d_y(P)) G^h=Phexp(dy(P))我们需要学习的就是 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)这四个变换,就可以得到估计框了
这四个变换可以用下列公式表示:
- d ∗ ( P ) = W ∗ T Φ 5 ( P ) d_*(P)=W_*^T\Phi_5(P) d∗(P)=W∗TΦ5(P)
Φ 5 ( P ) \Phi_5(P) Φ5(P)为AlexNet pool5输出的特征,进一步,只需求 W ∗ T W_*T W∗T即可该回归器的损失函数为:
- w ∗ = a r g min w ^ ∗ ∑ i n ( t ∗ i − w ^ ∗ T Φ 5 ( P i ) ) 2 + λ ∣ ∣ w ^ ∗ ∣ ∣ 2 w_* = arg \min_{\hat{w}_*} \sum_i^n(t_*^i-\hat{w}_*^T\Phi_5(P^i))^2+\lambda||\hat{w}_*||^2 w∗=argw^∗mini∑n(t∗i−w^∗TΦ5(Pi))2+λ∣∣w^∗∣∣2
上式中的 t ∗ i t_*^i t∗i可以通过如下公式求出:
- t x = ( G x − P x ) / P w t_x = (G_x-P_x)/P_w tx=(Gx−Px)/Pw
- t y = ( G y − P y ) / P h t_y = (G_y-P_y)/P_h ty=(Gy−Py)/Ph
- t w = log ( G w / P w ) t_w =\log (G_w/P_w) tw=log(Gw/Pw)
- t h = log ( G h / P h ) t_h = \log(G_h/P_h) th=log(Gh/Ph)
所以通过输入的特征值训练,从而求出 w ^ ∗ \hat{w}_{*} w^∗,就可以得到回归器
RCNN虽然显著提升了物体检测的效果,但仍存在3个较大的问题:
- 首先RCNN需要多步训练,步骤烦琐且训练速度较慢;
- 其次,由于涉及分类中的全连接网络,因此输入尺寸是固定的,造成了精度的降低;
- 最后,候选区域需要提前提取并保存,占用空间较大。
此外通过上面的介绍,R-CNN虽然不再像传统方法那样穷举,但R-CNN流程中对原始图片通过Selective Search提取的候选框region proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都需要47s。
很显然,这慢的不能接受啊,那么如何提速呢?这2000个region proposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。
但现在的问题是每个region proposal的尺度不一样,而全连接层输入必须是固定的长度,所以直接这样输入全连接层肯定是不行的。SPP Net恰好可以解决这个问题。
2.2 SPP Net
SPP:Spatial Pyramid Pooling(空间金字塔池化)
众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。
SPP Net主要解决的是当输入的图片的尺寸不是既定的224×224,采用各种对图片放缩的时候会影响网络的学习。比如下图,只裁剪了一部分(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或者放缩(把一个边界框bounding box的内容resize成227×227):
但warp/crop这种预处理,导致的问题要么发生了几何的形变、要么物体不全,限制了识别精确度。
SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?
这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer
指的是对于卷积学得的N个feature maps进行多次池化操作, 并且池化核的大小逐渐增大, 这会导致着池化的输出逐渐减小,(像金字塔形状一样) 将这些池化后的输出合并起来, 作为FC的输入, 以此来解决FC要求的输入必须要一致的问题
下图便是R-CNN和SPP Net检测流程的比较:
它的特点有两个:
- 结合空间金字塔方法实现CNNs的多尺度输入。
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。
- 只对原图提取一次卷积特征
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
而SPP Net根据这个缺点做了优化:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。
相比于R-CNN不必把2000个候选区域都去卷积了,一张图片只需要做一次卷积,候选区域的特征提取直接在最后一层的feature maps作提取。
2.3 Fast R-CNN
SPP Net算法解决了重复卷积计算与固定输出尺度的两个问题,但仍然存在RCNN的其他弊端。在2015年,Ross Girshick独自提出了更快、更强的Fast RCNN算法,不仅训练的步骤可以实现端到端,而且算法基于VGG16网络,在训练速度上比RCNN快了近9倍,在测试速度上快了213倍,并在VOC 2012数据集上达到了68.4%的检测 率。
R-CNN的进阶版Fast R-CNN就是在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进,使得性能进一步提高。
大体流程如下:
(1)输入图像;
(2)利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal);
(3)将整张图片输入CNN,进行特征提取;
(4)把建议窗口映射到CNN的最后一层卷积feature map上;
(5)通过RoI pooling层使每个建议窗口生成固定尺寸的feature map;
(6)使用多任务损失函数(multi-task loss),联合训练分类概率和边框回归。
与R-CNN框架图对比,可以发现主要有两处不同:
(1)最后一个卷积层后加了一个ROI pooling layer
- ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个 7 × 7 7\times7 7×7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个 7 × 7 × 512 7\times7\times512 7×7×512维度的特征向量作为全连接层的输入。
换言之,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。
(2)损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练
- R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去Region Proposal提取阶段)
也就是说,之前R-CNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast R-CNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal + CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster R-CNN做下了铺垫。
综上,Fast R-CNN相对于R-CNN的提速原因就在于:不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。
2.4 Faster R-CNN
Fast R-CNN存在的问题:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,该算法最大的创新点在于提出 了RPN(Region Proposal Network)网络替代Selective Search,同时引入anchor box应对目标形状的变化问题(anchor就是位置和大小固定的box,可以理解成事先设置好的固定的proposal),将检测速度一举提升到了17 FPS(Frames Per Second),并在VOC 2012测试集上实现了70.4%的检测结果。
大体流程:
(1)输入测试图像;
(2)首先缩放至固定大小MxN,然后将MxN图像送入网络;例如上图使用VGG16:包含了13个conv层+13个relu层+4个pooling层
(3)RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;
(4)而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。
Faster RCNN其实可以分为4个主要内容:
- Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取图像的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks:RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
- Roi Pooling:该层收集输入的feature maps(特征图)和proposals(候选区域),综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- Classification:利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
由此,我们也能看出,Faster R-CNN最大的亮点在于提出了一种有效定位目标区域的方法,然后按区域在特征图上进行特征索引,大大降低了卷积计算的时间消耗,所以速度上有了非常大的提升。
2.4.1 Conv layers
Conv layers包含了conv,pooling,relu三种层:
- 所有的conv层都是:kernel_size=3,pad=1,stride=1
- 所有的pooling层都是:kernel_size=2,pad=0,stride=2
由于以上两个设置,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。
2.4.2 Region Proposal Networks(RPN)
Faster RCNN抛弃了传统的滑动窗口和选择性搜索方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线:
- 上面一条通过softmax分类anchors获得positive和negative分类
- 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal
而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors
Anchor可以看做是图像上很多固定大小与宽高的方框,由于需要检测的物体本身也都是一个个大小宽高不同的方框,因此Faster RCNN将 Anchor当做强先验的知识,接下来只需要将Anchor与真实物体进行匹 配,进行分类与位置的微调即可。相比起没有Anchor的物体检测算法,这样的先验无疑降低了网络收敛的难度,再加上一系列的工程优化,使得Faster RCNN达到了物体检测中的一个高峰。
在Python实现的Faster R-CNN项目中,所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出:
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
其中每行的4个值(x1, y1, x2, y2) 表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为with:height∈{1:1, 1:2, 2:1}三种,如下图所示。实际上通过anchors就引入了检测中常用到的多尺度方法。
那么这9个anchors是做什么的呢?
- 遍历卷积网络计算获得的特征图,为每一个点都配备这9种anchors作为初始的检测框。
- 这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。
解释一下上面这张图的数字:
- 原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
- 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变
- 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates
- 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!
那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:ceil(800/16) * ceil(600/16) * 6=17100个候选框。
如果没有Anchor,做物体检测需要直接预测每个框的坐标,由于框 的坐标变化幅度大,使网络很难收敛与准确预测,而Anchor相当于提供 了一个先验的阶梯,使得模型去预测Anchor的偏移量,即可更好地接近真实物体。实际上,Anchor是我们想要预测属性的先验参考值,并不局限于矩形框。如果需要,我们也可以增加其他类型的先验,如多边形框、角度 和速度等
前景锚点背景锚点分类
一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如上图所示。可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小。这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9*2)大小的矩阵。为何这样做?后面接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。
如图所示绿色框为飞机的Ground Truth(GT),红色为提取的foreground anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得foreground anchors和GT更加接近,这便是我们前面提到的Bounding-box regression(边界框回归)。
Proposal Layer
Proposal Layer负责综合所有 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P) 变换量和foreground anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
Proposal Layer有3个输入:
- fg/bg anchors分类器结果rpn_cls_prob_reshape
- 对应的bbox reg的变换量rpn_bbox_pred
- im_info
- 另外还有参数feat_stride=16
对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。
整个流程可以解释为:生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals。
2.4.3 RoI pooling
RoI Pooling层负责收集proposal,并计算出proposal feature maps,送入后续网络。Rol pooling层有2个输入:
- 原始的feature maps
- RPN输出的proposal boxes(大小各不相同)
2.4.4 分类
分类部分利用已经获得的proposal feature maps,通过full connection层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。Classification部分网络结构如下图所示。
2.4.5 Faster R-CNN训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
- 在已经训练好的model上,训练RPN网络
- 利用步骤1中训练好的RPN网络,收集proposals
- 第一次训练Fast RCNN网络
- 第二次训练RPN网络
- 再次利用步骤4中训练好的RPN网络,收集proposals
- 第二次训练Fast RCNN网络
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。
2.4.6 对比
Faster R-CNN的主要贡献就是设计了提取候选区域的网络RPN,代替了费时的选择性搜索selective search,使得检测速度大幅提高。
2.5 总结
RCNN
- 在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
- 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
- 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
- 对于属于某一类别的候选框,用回归器进一步调整其位置
Fast R-CNN
- 在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
- 对整张图片输进CNN,得到feature map
- 找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
- 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
- 对于属于某一类别的候选框,用回归器进一步调整其位置
Faster R-CNN
- 对整张图片输进CNN,得到feature map
- 卷积特征输入到RPN,得到候选框的特征信息
- 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
- 对于属于某一类别的候选框,用回归器进一步调整其位置
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于Region Proposal的R-CNN系列目标检测方法是当时目标检测技术领域最主要的一个分支。R-CNN更是开启了基于深度学习目标检测的热潮。从R-CNN到Faster R-CNN一直采用的思路是proposal+分类,精度已经很高,但由于two-stage(proposal耗费时间过多)处理速度不行达不到实时效果。下一篇我们将介绍one-stage的检测模型,一阶的算法将二阶算法的两个阶段合二为一,在一个阶段里完成寻找物体出现位置与类别的预测,方法通常更为简单,依赖于特 征融合、Focal Loss等优秀的网络经验,速度一般比两阶网络更快,但 精度会有所损失,典型算法如SSD、YOLO系列等。
备注:
本文主要参考: