当前位置: 首页 > news >正文

Faster R-CNN

文章目录

      • 论文信息
          • 论文标题:
          • 论文作者:
          • 收录期刊/会议及年份:
      • 论文学习
      • 论文阅读
          • 问题/背景:
          • 主要贡献:
          • 摘要:
          • 介绍:
          • Faster R-CNN:
            • RPN 网络:
            • RPN 和 Fast R-CNN 的共享特征:
            • 实现细节:
          • 实验:

论文信息

论文标题:

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

论文作者:

Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun

收录期刊/会议及年份:

NIPS,2015

论文获取地址

论文学习

在 Faster R-CNN 中加入一个生成候选区域的网络,如此,目标检测的四个基本步骤(候选区域生成、特征提取、分类、回归)都被整合到一个深度网络中。

在这里插入图片描述

论文阅读

问题/背景:

使用 SS 算法生成候选区域需要花费大量时间

主要贡献:

引入 RPN 网络代替 SS 算法生成更高质量的候选区域

摘要:

SPPNet、Fast R-CNN 等先进的网络减少了检测模型的运行时间,但也暴露了生成候选区域需要耗费大量时间和计算量的瓶颈。在本文中,引入了候选区域网络(RPN),它与检测网络共享整个图像的卷积特征。RPN 是一个全卷积网络,它能同时预测每个位置的目标边界和分数。RPN 经过端到端的训练来生成高质量的候选区域,再输入进 Fast R-CNN 中用于检测任务。通过共享 RPN 和 Fast R-CNN 的卷积特征,可以进一步将它们合并到一个网络中。

介绍:

在 CPU 上,一张图像需要花费 2s 才能生成候选区域。与高效的检测网络相比,选择性搜索慢了一个数量级。

我们注意到,快速的 CNN 网络利用了 GPU 的加速性能,而候选区域的生成是在 CPU 上完成的,这导致了运行时间上的不公平。一个明显的改进思路是将生成候选区域这一步骤放到 GPU 上实现,但是这样无法让生成候选区域与 CNN 中的特征提取做到共享计算(生成候选区域需要对整个图像做一次操作,特征提取又需要对整个图像做一次操作)。

在本文中,我们使用深度卷积神经网络来实现候选区域的计算,把该网络称之为 Region Proposal Network(RPN),它与最先进的目标检测网络共享卷积层。使用了 RPN 之后,一张图像只需 10ms 就能生成候选区域。

据我们观察,像 Fast R-CNN 这样的基于区域的检测模型中使用到的特征图也可以用来生成候选区域。在这些卷积特征的基础上,我们通过增加几个额外的卷积层来构造 RPN,这些卷积层在一个规则的网格上对每一个位置同时回归区域边界和客观性分数。
因此 RPN 是一种全卷积网络,并且可以针对生成候选区域的任务进行端到端的专门训练。

RPN 被设计用来有效地预测具有大范围比例和长宽比的候选区域。与之前那些使用金字塔图像或金字塔滤波器的方法不同,我们引入了 anchor 框,作为多种比例和长宽比的参考。我们的方法可以避免列举多个尺度的图像或滤波器。

为了将 RPN 和 Fast R-CNN 统一起来,我们提出了一种训练方案,即在保持候选区域不变的情况下,交替着先对候选区域任务做微调,然后对目标检测做微调。该方案能快速收敛,并产生在两个任务之间共享的卷积特征。

在这里插入图片描述

Faster R-CNN:

Faster R-CNN 由两个模块组成,第一个模块是能生成候选区域的深度全卷积网络(RPN),第二个模块是 Fast R-CNN 检测器。

在这里插入图片描述

RPN 网络:

RPN 网络以任意大小的图像为输入,输出一组矩形的目标候选区域,每一个候选区域都有一个客观性分数。
我们做了实验以研究 RPN 与 Fast R-CNN 的共享计算,分别研究了具有 5 个可共享卷积层的 ZF 模型与具有 13 个可共享卷积层的 VGG-16 模型。

为了生成候选区域,我们在最后一个共享卷积层输出的特征图上滑动一个小的网络。我们把特征图上一个 n*n 的空间窗口作为这个小网络的输入,在小网络内部每个滑动窗口映射成一个低维特征(ZF 模型为 256 维,VGG 模型为 512 维)。这个低维特征被传入到两个并行的全连接层,一个用于分类,一个用于边框回归。
在这里插入图片描述

假设得到 H*W 的特征图,且有 C=256 个通道,空间窗口大小为 3*3,那么就需要将 3*3*256 的特征输入到小网络中,让这个小网络根据输入的低维特征去判断原图上对应的位置能不能产生候选区域。判断完之后将滑动窗口向右滑动一小格,再将这个 3*3*256 的特征输入小网络,判断原图对应位置能否产生候选区域。

在这里插入图片描述

上图中所示的 intermediate layer 可以通过 3*3 的卷积层实现,cls layer 可以通过 1*1 的卷积层或全连接层再加上一个 softmax 来实现,reg layer 也可以通过 1*1 的卷积层或全连接层实现。
其中,k 表示 anchor 的数量;分类分支输出 2k 个分数,2 表示包含目标的概率和不包含目标的概率。

Anchors: 滑动窗口每滑动到一个位置,会同时预测多个候选区域,最大能预测 k 个可能的候选区域,它根据 k 个参考框得到,我们将这 k 个参考框称为 anchors。一个 anchor 的中心位于滑动窗口的中心,每个位置我们使用 3 种尺度和 3 种长宽比(每种长宽比具有 3 种尺度),因此有 k=9 个 anchor。

损失函数: 在训练 RPN 网络时,我们给每一个 anchor 分配一个二分类标签(即是否包含目标),在两种情况下,我们会给 anchor 一个正标签(包含目标):(1)与 ground truth 具有最高 IoU 值的 anchor;(2)与任何一个 ground truth 的 IoU 值大于 0.7 的 anchor。
因此,一个 ground truth 可能分配正标签给多个 anchors。通常第二种情况就足以确定正样本,但我们仍然采用第一种情况,因为在某些特殊情况下,第二种情况可能找不到正样本。
我们将与所有 ground truth 的 IoU 值小于 0.3 的 anchor 分配负标签,既不是正样本也不是负样本的 anchor 对训练目标没有贡献。

我们对一张图像的损失函数定义如下:
在这里插入图片描述

i i i 是一个 mini-batch 中一个 anchor 的索引, p i p_i pi 表示第 i i i 个 anchor 是一个目标的预测概率, p i ∗ p_i^* pi 表示 ground truth(anchor 为正样本时等于 1,为负样本时等于 0), t i t_i ti 是一个包含预测边界框 4 个参数化坐标的向量, t i ∗ t_i^* ti 是 ground truth 的 4 个坐标。

训练 RPN: RPN 可以通过反向传播和随机梯度下降进行端到端训练。我们遵循“以图像为中心”的采样策略:每个 mini-batch 都来自一张图像(一张图像包含许多正标签和负标签的 anchors)。
可以将所有 anchors 用于优化损失函数,但这样做会偏向负样本,因为它们数量更多从而占主导地位。
我们的方法是在一张图像中随机采样 256 个 anchors 来计算一个 mini-batch 的损失函数,其中采样的正样本和负样本比例接近 1:1,如果在一个图像中采样的正样本数量少于 128,那就用负样本填补。

RPN 和 Fast R-CNN 的共享特征:

RPN 和 Fast R-CNN 网络各自独立训练,因此会用不同的方式更新它们的卷积层参数。我们需要开发一种技术使得两个网络能够共享卷积层。
我们讨论了三种训练共享特征网络的方法:(1)交替训练。首先训练 RPN 网络,然后用 RPN 网络生成的候选区域来训练 Fast R-CNN,Fast R-CNN 的权重又能用来初始化 RPN 网络。本文中所有实验皆用此方法。(2)近似联合训练。将 RPN 和 Fast R-CNN 合并成一个网络,在每一次 SGD 迭代中,前向传递生成候选区域,当训练 Fast R-CNN 时冻结候选区域任务,反向传播时将 RPN 的损失跟 Fast R-CNN 的损失组合起来。该方法能产生与交替训练法相近的结果,并且训练时间能减少 25-50%,因此后续发布的 Python 代码中使用了该方法。虽然该方法容易实现,但忽略了候选框坐标的偏导数。(3)非近似联合训练。

四步交替训练: 本文采用一种实用的四步训练法,通过交替优化来学习共享特征。第一步,训练 RPN 网络,该网络使用 ImageNet 预训练模型进行初始化,并针对候选区域任务进行端到端的微调;第二步,使用 RPN 网络生成的候选区域来训练一个单独的检测网络,该检测网络也通过 ImageNet 预训练模型进行初始化(这一步,两个网络不共享卷积层);第三步,使用检测网络来初始化 RPN 训练,但是冻结了共享的卷积层,并且只微调 RPN 网络独有的层(这一步,两个网络共享卷积层);第四步,继续冻结共享层,并微调 Fast R-CNN 独有的层。
在这里插入图片描述

实现细节:

使用单尺度的图像来训练和测试 RPN 和 Fast R-CNN 网络。重新缩放图像,使其短边为 600 像素。多尺度特征提取也许能提高精度,但不能很好的权衡速度和精度。

对于 anchors,我们使用三种尺度(分别为 128*128、256*256、512*512),每一种尺度又使用三种长宽比(分别为 1:1、1:2、2:1)。
如前所述,我们的解决方案不需要用一个图像金字塔或滤波器金字塔去预测多个尺度的候选区域,从而节省了大量的运行时间。

在这里插入图片描述

有些 anchors 可能会跨越图像边界,这些 anchors 将被忽略掉。对于一张 1000*600 的图像,可能生成大约 20000 个 anchors,忽略掉跨越边界的 anchors,最后可能有 6000 个能用来训练。如果这些跨越边界的 anchors 也用来训练,它们会给目标函数引入很大的误差,并导致训练无法收敛。在测试的时候会保留这些跨越图像边界的框,会把超出图像的部分裁剪掉。

一些通过 RPN 网络产生的候选框可能会高度重叠,为了降低冗余度,我们基于它们的分类分数采用非极大值抑制来过滤。当 NMS 的 IoU 阈值设置为 0.7 的时候,最后每张图像能留下大约 2000 个候选区域。NMS 不会损害最终的检测精度,而且能大大减少候选框的数量。在 NMS 之后,我们根据分数对候选框进行排序,然后选取前 N 个候选区域用于检测。

实验:

在这里插入图片描述

该实验证明了 :

  1. RPN 网络相比于 SS 算法能更好的提升最终检测精度;
  2. 两个网络共享卷积层对于结果的提升更有帮助;
  3. 在测试阶段,将候选框数量限定在 300 能得到最好结果;
  4. 使用 NMS 对提升精度有帮助;
  5. 不论缺少分类分支还是缺少回归分支,都会使得精度显著下降。

在这里插入图片描述

该实验证明了 RPN 网络能显著提高生成候选区域的速度。

在这里插入图片描述

该实验证明了在同一种长宽比的情况下,多种尺度更有助于提升检测精度;同样地,在同一种尺度的情况下,多种长宽比更有助于提升精度。

在这里插入图片描述

该实验证明了增加数据能显著提升精度。

相关文章:

  • AndroidSDK开发6我用kotlin写了一个简单sdk
  • Linux设置定时任务
  • 研发效能的逻辑:填补软工鸿沟
  • 如何为 Docker 容器设置内存限制
  • mysql的索引分类B+和hash详解
  • Kafka陌陌案例,220903,,
  • Vue 使用原生 js 实现锚点定位到指定位置
  • 64. 最小路径和 java解决
  • 【mia】rtc_Push和player拉取
  • GDScript进行HTTP请求以及session问题
  • Python + Selenium + Chrome Driver 自动化点击+评论+刷弹幕(仅供学习)
  • workmanager导入android studio
  • Fast R-CNN
  • 【Spring系列03】依赖注入(DI)[之set注入]
  • 机器学习笔记之支持向量机(二)引出对偶问题
  • [deviceone开发]-do_Webview的基本示例
  • CentOS7简单部署NFS
  • cookie和session
  • Elasticsearch 参考指南(升级前重新索引)
  • FineReport中如何实现自动滚屏效果
  • hadoop集群管理系统搭建规划说明
  • JS 面试题总结
  • MySQL主从复制读写分离及奇怪的问题
  • vue 配置sass、scss全局变量
  • 从伪并行的 Python 多线程说起
  • 代理模式
  • 入手阿里云新服务器的部署NODE
  • 王永庆:技术创新改变教育未来
  • 学习Vue.js的五个小例子
  • 怎样选择前端框架
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 进程与线程(三)——进程/线程间通信
  • ​低代码平台的核心价值与优势
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $().each和$.each的区别
  • (C#)获取字符编码的类
  • (HAL库版)freeRTOS移植STMF103
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二)fiber的基本认识
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net的C#语言取月份数值对应的MonthName值
  • /proc/stat文件详解(翻译)
  • @Bean, @Component, @Configuration简析
  • [Android] Implementation vs API dependency
  • [AR]Vumark(下一代条形码)
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C++]命名空间等——喵喵要吃C嘎嘎