【目标检测】RCNN系列

在这里插入图片描述

  在计算机视觉的众多技术领域中,目标检测(物体检测,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)=WTΦ5(P)
    Φ 5 ( P ) \Phi_5(P) Φ5(P)为AlexNet pool5输出的特征,进一步,只需求 W ∗ T W_*T WT即可

该回归器的损失函数为:

  • 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^minin(tiw^TΦ5(Pi))2+λw^2

上式中的 t ∗ i t_*^i ti可以通过如下公式求出:

  • t x = ( G x − P x ) / P w t_x = (G_x-P_x)/P_w tx=(GxPx)/Pw
  • t y = ( G y − P y ) / P h t_y = (G_y-P_y)/P_h ty=(GyPy)/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系列等。

备注:

本文主要参考:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值