FasterRCNN之整体框架详解

刚接触物体检测领域,学习了Faster RCNN的论文及Tensorflow版本的源码,不得不说,读源码真的过瘾..不过确实能够帮助理解框架,下面按照Faster RCNN的预测过程介绍其整体流程

整体框架

Faster RCNN整体框架包括4部分:
一. 使用VGG16或者其他成熟的图片分类模型提取图片特征(feature map)
二. 将图片特征喂入RPN(Region Proposal Network)网络得到proposals (包含第一次回归)
三. 将上两步的结果:图片特征proposals 喂入RoI Pooling层得到综合的proposals特征
四. 根据poposals特征预测物体的bounding box物体的类别 (包含第二次回归)

对应下图: 图中conv(3,3,512,1,1)对应conv(filter_height,filter_width,output_channels,stride_height,stride_width)
Faster RCNN预测.jpg

接下来分别介绍这四部分对应的网络结构,以预测过程为例(训练过程涉及ground truth的构建,会在之后的博客中具体介绍)

一.获取图片特征

vgg.png
使用预训练好的VGG16提取图片特征,如下图所示,喂入的图片(也就是’data’)并没有经过VGG16所有的流程,而是在得到’conv5_3’这个结果后就停下了,’conv5_3’就是Faster RCNN需要的图片特征(feature map)
注意:’conv5_3’的h,w是输入图片’data’的1/16
1.png

二.RPN网络输出proposals

这是Faster RCNN中最复杂的一部分. 将通过VGG16得到的图片特征喂入RPN(Region Proposal Network)网络得到proposals
RPN网络结构如下图所示
rpn.png
(1) 首先将图片特征’conv5_3’喂给卷积层conv(3,3,512,1,1),输出的图片特征 ‘rpn_conv/3x3’ 尺寸和通道数均保持不变.
根据卷积的运算公式,猜测这一层的作用为:该层 每个filter 分别将’conv5_3’的所有通道联系起来,也就是说经过卷积后, ‘rpn_conv/3x3’的每个通道 都整合了’conv5_3’所有通道的信息.(这地方说起来比较绕,如果明白卷积的计算过程就容易理解了)
(2.1) 将 ‘rpn_conv/3x3’ 喂给conv(1,1,36,1,1)得到 ‘rpn_box_pred’ ,36个通道表示:每个点有9组proposals的回归值,每组proposals的回归值对应论文中的tx,ty,tw,th.(这里是第一次回归)
这里要重点注意一下,’rpn_conv/3x3’的尺寸是h,w,也就是’rpn_conv/3x3’有h*w个像素(不要考虑通道数,举个例子:平时我们看到的彩色图是3通道的,假设分辨率是1920*1080,这表示有1920*1080个像素点,而不是3*1920*1080个).针对这h*w个像素,以每个像素为中心为每个像素生成9组proposals的回归值,每组回归值包含4个信息.所以每个像素点需要36个维度去存储9*4个信息,这就是输出通道36的来源!
(2.2.1) 将 ‘rpn_conv/3x3’ 喂给conv(1,1,18,1,1)得到 ‘rpn_cls_score’ ,刚才说了,要为 ‘rpn_conv/3x3’ 的每个像素生成9个proposals,而每个proposal是有类别的,要么是foreground proposal(框出物体),要么是backgroud proposal(框出背景).所以每个proposal需要2个维度来存储类别得分,因此 ‘rpn_conv/3x3’ 的每个像素需要9*2=18个维度,这就是输出通道18的来源.
(2.2.2)接着将 ‘rpn_cls_score’ 依次喂入reshape_layer,softmax,reshape_layer,最终得到 ‘rpn_cls_prob_reshape’ ,这一过程将每个类别得分转换为概率.
为什么要经过两个reshape_layer呢? 这里引用白裳大神的解释:

1
2
3
4
5
6
7
8
9
10
11
那么为何要在softmax前后都接一个reshape layer?其实只是为了便于softmax分类,至于具体原因这就要从caffe的实现形式说起了。
在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel,height,width]
对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 2x9, H, W]。
而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,
即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
贴一段caffe softmax_loss_layer.cpp的reshape函数的解释,非常精辟:
"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be N*H*W, "
"with integer values in {0, 1, ..., C-1}.";
综上所述,RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。

(3) 将 ‘rpn_box_pred’‘rpn_cls_prob_reshape’ 以及 im_info 喂给proposal_layer 得到 ‘rois’ ,也就是RPN网络最终输出的proposals. 这些proposals都是从foreground anchors里面挑选的, 用到了nms. 接下来还需要对RPN输出的proposals进行第二次回归

三. 通过RoI Pooling层得到综合的proposals特征

roi.png
(1) 将 ‘rois’‘conv5_3’ 喂给roi_pool 得到 ‘pool_5’ , 关于roi_pool的输入,尺寸是任意大小的,但输出的特征都是长度固定的. 具体可参考3分钟理解ROI Pooling层

四.根据poposals特征进行框回归和物体分类

final.png
(1) 将 ‘pool_5’ 连续经过两个全连接层得到 ‘fc_7’
(2.1)将 ‘fc_7’ 经过全连接层得到 ‘bbox_pred’ ,这里是二次回归,表示tx,ty,tw,th.用来和 ‘rois’ 相加,从而得到Faster RCNN最终的proposals!
(2.2.1) 将 ‘fc’ 经过全连接层得到 ‘cls_score’
(2.2.2) 将 ‘cls_score’ 经过softmax层得到 ‘cls_prob’ ,也就是proposal属于各个物体的概率

以上便是Faster RCNN的4部分,关于模块的实现细节,我过几天再写

训练时迭代了50000次,pascal2007测试结果MAP=0.65,其中,chair的ap最低0.46,horse的ap最高0.81
运行环境:CUDA8,cuDNN7,1070Ti,TensorFlow1.4.0,python2.7
训练集:voc_2007_trainval 训练时间148分钟
测试集:voc_2007_testt 测试时间10分钟(5000图)

参考:
白裳

0%