Faster RCNN详解
Faster RCNN 是在Fast RCNN的基础上,进一步改进,解决select search 算法选择候选框速度太慢的问题。
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
submit time: 2016
arxiv link
fast R-CNN和faster R-CNN之间的区别在于我们不使用特殊区域提议方法来创建region proposal。而是训练一个region proposal network(RPN),该网络将features map 作为输入并输出region proposals。然后将这些proposal输入Fast R-CNN中的RoI池化层。以下是fast RCNN与Faster RCNN的网络结构对比图。

由于frcnn的网络结构主要是两个网络组成,损失函数分为四个部分。
- RPN分类损失:anchor是否为gt
- RPN位置回归损失:anchor位置微调
- ROI分类损失:ROI所属类别
- ROI位置回归损失:继续对ROI位置微调
四个损失相加就是最后的损失,反向传播,更新参数。
Faster RCNN 关键步骤:
- Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
- Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
Faster RCNN 网络是用于目标检测的一种比较流行的框架。它主要由以下四个部分组成:
- 分别是conv layer 输入为原始图片,用于提取图片的feature map;
- RPN网络,输入为features map,用于生成region proposal,该层为features map 上每个像素生成若干个anchors(9个),随后通过softmax 判断每个anchor是属于foreground(目标)或者background(背景),再利用bounding box regression修正anchors获得精确的proposal位置;
- RoI pooling,该层输入为proposal位置信息和features map,通过proposal的位置信息在features map 上提取region features map候选区,然后通过pooling产生一个固定长度的特征,送入全连接层进行目标判别;
- classification,利用proposal feature maps计算proposal的类别,同时再次进行一次bounding box regression,对proposal位置进行精修,随后将结果输出。
总结一套介绍网络框架的先后顺序的方法。
可以先大后小,按照先后顺序从前到后,按功能性介绍一件事情,每件事情的功能介绍的时候,说清楚输入,工作流程附带其具体功能,输出。
Faster RCNN 详细网络结构如图:

将一副任意大小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。
conv layer

Conv layers部分共有13个conv层,13个relu层,4个pooling层。
- 所有的conv层都是: kernel_size=3 , pad=1 ,stride=1,因此conv层不改变原图大小
- 所有的pooling层都是: kernel_size=2 ,pad=0 , stride=2,pooling 层将原图缩小为原来的一半
- 经过Conv layer后,一个MxN大小的矩阵将变为(M/16)x(N/16)
Region Proposal Networks(RPN)
Faster RCNN 层在fast RCNN 的基础上,对提取候选框进行优化。
RPN网络分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors
anchor为由一个中心点,周围生成了9个矩形,矩形长宽比由三个尺寸1:1,1:2;2:1
三种,如下图,基本覆盖了各种尺寸和形状,引入检测中常用到的多尺度方法。

Faster RCNN遍历Conv layers计算获得的feature maps,为feature map上每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,之后将会在RPN层,以及最后进行2次的bounding box regression修正检测框位置。
如上图,对于每一个点的k个anchor来说,从conv layer提取出得特征具有256维,对于每一个anchor,需要分foreground与background,因此共有2k个score,对于每一个anchor共有 四个坐标值。因此共有4k个coordinates。在训练阶段,程序将会从这些anchor中挑选出一些合适的anchor进行训练。
因此RPN最终就是在原图尺度上,对每一个像素设置9个尺度的候选anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!
那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:
其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。

softmax判定foreground与background
RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。
features map 首先做一个1*1的卷积,这个卷积的作用是生成一个 大小的矩阵。该矩阵用于存储上面提到的foreground与background信息(2*k score)。将该特征后接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。前后两个reshape 操作目的为便于程序实现。
clc layer输出预测区域共k个,每个有的2个参数,即预测为前景的概率和背景的概率,损失用softmax loss(cross entropy loss)。监督信息是Y=0,1,表示这个区域是否为groundtruth。确定groundtruth时,我们需要确定k个区域中的各个区域是不是有效的,是前景还是背景。
K个区域分配标签规则:
- 与某个ground truth(GT)的IoU最大的区域的分配正标签
- 与任意GT的IoU大于0.7的区域分配正标签
- 与所有GT的IoU都小于0.3的区域分配负标签
bounding box regression原理
对于窗口一般使用四维向量 (x, y, w, h) 表示,分别表示窗口的中心点坐标和宽高。对于图 11,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:
那么经过何种变换F才能从图10中的anchor A变为G’呢? 比较简单的思路就是先做平移,然后进行缩放,边框回归与RCNN中边框回归相同。bounding box 原理参考链接
RPN中所涉及的边框回归首先经过一个1*1的卷积层,输出一个 的矩阵,用于存储box的坐标信息(4k coordinate)

RPN值得注意的地方:
- - RPN在原图的尺度上选择anchor的大小
- - anchor的数目是feature map上每个像素选择9个长宽比不同的矩形
- - soft Max层用于判断anchor是否为前景(含有目标)
- - bounding box regression 预测的输出是anchor的偏移变换
- - proposal层,结合前景的anchor(背景anchor被忽略)与anchor偏移变换,对anchor位置进行调整,计算出proposal的精确位置。
- - bounding box 本质上是学习一个W权重矩阵,即那个1*1的网络的参数(输出为4K regreason,对应anchor的(x,y,w,h)四个偏移),利用W参数乘以 CNN pool5层输出的features map,通过最小二乘,得到anchor的偏移。
- - 为什么bounding box regression不直接预测坐标呢? 因为坐标间的关系不是简单的一维关系,难以优化。当anchor 与 ground truth比较接近时,他们之间的位置关系(偏移)就可以用一维关系来近似。
- - proposal层输出的proposal坐标是在原图的尺度上的proposal坐标。
proposal layer
RPN 最后一层为proposal layer,用于前景anchors,以及anchor对应的边框回归微调参数 和
(传入Faster RCNN前首先reshape到固定MxN,im_info则保存了此次缩放的所有信息)来计算产生的proposal位置,此时输出的proposal坐标为原图尺度上的proposal坐标。
Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:
- - 生成anchors:利用
对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
- - 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
- - 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
- - 剔除非常小(width<threshold or height<threshold)的foreground anchors
- - 进行nonmaximum suppression
- - 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal = [x1, y1, x2, y2]输出。
- 输出的proposal=[x1, y1, x2, y2],由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的。
- RPN网络结构主要步骤如下:
- 生成anchors -> softmax分类器提取前景 anchors -> bbox reg回归前景 anchors -> Proposal Layer生成proposals
RoI pooling layer
RoI Pooling layer负责收集proposal,并计算出proposal feature maps,送入后续网络。Rol pooling层有2个输入:
- - 原始的feature maps
- - RPN输出的proposal boxes(大小各不相同)
RoI Pooling layer forward过程:
- - 由于proposal是对应
尺度的,所以首先使用spatial_scale参数将其映射回
大小的feature map尺度;
- - 再将每个proposal对应的feature map区域水平分为 pooled_w×pooled_hpooled_w×pooled_h的网格;
- - 对网格的每一份都进行max pooling处理。
经过上述处理后,即使大小不同的proposal输出结果都是 pooled_w×pooled_hpooled_w×pooled_h 固定大小,实现了固定长度输出。
Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

从PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:
- - 通过全连接和softmax对proposals进行分类
- - 再次对proposals进行bounding box regression,获取更高精度的rect box
Faster R-CNN训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
- 在已经训练好的model上,训练RPN网络
- 利用步骤1中训练好的RPN网络
- 第一次训练Fast RCNN网络
- 第二训练RPN网络
- 再次利用步骤4中训练好的RPN网络
- 第二次训练Fast RCNN网络
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:”A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。

RPN训练
与检测网络类似的是,依然使用Conv Layers提取feature maps。整个网络使用的Loss如下:
上述公式中 i 表示anchors index, 表示foreground softmax probability,
代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是foreground,
;反之IoU<0.3时,认为是该anchor是background,
;至于那些0.3<IoU<0.7的anchor则不参与训练);t代表predict bounding box,
代表对应foreground anchor对应的GT box。可以看到,整个Loss分为2部分:
- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为forground与background的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 ,相当于只关心foreground anchors的回归(其实在回归中也完全没必要去关心background)。
Smooth L1 loss 相比于L2 loss对离群点更加不敏感,更加鲁棒。当预测值与目标相差很大时,L2 loss的梯度是x-t,容易产生梯度爆炸,而L1的梯度为常数,使用L1 loss 可以防止梯度爆炸。
关于softMax loss 和 边框回归loss与fast RCNN 相同。链接
参考资料:
https://perper.site/%2F2019%2F02%2F14%2FFaster-RCNN%E8%AF%A6%E8%A7%A3%2F