keras框架:目标检测Faster-RCNN思想及代码
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的 必要性
代码实现:
因为代码非常多,所以放在资源里面。
keras框架:目标检测Faster-RCNN思想及代码相关推荐
- 目标检测——Faster R-CNN论文阅读
论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...
- 目标检测Faster RCNN 批量标记数据集,生成xml,csv以及record文件
目标检测Faster RCNN 批量标记数据集,生成xml,csv以及record文件 0.将png图片转换为jpg import os from PIL import Image# dirname_ ...
- [目标检测] Faster R-CNN 深入理解 改进方法汇总
Faster R-CNN 从2015年底至今已经有接近两年了,但依旧还是Object Detection领域的主流框架之一,虽然推出了后续 R-FCN,Mask R-CNN 等改进框架,但基本结构变化 ...
- 目标检测 Faster R-CNN运行及实时性DEMO测试
faster-rcnn:Fast Region-based Convolutional Neural Networks基于区域的卷积神经网络 http://blog.csdn.net/column/d ...
- 深度学习和目标检测系列教程 7-300:先进的目标检测Faster R-CNN架构
@Author:Runsen Faster R-CNN 由于Fast R-CNN 过程中仍然存在一个瓶颈,即ROI Projection.众所周知,检测对象的第一步是在对象周围生成一组潜在的边界框.在 ...
- 重温目标检测--Faster R-CNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks NIPS2015 https://gith ...
- 目标检测--Faster R-CNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks NIPS 2015 Matlab code ...
- yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...
GitHub: liuyuemaicha/PyTorch-YOLOv3github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...
- 目标检测——从RCNN到Faster RCNN 串烧
目标检测--从RCNN到Faster RCNN 串烧 https://blog.csdn.net/xyy19920105/article/details/50817725 本人小硕一枚,方向是深度学习 ...
- 目标检测到目标跟踪 -- Faster R-CNN 观测器
https://blog.paperspace.com/ 目标跟踪在在某些程度上可以说是目标检测的一个维度拓展.目标检测类似于贝叶斯 Filtering 和 Smoothing 中的观测器,整个目标跟 ...
最新文章
- 毕业仅1年,干Python赚了50W 网友:不是吹的
- SAP ABAP实用技巧介绍系列之使用代码获得某个structure上的扩展字段
- 安装mysql-connector-python-8.0.11-py3.6遇到问题
- PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
- Jeewx捷微 , 免费微信公众账号管家系统发布,采用JAVA语言
- Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260...
- pandas 使用把dataframe变为series
- 21天Jenkins打卡Day14-maven服务
- python3 性能提升_5个提升Python性能的项目
- Axure第11享:Axure汉化方法?
- Ajax---菜鸟教程
- (TeamTalk服务端源码分析一)TeamTalk服务端部署
- 分配甲、乙、丙、丁四人去完成五项任务,每人完成各项任务的时间如下表所示
- 计算机创新创业计划2000字,创新创业论文2000字
- 浅谈高速公路服务区分布式光伏并网发电
- 全国计算机考试比省级的难吗,国考和省考考题的区别,难度差异很大吗?
- 截屏 远程协助 android,ARDC Android 远程桌面助手 录屏 演示 MD
- macOS_Monterey_12.6.1_21G217可引导可虚拟机安装的纯净版苹果OS系统ISO镜像安装包免费下载
- docker常见面试题
- Android 系统截屏实现