Faster-RCNN(RPN + CNN + ROI)概念
Faster RCNN可以分为4个主要内容:
- Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取 image的feature maps。该feature maps被共享用于后续 RPN层和全连接层。
- Region Proposal Networks:RPN网络用于生成region proposals。通过softmax判断anchors属于positive或者 negative,再利用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
Conv layers包含了conv,pooling,relu三种层。共有13个conv层,13个relu层,4个pooling层。
在Conv layers中:
- 所有的conv层都是:kernel_size=3,pad=1,stride=1
- 所有的pooling层都是:kernel_size=2,pad=1,stride=2
在Faster RCNN Conv layers中对所有的卷积都做了pad处理( pad=1,即填充一圈0),导致原图 变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层 不改变输入和输出矩阵大小。
类似的是,Conv layers中的pooling层kernel_size=2,stride=2。 这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。
综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长 宽都变为输入的1/2。
那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)。 这样Conv layers生成的feature map都可以和原图对应起来。
Faster-RCNN:Region Proposal Networks(RPN)
区域生成网络Region Proposal Networks(RPN)
经典的检测方法生成检测框都非常耗时。直接使用RPN生成检测框,是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
• 可以看到RPN网络实际分为2条线:
- 上面一条通过softmax分类anchors获得positive和negative分类;
- 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
• 而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取 proposals,同时剔除太小和超出边界的proposals。
• 其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors
RPN网络在卷积后,对每个像素点,上采样映射到原始图像一个区域,找到这 个区域的中心位置,然后基于这个中心 位置按规则选取9种anchor box。
9个矩形共有3种面积:128,256,512; 3种形状:长宽比大约为1:1, 1:2, 2:1。 (不是固定比例,可调) 每行的4个值表示矩形左上和右下角点坐标。
遍历Conv layers获得的feature maps,为每一个点都 配备这9种anchors作为初始的检测框。
这些anchor box都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练。其中:
- 把每个标定的ground-truth box与其重叠最大的anchor box记为正样本。(保证每个ground-truth box 至少对应一个正样本anchor)
- 剩余的anchor box与某个ground-truth box重叠大于0.7的记为正样本。(每个ground-truth box可能 会对应多个正样本anchor。但每个正样本anchor只可能对应一个grand-truth box)
- 与任意一个标记ground-truth box重叠小于0.3的anchor box记为负样本。
- 其余的舍弃。 这样做获得检测框很不准确,通过后面的2次bounding box regression可以修正检测框位置。
softmax判定positive与negative
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面 有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已。
可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小。
这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和 negative,所有这些信息都保存在WxHx(9*2)大小的矩阵。
注意这里的18,后面之所以reshape成为18也是因为对应这18个元素的原因
为何这样做?
后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box (一般认为目标在positive anchors中)。
那么为何要在softmax前后都接一个reshape layer?
其实只是为了便于softmax分类。 前面的positive/negative anchors的矩阵,其在caffe中的存储形式为[1, 18, H, W]。而在softmax 分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,即 单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
对proposals进行bounding box regression
可以看到其 num_output=36,即经过该卷积输出图像为WxHx36。 这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量:
Proposal Layer
Proposal Layer负责综合所有变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
Proposal Layer有4个输入:
- positive vs negative anchors分类器结果rpn_cls_prob_reshape,
- 对应的bbox reg的变换量rpn_bbox_pred,
- im_info
- 参数feat_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偏移量。
Proposal Layer 按照以下顺序依次处理:
- 利用变换量对所有的anchors做bbox regression回归
- 按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors, 即提取修正位置后的positive anchors。
- 限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
- 剔除尺寸非常小的positive anchors。
- 对剩余的positive anchors进行NMS(non-maximum suppression)。
- 之后输出proposal。
注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输 入图像尺度的,这点在后续网络中有用。
严格意义上的检测应该到此就结束了,后续部分应该属于识别了。
RPN网络结构就介绍到这里,总结起来就是:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
Faster-RCNN:Roi pooling
RoI Pooling概念
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。
Rol pooling层有2个输入:
- 原始的feature maps
- RPN输出的proposal boxes(大小各不相同)
为何需要RoI Pooling?
对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也 是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。
有2种解决办法:
- 从图像中crop一部分传入网络将图像(破坏了图像的完整结构)
- warp成需要的大小后传入网络(破坏了图像原始形状信息
RoI Pooling原理
新参数pooled_w、pooled_h和spatial_scale(1/16)
RoI Pooling layer forward过程:
- 由于proposal是对应MN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)(N/16)大小 的feature map尺度;
- 再将每个proposal对应的feature map区域水平分为poold_w * pooled_h的网格;
- 对网格的每一份都进行max pooling处理。
这样处理后,即使大小不同的proposal输出结果都是poold_w * pooled_h固定大小,实现了固定长度输出。
Faster-RCNN: Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;
同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
从RoI Pooling获取到poold_w * pooled_h大小的proposal feature maps后,送入后续网络,做了如下2 件事:
- 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
- 再次对proposals进行bounding box regression,获取更高精度的预测框
全连接层InnerProduct layers:
输入X和输出Y是固定大小。所以,这也就印证了之前Roi Pooling的 必要性
代码实现:
因为代码非常多,所以放在资源里面。