一文看懂Faster R-CNN

Faster R-CNN是目标检测历程中最重要的论文之一,继Fast R-CNN之后将训练检测速度提升到接近可以实时检测(未达到实时)。Faster里面一系列重要思想算法需要我们理解到位。

一文看懂Faster R-CNN_第1张图片
Faster R-CNN是典型的“two-stage”,可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。Faster R-CNN这篇论文着重解决了这个系统中的三个问题:

  1. 如何设计区域生成网络;
  2. 如何训练区域生成网络;
  3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络。
    一文看懂Faster R-CNN_第2张图片
    从上面这幅图,我们可以清晰地看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
    这是该网络的总体思路,接下来我们慢慢分析它的精髓所在。

1 Region Proposal Network(RPN网络)
RPN的核心思想是使用CNN卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口(只需在最后的卷积层上滑动一遍),anchor机制和边框回归可以得到多尺度多长宽比的Region Proposal。

RPN网络也是全卷积网络(FCN,fully-convolutional network),可以针对生成检测建议框的任务端到端地训练,能够同时预测出object的边界和分数。只是在CNN上额外增加了2个卷积层(全卷积层cls和reg)
一文看懂Faster R-CNN_第3张图片
上图介绍了RPN网络的具体结构,可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

1.1 Anchors
一文看懂Faster R-CNN_第4张图片
Anchors是为了训练RPN网络提供样本的。说是在RPN网络的每个3×3的窗口中心生成一系列anchors,实际上60×40的卷积特征图上每个点都生成了一系列的anchors。文中anchors默认有9个不同的形态:三种面积{128×128,256×256,512×512} * 三种长宽比例{1:1, 1:2, 2:1}。注意这里的面积是对应到“短边resize到600的重新缩放的原始图像”。这一步在60*40的feature maps上会生成60×40×9=21600,大约2W个anchors。附一张每个博客都会提到的描述anchors的图。

一文看懂Faster R-CNN_第5张图片
一文看懂Faster R-CNN_第6张图片
结合两张图讲讲Anchor,上图Anchor产生于ZF model最后一卷积层的特征输出num_output=256(feature map有256dimensions),在feature map中每个点上生成k个anchor(默认k=9,即各种纵横比于面积的组合)。经过rpn_conv(3×3,两个1×1卷积)后转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates。
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!

1.2 softmax判定foreground与background
一文看懂Faster R-CNN_第7张图片
一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,只是为了让通道数变为18。这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9*2)大小的矩阵。后面接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。

1.3 对proposals进行bounding box regression一文看懂Faster R-CNN_第8张图片
可以看到其 num_output=36,即经过该卷积输出图像为WxHx36,在caffe blob存储为[1, 4x9, H, W],这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的
在这里插入图片描述
bounding box regression(bbr回归)具体内容请参看博文bbr相关部分

Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:
在这里插入图片描述
1.生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
2.按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
3.限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
4.剔除非常小(width 5.进行nonmaximum suppression
6.再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出。

之后输出proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,这点在后续网络中有用。

2 RoI pooling
RoI池化层去掉了SPP的多尺度池化,直接用MxN的网格,将每个候选区域均匀分成M×N块,对每个块进行max pooling。从而将特征图上大小不一的proposal boxes转变为大小统一的特征向量,计算出proposal feature maps送入下一层。
Rol pooling层有2个输入:
1.原始的feature maps
2.RPN输出的proposal boxes(大小各不相同)
总结一下:其实就是将Proposal层输出的boxes在原始的feature maps找到对应的元素,然后分成M×N的网格(即统一输出维度便于后面的fc层),最后用于分类。
Roi pooling可以理解为简化版的spp-net具体内容请参看博文相关内容。
RoIPooling可以在Faster RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map。
一文看懂Faster R-CNN_第9张图片
1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800×800,最后一层特征图feature map大小:25×25

2)假定原图中有一region proposal,大小为665×665,这样,映射到特征图中的大小:665/32=20.78,即20.78×20.78,如果你看过Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20×20

3)假定pooled_w=7,pooled_h=7,即pooling后固定成7×7大小的特征图,所以,将上面在 feature map上映射的20×20的 region proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86×2.86,此时,进行第二次量化,故小区域大小变成2×2

4)每个2×2的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49个小区域就输出49个像素值,组成7×7大小的feature map

总结,所以,通过上面可以看出,经过两次量化,即将浮点数取整,原本在特征图上映射的20×20大小的region proposal,偏差成大小为14×14的,这样的像素偏差势必会对后层的回归定位产生影响
所以,产生了替代方案,RoiAlign

RoIAlign
这个是在Mask RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map时提出的

一文看懂Faster R-CNN_第10张图片

1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800×800,最后一层特征图feature map大小:25×25

2)假定原图中有一region proposal,大小为665×665,这样,映射到特征图中的大小:665/32=20.78,即20.78×20.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数

3)假定pooled_w=7,pooled_h=7,即pooling后固定成7×7大小的特征图,所以,将在 feature map上映射的20.78×20.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97×2.97

4)假定采样点数为4,即表示,对于每个2.97×2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图一文看懂Faster R-CNN_第11张图片
上图中,四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的

最后,取四个像素值中最大值作为这个小区域(即:2.97×2.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成7×7大小的feature map

总结:知道了RoiPooling和RoiAlign实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些…

3 Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
一文看懂Faster R-CNN_第12张图片
4 训练RPN
RPN通过反向传播(BP,back-propagation)和随机梯度下降(SGD,stochastic gradient descent)进行端到端(end-to-end)训练。依照FastR-CNN中的“image-centric”采样策略训练这个网络。每个mini-batch由包含了许多正负样本的单个图像组成。我们可以优化所有anchor的损失函数,但是这会偏向于负样本,因为它们是主要的。

采样
每一个mini-batch包含从一张图像中随机提取的256个anchor(注意,不是所有的anchor都用来训练),前景样本和背景样本均取128个,达到正负比例为1:1。如果一个图像中的正样本数小于128,则多用一些负样本以满足有256个Proposal可以用于训练。

初始化
新增的2层参数用均值为0,标准差为0.01的高斯分布来进行初始化,其余层(都是共享的卷积层,与VGG共有的层)参数用ImageNet分类预训练模型来初始化。

参数化设置(使用caffe实现)
在PASCAL数据集上:

前60k个mini-batch进行迭代,学习率设为0.001;

后20k个mini-batch进行迭代,学习率设为0.0001;

设置动量momentum=0.9,权重衰减weightdecay=0.0005。
一文看懂Faster R-CNN_第13张图片

5 RPN与Fast R-CNN特征共享
Faster-R-CNN算法由两大模块组成:

1.PRN候选框提取模块;

2.Fast R-CNN检测模块。

我们已经描述了如何为生成区域建议训练网络,而没有考虑基于区域的目标检测CNN如何利用这些建议框。对于检测网络,我们采用Fast R-CNN,现在描述一种算法,学习由RPN和Fast R-CNN之间共享的卷积层。

RPN和Fast R-CNN都是独立训练的,要用不同方式修改它们的卷积层。因此需要开发一种允许两个网络间共享卷积层的技术,而不是分别学习两个网络。注意到这不是仅仅定义一个包含了RPN和Fast R-CNN的单独网络,然后用反向传播联合优化它那么简单。原因是Fast R-CNN训练依赖于固定的目标建议框,而且并不清楚当同时改变建议机制时,学习Fast R-CNN会不会收敛。

RPN在提取得到proposals后,作者选择使用Fast-R-CNN实现最终目标的检测和识别。RPN和Fast-R-CNN共用了13个VGG的卷积层,显然将这两个网络完全孤立训练不是明智的选择,作者采用交替训练(Alternating training)阶段卷积层特征共享:

第一步,我们依上述训练RPN,该网络用ImageNet预训练的模型初始化,并端到端微调用于区域建议任务;

第二步,我们利用第一步的RPN生成的建议框,由Fast R-CNN训练一个单独的检测网络,这个检测网络同样是由ImageNet预训练的模型初始化的,这时候两个网络还没有共享卷积层;

第三步,我们用检测网络初始化RPN训练,但我们固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了;

第四步,保持共享的卷积层固定,微调Fast R-CNN的fc层。这样,两个网络共享相同的卷积层,构成一个统一的网络。

注意:第一次迭代时,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷积层的参数;从第二次迭代开始,训练RPN时,用Fast-R-CNN的共享卷积层参数初始化RPN中的共享卷积层参数,然后只Fine-tune不共享的卷积层和其他层的相应参数。训练Fast-RCNN时,保持其与RPN共享的卷积层参数不变,只Fine-tune不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。相应的网络模型请参考https://github.com/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt

参考文章:
https://zhuanlan.zhihu.com/p/31426458
https://blog.csdn.net/zj15939317693/article/details/80569160
https://blog.csdn.net/qq_17448289/article/details/52871461
https://github.com/rbgirshick/py-faster-rcnn/blob/master/tools/demo.py

你可能感兴趣的:(人工智能,深度学习,目标检测,Faster,R-CNN)