欢迎访问我的个人主页
刚接触物体检测领域,学习了Faster RCNN的论文及Tensorflow版本的源码,不得不说,读源码真的过瘾…不过确实能够帮助理解框架,下面按照Faster RCNN的预测过程介绍其整体流程
整体框架
转载:https://blog.csdn.net/littlehaes/article/details/83344007Faster 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)
接下来分别介绍这四部分对应的网络结构,以预测过程为例(训练过程涉及ground truth的构建,会在之后的博客中具体介绍)
一.获取图片特征
使用预训练好的VGG16提取图片特征,如下图所示,喂入的图片(也就是’data’)并没有经过VGG16所有的流程,而是在得到’conv5_3’这个结果后就停下了,'conv5_3’就是Faster RCNN需要的图片特征(feature map)
注意:'conv5_3’的h,w是输入图片’data’的1/16
二.RPN网络输出proposals
这是Faster RCNN中最复杂的一部分. 将通过VGG16得到的图片特征喂入RPN(Region Proposal Network)网络得到proposals
RPN网络结构如下图所示
(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呢? 这里引用白裳大神的解释:
那么为何要在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作为候选区域。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
(3) 将 ‘rpn_box_pred’ 和 ‘rpn_cls_prob_reshape’ 以及 im_info 喂给proposal_layer 得到 ‘rois’ ,也就是RPN网络最终输出的proposals. 这些proposals都是从foreground anchors里面挑选的, 用到了nms. 接下来还需要对RPN输出的proposals进行第二次回归
三. 通过RoI Pooling层得到综合的proposals特征
(1) 将 ‘rois’ 和 ‘conv5_3’ 喂给roi_pool 得到 ‘pool_5’ , 关于roi_pool的输入,尺寸是任意大小的,但输出的特征都是长度固定的. 具体可参考3分钟理解ROI Pooling层
四.根据poposals特征进行框回归和物体分类
(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图)
参考:
白裳
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count">3</span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G"></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
<li class="tool-item tool-more">
<a>
<svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
</a>
<ul class="more-box">
<li class="item"><a class="article-report">文章举报</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/littlehaes">
<img src="https://profile.csdnimg.cn/E/8/D/3_littlehaes" class="avatar_pic" username="littlehaes">
<img src="https://g.csdnimg.cn/static/user-reg-year/2x/4.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://blog.csdn.net/littlehaes" data-report-click="{"mod":"popu_379"}" target="_blank">littlehaes</a></span>
</div>
<div class="text"><span>发布了445 篇原创文章</span> · <span>获赞 77</span> · <span>访问量 13万+</span></div>
</div>
<div class="right-message">
<a href="https://bbs.csdn.net/forums/p-littlehaes" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板
</a>
<a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a>
</div>
</div>
</div>
欢迎访问我的个人主页
刚接触物体检测领域,学习了Faster RCNN的论文及Tensorflow版本的源码,不得不说,读源码真的过瘾…不过确实能够帮助理解框架,下面按照Faster RCNN的预测过程介绍其整体流程
整体框架
转载:https://blog.csdn.net/littlehaes/article/details/83344007Faster 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)
接下来分别介绍这四部分对应的网络结构,以预测过程为例(训练过程涉及ground truth的构建,会在之后的博客中具体介绍)
一.获取图片特征
使用预训练好的VGG16提取图片特征,如下图所示,喂入的图片(也就是’data’)并没有经过VGG16所有的流程,而是在得到’conv5_3’这个结果后就停下了,'conv5_3’就是Faster RCNN需要的图片特征(feature map)
注意:'conv5_3’的h,w是输入图片’data’的1/16
二.RPN网络输出proposals
这是Faster RCNN中最复杂的一部分. 将通过VGG16得到的图片特征喂入RPN(Region Proposal Network)网络得到proposals
RPN网络结构如下图所示
(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呢? 这里引用白裳大神的解释:
那么为何要在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作为候选区域。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
(3) 将 ‘rpn_box_pred’ 和 ‘rpn_cls_prob_reshape’ 以及 im_info 喂给proposal_layer 得到 ‘rois’ ,也就是RPN网络最终输出的proposals. 这些proposals都是从foreground anchors里面挑选的, 用到了nms. 接下来还需要对RPN输出的proposals进行第二次回归
三. 通过RoI Pooling层得到综合的proposals特征
(1) 将 ‘rois’ 和 ‘conv5_3’ 喂给roi_pool 得到 ‘pool_5’ , 关于roi_pool的输入,尺寸是任意大小的,但输出的特征都是长度固定的. 具体可参考3分钟理解ROI Pooling层
四.根据poposals特征进行框回归和物体分类
(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图)
参考:
白裳
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count">3</span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G"></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
<li class="tool-item tool-more">
<a>
<svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
</a>
<ul class="more-box">
<li class="item"><a class="article-report">文章举报</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/littlehaes">
<img src="https://profile.csdnimg.cn/E/8/D/3_littlehaes" class="avatar_pic" username="littlehaes">
<img src="https://g.csdnimg.cn/static/user-reg-year/2x/4.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://blog.csdn.net/littlehaes" data-report-click="{"mod":"popu_379"}" target="_blank">littlehaes</a></span>
</div>
<div class="text"><span>发布了445 篇原创文章</span> · <span>获赞 77</span> · <span>访问量 13万+</span></div>
</div>
<div class="right-message">
<a href="https://bbs.csdn.net/forums/p-littlehaes" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板
</a>
<a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a>
</div>
</div>
</div>
来源:CSDN
作者:lxdfrank123
链接:https://blog.csdn.net/lxdfrank123/article/details/103567170