浅谈深度神经网络 — 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的步骤如下(对应上图):
-
图像输入 输入待检测的图像。
-
区域建议(Region proposals) 对第一步输入的图像进行区域框的选取。常用的方法是Selective Search EdgeBox,主要是利用图像的边缘、纹理、色彩、颜色变化等信息在图像中选取2000个可能存在包含物体的区域(这一步骤 选择可能存在物体的区域,跟分类无关 ,包含一个物体)。
-
特征提取 使用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特征等取特征的方法。) -
SVM分类 将提取出来的特征送入SVM分类器得到分类模型,在这里每个类别对应一个SVM分类器,如果有20个类别,则会有20SVM分类器。对于每个类别的分类器只需要判断是不是这个类别的,如果同时多个结果为Positive则选择概率之最高的。
-
Bounding Box Regression 这个回归模型主要是用来修正由第二步Region proposals得到的图像区域。同第四步的分类一样,每个类别对应一个Regression模型。这个Bounding Box Regression主要是为了精准定位。它所做的就是把旧的区域(SS算法生成的区域) Pi=(Pxi,Pyi,Pwi,Phi)重新映射到新的区域 Gi=(Gxi,Gyi,Gwi,Ghi),其中 - 中心位置 (x,y) -宽高尺寸 (w,h)。
上图中 w∗ 是我们要学习的参数矩阵,一共对应四个参数各有一个 w∗矩阵。 左图下面四个式子 t∗i 分别是在直角坐标系和极坐标系下的比例关系。左图第一个式子中 t∗i 对应下面四个式子, W∗Tϕ5(Pi)可以但国足是变化delta或是一个修正,后面的范式则是正则项。在测试的时候我们首先求得delta(右图最后一个式子),之后分别求得四个区域参数。 -
使用非极大值抑制输出(针对于测试阶段) 可能几个区域选择的是同一个区域内的物体,为了获得无冗余的区域子集。通过使用非极大值抑制(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)
IoU(Intersection over Union)=(A⋂B)/(A⋃B)=SI/(SA+SB−SI)
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详解 : SPP ,ROI 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 两个特点
它的特点有两个:
-
结合空间金字塔方法实现CNN的多尺度输入。SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
简言之,CNN原本只能固定输入、固定输出,CNN加上SSP之后,便能任意输入、固定输出。
ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。 -
只对原图提取一次卷积特征。在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详解 : SPP ,ROI 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:
Lcls(p,u)=−logpu
bounding box回归L1 loss:
Lloc(tu,v)=iϵ{x,y,w,h}∑smoothL1(tiu−vi)
多任务损失函数:
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]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({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(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