Faster RCNN是在2016提出的用于目标检测的网络结构,并且与之前的网络不同,已经将特征提取(feature extraction),proposal提取,bounding box regression,classification都整合在了一个网络之中。由于RCNN的准确度很大一部分依赖于proposal区域的选择,所以候选区确定尤为重要。Faster RCNN中的RPN是一个最为突出也是最重要的部分。

Faster_RCNN的基本结构

1.Conv layers

Faster RCNN首先使用了基础的Conv layer(conv+relu+pooling)提取输入图像的feature maps。提取出来的feature maps共享用于后续的RPN层以及全连接层。

2.RPN(Region Proposal Networks)

RPN是Faster RCNN中最重要的部分,用于生成region proposals。RPN中引入了一个重要的概念anchor,通过每个位置的anchor(共有k个选框生成),输出2k个score评估选框是否为目标,4k个score确定选框的位置。 正是anchor的引入实现了通过单一尺度图像特征映射并使用单一滤波器解决多尺度问题。softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。

3.Roi Pooling

该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。

4.Classification

利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Faster RCNN结构分析

​ 上图是基于VGG16的Faster RCNN网络结构,输入任意尺寸的image,缩放至固定大小MXN,然后经过Conv layers提取feature maps先送入RPN网络中,通过3X3的卷积生成positive anchors以及对应的bounding box regression偏移量,输出proposals进入Roi poooling层通过proposal feature map进行classification。

1 Conv layers

卷积层一共包括常规的三种层(conv,relu,pooling)

conv层

kernel_size = 3, pad = 1, stride = 1

pooling层

kernel_size = 3, pad = 1, stride = 1

在经过conv层之后,输入输出矩阵尺度不变。

最后变成M/16,N/16的feature map

2 Region Proposal Networks(RPN)

​ 经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

2.1 anchors
 遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。 之后可以通过bbox regression修正检测的位置。

​ 在原文中最后的conv5层输出了256个特征图,即每个点对应256-dimensions。在最后conv5层之后进入RPN层利用3X3的卷积输出,维度也是256-d,在conv5输出的feature map上每个点对应k个anchor(默认k = 9)。每个anchor需要判断是都为positive anchor,每个点有256-d转化为cls = 2k scores,每个anchor又有4个偏移量确定位置(x, y, w, h),reg = 4k scores。在进行训练时会随机选取1:1数量的positive anchor和negative anchor进行训练。

2.2 每个anchor的输出

在mmdetection的源代码rpn_head.py中对anchor的卷积描述为

1
2
3
self.rpn_cls = nn.Conv2d(self.feat_channels,
self.num_anchors * self.cls_out_channels, 1)
self.rpn_reg = nn.Conv2d(self.feat_channels, self.num_anchors * 4, 1)

cls做了1X1的卷积输出为2k,代表该anchor是否为positive。

reg做了1X1的卷积输出为4k,代表该anchor对应region proposal的位置。

RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!

2.3 bbox regression原理

如图所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。

bbox regression的目标是寻找一种关系使输入的anchor A经过映射得到跟真实窗口G更接近的回归窗口G’。(TODO)

对应于Faster RCNN原文,positive anchor与ground truth之间的平移量 [公式] 与尺度因子 [公式] 如下:

[公式]

[公式]

对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 [公式],即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 [公式],显然即可用来修正Anchor位置了。

对proposals进行bounding box regression

经卷积输出后的图像为(W,H,36),相当于feature map每个店都有9个anchors,每个anchors有四个用于回归的变换量。

2.4 Proposal layer

Propsal layer负责综合所有的$[d_x(A), d_y(A),d_w(A),d_h(A)]$变换量和positive anchors,计算出精准的proposal,送入后续的RoIl Pooling Layer。

Proposal Layer有3个输入:positive vs negative anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的 $[d_x(A), d_y(A),d_w(A),d_h(A)]$变换量rpn_bbox_pred,以及im_info;另外还有参数feature_stride=16。
首先解释im_info。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。

  1. 所有 anchors 做bbox regression回归(learning offset)
  2. foreground (iou>0.7) softmax scores由大到小排序anchors,提取 6000/12000(test/train) anchors(已经在上一步进行好了 coord reg)
  3. 限定超出图像边界的 foreground anchors 为图像边界(防止后续roi pooling时proposal超出图像边界)
  4. 剔除非常小的foreground anchors (__C.TRAIN.RPN_MIN_SIZE = 16)
  5. 进行 NMS(threshold=0.7)
  6. 提取 NMS 后的前300/2000(test/train) 个 fg anchor 结果作为proposal输出

    RPN网络结构总结起来就是:
    生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals

3 RoI Pooling

RoI Pooling负责收集proposal并计算出proposal feature maps,送入后面的classification网络。

RoI Pooling层有两个输入:

1.原始的feature maps

2.RPN输出的proposal boxes

与传统网络不同,传入的图像尺寸必须是固定值,就需要进行crop或者wrap,但效果都不好,破坏了图像原始的信息,这正是需要引入RoIl Pooling的理由。

3.1 RoI Pooling原理

TODO