深度学习目标检测之RCNN、SPP-net、Fast RCNN、Faster RCNN

一、目标检测介绍

目标检测(目标提取)是一种基于目标几何和统计特征的图像分割,将目标的分割和识别合二为一,主要是明确从图中看到了什么物体、它们分别在什么位置。传统的目标检测方法一般分为三个阶段:首先在给定的图像上选择一些候选区域,然后对这些区域提取特征,最后使用分类器进行分类。

1、区域选择

传统的目标定位方法是穷举法,由于目标可能在图片的任意位置且大小不定,因此需要使用不同长宽的滑动窗口对整幅图像进行遍历。这种方法虽然可以检测到目标所有可能出现的位置,但是时间复杂度过高,产生的冗余窗口过多,严重影响后续的特征提取和分类性能。

2、特征提取

提取特征的好坏直接影响到分类的准确性,由于目标的形态多样性,提取一个鲁棒的特征并不是一个简单的事情,这个阶段常用的特征算法有:

(1)SIFT(尺度不变特征变换,Scale-Invariant Feature Transform)

        尺度空间极值检测:搜索所有尺度上的图像位置,通过高斯微分函数识别潜在的对于尺度和旋转不变的点。

        关键点定位:在每个候选位置上,通过一个拟合精细的模型来确定位置和尺度,根据稳定程度选取关键点。

        方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

        关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度,这些梯度被变换成一种表示,允许比较大的局部形状的变形和光照变化。

(2)HOG(方向梯度直方图特征,Histogram of Oriented Gradient)

        将图像分成小的连通区域/细胞单元,采集细胞单元中各像素点的梯度的或边缘的方向直方图,将这些直方图组合起来就可以构成特征描述。这种方法能较好地捕捉局部形状信息,对几何和光学变化具有很好的不变性,适用于人体检测。

(3)LBP(局部二值模式,Local Binary Pattern)

        在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则标记为1,否则标记为0。这样3*3区域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共2^8=256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。

3、分类器

主要有Softmax、SVM、Adaboost等。

综上所述,传统目标检测存在两个主要问题:一个是基于滑动窗口的区域选择策略没有针对性、时间复杂度高、窗口冗余;二是手动设计的特征对于多样性没有很好的鲁棒性。

 

二、目标检测的发展及相关概念

目标检测算法大体上可以分为基于手工特征的时期(2013年以前)以及基于深度学习的目标检测时期(2013年至今),技术发展经历了“包围框回归”、“深度神经网络兴起”、“多参考窗口(又称Anchors)”、“难样本挖掘与聚焦以及”“多尺度多窗口检测”等里程碑式的进步。

一些基本概念

(1)ground truth:监督学习的训练集的分类基准,用于证明或者推翻某个假设,正确标记的数据是ground truth,错误的标记则不是(也有人将所有标注数据都叫做ground truth)。

(2)bounding box: 包围盒是一种求解离散点集最优包围空间的算法,用体积稍大且特性简单的几何体(包围盒)来近似代替复杂的几何对象,一般为包围目标的最小矩形。

(3)IoU(Intersection over Union):预测的bbox与真实的ground truth的bbox二者的交集面积与并集面积之比。

(4)mAP(mean average precision,均值平均精度):目标检测模型识别精度的评价指标,为多个类别AP的平均值,AP为Precision-Recall曲线下的面积。

(5)FPS(Frames Per Second每秒传输帧数):画面每秒的传输帧数,数值越大所显示的动作就越流畅,通常避免动作不流畅的最低值是30。

(6)Sliding Window:滑动窗口法使用不同大小的窗口/卷积核在图像上按指定步长进行滑动,对每一次滑动得到的区域计算卷积后判断存在目标的概率,使用NMS筛选重合的窗口,这种方法的计算成本很高且效率低。

(7)NMS(Non-Maximum Suppression,非极大值抑制):抑制不是极大值的元素,搜索局部的最大值。目的是消除多余的框,找到最佳的物体检测的位置。算法的输入为所有框的位置坐标(两个顶点的x,y坐标)、score分数值(置信度);对于有重叠的框,若IoU大于规定阈值则删除,小于阈值的则保留;输出为所有满足筛选条件的建议框(可能不止一个)。

(8)Regional Proposal:候选区域是预先找出图中目标可能出现的位置,这可以保证在选取较少的窗口(几百个或几千个)的情况下保持较高的召回率IoU,并且获取的候选窗口要比滑动窗口的质量更高(滑动窗口的长宽比是固定的)。常用的Regional Proposal方法有Selective Search和Edge Boxes。

(9)Selective Search:避免滑动窗口的穷举法,根据颜色、纹理等信息把图片划分成不同的区域,通过相似度(RGB,Lab,HSV等)和区域大小(小的区域先聚合,防止大的区域不断聚合小区域,导致层次关系不完全)聚合相邻的小区域。

(10)Edge Boxes:输入图片得到边框信息Edges,将近似在一条直线上的边框聚合成edge groups,使用公式 a(s_{i},s_{j})=|cos(\theta_{i}-\theta_{ij})cos(\theta_{j}-\theta_{ij})|^{\gamma } 计算两个edge groups之间的相似度,令T为从框边缘开始到达 s_{i} 的edge group序列集合,使用w_{b}(s_{i})=1-\underset{T}{\max} \prod_{j}^{|T|-1}a(t_{j},t_{j+1})为每个edge group赋一个权值,把权值为1的归为边框内轮廓上的一部分,把权值为0的归为边框外或与边框重叠的轮廓的一部分,最后计算边框的评分。

 

三、R-CNN

Regions with CNN Features使用region proposal+CNN代替传统的滑动窗口+手动特征提取,然后使用SVM分类器进行类别判断,具体流程如下:

(1)输入一张图像。

(2)使用selective search提取约2000个bottom-up的候选区域。

(3)对每个候选区域进行形变(affine image warping,方法D),使之成为固定大小(227*227)的正方形RGB图像,输入预训练过的CNN(AlexNet、VGG16)中进行特征提取,输出为21类(VOC的20类+1类background),将所有proposals与ground-truth包围框的IoU≥0.5的作为正类(20类之一),其余的为背景类。训练时SGD的学习率为0.001,batch_size为128,随机选择32个正类样本和96个背景类样本(提取proposals时背景样本远多于正类样本)。

(4)使用category-specific linear SVMs对提取的特征向量进行打分,对一张图片中所有打分的proposals,使用greed NMF去掉重叠部分超过IoU阈值的proposal,并使用hard negative mining(难分样本挖掘)将总被识别错误的背景样本放回训练集继续训练。作者发现如果不进行fine-tuning而是直接使用CNN作为特征提取器,精度会比较低。注意在CNN训练阶段bbox的位置限制条件比较宽松:与GT重叠IoU≥0.5为正样本;然而在SVM训练时,由于SVM适用于少量样本训练,所以对于IoU要求比较严格:GT为正样本,与GT的IoU<0.3为负样本。

(5)使用线性回归算法bounding-box regression对region proposals的位置进行修正。输入数据为N个训练对\left \{(P^{i},G^{i}) \right \}_{i=1,...,N},其中P^{i}=(P_{x}^{i},P_{y}^{i},P_{w}^{i},P_{h}^{i})前两个坐标表示proposal P^{i} 的中心坐标,后两个坐标表示 P^{i} 的宽高; G^{i} 表示ground-truth bbox的位置和宽高,bbox回归的目的就是学到将P转换为G的映射。作者使用四个函数d_{x}(P),\, d_{y}(P),\, d_{w}(P),\, d_{h}(P)来参数化这个映射,前两个表示对P的bbox中心坐标的尺度不变的平移变换,后两个表示对P的宽高的对数空间的变换,通过下列映射将P转换为预测的\hat{G}

        \hat{G}_{x}=P_{w}d_{x}(P)+P_{x}

        \hat{G}_{y}=P_{h}d_{y}(P)+P_{y}

        \hat{G}_{w}=P_{w}\exp (d_{w}(P))

        \hat{G}_{h}=P_{h}\exp(d_{h}(P))

其中预测值d*(P)(*表示x,y,w,h其中之一)表示对P的Pool5层提取的特征\phi _{5}(P)进行线性变换操作:d_{*}(P)=w_{*}^{T}\phi _{5}(P),w*是要学习的参数,则损失函数+正则项为:

        w_{*}=\underset{\hat{w}_{*}}{\arg\min}\sum_{i}^{N}(t_{*}^{i}-\hat{w}_{*}^{T}\phi _{5}(P^{i}))^{2}+\lambda ||\hat{w}_{*}||^{2}

t_{*} 为训练对(P,G)的回归目标:

        t_{x}=(G_{x}-P_{x})/P_{w}

        t_{y}=(G_{y}-P_{y})/P_{h}

        t_{w}=\log (G_{w}/P_{w})

        t_{h}=\log(G_{h}/P_{h})

在实验时λ=1000;在选择训练对(P,G)时,P和G不能相距过远,实际上相距过远基本上不会是同一个物体,因此选择离G较近的P进行配对,即IoU≥0.6,所有未配对的P都被丢弃。

 

        R-CNN的优缺点:

相比传统的目标检测方法可以使用GPU加速,CNN卷积核参数共享;

提取后的特征维度较低,计算速度更快;

预先提取的多个region proposals存在大量重叠,浪费计算资源且需要占用较大的磁盘空间;

训练步骤繁琐(预训练CNN,selective search提取region proposals,fine-tuning,为每个类训练一个SVM,bbox regression);

Crop+Warp产生的的图片导致CNN输入信息丢失;

时间和内存消耗大:训练SVM和回归时、测试时每张图片每个候选区域都要做卷积,重复操作过多。

 

四、SPP-net

Spatial Pyramid Pooling空间金字塔池化是词袋模型的扩展,将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。这种网络结构能产生固定大小的输出而不关心输入图像的尺寸。使用SPP-net只需要从整张图片计算一次特征图,然后对任意尺寸的区域进行特征池化以产生一个固定尺寸的表示用于训练检测器,避免反复计算卷积特征。

传统的CNN主要由卷积部分和全连接部分组成,卷积部分不需要固定图像尺寸,可以产生任意尺寸的特征图;但全连接部分需要固定的尺寸输入,需要把所有的输入输出连接起来,w个数是固定的。因此引入SPP层移除固定输入的限制,将固定的输出喂给fc层或其他分类器,这样就可以避免输入时对图像进行裁剪或变形,防止识别精度损失。

SPP将最后一层卷积层conv5得到的每个特征图分成4*4、2*2、1(不一定等比分,也可以是其它值如3*3等)的空间块spatial bins,池化后组合输出一个kM维向量,M为块的数量M=16+4+1=21,k为conv5的特征图个数,这个固定维度的向量就是全连接层的输入。粗糙的金字塔级别只有一个块,覆盖了整张图像,用于弱监督物体识别。

bins大小的计算方式:对于特征图为a*a,输出为n*n的SPP,池化窗win=上取整[a/n],步长stride=下取整[a/n]。若特征图为矩形,则池化窗也为矩形。对于l层金字塔实现l个这样的层,然后将l个层的输出进行连接输出给全连接层。

SPP-net存在和R-CNN一样的缺点:训练步骤多,需要训练SVMs分类器,额外的回归器,特征也保存在磁盘上读写很耗时。

 

五、Fast R-CNN

Fast Region-based Convolutional Network method借鉴SPP-net的思路全面改进了R-CNN算法,减少了训练步骤、准确率更高,也不需要额外将特征保存在磁盘上。基于VGG16的Fast R-CNN算法在训练速度上比R-CNN快9倍,比SPP-net快3倍;测试速度比R-CNN快213倍,比SPP-net快10倍。在VOC2012的mAP为66%(R-CNN为62%)。

(1)RoI pooling layer

Region of Interest pooling是对selective search得到的不同大小的region proposals均匀分成若干块,对每块进行最大池化,将最后一个卷积层的特征图大小不一的候选区域转换为固定大小的输出,相当于一个单层的SPP。输入是N个特征映射和一组R个RoI,R>>N,N个特征映射(H*W*C)来自于最后一个卷积层,每个RoI是一个元组(n, r, c, h, w),n∈{0,...,N-1}是特征映射的索引,(r, c)是RoI左上角坐标,(h, w)为高和宽。输出H'*W'*C是最大池化过的特征映射,H'\leqslant H,\: W'\leqslant W,RoI的 \mathrm{bin-size}\sim h/H'*w/W',个数为H'W',bin的大小是自适应的,取决于RoI的大小。RoI层将图片的RoI定位到特征图中对应的patch,将这个特征图patch下采样为固定大小的特征再传入fc层,并解决了SPP-net只能微调SPP层后面的fc层,而不能同时微调前面的卷积层的问题。

RoI pooling的一个输入节点可能和多个输出节点相连,设 x_{i} 为输入,y_{rj} 为第r个候选区域的第j个输出,y_{rj}=x_{i*(r,j)}i^{*}(r,j)=\arg \mathrm{max}_{\, i'\in R(r,j)}x_{i'}表示第r区第j个节点是否被选中为最大值,R(r,j)表示r个输入ROI区域以及对应的r个输出特征,一个 x_{i} 可以被分配给若干不同的输出 y_{rj}

        \frac{\partial L}{\partial x_{i}}=\sum_{r}\sum_{j}[i=i^{*}(r,j)]\frac{\partial L}{\partial y_{rj}}

 

(2)multi-task loss

使用multi-task loss令训练过程single-stage。使用softmax代替SVM,将分类和边框bbox回归的损失函数合并,cls_score用于判断分类,bbox_reg计算边框回归,label为训练样本标记。u为GT类别,v=(v_{x},v_{y},v_{w},v_{h}) 为GT位置,t^{u}=(t_{x}^{u},t_{y}^{u},t_{w}^{u},t_{h}^{u}) 为预测位置,[u≥1]的值当u≥1时为1否则为0,论文中λ=1,L_{cls} 为分类误差,输出为类别数+1的softmax分类概率(比SVM引入了类间竞争);L_{loc} 为边框回归误差,对应描述边框的4个参数,使用一个平滑的L1——SmoothL1比L2对离群点outlier更加不敏感。

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

        L_{cls}(p,u)=-\log p_{u}

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

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

(3)特征缓存不需要磁盘存储,而是保存在显存中。

(4)全连接层提速:设全连接层的参数为W,使用SVD分解得到 W\approx U\Sigma _{t}V^{T},计算复杂度由uv减少为t(u+v),实现时相当于将一个fc层拆成两个,mAP几乎不下降(0.3%)而速度提高了30%。

 

缺点:使用selective search提取region proposals耗时较长(提取需要2~3s,而特征分类只需要0.32s),无法满足实时应用,而且没有实现真正意义上的end-to-end端到端的训练测试。

 

六、Faster R-CNN

Faster R-CNN=RPN(Region Proposal Network)+Fast R-CNN,流程同和Fast R-CNN,只是使用RPN代替SS提取region proposals。RPN是一个全卷积网络,与检测网络共享全图像的卷积特征,可以同时在每个位置预测目标边界和目标分数,经过端到端的训练生成高质量的region proposals。整个系统是单个的、统一的目标检测网络,RPN模块告诉Fast R-CNN在哪里寻找,是系统的“attention注意力”。

对于提取候选框最常用的SS方法,在CPU实现中每幅图像的时间为2s,EdgeBoxes算法将时间减少到了0.2s,但仍不够快,候选框提取不一定要在原图image上做,在特征图上同样可以,低分辨率特征图意味着更少的计算量。RPN旨在有效预测具有广泛尺度和长宽比的区域提议,与使用图像&特征图金字塔(a)或滤波器金字塔(b)的方法相比,RPN引入新的“锚”盒anchor boxes作为多种尺度和长宽比的参考,避免了枚举,为回归参考金字塔pyramids of reference boxes(c)。

为了生成region proposals,在最后的共享卷积层输出的特征图上滑动一个小网络RPN,以特征图的n*n空间窗口作为输入(论文中n=3见下图),每个滑动窗口映射到一个低维特征(ZF为256维,VGG为512维,后面接ReLU),然后输入到两个子全连接层:一个边框回归层reg layer和一个边框分类层cls layer。因为小网络以滑动窗口的方式运行,所有空间位置共享全连接层。RPN通过一个n*n的卷积层后接两个1*1的卷积层实现。

在每个滑动窗口位置同时预测k个候选区域,reg层有4k个输出,cls层有2k个输出,相对于称为锚点anchors的k个边界参考框reference boxes,k个proposals是参数化的;锚点位于滑动窗口的中心,并与一个尺度和长宽比相关,默认使用3个尺度{128^2,256^2,512^2}和3个长宽比{2:1,1:1,1:2},在每个滑动位置产生k=9个锚点,对于大小为W*H的特征图来说共有WHk个锚点。

为了训练RPN,为每个锚点分配一个二值类别标签(是or不是目标),正标签为(i)与GT框重叠IoU最大的锚点,或(ii)与GT框重叠超过0.7 IoU的锚点,论文中采用(i)是因为一些极端案例里面没有正例。与GT框的IoU小于0.3的标注为负例,丢弃既不是正例也不是负例的锚点,对训练没有帮助。损失函数为:

        L(\left \{ p_{i} \right \},\left \{ t_{i} \right \})=\frac{1}{N_{cls}}\sum_{i}L_{cls}(p_{i},p_{i}^{*})+\lambda \frac{1}{N_{reg}}\sum_{i}p_{i}^{*}L_{reg}(t_{i},t_{i}^{*})

其中i为一个mini-batch中锚点的索引,p_{i} 是锚点i作为目标的预测概率,如果锚点为正,真实标签 p_{i}^{*} 为1,反之为0。t_{i} 为预测边界框4个参数化坐标的向量,t_{i}^{*} 为与正锚点相关的真实边界框的向量。分类损失 L_{cls} 是两个类别的对数损失,回归损失 L_{reg}(t_{i},t_{i}^*)=R(t_{i}-t_{i}^{*}) 中R为smooth L1损失函数,p_{i}^{*}L_{reg} 项表示回归损失仅考虑正锚点。cls和reg项通过 N_{cls}(256)和  N_{reg}(~24000)进行标准化(不是必须的),λ=10对宽范围的取值不敏感。bbox回归同R-CNN。论文采用四步训练法,通过交替优化学习共享特征:

(1)训练RPN(随机采样256个anchors,正负比1:1--不够用负样本填充;μ=0,σ=0.01,学习率=0.001 or 0.0001,动量=0.9,衰减系数=0.0005),使用ImageNet预训练模型进行初始化,对region proposal task进行了end-to-end微调;

(2)使用1中RPN生成的候选区域,由Fast R-CNN训练单独的检测网络(也由ImageNet预训练模型进行初始化),此时两个网络不共享卷积层;

(3)使用检测网络初始化RPN训练,修正共享的卷积层,并且只对RPN特有的层进行微调,这时两个网络共享卷积层;

(4)固定共享的卷积层,对Fast R-CNN独有的层进行微调。

这样两个网络共享相同的卷积层并形成统一的网络。

注意:

(1)训练时忽略超过图像边界的anchor boxes(不收敛且误差难以纠正),测试时剪切跨边界的框。

(2)一些RPN proposals相互高度重叠,为了减少冗余,根据cls分数采取非极大值抑制,阈值为0.7,NMS不会影响检测准确性,但会大大减少proposal的数量。在NMS之后使用前N个候选区域进行检测。

 

七、总结

从R-CNN,SPP-net,Fast R-CNN到Faster R-CNN,基于深度学习目标检测的流程变得更加精简、精度更高、速度更快,因此基于region proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。

Faster RCNN这种基于CNN的目标检测方法使得real-time检测成为可能,在这个方向上有老进一步的研究思路。RCNN网络的演进如下:

 

参考资料

http://www.360doc.com/content/18/0320/11/52505666_738677892.shtml

https://blog.csdn.net/u014696921/article/details/52791366

https://arxiv.org/pdf/1311.2524v3.pdf

https://blog.csdn.net/v1_vivian/article/details/73275259

https://arxiv.org/pdf/1504.08083.pdf

https://blog.csdn.net/u011534057/article/details/51241831

https://arxiv.org/pdf/1506.01497.pdf

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值