浅谈深度神经网络 — R-CNN(区域卷积神经网络)R-CNN->Fast R-CNN->Faster R-CNN


R-CNN(区域卷积神经网络)


模型发展图

1. 引言

目标检测(Object Detection) 就是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,通俗点说就是给定一张图片要精确的定位到物体所在位置,并完成对物体类别的识别。其准确性实时性是整个系统的一项重要能力。

R-CNN的全称是Region-CNN (区域卷积神经网络),是第一个成功将深度学习应用到目标检测上的算法。R-CNN基于卷积神经网络(CNN),线性回归,和支持向量机(SVM)等算法,实现目标检测技术。

但是这个问题并没有想象的那么简单,首先物体的尺寸变化很大,物体摆放的角度不同,形态各异,而且可以出现在图片的任何地方,有些物体还具有多个类别。

2. 任务

R-CNN主要就是用了做目标检测任务的。先简单了解下目标检测,我的通俗理解是对于给定图片精确的找到物体所在的位置,并且标注物体的类别(一张图像中含有一个或多个物体)。

输入:image
输出:类别标签(Category label);位置(最小外接矩形 / Bounding Box)

模型构思
按分类问题对待可分为两个模块:

  • 模块一:提取物体区域(Region proposal)
  • 模块二:对区域进行分类识别(Classification)

主要难度: 在提取区域上需要面临 不同位置,不同尺寸,提取数量很多的问题。在分类识别方面主要面对CNN分类及计算量大的问题。

3. 传统方法 -> R-CNN

3.1 模型概述

传统的目标检测方法大多以图像识别为基础。 一般可以在图片上使用穷举法选出所所有物体可能出现的区域框,对这些区域框提取特征并使用图像识别方法分类, 得到所有分类成功的区域后,通过非极大值抑制(Non-maximumsuppression)输出结果。

R-CNN遵循传统目标检测的思路,同样采用提取框,对每个框提取特征、图像分类、 非极大值抑制四个步骤进行目标检测。只不过在提取特征这一步,将传统的特征(如 SIFT、HOG 特征等)换成了深度卷积网络提取的特征。

3.2 R-CNN详细步骤


R-CNN的步骤如下(对应上图):

  1. 图像输入 输入待检测的图像。

  2. 区域建议(Region proposals) 对第一步输入的图像进行区域框的选取。常用的方法是Selective Search EdgeBox,主要是利用图像的边缘、纹理、色彩、颜色变化等信息在图像中选取2000个可能存在包含物体的区域(这一步骤 选择可能存在物体的区域,跟分类无关 ,包含一个物体)。

  3. 特征提取 使用CNN网络对选取的2000存在物体的潜在区域进行特征提取。但是可能存在一些问题,由于上一步Region proposals所提取出来的图像的尺寸大小是不一样的,我们需要卷积后输出的特征尺度是一样的,所以要将Region proposals选取的区域进行一定的缩放处理(warped region)成统一的227x227的大小,再送到CNN中特征提取。
    R-CNN特征提取用的网络是对ImageNet上的AlexNet(AlexNet网络详解)的CNN模型进行pre-train(以下有解释,可先行了解pre-train)得到的基本的网络模型。然后需要对网络进行fine-tune,这时网络结构需要一些修改,因为AlexNet是对1000个物体分类,fc7输出为1000,因此我们需要改为(class + 1)若类别数为20则应改为20+1=21个节点,加一的原因是对图像背景类识别,判断是不是背景。其他的都用AlexNet的网络结构fine-tune(全连接),其中包括五层卷积和两层全连接层。 (在这里使用的是ImageNet竞赛上面训练好的AlexNet模型去除最后两层全连接层的模型(也可以是VGG,GoogLeNet,ResNet等)。特征提取用的是卷积神经网络代替了传统的HOG特征,Haar特征等取特征的方法。)

  4. SVM分类 将提取出来的特征送入SVM分类器得到分类模型,在这里每个类别对应一个SVM分类器,如果有20个类别,则会有20SVM分类器。对于每个类别的分类器只需要判断是不是这个类别的,如果同时多个结果为Positive则选择概率之最高的。

  5. Bounding Box Regression 这个回归模型主要是用来修正由第二步Region proposals得到的图像区域。同第四步的分类一样,每个类别对应一个Regression模型。这个Bounding Box Regression主要是为了精准定位。它所做的就是把旧的区域(SS算法生成的区域) P i = ( P x i , P y i , P w i , P h i ) P^i=(P^i_x,P^i_y,P^i_w,P^i_h) Pi=(Pxi,Pyi,Pwi,Phi)重新映射到新的区域 G i = ( G x i , G y i , G w i , G h i ) G^i=(G^i_x,G^i_y,G^i_w,G^i_h) Gi=(Gxi,Gyi,Gwi,Ghi),其中 - 中心位置 ( x , y ) (x,y) (x,y) -宽高尺寸 ( w , h ) (w,h) (w,h)

    上图中 w w_* w 是我们要学习的参数矩阵,一共对应四个参数各有一个 w w_* w矩阵。 左图下面四个式子 t i t_*^i ti 分别是在直角坐标系和极坐标系下的比例关系。左图第一个式子中 t i t_*^i ti 对应下面四个式子, W T ϕ 5 ( P i ) W^T_*\phi_5(P^i) WTϕ5(Pi)可以但国足是变化delta或是一个修正,后面的范式则是正则项。在测试的时候我们首先求得delta(右图最后一个式子),之后分别求得四个区域参数。

  6. 使用非极大值抑制输出(针对于测试阶段) 可能几个区域选择的是同一个区域内的物体,为了获得无冗余的区域子集。通过使用非极大值抑制(loU>=0.5)获取无冗余的区域子集。主要有以下几步:

    ① 所与区域分值从大到小排列
    ② 剔除冗余,与最大分值区域loU>=0.5的所有区域
    ③ 保留最大分值区域,剩余区域作为新的候选集

3.3 对以上出现的一些概念的解释:

3.3.1 pre-train

预训练,拿一个在其他训练集上面训练好的模型作为初始模型,共用层的参数是相同的已经在其他训练集上面训练好的。e.g. ImageNet是一个很大的数据集,它的1000个分类基本涵盖主要的物体识别,是比较权威的,在前卷积层特征提取已经比较成熟,我们就可以直接把模型的结构参数拿过来直接使用。

3.3.2 fine-tune

再训练,把模型拿过来针对现在要解决问题的数据集再次训练,以更加适应现在数据集。e.g. 我们要分类的物体不包含在ImageNet分类中,则需要针对现在的数据集再训练,重新训练得到参数。

3.3.3 IoU(Intersection over Union)


I o U I n t e r s e c t i o n <mtext>   </mtext> o v e r <mtext>   </mtext> U n i o n = A B / A B = S I / ( S A + S B S I ) IoU(Intersection\ over\ Union) = (A\bigcap B)/(A\bigcup B)= SI/(SA+SB-SI) IoUIntersection over Union=AB/AB=SI/(SA+SBSI)

3.4 一些问题

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恰好可以解决这个问题。

4. SPP-Net网络

4.1 模型概述

SPP:Spatial Pyramid Pooling(空间金字塔池化) SPP-Net是出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

空间金字塔池化, ROI Pooling详解 : SPPROI Pooling

众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。

正如你在上图中看到的,在R-CNN中,“因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN”。

但warp/crop这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度。没太明白?说句人话就是,一张16:9比例的图片你硬是要Resize成1:1的图片,你说图片失真不?

SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?

4.2 两个特点

它的特点有两个:

  1. 结合空间金字塔方法实现CNN的多尺度输入。SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
    换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
    简言之,CNN原本只能固定输入、固定输出,CNN加上SSP之后,便能任意输入、固定输出。
    ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。

  2. 只对原图提取一次卷积特征。在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
    而SPP Net根据这个缺点做了优化:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。
    如此这般,R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。

4.3 总结: 2大改进

  • 直接输入整图,所有区域共享卷积计算(一遍),在CNN输出上提取所有区域的特征
  • 引入空间金字塔池化(Spatial Pyramid Pooling),为不同的尺寸区域在CNN输出上提取特征,映射到固定尺寸的全连接层上。

SPP-Net网络使用了SPP技术实现了① 共享计算适应不同输入的尺寸

4.4 SPP-Net一些问题

继承了R-CNN的问题

① 需要存储大量特征
② 复杂的多阶段训练
③ 训练时间长

5 . Fast R-CNN网络

空间金字塔池化, ROI Pooling详解 : SPPROI Pooling

5.1 改进

  • 比R-CNN,SPP-Net更快的train/test,更高的准确率,召回率。
  • 实现end-to-end(端对端)单阶段训练,使用多任务损失函数。
  • 所有层都可以fine-tune
  • 不需要离线存储特征文件

引入2个新技术:

  • 感兴趣区域池化层(Rol pooling layer
    其实就是是空间金字塔池化特殊形式,空间金字塔池化单层特例。(详细内容这里不再叙述)
  • 多任务损失函数(Multi-task loss)

5.2 结构

5.3 概述

R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI pooling layer,二是损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练(关于什么是边框回归,请参看七月在线APP题库大题查看深度学习分类下第56题:https://www.julyedu.com/question/big/kp_id/26/ques_id/2139)。

(1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个77512维度的特征向量作为全连接层的输入。

换言之,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。

(2) 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做下了铺垫。

画一画重点:
R-CNN有一些相当大的缺点(把这些缺点都改掉了,就成了Fast R-CNN)。
大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。
解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征

原来的方法:许多候选框(比如两千个)–>CNN–>得到每个候选框的特征–>分类+回归
现在的方法:一张完整图片–>CNN–>得到每张候选框的特征–>分类+回归

所以容易看见,Fast R-CNN相对于R-CNN的提速原因就在于:不过不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

在性能上提升也是相当明显的:

5.4 多任务损失函数

分类器loss:
L c l s ( p , u ) = l o g p u L_{cls}(p,u) = -logp^u Lcls(p,u)=logpu
bounding box回归L1 loss:

L l o c ( t u , v ) = <munder> i ϵ { x , y , w , h } </munder> s m o o t h L 1 ( t i u v i ) L_{loc}(t^u,v)= \sum_{i\epsilon \{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i) Lloc(tu,v)=iϵ{x,y,w,h}smoothL1(tiuvi)

多任务损失函数:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u 1 ] L l o c ( t u , v ) L(p,u,t^u,v)= L_{cls}(p,u) +\lambda [u\geq 1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)

6 . Faster R-CNN网络


同 Fast R-CNN 相比 Faster R-CNN引入了RPN(Region Proposal Network)即 Faster R-CNN = Fast R-CNN + RPN

6.1 RPN网络介绍参考:

(RegionProposal Network)RPN网络结构及详解

6.2 集成RPN网络(Region Proposal NetWork)的优点

  • 取代离线Selective Search模块,解决性能瓶颈(之前提取的区域建议都是离线存储的)
  • 进一步共享卷积层计算
  • 基于Attention注意机制,引导Fast R-CNN关注区域
  • Region proposals量少质优
  • 高准确率,召回率

6.3 RPN网络loss

L ( { p i } , { t i } ) = 1 N c l s <munder> i </munder> L c l s ( p i , p i ) + λ 1 N r e g <munder> i </munder> p i L r e g ( t i , t i ) L(\{pi\},\{ti\})=\frac1 {N_{cls}}∑_iL_{cls}(pi,p^∗_i)+λ\frac1 {N_{reg}}∑_ip^∗_iL_{reg}(t_i,t^∗_i) L({pi},{ti})=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)

6.4 训练过程(分步训练)

Step1 - 训练RPN网络

  • 卷集层初始化 使用ImageNet上pre-train模型参数

Step2 - 训练Fast R-CNN网络

  • 卷集层初始化 使用ImageNet上pre-train模型参数
  • Region proposals由Step1的RPN生成

Step3 - 调优RPN网络

  • 卷集层初始化 Fast R-CNN的卷积层参数
  • 固定卷积层,finetune剩余层

Step4 - 调优Fast R-CNN网络

  • 固定卷积层,finetune剩余层
  • Region proposals由Step3的RPN生成

7. 小结:

最后总结一下各大算法的步骤:
RCNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

Fast R-CNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.对整张图片输进CNN,得到feature map
3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一类别的候选框,用回归器进一步调整其位置

Faster R-CNN
1.对整张图片输进CNN,得到feature map
2.卷积特征输入到RPN,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

简言之,即如本文开头所列
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)

R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。

8. 参考:

算法之道 结构之法 : https://blog.csdn.net/v_JULY_v/article/details/80170182
RPN网络结构及详解: https://blog.csdn.net/qq_36269513/article/details/80421990
ROI Pooling:https://blog.csdn.net/H_hei/article/details/89791176
SPP-Net: https://blog.csdn.net/H_hei/article/details/87298459

全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务