4. Faster RCNN细节

224 阅读5分钟

Faster RCNN将特征提取、生成候选区域、分类、回归预测整合在了一个网络中,使得综合性能有了较大提升,速度方面更为明显。

1. Faster RCNN四件套

图片.png

图1-1 Faster RCNN的四部分

  1. Conv Layers:提取feature maps。
  2. Region Proposal Network(RPN):生成anchors。(1)softmax得到anchors的类别。(2)bounding box regression修正anchors回归参数。结合(1)、(2)得到更加精确的anchors。
  3. ROI Pooling Layers:收集Conv Layers的feature maps,并根据RPN得到的精确的anchors信息将region prospsal从feature map中提取出来。
  4. Classifier:prospsal feature map计算proposal的类别,并再次bounding box regression修正proposal的位置。

2. Faster RCNN的详细信息

图片.png

图2-1 Faster RCNN网络结构

2.1 Conv Layers

以VGG16模型中的faster_rcnn_test.pt模型结构为例,Conv Layers中包含了13个Conv层+13个Relu层+4个Pooling层。

这里有个非常重要的信息,在conv Layers中,首先缩放至固定大小MxN(一般是800×600),然后将MxN图像送入网络;

  1. 所有的Conv层都是:kernel_size=3,padding=1,stride=1。
  2. 所有的pooling层都是:kernel_size=2,padding=0,stride=2。

根据卷积公式:

out_size=in_size+2×paddingkernel_sizestride+1out\_size=\frac{in\_size+2×padding-kernel\_size}{stride}+1

  • 这样我们得到一个重要的信息,经过conv层,原图大小保持不变,仍然是M×N;经过pooling层,原图变成(M/2)×(N/2)大小。

  • 一个M×N大小的矩阵经过Conv Layers变成了(M/16)×(N/16)大小。

小小知识点:kernel_size,padding,stride常用(3,1,1),(5,2,1)保持feature map不变,常用(2,3,1)缩为一半。

2.2 Region Proposal Networks(RPN)

接着我们的(M/16)×(N/16)大小的feature map一条线直达ROI Pooling层,另一条线来到了RPN的大门。

2.2.1 anchors

首先为大家介绍RPN的主角anchors,了解了一些概念之后接下去看RPN的流程就没那么晦涩了。

我们在Conv Layers最终生成了(M/16)×(N/16)大小的feature map,接着针对feature map的每个点生成9个anchors:所谓anchors实际上是一组矩阵,每行的4个值(x1,y1,x2,y2)(x_1,y_1,x_2,y_2)表示anchors proposal的左上角和右下角坐标,有三种尺度(面积){1282128^22562256^25122512^2}和每种面积下三种比例{1:1,1:2,2:1},这就构成了9个anchors。

图片.png

图2-2 每个位置/每个滑动窗口都会生成9个anchor boxes

如下为9个anchors的(x1,y1,x2,y2):
[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

图片.png

图2-3 k、2k、4k的意义

请看图2-2:

  1. 256-d:因为原文使用的是ZF模型,因此Conv Layers最后一层的卷积核为256,所以生成了256深度的feature map,这里的256-d的意思是feature map的每个点都是256-dimensions。那么VGG16网络的话这里就是512-d。
  2. 2k:假设Conv Layers最终生成的feature map上每个点有k个anchor,每个anchor要分positive(前景)和negative(背景),这就是简单的二分类,而不用具体区分前景中到底是哪一类。那么每个点有k个anchors,每个点便有2k个scores(看作前景背景的概率值好啦)。
  3. 4K:每个anchor还有4个回归变换量[dx(A),dy(A),dw(A),dh(A)][d_x(A),d_y(A),d_w(A),d_h(A)],那么每个点有k个anchors,每个点便有4k个回归变换量。

anchor一共有多少个呢?

原图M=800,N=600→Conv Layers的一张features map尺寸:(800/16)×(600/16)=50×38→Anchors个数:50×38×9=17100个≈2w个

2.2.2 RPN流程

在Conv Layers之后,rpn开始还进行了一次3×3的卷积操作,相当于每个点又融合了周围3x3的空间信息,也许是因为这样更加鲁棒。

接下来,一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积。这两条线的作用如下:

  1. 分类:上面那条线,可以看到1×1的卷积核有18个,记得我们2.2.1讲述的2k,feature map每个点9个anchors,每个anchors2个分类分数,那么W×H×(2×9)岂不是代表着一张特征图上生成的anchors的分类信息,这个3-d矩阵。

  2. 回归:下面那条线,是一张特征图上生成的anchors回归的变换信息。

  3. 这两个1×1的参数矩阵通过损失函数不断迭代训练,得到更准确的分类分数矩阵(W,H,18)和更准确的位置回归矩阵(W,H,36)。

图片.png

图2-4 损失函数

为何要在softmax的前后接一个reshape layer?

保存positive/negative anchors的矩阵,其在caffe blob中的存储形式为[1,2x9,H,W]。而在softmax分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1,2,9xH,W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。

2.2.3 Proposal Layer

Proposal Layer负责综合所有[dx(A),dy(A),dw(A),dh(A)][d_x(A),d_y(A),d_w(A),d_h(A)]变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。

其实Proposal Layer还有一个输入时还有一个量:im_info,这个量保存的是Conv Layers的变换量。

Proposal Layer forward(前传函数)按照下面顺序处理,我大致总结为:

1.生成anchors。

2.对所有的anchors做bbox regression回归。

3.按照一定的比例,提取修正位置的positive anchors。

4.剔除超出图像边界、尺寸太小的anchors。

5.剩下的anchors进行NMS。

6.Proposal Layer生成proposals=[x1,y1,x2,y2]

2.3 ROI Pooling Layers

Rol pooling层有2个输入:

1.原始的feature maps

2.RPN输出的proposal boxes(大小各不相同)

进行7×7的池化操作。

2.4 Classifier

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于哪个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。