RCNN

这个网络也是目标检测的鼻祖了。其原理非常简单,主要通过提取多个Region Proposal(候选区域)来判断位置,作者认为以往的对每个滑动窗口进行检测算法是一种浪费资源的方式。在RCNN中,不再对所有的滑动窗口跑算法,而是只选择一些窗口,在少数窗口上运行CNN。

流程是:

  1. 输入图像
  2. 利用selective search对图像生成1K~2K的候选区域(region proposal),这个量比传统的算法要少得多。具体一点,选出region proposal的方法是运行图像分割算法,对于分割算法跑出来的块,把它作为可能的region proposal输出。
  3. 提取特征:将region proposal resize为统一大小,送进去掉了softmax的CNN,对每个候region proposal提取特征
  4. 对区域进行分类:对从CNN output出来的特征向量送进每一类的SVM分类, 如果我有十个类别,那么每个region proposal要跑10个SVM,得到类别。这里为什么要用SVM而不是softmax,有一种说法是为了解决样本不均衡的问题,另外是早期神经网络还不如现在这样发达,当时SVM还是比较领先的分类器。
  5. 修正:对CNN output的特征向量(这个特征向量和第4步中拿去喂给SVM的是一个向量)做回归(左上角右下角的四个坐标),修正region proposal的位置。

Fast R-CNN

前面聊的这个RCNN吧,有几点问题:

  1. 可以明显地感受到它的计算量是非常大的,毕竟要对每个候选区域都进行特征计算。
  2. 冗余计算太多了,毕竟候选区域高度重叠。
  3. 同时又不是端到端的训练,还麻烦。
  4. 内存占用:需要储存多个SVM分类器和bounding box 回归器
  5. 对输入图片的大小有硬性要求

这种情况下,二代目fast R-CNN出现了,它的流程是:

  1. 将任意size的图片输入CNN,得到特征图。在RCNN中,先生成region proposals再做卷积,相当于做了多次卷积,浪费时间。
  2. 对原始图片使用selective search算法得到约2k region proposals(相当于RCNN的第一步)
  3. 在特征图中找到每一个region proposals对应的特征框。在ROI池化层中将每个特征框池化到统一大小
  4. 统一大小的特征框经过全连接层得到固定大小的特征向量,分别进行softmax分类(使用softmax代替了RCNN里面的多个SVM分类器)和bbox回归

Fast R-CNN组合了classification和regression, 做成single Network,实现了端到端的训练,实际上它相对RCNN最大的改进是抛弃了多个SVM分类器和bounding box回归器的做法,一起输出bbox和label, 很大程度上提升了原始RCNN的速度。

这里出现了一个新的概念,ROI Polling,很重要,是考点,解释一下:

ROI Pooling(Region of Interest)

它的输入是特征图,输出则是大小固定的channel x H x W的vector。ROI Pooling是将一个个大小不同的region proposals,映射成大小固定的(W x H)的矩形框。它的作用是根据region proposals的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和输出回归框操作。它可以加速处理速度。这个ROI Pooling在下面的Faster RCNN也会出现,它的作用是类似的,就是将region proposals池化成同样大小的vector,便于传入后续分类网络。

ROI Pooling有两个输入,一个是图片进入CNN后的特征图,另一个是区域的边框。ROI 的输出是一个region_nums x channels x W x H的向量。

说到这里耶解释一下ROI Pooling的进阶版本ROI Align。

ROI Pooling在池化的时候需要对浮点数边界int化,这样会存在一定的偏差。在特征图比原始图片尺寸小的情况下,一点点的精度损失映射到原始图片上就存在很大的像素点差别。而ROI Align就是取消了取整的操作,使用双线性内插的方法获得坐标未浮点数的像素点上的图像数值。

Faster RCNN

在Fast RCNN的基础上,Faster RCNN在性能上又有了进步。Faster RCNN将特征抽取(feature extraction),proposal提取,bounding box regression,classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。对比起它哥哥Fast-RCNN, 其实最重要的一点就是使用RPN(下面会详细解说)来代替原来使用分割算法生成候选框的方式,极大的提升了检测框生成速度。总地来说,Faster RCNN对Fast RCNN的改进点在于获得region proposals的速度要快很多。

具体来说,它的网络结构长这样:

  1. 提取特征:输入固定大小的图片,进过卷积层提取特征图feature maps
  2. 生成region proposals: 然后经过Region Proposal Networks(RPN)生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box 回归修正anchors获得精确的proposals(候选区域)。
  3. ROI Pooling: 该层的输入是feature maps和proposals,综合这些信息后提取proposal feature maps
  4. Classification: 将Roi pooling生成的proposal feature maps分别传入softmax分类和bounding box regression获得检测物体类别和检测框最终的精确位置。

具体一点的图长这样:

Region Proposal Network(RPN)

Faster-RCNN的巨大优势主要在于第二步Region Proposal Networks(RPN)的设计。传统的Selective Search方法生成检测框都很耗时。而使用RPN生成就会快很多,我们来看看RPN的原理叭

RPN的作用是用来提取候选框的,类似于前面介绍的RCNN的第一步Selective Search它的网络结构基于神经网络,但是输出的是包含二元softmax和bbox回归的多任务模型。RPN网络的输入是前面CNN output的feature maps。我们在feature map上做一个大小为3x3的滑窗操作, 得到一个channel是256维的特征图,尺寸与input的特征图相同,维度是256*H*W。对这个256维的向量,我们分别做两次1x1卷积操作,一个得到2k score, 一个得到4k coordinates。这个2k score只区分是不是目标,输出候选区域属于前景(物体)和背景的分数,这里注意,这里的分类只区分是否包含目标,至于所包含目标的类别,是Faster-RCNN最后的分类网络干的事情。4k coordinates指的是对原图坐标的偏移。

那么这个k又是什么东西呀?这里有一个anchor的概念,也是RPN的核心之一。论文预先设定好生成9个anchors。我们前面说到对于feature map, 我们有一个3*3的滑窗操作。对于每次滑窗所划到的3x3的区域,就以该区域中心点为坐标,生成9个anchor。anchor它的本质是,将相同尺寸的输入,得到不同尺寸的输出。它们的中心相同,但是有不同的长宽比和尺度。这9个anchor, 中心坐标一样,但是大小各不相同,如下图:

而上文提到的k就是anchors的数量,所以2k个分数就是9个anchors的共18个分数,36个坐标。对于每个anchor, 计算anchor与ground-truth bounding boxes的IoU,大于0.7则判定为有目标,小于0.3则判定为背景,介于0.3-0.7,则设为0,不参与训练

这么说完可能还是有点模糊,我们来看看RPN的代价函数:

代价函数有两部分,对应着RPN的两条路线,即是否包含目标和bbox的坐标与anchor坐标的回归误差。注意回归误差这一项中,L与p相称,也就是说,如果anchor不包含目标,那么box输出位置是不算误差的,对于

,只计算
判定为有目标的anchor。总的来说
,就是交叉熵,分类的损失;
,计算每个anchor分配的四个坐标和ground truth的坐标的偏移量,用的是L1范数。看一下pytorch的官方实现你就懂了:
  self.rpn_loss_cls = F.cross_entropy(rpn_cls_score, rpn_label)self.rpn_loss_box = _smooth_l1_loss(rpn_bbox_pred, rpn_bbox_targets, rpn_bboxinside_weights,rpn_bbox_outside_weights, sigma=3, dim=[1,2,3])

插嘴一句,我们现在在做目标检测基本是用YOLO了,贼快,Faster RCNN虽然已经Faster了还是YOLO快!当然region proposals的概念很值得了解,YOLO的缺点是在检测小目标时难以得到精确的定位。

Faster R_CNN改进方法

Faster R-CNN从2015年被提出,后来也出现了不少改进方法,下面列举一些方向,有兴趣可以再去深入研究:

  • 提取特征网络的改进:使用ResNet代替原来的VGG提取特征,效果显著
  • RPN升级版本:FPN
  • ROI升级:PS_RPI
  • R-FCN
  • Mask R-CNN
  • DeepText
  • 训练过程中的hard-example finetune,可参见:视觉分类任务中处理不平衡问题的loss比较 - Daniel2333的博客 - CSDN博客
  • A-Fast-RCNN, 这篇文章引入了GAN, 在某些数据集上精度增加

参考文献

晓雷:RCNN- 将CNN引入目标检测的开山之作

最帅的大厨:RCNN-> SPP net -> Fast RCNN -> Faster RCNN

Fast R-CNN论文详解 - WoPawn的博客 - CSDN博客

CNN目标检测(一):Faster RCNN详解

RPN 解析 - lanran2的博客 - CSDN博客

目标检测 - Faster R-CNN 中 RPN 原理

RPN 解析 - lanran2的博客 - CSDN博客

目标检测 - Faster R-CNN 中 RPN 原理

Faster-RCNN算法精读 - hunterlew的专栏 - CSDN博客

详解 ROI Align 的基本原理和实现细节

Faster R-CNN 深入理解 && 改进方法汇总

cnn 回归 坐标 特征图_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法相关推荐

  1. cnn 回归 坐标 特征图_论文笔记 | CNN 是怎么学到图片绝对位置信息的

    来自 | 知乎作者丨Xinlong Wang来源丨https://zhuanlan.zhihu.com/p/99766566编辑 | 深度学习这件小事仅作学术交流,如有侵权,请联系删文 昨天读到一篇挺 ...

  2. faster rcnn resnet_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法

    RCNN 这个网络也是目标检测的鼻祖了.其原理非常简单,主要通过提取多个Region Proposal(候选区域)来判断位置,作者认为以往的对每个滑动窗口进行检测算法是一种浪费资源的方式.在RCNN中 ...

  3. CNN训练可视化特征图(tensorflow2.x实现)

    CNN训练可视化(tensorflow2.x实现) 原理介绍 实例化VGG16 加载图片并进行预处理 预测图片 获取指定层对应的输出 可视化CNN训练过程 原理介绍 卷积层由多个卷积核组成,可以将每个 ...

  4. 基于DAMO-YOLO的RepGFPN多尺度特征融合的YOLOv5、YOLOv7、Faster RCNN、FCOS、CenterNet等目标检测器改进

    DAMO-YOLO的RepGFPN多尺度特征融合颈部网络与目标检测器的融合策略 1.DAMO-YOLO 点击此处直达论文地址 DAMO-YOLO是一个兼顾速度与精度的目标检测框架,其效果超越了目前的一 ...

  5. 理解CNN中的特征图 feature map

    feature map的含义 在每个卷积层,数据都是以三维形式存在的.你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map.在输入层,如果是灰度图片,那就只有一个featur ...

  6. OpenImage冠军方案:在物体检测中为分类和回归任务使用各自独立的特征图

    点击上方"深度学习技术前沿",关注公众号,选择加"星标"或"置顶" 导读 这篇文章来自商汤科技,是OpenImage竞赛的冠军方案,本文对物 ...

  7. cnn输入层_多尺度CNN特征图的分析与应用

    本文适用于那些参与CNN架构设计的工程师和研究人员,他们厌倦了盲目尝试和错误,可以从CNN主干中选择哪些特征图以改善其模型的性能,而宁愿从早期开始设计过程的步骤,以使特征图的空间比例轮廓与训练数据集中 ...

  8. PixelShuffle特征图的上采样的方法

    PixelShuffle是一种上采样方法,可以对缩小后的特征图进行有效的放大.可以替代插值或解卷积的方法实现upscale PixelShuffle PixelShuffle(像素重组)的主要功能是将 ...

  9. 【总结】Keras+VGG16特征图可视化,帮助你深入理解VGG16

    Keras+VGG16特征图可视化 一.VGG16结构理解 1. 可视化结构图 2. VGGNet各级别网络结构图 3. VGG16网络结构图 二.Keras实现VGG16 代码实现 三.VGG16特 ...

最新文章

  1. 【js】callback时代的变更
  2. Tungsten Fabric SDN — 与 OpenStack 的集成部署
  3. gets scanf以及缓冲区域的问题
  4. 智能合约重构社会契约(11)天德区块链智能合约系统
  5. 分布式——ACID原则 CAP理论
  6. 程序员为什么爱穿格子衫和卫衣?
  7. Adobe Experience Design是什么软件?xd mac版下载安装教程 XD 2021发布
  8. Javascript学习笔记一 之 数据类型
  9. Working with Latex under Emacs
  10. Atitit 搜索的艺术 目录 1. 索引基础 2 1.1. 单词-文档矩阵 2 1.2. 倒排索引基本概念 3 2. 建立索引 4 2.1. 两遍文档遍历法(2-Pass In-Memory In
  11. 电视android怎么连接手机助手下载,投屏助手app下载 投屏助手(手机投屏到电视) for Android v2.0 安卓版 下载-脚本之家...
  12. 图书信息管理系统的设计与实现
  13. spring mvc 404 报错记录
  14. 摩拜与ofo, 你们这是为了共享单车还是共享经济?
  15. 锁定计算机不让u盘导出,怎样防止别人用U盘拷贝我的文件 禁止u盘拷贝文件设置方法图文详细教程...
  16. 去哪儿网被央视曝光,其实智慧旅行可以做到更多
  17. Intriguing Properties of Vision Transformers论文解析
  18. 《地球概论》(第3版)笔记 第三章 地球的运动
  19. 网页制作怎么入服务器,网站后台是怎么做的 如何进入网站后台
  20. 计算机网络概述——计算机网络

热门文章

  1. linux与linux传文件乱码,关于Linux与windows传递文件乱码问题
  2. 局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究!
  3. 2020统计局的行政划分表_湖州市有几个区和县?湖州市2020年县级以上区划名单...
  4. Java实验8 T6.绘制一个二叉树
  5. AcWing 1055. 股票买卖 II
  6. ORB-SLMA3的学习笔记
  7. PyTorch 靠谱的模型可视化教程
  8. linux interfaces配置文件详解
  9. Git Pull Failed:Could not read from remote repository
  10. php文件下载IE文件名乱码问题