图像目标检测:从R-CNN到SPP-Net,再到Fast R-CNN,最后到Faster R-CNN。

 

  • R-CNN

传统的目标检测方法一般分为四个阶段:(1)图像预处理,(2)目标区域选择,(3)特征提取,(4)分类器分类。其中,目标区域选择通常采用的方法是 利用不同尺寸大小的滑动窗口对图片进行遍历,这导致了一个问题,就是时空复杂度很高,计算量大。此外,在特征提取阶段,需要人为选取特征,鲁棒性差。针对这些不足,2014年Girshick R等提出了首个用于图像目标检测的深度学习模型 R-CNN 进行图像目标检测。

R-CNN结合了候选区域建议(Region Proposal, RP)和卷积神经网络(Convolutional Neural Networks, CNN)来代替传统的目标检测算法,因此命名为R-CNN。

首先简单介绍一下候选区域建议,使用该算法主要为了解决窗口滑动的缺点。候选区域建议的基本原理是利用图像的纹理、边缘和颜色等特征信息,在图片中产生了多个尺寸不一的区域框,其中某个区域框应该就包含了目标,在R-CNN 中具体采用的候选区域建议算法为选择性搜索(Selective Search, SS)。由于这些不是重点,我也没去详细了解,知道采用了这些方法就行了。


R-CNN的网络框架流程为:

(1)原始图像经过选择性搜索算法提取出了2000个候选区域框,这2000个区域框基本上包括了图像中可能出现的目标。

(2)把所有区域框缩放到统一尺寸(如:227*227)。

(3)将所有区域框逐个通过CNN提起特征,采用的是AlexNet模型(去掉了最后一层),这样每个区域框都得到一个4096维的特征向量,2000个区域框一共就是2000*4096维,设该2000*4096维的特征矩阵为M

(4)使用SVM分类器对(3)中提取的特征进行分类。SVM是二分类器,假设我们需要将目标分为k类,那么就需要训练k个SVM分类器,设k个分类器组成的权值矩阵为N(4096*k),将MN相乘,得到矩阵S(2000*k),矩阵S中的元素sij就表示第i个区域框属于第j个分类。

(5)通过线性回归算法对候选框位置进行微调(边框回归)。首先对矩阵S中的每一列(类别)进行非极大值抑制,去除重叠的候选区域,得到该类别中得分最高且重合度低的候选区域。最后对选出来的候选区域进行边框回归。

R-CNN的流程构架图如下。(图摘自《深度学习原理与实践》,后面的图也是)


R-CNN存在着如下不足:

(1)重复计算量大:2000个候选框都需要输入给CNN提取特征,而这2000个候选框存在着大量的相互重叠,导致很多不必要的重复计算。

(2)候选框缩放丢失信息:由于CNN中全连接层神经元个数固定,因此需要输入的候选框尺寸一致,而缩放导致图像失真,丢失部分信息。

(3)训练步骤繁琐:R-CNN的训练阶段分为了3个单独的部分,分别为训练CNN,训练SVM分类器和训练边框回归器。

(4)训练耗时且占用空间大:由于需要分开单独训练,需要保存大量的特征文件。

  • SPP-Net

针对R-CNN存在的不足,何恺明提出了SPP-Net对R-CNN的部分不足(第(1)和第(2)个不足)进行了改进。SPP-Net主要解决的问题是:只需执行一次CNN操作就可以获得所有候选框的特征(而不是R-CNN中的2000次),此外,采用空间金字塔池化(Spatial Pyramid Pooling, SPP)代替了候选框缩放, 解决了信息丢失的问题。

首先,先了解一下SPP的原理。如下图,假设经过CNN得到了最后一层卷积层的特征图,在特征图上任取一个窗口(windows),尺寸大小随意,为什么要取一个窗口后面再解释,其实这个窗口就是前面讲的候选框。由于输入给全连接层的尺寸必须是一致的,因此利用空间金字塔池化将不同尺寸的窗口映射为同一个尺寸的特征向量。具体操作为:将窗口分别划分为4*4,2*2和1*1的图像块,再对每个块进行最大池化,这样,最后每个窗口最后都得到了4*4+2*2+1=21个特征,这21个特征组成了一个特征向量,作为全连接层的输入。


介绍完SPP的原理,就可以来探索一下SPP-Net的原理了。SPP-Net的网络框架流程为:

(1)原始图像经过选择性搜索算法提取出了2000个候选区域框。(与R-CNN一致)

(2)原始图像通过CNN直到最后一层卷积层,提取特征图。

(3)将(1)提取到的候选框映射到特征图上,从而得到2000个候选框的特征,论文中称之为窗口,这也就是在上一段中为什么要取一个窗口的原因。

(4)将每个窗口进行SPP操作,获得固定尺寸的特征向量,输入给全连接层。

(5)对全连接层输出的特征进行SVM分类,同时进行边框回归。(与R-CNN一致)

其网络构架图如下。


可以看出,SPP-Net解决了R-CNN重复计算量大候选框缩放丢失信息的不足,但是训练步骤繁琐训练耗时且占用空间大的缺点并没得到解决。

  • Fast R-CNN

针对上述存在的不足,Girshick R又提出了更为精简的模型Fast R-CNN。Fast R-CNN将SPP层改为了ROI Pooling层,同时使用了多任务损失函数,将边框回归和分类合并到卷积神经网络一起训练,从而大大简化了训练步骤,同时也节省了不少空间。

同样,先介绍ROI Pooling层多任务损失函数的原理,再介绍Fast R-CNN的原理。

ROI Pooling层是SPP层的简化版,ROI Pooling将窗口划分为7*7的图像块,然后在每个图像块执行最大池化,最后得到了一个7*7的特征向量。

所谓多任务损失函数是指分类的任务和边框回归的任务都基于同一个损失函数。总的损失函数L包括两个部分L_{cls}L_{loc}。其中L_{cls}计算的分类的误差,L_{loc}计算的是检测框定位的误差。如式(1)。

                                               L(\mathbf{p},u,\mathbf{t}^{u},\mathbf{v})=L_{cls}(\mathbf{p},u)+\lambda L_{loc}(\mathbf{t}^{u},\mathbf{v})                                                                 (1)

其中,每个训练的ROI都有用 类别真值u 和 边框回归真值\mathbf{v} 标记,\mathbf{p}=(p_{0},p_{1},\cdots ,p_{K})为每个ROI在K+1个类别中的离散概率分布(K个目标类别,1个背景类别),分类的损失函数具体为:

                                                              L_{cls}(\mathbf{p},u)=-log\mathbf{p}_{u}                                                                                    (2)

此外,第二个损失L_{loc}是针对类别u边框回归真值\mathbf{v}定义的,\mathbf{v}=(v_{x},v_{y},v_{w},v_{h}),类别u的预测边框预测值为\mathbf{t}^{u}=(t_{x}^{u},t_{y}^{u},t_{w}^{u},t_{h}^{u}),具体的L_{loc}为:

                                                      L_{loc}(\mathbf{t}^{u},\mathbf{v})=\sum_{i\in\left \{ x,y,w,h\right \}}^{ } smooth_{L1}(t_{i}-v_{i})                                                         (3)

                                                 smooth_{L1}(x)=\left\{\begin{matrix} 0.5x^{2}\, \, \, \, \, \, \, \, \, \, \, \, \, \, if(|x|<1)\\ |x|-0.5 \, \, \, \, \, \, \, \, otherwise \end{matrix}\right.                                                                (4)

根据作者在论文中介绍,L1 loss 比R-CNN和SPP-Net中的L2 loss更具有抗噪性,对数值波动不敏感。当回归目标无限制时,L2 loss 的训练可能需要仔细调整学习率以防止梯度爆炸。

最后,式(1)中的超参数\lambda用于控制两个任务损失之间的平衡。 将边框回归真值v_{i} 标准化为零均值和单位方差后, \lambda取1。


了解完ROI Pooling层和多任务损失函数,下面介绍一下Fast R-CNN的网络框架流程。

(1)原始图像经过选择性搜索算法提取出了2000个候选区域框。(与R-CNN一致)

(2)原始图像通过CNN直到最后一层卷积层,提取特征图。(与SPP-Net一致)

(3)将(1)提取到的候选框映射到特征图上,从而得到2000个候选框的特征,然后经过ROI Pooling层得到固定尺寸的特征。

(4)先将特征通过两个全连接层,然后将输出的特征分别进行分类(Softmax)和边框回归。

Fast R-CNN网络构架如下。

 


经过Fast R-CNN的改进,现在获得了更高的检测精度,同时也使训练方式变得简单。但是还是存在一些缺点,如下:后续区域采用的选择性搜索算法太耗时,占用了目标检测2/3的时间,无法满足实时性要求。

于是乎,Faster R-CNN被提出来了。

  • Faster R-CNN

Faster R-CNN由Ren在2015年提出,主要针对Fast R-CNN中候选区域框的提取环节做出了改进,建设性的提出了候选区域网络(Region Proposal Network, RPN)来代替选择性搜索,从而实现了将候选框提取这一环节合并到深度网络中,首次实现了真正意义上的端到端的训练与预测。

Faster R-CNN的网络框架如下图,

其中的conv layers为ZF网络,如下图,为ZF网络最后一层卷积层(Layer5)前的结构,然后将Layer5的输出,也就是13*13*256特征输入给RPN。

在RPN中,定义了一个概念,称之为anchor。在每个特征图中(大小为13*13),共有13*13个像素,称之为“位置”,每个位置都生成9个窗口,这9个窗口由3种面积,3种比例(1:1,1:2, 2:1)构成,这些窗口就称为anchor,这些不同尺度的anchor包含可能存在目标的区域,一张特征图将生成13*13*9个anchor。

那RPN的输出跟anchors是什么关系呢,通过下图进行讨论 。

RPN中,先对输入的特征(Layer5)进行卷积,sliding window也相当于卷积窗口,在特征图上进行滑动。需要注意的是,下图仅仅以一个sliding window为例,所得到的数据也只是一个sliding window的。由于输入的特征是13*13*256的,对每一个sliding window卷积完后得到的特征尺寸是1*256,也就是下图中的256-d。第二个卷积层对应每个sliding window位置输出k个区域得分,表示该位置的anchor为物体的概率,这部分总输出长度为2k(一个anchor对应两个输出:是物体的概率+不是物体的概率) 和 k个回归后的区域建议(框回归),一个anchor对应4个框回归参数,因此框回归部分的总输出的长度为4k,并对得分区域进行非极大值抑制,输出得分Top-N(文中为300)的区域。

Faster R-CNN用RPN输出的区域代替了以往的SS算法。网络的其他部分与Fast R-CNN基本一样,就不再介绍了。关于Faster R-CNN,具体的可以参考这篇博客(https://www.cnblogs.com/zyly/p/9247863.html),断断续续写了几天,懒得再写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值