无意中看到这个RFCN,瞬间有点蛋疼,因为当时用原始FasterRCNN的时候,替换了最后的全链接层为卷积层,还花了不少时间验证是否有性能损失,结果现在看到,原来有现成的验证过了。。。。

论文地址:https://arxiv.org/abs/1605.06409

虽然其比yolo,ssd出来的晚,不过看模型结构,更多的是针对faster rcnn的一个改进。

一路走来,不同模型都是为了解决不同的痛点而提出的:

  • rcnn证明了cnn提取的特征的有效性;
  • 而spp解决了如何应对不同尺度feature map的问题;
  • fast rcnn通过roi pooling将需要应用到多个候选框上的基CNN模型进行共享,加快了速度并且提升了准确度;
  • 而faster rcnn为了更进一步的共享基CNN,将本来需要由SS算法提取候选框的任务一并放入基CNN中,从而提出了RPN子网络;

那么问题来了,fast rcnn发明的ROI pooling中间是由全连接层(就是ROI pooling后分别在回归和分类之前的那层FC)存在,从而将前面的ROIpooling后的feature map 映射成两个部分(对象分类,坐标回归);而越来越多的基CNN,如googlenet,resnet等全卷积网络证明了不要全链接层,效果不但更好,而且能适应不同尺度的图片无压力。本着解决下一个痛点的原则,rfcn应运而生。

主要的尴尬在于,这种从RCNN发展起来的目标检测思路,都是采用分类+位置回归的思路实现,基于CNN的分类算法,要求平移不变形越大越好,而回归又要求平移不变性越小越好。

R-FCN

rfcn是基于faster rcnn的基础上对roi pooling这部分进行了改进。那么我们为了消灭fast rcnn的roi pooling中的全连接层的最naive的想法自然就是丢弃全连接层(起到了融合特征和特征映射的作用),直接将roi pooling的生成的feature map 连接到最后的分类和回归层即可。不过作者们通过做实验发现,这样的结果导致的对象检测结果很差,并且受到《Deep residual learning for image recognition》的启发,认为这主要是:基CNN本身是对图像分类设计的,具有图像移动不敏感性;而对象检测领域却是图像移动敏感的,所以二者之间产生了矛盾。从而对roi pooling进行了很神奇的设计

图1.1 rfcn结构图

如图1.1所示,网络的第一印象,结构大体和faster rcnn很像,都是有个RPN子网络用来训练并生成一堆基于当前图像的对象候选框,而ROI Pooling 就不一样。

基础conv网络是ResNet101,一个RPN,一个位置敏感预测层,一个改进版ROI Pooling层(含投票决策)

2 - 改进的ROI Pooling

图2.1 rfcn中ROI Pooling结构图

如图2.1所示,假设图像经过了基CNN,到达了最后一层feature maps,接下来就是如fast rcnn中一样,提取当前feature map的ROI区域了,然而rfcn不是直接这么干。这里我们设计一个位置敏感的ROI Pooling:将fast rcnn中的ROI 划分成k∗k大小,即图片中本来获取的ROI区域,将其分成k∗k个区域(这里k=3,即分成9个部分)。假设该数据集一共由C类,那么再加个背景类,一共是C+1类。我们希望对每个类别都有各自的位置感应。

所以我们要设计的位置敏感得分map如图2.1中position-sensitive score maps(即从之前基CNN的feature maps,假设有n个通道,通过一样的卷积连接结构生成当前的相同大小map且有k^2(c+1)通道的位置敏感得分maps)。就是几个大色块并列的部分:每个色块表示对对象的特定位置进行敏感,而且每个色块大小中有C+1个map,所以该区域一共有k^2(C+1)个map,其中每个map的大小和之前那个基CNN的feature map大小一致。

那么接下来就需要介绍具体的怎么从position-sensitive score maps得到图2.1中右边那个k∗k大小,通道为C+1的map了。
这里就不贴论文公式了,我们以图解释

图2.2,从位置敏感得分map到位置敏感ROI pooling

2.1 ROI区域的分类

图2.2是在一个类别下而不是C+1个类别同时进行。假设我们图2.1的位置敏感mapk=3,那么当前一共有:

这么9个不同颜色的feature maps,其中每个feature maps中都有C+1个feature map

     
左上 中上 右上
左中 中间 右中
左下 中下 右下

上述为划分成k∗k,且k=3情况下的位置对应关系

  • 1 - 首先处理类别为1的部分,即如上面表格所示:
  • 2 - 如图2.2中,就是这抽取出来的9个feature map,然后如图2.2所示,对每个feature map按照各自敏感的区域,将其框出来:比如在这9个feature map中第一个特征图表示左上位置,那么提取这个feature map的ROI区域,然后将其分成k∗k的网格,提取其表示的左上位置,即第一个网格;同理第二个表示中上的feature map提取其k∗k的网格中第二个网格,因为当前feature map表示的是中上位置,当前map的第二个网格也表示中上位置
  • 3 - 对抽取出来的部分进行求均值,然后按照位置组成一个k*k(即3*3)大小的矩阵;
  • 4 - 对这个k*k大小的矩阵求和,得到一个值。
  • 5 - 对类别2~C+1分别进行步骤1-4的操作,从而最终得到一个1*(C+1)这样的向量(如图2.1),将这个向量进行softmax,从而估计当前feature map对应的ROI区域是什么类别

2.2 ROI区域的回归

上面说到了从基CNN的feature map得到ROI pooling直到softmax的分类,这里接着说如何微调ROI本身的区域,这部分与分类其实很相似:

  • 1 - 如图2.1的位置敏感maps是有k*k*(c+1)个通道的,我们依然从基CNN的feature map部分连接出一个4*k*k通道的maps(与位置敏感maps并列),用来做候选框坐标微调,如上面表格所示;
  • 2 - 如分类部分的步骤1-4一样的操作,最后得到一个1∗4的向量,即x,y,w,h
  • 3 - 按照之前的那些模型一样去计算目标函数即可

问题

问:为什么需要做如图2.2这种特定map的特定区域的选取,而不是直接在特定map上将整个ROI区域都选取?
答:将k设为1就行了,就是整个ROI选取,作者做过实验的,效果不好。



目标检测(二十二)--R-FCN相关推荐

  1. 深度学习论文阅读目标检测篇(二):Fast R-CNN《Fast R-CNN》

    深度学习论文阅读目标检测篇(二):Fast R-CNN<Fast R-CNN> Abstract 摘要 1. Introduction 引言 1.1 RCNN and SPPnet 1.2 ...

  2. sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 在前面的秘籍一中,我们主要关注了模型加速之轻量化网络,对目标检测模型的实时性难点 ...

  3. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  4. 无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定

    无人驾驶汽车系统入门(二十二)--使用Autoware实践激光雷达与摄像机组合标定 单目相机分辨率高,我们可以使用各种深度学习算法完成对目标检测,但是缺乏深度,坐标等信息.激光雷达能够获得目标相当精确 ...

  5. 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917 作者:毛星 ...

  6. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  7. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  8. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  9. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  10. 网络存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署)

    网络云存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署) 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面向网络的存储体系结构,使数据处理和数据存 ...

最新文章

  1. 2021年春季学期-信号与系统-第九次作业参考答案-第三小题
  2. 模态框在IE下的问题,即position:fixed在IE下不兼容的处理方式
  3. php $globa作用是l,php 关键字global在定义变量中的作用
  4. 余额宝升级,限额限时解除,以后再也不用定闹钟抢破头了!
  5. express html文件接收路由参数,express 获取post 请求参数
  6. Storm入门教程 Storm安装部署步骤
  7. 在windows上搭建一个ftp服务器
  8. 对面象对象概念的理解、解释
  9. 应用SqlParameter防止注入式攻击,打开主窗体关闭登录窗体
  10. LaTeX 阿拉伯语
  11. ps和matlab哪个,Matlab与photoshop在数字图像处理中的比较
  12. AtCoder Regular Contest 120 解题报告
  13. Linux在线词典问题,linux中goldendict发声词典播放报错问题解决方案
  14. iOS第三方验证简单接入Game Center
  15. php fopen 追加,PHP文件写入或追加
  16. 农产品进出口成都代办公司注册流程
  17. oracle之concat()函数
  18. CryptoJS的hmac-sha1算法使用(转base64)——2022.11.18
  19. python毕业设计 基于django框架个人博客系统毕业设计设计与实现
  20. 倒计时工具类:PYContDownManager

热门文章

  1. PLT hook与Inline hook
  2. android pm命令用法
  3. LNMP环境下搭建SVN服务器
  4. 比较linux的桌面环境的使用和异同?_深度UI + Ubuntu系统,堪称最强最美Linux发行版!你敢升级吗?...
  5. java request 原理_JavaWeb response和request对象原理及实例解析
  6. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc
  7. python打印tensor_如何在TensorFlow中打印SparseTensor内容?
  8. python编程语言集合_【python】编程语言入门经典100例--12
  9. springboot做网站_Github点赞接近100k的SpringBoot学习教程+实战推荐!牛批!
  10. bootstrap日期控件 只显示 年月