Faster R-CNN 理解

参考博文: 知乎传送门
1. Conv layers。作为一种CNN网络目标检测方法,Faster R-CNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。(maps 的 s 解释下.)
因为conv结构后的feature map有256或512张(上图是256张), 所以相当于feature map每个点都是256-dimensions。所以是feature maps.. 并且上图可知,对256张feature maps做3x3的filter,卷积核的尺寸其实是 3x3x256 (即output number 也是256.)

2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。(包涵foreground和backrround的判断和bboxregression两步.)


RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal ( bbox regression的输入仅是个:1x1 后的 map)最后的Proposal 层负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。解释下im_info,im_info是proposal 层的输入。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定 M\times N ,im_info=[M, N, scale_factor] 则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为 W\times H=(M/16)\times(N/16) 大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。

对bbx 的 regression,我参考的知乎文章写的很清楚,我这里就直接搬过来:

  • 给定:anchor A=(A_{x}, A_{y}, A_{w}, A_{h})GT=[G_{x}, G_{y}, G_{w}, G_{h}]
  • 寻找一种变换F,使得:F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'}),其中(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})

那么经过何种变换F才能从图10中的anchor A变为G'呢? 比较简单的思路就是:

  • 先做平移

  • 再做缩放

观察上面4个公式发现,需要学习的是 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 这四个变换。当输入的anchor A与GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当anchors A和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了 。。。有待好好理解...)。

接下来的问题就是如何通过线性回归获得 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 了。线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即Y=WX。对于该问题,输入X是一张经过卷积获得的feature map,定义为Φ;同时还有训练传入的GT,即(t_{x}, t_{y}, t_{w}, t_{h})。输出是d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)四个变换。那么目标函数可以表示为:

其中Φ(A)是对应anchor的feature map组成的特征向量,w是需要学习的参数,d(A)是得到的预测值(*表示 x,y,w,h,也就是每一个变换对应一个上述目标函数)。为了让预测值(t_{x}, t_{y}, t_{w}, t_{h})与真实值差距最小,设计损失函数:

函数优化目标为:


需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。

说完原理,对应于Faster RCNN原文,foreground anchor与ground truth之间的平移量 (t_x, t_y) 与尺度因子 (t_w, t_h) 如下:

对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 (t_x, t_y, t_w, t_h),即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。

那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 (t_x, t_y, t_w, t_h),显然即可用来修正Anchor位置了。

RPN网络的总结:生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals

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

RoI pooling层主要是解决上述得到的各个 proposals size 各不相同的问题。它们这样的不同size直接resize是会破坏特征的,如:


RoI pooling 具体操作:

将每个proposal水平和竖直分为pooled_w和pooled_h份(本文是7 和 7),对每一份都进行max pooling处理。这样处理后,即使大小不同 size 的proposal,输出结果都是 7\times7 大小,实现了fixed-length output(固定长度输出)。 caffe layer 参数:

layer {
  name: "roi_pool5"
  type: "ROIPooling"
  bottom: "conv5_3"
  bottom: "rois"
  top: "pool5"
  roi_pooling_param {
    pooled_w: 7
    pooled_h: 7
    spatial_scale: 0.0625 # 1/16
  }
}

4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。(进行目标具体类别识别.并在一次bbox regression,精准目标坐标.)

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


PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

1. 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
2. 再次对proposals进行bounding box regression,获取更高精度的rect box

这里来看看全连接层InnerProduct layers,简单的示意图如图:

其计算公式如下:

其中W和bias B都是预先训练好的,即大小(维度)是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性 RoI 的必要性!!!


更所细节,移步知乎传送门,大神写的真心良心!!!





猜你喜欢

转载自blog.csdn.net/jiachen0212/article/details/80281190