目标检测网络的介绍及应用(二) -- Faster-RCNN

10 篇文章 0 订阅
10 篇文章 1 订阅
本文详细介绍了从R-CNN到Faster-RCNN的目标检测网络发展历程,包括R-CNN的候选框提取、CNN特征提取、SPPNet的空间金字塔池化层和Fast-RCNN的RoI池化层改进,以及Faster-RCNN引入的区域生成网络(RPN)以提高检测速度和准确性。
摘要由CSDN通过智能技术生成

二、Two-stages的开山之作—从R-CNN到Faster-RCNN

在2015年之前,传统的目标检测算法主要是通过特征提取或滤波变换来实现的,人们大多在低层特征表达基础上构建复杂的模型或更加复杂的多模型集成来缓慢地提高目标检测的精度,如DPM算法使用了许多传统的算法模型,以“从整体到部分,再从部分到整体”为指导思想。尽管DPM算法连续获得VOC07,08,09三年的检测冠军,但它在VOC数据集上的mAP却只有大约30%左右。直到2014年卷积神经网络空降目标检测领域,Ross
Girshick开创性地提出R-CNN模型来完成目标检测任务。以R-CNN为起点,后面两年相继提出了SPPNet,Fast-RCNN以及Faster-RCNN模型,Faster-RCNN模型使得Two-Stages模型日趋完善,极大地提高了目标检测的精度及准确度。下面我们就来一一介绍这些算法的思想及实现流程。

2.1 R-CNN算法原理

R-CNN论文原文在这里

通过之前的介绍,我们知道目标检测有两个任务,一个是检测出目标的类别,另一个是找出目标的最小标定框,所谓two-stage方法,就是将这两个任务分开来,先通过某种方法给出候选区域,再对候选区域进行判别依照某种准则输出最终的bbox。这种方法也称基于区域(Region-based)的方法,R-CNN系列算法就是这一类型的代表。R-CNN算法可以分成三个步骤(也可以认为是两个阶段):

  • 生成候选区域;

  • 对候选区域的使用CNN提取特征向量并训练分类器进行分类,对比阈值用于判别物体得到bbox;

  • 修正bbox,对bbox做回归微调。

上述步骤可以通过下图来表述:

在这里插入图片描述

2.1.1 候选框的提取

对于候选区域的提取阶段,最容易想到的方法就是滑窗法(sliding window)。所谓滑窗法就是设计不同尺寸的窗口,给定一定的滑动间隔沿图像方向移动产生候选框。滑窗法设计简单,但由于需要对图像进行全局搜索而效率低下,所以对于实时性要求比较高的检测分类器不推荐使用滑窗法。在RCNN中,作者对比了不同产生候选框的方法,最终采用了选择性搜索(selective search)方法来产生候选框,选择性搜索的详细介绍可以看这里 Search for Object Recognition.pdf)。由于同一物体往往具有相似性,选择性搜索算法通过对比颜色、纹理、尺寸和空间交叠这四个参数来计算区域集R中每个相邻区域的相似度,并选出相似度最高的两个区域,将其合并最终生成我们需要的候选框,如下图表示了设置不同尺度的标定框的搜索结果。
在这里插入图片描述

在RCNN算法中,首先使用Selective Search方法生成2000个左右的候选框,这些候选框的尺寸和位置有图像中的目标有一定的关联性。

对于经过选择性搜索得到的候选框,我们再将其输入到一个深度学习网络进行训练。注意卷积网络的输入应该是固定的,而候选框的尺寸却不是固定的,所以在输入网络之前应该对候选框进行缩放,论文中提出了两种缩放方式,各向异性缩放各向同性缩放。各向异性缩放即直接缩放到指定的大小,但会造成图像失真;各向同性缩放即直接裁剪到指定大小,并对边界区域填充固定的背景颜色。在实际应用过程中,作者发现各向异性缩放的效果要比各向同性缩放的效果更好。

2.1.2 CNN输出检测结果

在R-CNN中,作者采用了迁移学习的策略,即采用在ImageNet数据集上已经训练好的AlexNet/VGG网络作为R-CNN的基础网络结构,并对其做fine-tuning(微调)。如下图所示,将ImageNet中的1000个输出改成N+1个(其中N表示检测目标的类别数,1表示背景)。

将前面利用选择性搜索方法得到的2000个候选区域输入经过缩放后作为fine-tuning过的AlexNet网络中,提取出2000*4096个特征向量,然后把这些特征向量存到硬盘中(这里的存取操作,再加上后面SVM训练的读取操作非常浪费时间)。将这些特征向量用来训练N个二分类的SVM分类器,SVM的权重矩阵为4096*N。注意这里另外再训练SVM分类器而不是直接采用卷积网络的输出是有原因的,这是因为我们在训练CNN的样本不够准确,直接使用softmax输出的效果不是很好,而在特征向量的基础上,再训练一组SVM的效果能提高网络性能。而且我们在训练SVM的时候,正样本的选择也有所变化,只有当候选区域与ground-truth的IoU大于0.7时才被视为正样本,而在CNN中,当IoU大于0.5就会被视为正样本。经过SVM分类后,我们就得到了对于某一类的一堆的候选框,但是同一目标同一区域可能存在多个候选框,这时我们就需要对这些实际上表示同一目标的候选框进行分类,这个过程叫做非极大值抑制(NMS)。非极大值抑制,顾名思义就是抑制不是极大值的元素,只保留极大值的元素的过程。实现过程如下图所示。

在这里插入图片描述

具体的实现过程如下,首先我们给定一个NMS的阈值T,并建立一个集合S存储经SVM输出的某一类(如马)的所有正样本候选区域。在集合S中选出得分最高的候选区域A并将A从集合S中移出,依此计算集合S中剩下的候选区域与A的重叠度IoU,若IoU大于阈值T,则将该候选区域从集合S中移出。重复上述过程直至集合S为空。当然这种算法有一些固有的缺陷,有一些研究针对NMS提出了改进方案,有兴趣的同学可以看这里

经过NMS之后,已经能够输出一组置信度最高的候选框了,但是在R-CNN中提出了对输出bounding-box进行线性回归的方法来进一步提高算法的性能。对于我们的候选框P,我们希望能够训练一组线性变量 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_{x}\left( P \right),d_{y}\left( P \right),d_{w}\left( P\right),d_{h}(P) dx(P),dy(P),dw(P),dh(P),候选框P能够通过这组线性变换进行平移和缩放操作变成最终的预测框 G ^ \hat{G} G^。预测框 G ^ \hat{G} G^与候选框P的关系如下:

G ^ x = P w d x ( P ) + P x ,   G ^ y = P h d y ( P ) + P y {\hat{G}}_{x} = P_{w}d_{x}\left( P \right) + P_{x},\ {\hat{G}}_{y} = P_{h}d_{y}\left( P \right) + P_{y} G^x=Pwdx(P)+Px, G^y=Phdy(P)+Py

G ^ w = P w e d w ( P ) , G ^ h = P h e d h ( P ) {\hat{G}}_{w} = P_{w}e^{d_{w}\left( P \right)},{\hat{G}}_{h} = P_{h}e^{d_{h}\left( P \right)} G^w=Pwedw(P),G^h=Phedh(P)

如下图所示:

在这里插入图片描述

注意文中训练这四个参数使用的输入不是候选框的坐标 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),而是候选框对应第5个池化层输出的特征向量(注意这里只有当候选框的IoU>0.6才会被视为是正样本),即 d ∗ = w ^ ∗ T Θ 5 ( P ) {d_{*}= \hat{w}}_{*}^{T}\Theta_{5}\left( P \right) d=w^TΘ5(P),其中 Θ 5 ( P ) \Theta_{5}\left( P\right) Θ5(P)表示第5个池化层输出的特征向量, w ^ ∗ T {\hat{w}}_{*}^{T} w^T即为要学习的向量。而实际的线性回归参数(训练标签)应该如下:

t x = G x − P x P w , t y = G y − P y P y , t w = log ⁡ G w P w , t h = log ⁡ G h P h t_{x} = \frac{G_{x} - P_{x}}{P_{w}},t_{y} = \frac{G_{y} - P_{y}}{P_{y}},t_{w} = \log\frac{G_{w}}{P_{w}},t_{h} = \log\frac{G_{h}}{P_{h}} tx=PwGxPx,ty=PyGyPy,tw=logPwGw,th=logPhGh

所以损失函数可以表示为:

L o s s = a r g m i n ∑ i = 0 N ( t ∗ i − w ^ ∗ T Θ 5 ( P i ) ) 2 + λ ∣ ∣ w ^ ∗ ∣   ∣ 2 Loss = argmin\sum_{i = 0}^{N}{\left( t_{*}^{i} - {\hat{w}}_{*}^{T}\Theta_{5}\left( P^{i} \right) \right)^{2} + \lambda||}{\hat{w}}_{*}|\left. \ \right|^{2} Loss=argmini=0N(tiw^TΘ5(Pi))2+λw^ 2

好了,基本上R-CNN的算法思想这里已经表达清楚了,总结一下R-CNN算法的流程。首先利用选择性搜索确定2000个左右的候选区域,然后放入fine-tuning的卷积神经网络(AlexNet),对满足阈值的输出结果进行非极大值抑制,同时训练回归参数。最后对输出的候选区域进行线性回归得到最终的预测框。

2.2 R-CNN的进阶版—SPPNet和Fast-RCNN

之前介绍了R-CNN的算法原理,尽管R-CNN在2014年首次使用候选区域+卷积神经网络的方法来进行目标检测,检测精度得到了极大地提升,但是其具有一个很致命的缺点,那就是检测速度太慢。后续的SPPNet,Fast-RCNN以及Faster-RCNN都是为了提高R-CNN的速度而设计的网络结构。

2.2.1 SPPNet的改进之处

SPPNet原文在这里

之前提到的R-CNN主要分为两个步骤,一个是提取候选框,另一个是将候选框输入网络得到结果,而SPPNet主要是针对两点进行改进。①R-CNN在候选框输入到CNN之前,需要对候选区域resize到固定大小,这样就会造成图像失真,进而在一定程度上造成精度损失。②在提取出2000个候选区域后,每个候选区域都会输入到CNN进行卷积运算,这样就会造成一张图片实际上重复进行了2000次卷积运算,造成大量的计算冗余和时间的严重浪费。

2.2.1.1 空间金字塔变换层

针对第一个问题,SPPNet提出了空间金字塔变换层(spatial pyramid pooling layer)来实现任意尺寸的CNN的输入方法。实际上在卷积层中,并不需要针对特定大小的图像才能进行卷积操作,必须要固定输入大小的实际上是在全连接层,因为全连接层的神经元数量是在网络设计时就固定了的,也就是说全连接层的参数的维度是固定的,如果输入不匹配就无法计算。在SPPNet中,作者在卷积层和全连接层之间添加了一个空间金字塔变换层来输出固定长度的特征向量并作为全连接层的输入。如下图所示:
在这里插入图片描述

假设我们卷积层的输出是x*y*256维的特征,上图中的SPP层使用了三种不同尺度的卷积核,注意这里卷积核的尺寸大小和维度分别是 16 ∗ x 4 ∗ y 4 ∗ 256 16*\frac{x}{4}*\frac{y}{4}*256 164x4y256 4 ∗ x 2 ∗ y 2 ∗ 256 4*\frac{x}{2}*\frac{y}{2}*256 42x2y256 1 ∗ x 1 ∗ y 1 ∗ 256 1*\frac{x}{1}*\frac{y}{1}*256 11x1y256。这样我们SPP层的输出尺寸就是(16+4+1=21)*256了,通过设计这三种卷积核的数量,不管我们的卷积层输出的尺寸是多少,都可以得到固定尺寸的输出,这样也就不需要在对候选区域进行resize了。

2.2.1.2 基于感受野的特征映射

所谓感受野(Receptive Field)就是指某一层中的某一个元素(特征图中的像素)对应原始图像上的区域大小。由于在R-CNN中,每一个候选区域都要输入网络进行运算,而实际上这些区域都是同一副图像中的不同部分,所以在SPPNet中,作者提出首先将整幅图像输入我们的CNN中得到输出结果,然后再建立起输出特征向量与原始图像之间的对应关系。这样就可以很方便地得到对应候选区域在输出特征向量的对应位置,从而实现一次卷积操作就可以得到所有的候选区域的卷积网络的输出结果。如下图所示:

在这里插入图片描述
在这里插入图片描述

具体的映射过程及相关计算可以看这里。这里就不在展开赘述了。

2.2.2 Fast-RCNN的改进之处

Fast-RCNN原文在这里

Fast-RCNN改进了SPPNet的网络结构,使用RoI层来代替SPP层,从而进一步提升了目标检测网络的速度和准确度,实现了物体检测模型大部分网络的end-to-end(端到端)模型。论文首先指出了SPPNet和R-CNN网络存在的问题,并针对这些问题提出了改进方法。这两种算法主要存在的问题有两种:

  • 训练分为多个阶段。即将CNN训练特征向量和SVM分类和候选框bbox回归分裂开来,所以在训练SVM和bbox回归这一阶段无法更新前面的CNN的网络参数,进而导致模型的精度下降;

  • 在训练过程中需要先将CNN的特征向量存储到硬盘中,再对数据进行读取来训练SVM和bbox回归。这样的读取操作大大的占用了计算机资源,降低训练和检测速度。

为了解决上述问题,Fast-RCNN提出了RoI层来整合在SPPNet和R-CNN中的SVM和bbox回归任务,与前面的CNN层以及尺寸变换层(SPP层)结合成一个整体,一起训练。如下图所示:

在这里插入图片描述

和SPPNet一样,Fast-RCNN同样将一副图像输入到卷积层进行训练得到整幅图的特征向量,再通过感受野映射得到2000个候选框的特征向量。然后通过RoI池化层将这些特征向量固定特定大小再输入全连接层。在FC层中,最终的输出会分为两个分支层,一个负责处理候选框的Softmax概率得到候选框的类别,另一个负责处理bbox的线性回归。联合训练整个网络。

注意Fast-RCNN中采用的RoI池化层和SPP层有一点区别,RoI池化层可以视为特殊的SPP层,它是只有单个尺度的SPP层。(原因是因为作者发现多个尺度的SPP层对精度提高效果不大,但是计算量成倍增加)。如下图所示:
在这里插入图片描述

之前提到的RoI层的输出可以分为两个部分,一个负责SVM分类,另一个负责bbox回归,为了将这两个部分和之前的网络整合起来,我们网络的整个损失函数就可以这样设计:

L ( p , u , t u , v ) = L cls ( p , u ) + λ [ μ ≥ 1 ] L loc ( t u , v ) L\left( p,u,t^{u},v \right) = L_{\text{cls}}\left( p,u \right) + \lambda\left\lbrack \mu \geq 1 \right\rbrack L_{\text{loc}}(t^{u},v) L(p,u,tu,v)=Lcls(p,u)+λ[μ1]Lloc(tu,v)

其中, p p p表示网络输出的概率分布: p = ( p 0 , … , p k ) p =(p_{0},\ldots,p_{k}) p=(p0,,pk),表示 k k k个类别加上一个背景的概率; t k = ( t x k , t y k , t w k , t h k ) t^{k} = (t_{x}^{k},t_{y}^{k},t_{w}^{k},t_{h}^{k}) tk=(txk,tyk,twk,thk),表示第 k k k个类别的输出框的坐标;KaTeX parse error: Expected 'EOF', got '\ ' at position 1: \̲ ̲\lbrack u,v\rbr…分别代表标签值; L cls ( p , u ) L_{\text{cls}}\left( p,u \right) Lcls(p,u)代表类别的损失; L loc ( t u , v ) L_{\text{loc}}(t^{u},v) Lloc(tu,v)代表回归坐标的损失,每个类别都会训练一个回归器,回归器的损失如下:

L loc ( t u , v ) = ∑ i ∈ { x , y , w , h } smoot h L 1 ( t i u − v i ) L_{\text{loc}}\left( t^{u},v \right) = \sum_{i \in \{ x,y,w,h\}}^{}{\text{smoot}h_{L_{1}}(t_{i}^{u} - v_{i})} Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)

其中:

smoot h L 1 ( x ) = { 0.5 x 2 if ∣ x ∣ &lt; 1 ∣ x ∣ − 0.5   o t h e r w i s e   \text{smoot}h_{L_{1}}\left( x \right) = \left\{ \begin{matrix} 0.5x^{2}\text{if}\left| x \right| &lt; 1 \\ \left| x \right| - 0.5\ otherwise \\ \end{matrix} \right.\ smoothL1(x)={0.5x2ifx<1x0.5 otherwise 

Fast-RCNN这里就介绍完了,当然论文中还介绍了一些具体的训练细节,如使用SVD分解为FC层加速,使用小批量采样(Mini-batch sampling)来训练网络,这里就不再一一介绍了,有兴趣的读者可以去翻看论文。

2.3 R-CNN的最终版—Faster-RCNN

2015年,何凯明大神和RGB大神共同提出了Faster-RCNN网络框架,大大提升了基于深度学习的目标检测算法的速度和准确度,使得two-stages算法模型终于整合到了一个深度学习的网络框架之中。

2.3.1 Faster-RCNN算法原理

之前提到了R-CNN主要分为两步,第一个是使用选择性搜索方法生成候选框,第二个是扔进卷积网络训练得到结果。SPPNet和Fast-RCNN主要是对卷积网络进行优化,而Faster-RCNN则主要对候选框的生产进行优化。在Fast-RCNN中,最耗时的步骤是proposals的选取,这是由于SS方法主要是在CPU上完成的,它需要分析图像中的边缘特征、颜色特征以及纹理特征等,这就对计算机的资源要求比较高。所以Faster-RCNN中设计了RPN层,利用卷积神经网络来生成候选区域,从而将候选区域生成算法移植到GPU中来进一步加快网络的运算速度。事实上,Faster-RCNN就是“区域生成网络(Region
Proposal Network,
RPN)+Fast-RCNN特征提取网络”的集成
。Faster-RCNN的网络结构如下:
在这里插入图片描述

RPN层的基本思想是,在之前卷积层提取好的特征图上,通过划窗法来提取anchor得到候选框,然后再出到两个全连接层进行微调,分别负责候选框位置微调(box-regression)和类别分类(box-classification)。注意这里的只是RPN层中微调,在最后一步的classifier中还会再进行bounding box的回归和分类(Fast-RCNN结构)。之所以这么做事因为直接使用卷积网络提取出的候选框效果不是很好,而接一个分类器和bbox回归能够重新修正检测位置。在RPN中,候选框的提取是通过锚点(Anchor)来实现的,下面来具体介绍一下Anchor的概念。

所谓anchors其实就是给定的一组矩形尺寸,在Faster-RCNN中作者设计了3种长宽比和3种面积共9种形状的矩形框,对应每个中心点,就能生成9种anchors。如下图所示:

在这里插入图片描述

在这里插入图片描述

对于利用anchors提取特征区域的具体步骤如下图:

在这里插入图片描述

一张原始图像在进入RPN层之前首先结果一系列卷积层进行降维得到特征图,然后在得到的特征图上又接了一个3*3的卷积层,并且其卷积核的个数与之前输入的特征维度相同(原因可能是因为能够进一步融合特征图上的信息,使结果更鲁棒),如之前的卷积层使用的结构是ZFNet,Feature map的维度为W*H*256,那么这个卷积层的维度为3*3*256。之后在特征图上按照之前提到的3种尺度生成9个anchors,对每个anchor,又进行了两个1*1卷积核的降维。对于分类的分支而言,要输出的是当前anchor属于前景和背景的概率,所以输出维度应该是2k个(k表示anchor的数量);对于回归的分支而言,输出的是每个anchor预测位置的回归参数,所以输出维度是4k个。在分类的分支中,还有两个reshape操作是为了满足softmax的输入的数据格式的要求,具体解释可以看这里

最后这两个分支在Proposal层被整合起来,计算出最终的候选框输入到后续网络进一步完成目标检测的任务。Proposal层共有三个输入参数,分别是fg/bg
anchors分类器结果、bbox reg的回归变量以及im_info=[M, N, scale_factor],其中scale_factor表示原始图像经过4次pooling层变为W*H=(M/16, N/16)大小,用于计算anchor的偏移量。Proposal层的工作流程如下:

  • 生成anchors,利用bbox reg回归层的参数对所有anchors做bbox线性回归;

  • 根据分类器的得分从大到小排序anchors,anchors的数量不超过pre_nms_topN个;

  • 对anchors对应的原始图像的区域限定边界,防止bbox越界;

  • 剔除非常小尺寸的anchors;

  • 进行非极大值抑制;

  • 再对非极大值抑制后的anchors按照得分进行排序,选取前post_nms_topN作为proposal的输出候选框。

Faster-RCNN后续的步骤就是利用Fast-RCNN特征提取网络来进行精确的目标检测,所以在进如全连接层之前要对proposal的尺度进行固定,Faster-RCNN同样使用了ROIPooling来完成尺度变换。

2.3.2 Faster-RCNN训练过程

Faster-RCNN训练过程可以分为2个部分,包括RPN网络的训练和Fast-RCNN网络的训练,其中RPN网络和Fast-RCNN网络共享原始特征的提取卷积网络(如ZFNet和VGGNet)。作者将实际训练过程分为了4个步骤,如下图所示:

在这里插入图片描述

  • 首先利用已经训练好的模型独立训练RPN网络,然后用这个RPN的网络权重对Fast-RCNN网络的原始特征提取网路进行初始化;

  • 利用RPN层输出的候选框作为Fast-RCNN网络的输入来训练Fast-RCNN网络;

  • 利用上一步训练好的Fast-RCNN来初始化RPN网络的网络权重并训练再次训练RPN网络;

  • 最后将第二次训练好的RPN网络输出的候选框作为Fast-RCNN网络的输入再训练一次Fast-RCNN,整合RPN网络和Fast-RCNN网络就是Faster-RCNN网络。

RPN层的损失函数如下:

L ( { p i } , { t i } ) = 1 N cls ∑ i L cls ( p i , p i ∗ ) + λ 1 N reg ∑ i p i ∗ L reg ( t i , t i ∗ ) L\left( \left\{ p_{i} \right\},\left\{ t_{i} \right\} \right) = \frac{1}{N_{\text{cls}}}\sum_{i}^{}{L_{\text{cls}}\left( p_{i},p_{i}^{*} \right) + \lambda\frac{1}{N_{\text{reg}}}\sum_{i}^{}{p_{i}^{*}L_{\text{reg}}(t_{i},t_{i}^{*})}} L({pi},{ti})=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)

其中, i i i表示anchors的序号, p i p_{i} pi表示foreground softmax probability, p i ∗ p_{i}^{*} pi代表对应的GT
predict概率(即当第i个anchor与GT之间IoU>0.7时,认为该anchor为foreground, p i = 1 p_{i} = 1 pi=1;当IoU<0.3时,认为该anchor为background, p i = 0 p_{i} =0 pi=0;当0.3<IoU<0.7时舍弃该anchor,不参与训练);t表示预测的候选框,t*表示对应foreground anchor对应的标定框。可以看到,这个Loss分为了两个部分,分类损失和回归损失,分类损失即前图提到的softmax损失;回归损失和Fast-RCNN中使用的smooth L1一致。

这里就把Faster-RCNN的原理介绍完了,下面我们再来讲讲速度更快的one-stage方法代表方法YOLO及SSD。

参考文献

[1] 原始图片中的ROI如何映射到到feature map?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值