欢迎访问我的个人主页
刚接触物体检测领域,学习了Faster RCNN的论文及Tensorflow版本的源码,不得不说,读源码真的过瘾…
不过确实能够帮助理解框架
整体框架
Faster RCNN大体包括4部分,所以要清晰地了解这四个部分是做什么的
- 使用VGG16等成熟的模型提取图片特征(feature map)
- 将图片特征喂入RPN(Region Proposal Network)网络得到proposals
- 将上两步的结果:图片特征和 proposals 喂入RoI Pooling层得到综合的proposals特征
- 根据poposals特征进行框回归和物体分类
接下来分别介绍这四部分对应的网络结构,以训练过程为例(训练和测试过程有简单的差别)
1.获取图片特征
使用预训练好的VGG16提取图片特征,如下图所示,喂入的图片(也就是’data’)并没有经过VGG16所有的流程,而是在得到’conv5_3’这个结果后就停下了,'conv5_3’就是Faster RCNN需要的图片特征(feature map)
要注意:'conv5_3’的h,w都是输入图片’data’的1/16
2.RPN网络输出proposals
将通过VGG16得到的图片特征喂入RPN(Region Proposal Network)网络得到proposals
RPN网络结构如下图所示
- 首先将图片特征’conv5_3’喂给卷积层conv(3,3,512,1,1),输出的图片特征feature map尺寸和通道数均保持不变,输出的结果名为 'rpn_conv/3x3’
根据卷积的运算过程,猜测这一层的作用是:该层每个filter分别将’conv5_3’的所有通道联系起来,也就是说经过卷积后,'rpn_conv/3x3’的每个通道都整合了’conv5_3’所有通道的信息.(这地方说起来比较绕,如果明白卷积的计算过程就容易理解了) -
- 将 ‘rpn_conv/3x3’ 喂给conv(1,1,36,1,1)得到 ‘rpn_box_pred’ ,这个结果就是RPN网络预测出的bounding box,36个通道表示:每个点有9个bbox,每个bbox有4个信息:中心坐标x,y以及宽高.9个anchors有3种尺度和3种长宽比,具体如何生成9个anchors将在源码解读中给出,这里主要是掌握Faster RCNN的整体框架
这里要重点注意一下,'rpn_conv/3x3’的尺寸是h,w,也就是有’rpn_conv/3x3’有h*w个像素(不要考虑通道数,举个例子:平时我们看到的彩色图是3通道的,假设分辨率是1920*1080,这表示有1920*1080个像素点,而不是3*1920*1080个).针对这h*w个像素,Faster RCNN以每个像素为中心为每个像素生成9个anchors,同时每个anchor包含4个信息:anchor的中心坐标x,y以及anchor的宽和高.所以每个像素点需要36个维度去存储9*4个信息,这就是输出通道36的来源! -
- 将 ‘rpn_conv/3x3’ 喂给conv(1,1,18,1,1)得到 ‘rpn_cls_score’ ,刚才说了,要为 ‘rpn_conv/3x3’ 的每个像素生成9个anchors,注意到anchor也是有类别的,要么是foreground anchor(框出物体的),要么是backgroud anchor(框出背景的).所以要为判断achor的类别,也就是个二分类问题.所以每个anchor需要2个维度来存储foreground anchor的score以及backgroud anchor的score,所以 ‘rpn_conv/3x3’ 的每个像素需要18个维度,这就是输出通道18的来源.
- 接着将 ‘rpn_cls_score’ 依次喂入reshape_layer,softmax,reshape_layer,最终得到 ‘rpn_cls_prob_reshape’ .为什么要经过两个reshape_layer呢? 这里引用白裳大神的解释:
- 将 ‘rpn_conv/3x3’ 喂给conv(1,1,36,1,1)得到 ‘rpn_box_pred’ ,这个结果就是RPN网络预测出的bounding box,36个通道表示:每个点有9个bbox,每个bbox有4个信息:中心坐标x,y以及宽高.9个anchors有3种尺度和3种长宽比,具体如何生成9个anchors将在源码解读中给出,这里主要是掌握Faster RCNN的整体框架
那么为何要在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作为候选区域。
-
将 ‘rpn_box_pred’ 和 ‘rpn_cls_prob_reshape’ 以及 im_info 喂给proposal_layer 得到 ‘rpn_rois’ ,也就是说RPN网络最终提出的proposals! 这些proposals都是从foreground anchors里面挑选的, 这一步用到了nms
-
将 ‘rpn_rois’ 和 ‘gt_boxes’ 喂给 proposal_target_layer 得到 ‘roi_data’ .重点在于proposal_layer 和proposal_target_layer 的区别, 测试时没有proposal_target_layer !!!
3. 通过RoI Pooling层得到综合的proposals特征
- 将 ‘roi_data’ 和 ‘conv5_3’ 喂给roi_pool 得到 ‘pool_5’ , 关于roi_pool的输入,尺寸是任意大小的,输出都是固定维度的!!! 具体可参考之前的博文,RoI Pooling, 关于代码的实现呢???
4.根据poposals特征进行框回归和物体分类
- 将 ‘pool_5’ 依次经过全连接层,dropout,全连接层,dropout后得到 'drop_7’
-
- 将 ‘drop_7’ 经过全连接层得到 ‘bbox_pred’ ,也就是最终的proposal的预测值
-
- 将 ‘drop_7’ 经过全连接层得到 'cls_score’
- 将 ‘cls_score’ 经过softmax层得到 ‘cls_prob’ ,也就是proposal属于各个物体的概率
以上便是Faster RCNN的4部分,关于模块的实现细节,可以参看Faster RCNN 代码研读系列论文
训练时迭代了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图)
Faster RCNN训练的整体流程
还没写完,明天接着写…先拿个1024勋章
参考:
白裳