Faster R-CNN:端到端的目标检测网络

本文回顾了由微软研究人员开发的 Faster R-CNN 模型。Faster R-CNN 是一种用于物体检测的深度卷积网络,在用户看来,它是一个单一的、端到端的统一网络。该网络可以准确快速地预测不同物体的位置。为了真正理解 Faster R-CNN,我们还必须快速概述一下它所进化的网络,即 R-CNN 和 Fast R-CNN。

本文首先快速回顾了基于区域的 CNN (R-CNN),这是首次尝试构建使用预训练 CNN 提取特征的物体检测模型。接下来,快速回顾了 Fast R-CNN,它比 R-CNN 更快,但不幸的是它忽略了区域提案的生成方式。Faster R-CNN 后来解决了这个问题,它构建了一个区域提案网络,可以生成区域提案,并将其输入到检测模型 (Fast R-CNN) 以检查物体。

NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

1、对象检测流程概述

传统的对象检测技术遵循下图给出的 3 个主要步骤。第一步涉及生成多个区域提案。这些区域提案是可能包含对象的候选区域。这些区域的数量通常为几千个,例如 2,000 个或更多。一些生成区域提案的算法的示例是选择性搜索和 EdgeBox。

从每个区域提案中,使用各种图像描述符(例如方向梯度直方图 (HOG))提取固定长度的特征向量。该特征向量对于对象检测器的成功至关重要。即使对象由于某些变换(例如缩放或平移)而发生变化,该向量也应该充分描述对象。

然后使用特征向量将每个区域提案分配给背景类或对象类之一。随着类别数量的增加,构建可以区分所有这些对象的模型的复杂性也会增加。用于对区域提案进行分类的流行模型之一是支持向量机 (SVM)。

这个快速概述足以理解基于区域的卷积神经网络 (R-CNN) 的基础知识。

2、R-CNN 快速概览

2014 年,加州大学伯克利分校的一组研究人员开发了一种名为 R-CNN(基于区域的卷积神经网络的缩写)的深度卷积网络,它可以检测图像中的 80 种不同类型的物体。

与上图所示的物体检测技术的通用流程相比,R-CNN 的主要贡献只是基于卷积神经网络 (CNN) 提取特征。除此之外,一切都与通用物体检测流程相似。下图显示了 R-CNN 模型的工作原理。

R-CNN 由 3 个主要模块组成:

  • 第一个模块使用选择性搜索算法生成 2,000 个区域提案。
  • 在调整为固定的预定义大小后,第二个模块从每个区域提案中提取长度为 4,096 的特征向量。
  • 第三个模块使用预训练的 SVM 算法将区域提案分类为背景或对象类之一。

R-CNN 模型有一些缺点:

  • 它是一个多阶段模型,其中每个阶段都是一个独立的组件。因此,它无法进行端到端训练。
  • 它将从预训练的 CNN 中提取的特征缓存在磁盘上,以便稍后训练 SVM。这需要数百 GB 的存储空间。
  • R-CNN 依赖于选择性搜索算法来生成区域提案,这需要大量时间。此外,该算法无法针对检测问题进行定制。
  • 每个区域提案都独立地输入到 CNN 进行特征提取。这使得无法实时运行 R-CNN。

作为 R-CNN 模型的扩展,提出了 Fast R-CNN 模型以克服一些局限性。下一节将简要概述 Fast R-CNN。

3、Fast R-CNN 快速概览

Fast R-CNN是一种由 Facebook AI 研究员、前微软研究员 Ross Girshick 独自开发的物体检测器。Fast R-CNN 克服了 R-CNN 中的几个问题。顾名思义,Fast R-CNN 相对于 R-CNN 的一个优势是速度。

以下是Fast R-CNN中主要贡献的摘要:

  • 提出了一个名为 ROI Pooling 的新层,可从同一图像中的所有提案(即 ROI)中提取等长特征向量。
  • 与具有多个阶段(区域提案生成、特征提取和使用 SVM 进行分类)的 R-CNN 相比,Faster R-CNN 构建的网络只有一个阶段。
  • Faster R-CNN 在所有提案(即 ROI)之间共享计算(即卷积层计算),而不是独立进行每个提案的计算。这是通过使用新的 ROI Pooling 层来实现的,这使得 Fast R-CNN 比 R-CNN 更快。
  • Fast R-CNN 不会缓存提取的特征,因此与需要数百 GB 的 R-CNN 相比,它不需要那么多磁盘存储。
  • Fast R-CNN 比 R-CNN 更准确。

Fast R-CNN 的一般架构如下所示。与 R-CNN 中的 3 个阶段相比,该模型由一个阶段组成。它只接受图像作为输入并返回检测到的对象的类概率和边界框。

最后一个卷积层的特征图被馈送到 ROI Pooling 层。原因是从每个区域提案中提取固定长度的特征向量。下面的 GIF 显示了 ROI Pooling 层的工作原理。

简而言之,ROI Pooling 层的工作原理是将每个区域提案拆分成一个单元格网格。最大池化操作应用于网格中的每个单元格以返回单个值。所有单元格的所有值都代表特征向量。如果网格大小为 2×2,则特征向量长度为​​ 4。

有关 ROI Pooling 层的更多信息,请查看这篇文章

然后,使用 ROI Pooling 提取的特征向量被传递到一些 FC 层。最后一个 FC 层的输出分为 2 个分支:

  • Softmax 层用于预测类别得分
  • FC 层用于预测检测到的对象的边界框

在 R-CNN 中,每个区域提案都独立于其他区域提案输入到模型中。这意味着如果处理单个区域需要 S 秒,则 N 个区域需要 S*N 秒。Fast R-CNN 比 R-CNN 更快,因为它在多个提案之间共享计算。

R-CNN 从每幅图像中采样单个 ROI,而 Fast R-CNN 则从同一幅图像中采样多个 ROI。例如,R-CNN 从 128 张不同的图像中选择一批 128 个区域。因此,总处理时间为 128*S 秒。

对于 Faster R-CNN,可以从仅 2 张图像(每幅图像 64 个区域)中选择一批 128 个区域。当从同一幅图像中采样区域时,它们的卷积层计算是共享的,这减少了时间。因此,处理时间降至 2*S。但是,从同一幅图像中采样多个区域会降低性能,因为所有区域都是相关的。

尽管 Fast R-CNN 模型具有优势,但它有一个关键的缺点,因为它依赖于耗时的选择性搜索算法来生成区域提议。选择性搜索方法无法针对特定的对象检测任务进行定制。因此,它可能不足以准确检测数据集中的所有目标对象。

在下一节中,我们将介绍 Faster R-CNN。Faster R-CNN 构建了一个用于生成区域提议的网络。

4、Faster R-CNN

Faster R-CNN 是 Fast R-CNN 的扩展。顾名思义,Faster R-CNN 比 Fast R-CNN 更快,这要归功于区域提议网络 (RPN)。

本文的主要贡献是:

  • 提出区域提议网络 (RPN),这是一个完全卷积网络,可生成具有各种尺度和长宽比的提议。RPN 实现了注意神经网络的术语,以告诉对象检测 (Fast R-CNN) 在哪里查看。
  • 本文没有使用图像金字塔(即图像的多个实例但尺度不同)或过滤器金字塔(即具有不同大小的多个过滤器),而是引入了锚框的概念。锚框是具有特定尺度和长宽比的参考框。有了多个参考锚框,单个区域就会存在多个尺度和长宽比。这可以被认为是参考锚框的金字塔。然后将每个区域映射到每个参考锚框,从而检测不同尺度和长宽比的对象。
  • 卷积计算由 RPN 和 Fast R-CNN 共享。这减少了计算时间。

下图显示了 Faster R-CNN 的架构。它由 2 个模块组成:

  • RPN:用于生成区域提议。
  • Fast R-CNN:用于检测提议区域中的对象

RPN 模块负责生成区域提议。它应用了神经网络中的注意力概念,因此它指导 Fast R-CNN 检测模块在图像中寻找对象的位置。

请注意,卷积层(例如计算)是如何在 RPN 和 Fast R-CNN 模块之间共享的。

Faster R-CNN 的工作原理如下:

  • RPN 生成区域提案。
  • 对于图像中的所有区域提案,使用 ROI Pooling 层从每个区域中提取固定长度的特征向量。
  • 然后使用 Fast R-CNN 对提取的特征向量进行分类。
  • 除了返回边界框外,还返回检测到的对象的类别分数。

5、区域提议网络 (RPN)

R-CNN 和 Fast R-CNN 模型依赖于选择性搜索算法来生成区域提议。每个提议都被输入到预先训练的 CNN 中进行分类。本文提出了一种称为区域提议网络 (RPN) 的网络,它可以生成区域提议。这有一些优点:

  • 现在使用可以根据检测任务进行训练和定制的网络来生成区域提议。
  • 由于提议是使用网络生成的,因此可以对其进行端到端训练以针对检测任务进行定制。因此,与选择性搜索和 EdgeBoxes 等通用方法相比,它可以生成更好的区域提议。
  • RPN 使用与 Fast R-CNN 检测网络中使用的相同卷积层来处理图像。因此,与选择性搜索等算法相比,RPN 不需要额外的时间来生成提议。
    由于共享相同的卷积层,RPN 和 Fast R-CNN 可以合并/统一为单个网络。因此,训练只需进行一次。

RPN 处理与 Fast R-CNN 共享的最后一个卷积层返回的输出特征图。如下图所示。基于大小为 nxn 的矩形窗口,滑动窗口穿过特征图。对​​于每个窗口,都会生成多个候选区域提案。这些提案不是最终提案,因为它们将根据其"对象性得分"(如下所述)进行筛选。

6、锚点

根据下图,最后一个共享卷积层的特征图通过大小为 nxn 的矩形滑动窗口,其中对于 VGG-16 网络,n=3。对于每个窗口,生成 K 个区域提案。每个提案都根据称为锚点框的参考框进行参数化。锚点框的 2 个参数是:

  • 缩放比例
  • 长宽比

通常,有 3 个比例和 3 个长宽比,因此总共有 K=9 个锚点框。但 K 可能不同于 9。换句话说,每个区域提案都会生成 K 个区域,其中 K 个区域中的每一个在比例或长宽比上都有所不同。下图显示了一些锚点变化。

使用参考锚点(即锚框),使用单一尺度的单一图像,同时能够提供尺度不变的物体检测器,因为锚点存在于不同的尺度上。这避免了使用多个图像或过滤器。多尺度锚点是跨 RPN 和 Fast R-CNN 检测网络共享特征的关键。

对于每个 nxn 区域提议,提取一个特征向量(ZF 网络的长度为 256,VGG-16 网络的长度为 512)。然后,将该向量馈送到 2 个兄弟全连接层:

  • 第一个 FC 层名为 cls,表示一个二元分类器,为每个区域提议生成对象性分数(即该区域是否包含对象,或是否是背景的一部分)。
  • 第二个 FC 层名为 reg,它返回一个定义区域边界框的 4-D 向量。

第一个 FC 层(即二元分类器)有 2 个输出。第一个用于将该区域分类为背景,第二个用于将该区域分类为对象。下一节将讨论如何将对象性分数分配给每个锚点以及如何使用它来生成分类标签。

7、对象性得分

cls 层为每个区域提案输出一个包含 2 个元素的向量。如果第一个元素为 1,第二个元素为 0,则区域提案被归类为背景。如果第二个元素为 1,第一个元素为 0,则该区域表示对象。

为了训练 RPN,每个锚点都会根据交并比 (IoU) 获得正或负的对象性得分。

IoU 是锚点框与真实框的交集面积与 2 个框的并集面积之比。 IoU 的范围从 0.0 到 1.0。当没有交集时,IoU 为 0.0。随着 2 个框彼此靠近,IoU 会增加,直到达到 1.0(当 2 个框 100% 相同时)。

接下来的 4 个条件使用 IoU 来确定为锚点分配正或负的客观性得分:

  • 与任何真实框的 IoU 重叠度高于 0.7 的锚点将被赋予正的客观性标签。
  • 如果没有 IoU 重叠度高于 0.7 的锚点,则为与真实框具有最高 IoU 重叠度的锚点分配正标签。
  • 当所有真实框的 IoU 重叠度小于 0.3 时,将负的客观性得分分配给非正的锚点
  • 负的客观性得分意味着锚点被归类为背景。

既不是正的也不是负的锚点对训练目标没有贡献。

我第一次阅读这篇论文时,对第二和第三个条件感到困惑。所以,让我们进一步澄清一下。

假设有 3 个区域提案与 3 个锚点相关联,它们与 3 个真实框的 IoU 分数如下所示。因为有一个锚点的 IoU 分数为 0.9,高于 0.7,所以它与该真实框的 IoU 分数为正,与所有其他框的 IoU 分数为负。

0.9, 0.55, 0.1

这是对锚点进行分类的结果:

positive, negative, negative

第二个条件意味着当没有锚点的 IoU 重叠分数高于 0.7 时,则搜索具有最高 IoU 的锚点并为其分配正的客体性分数。预计最大 IoU 分数小于或等于 0.7,但令人困惑的是,论文中没有提到 IoU 分数的最小值。

预计最小值应为 0.5。因此,如果锚点框的 IoU 分数大于 0.5 但小于或等于 0.7,则为其分配正的客体性分数。

假设锚点的 IoU 分数如下所示。因为最高的 IoU 分数是第二个,其值为 0.55,所以它符合第二个条件。因此,它被分配了一个正的 objectness 分数。

0.2, 0.55, 0.1

以下是对锚点进行分类的结果:

negative, positive, negative

第三个条件规定,当一个锚点与所有真实框的 IoU 分数小于 0.3 时,则为该锚点分配一个负的 objectness 分数。对于接下来的 IoU 分数,由于所有 IoU 分数都小于 0.3,因此在 3 种情况下为该锚点分配一个负分数。

0.2, 0.25, 0.1

以下是对锚点进行分类的结果:

negative, negative, negative

根据第四个条件,当一个锚点的 IoU 分数大于或等于 0.3 但小于或等于 0.5 时,它既不被分类为正也不被分类为负。此锚点不用于训练分类器。

对于以下 IoU 分数,锚点未分配任何标签,因为所有分数都在 0.3 和 0.5 之间(含)。

0.4, 0.43, 0.45

下一个等式总结了这 4 个条件。

请注意,第一个条件(0.7 < IoU)通常足以将一个锚点标记为正(即包含一个对象),但作者更喜欢提及第二个条件(0.5 < IoU <= 0.7),因为在极少数情况下不存在 IoU 为 0.7 的区域。

8、RPN 和 Fast R-CNN 之间的特征共享

Fast R-CNN 架构中的 2 个模块,即 RPN 和 Fast R-CNN,是独立的网络。它们每个都可以单独训练。相比之下,对于 Faster R-CNN,可以构建一个统一的网络,其中 RPN 和 Fast R-CNN 可以同时训练。

核心思想是 RPN 和 Fast R-CNN 共享相同的卷积层。这些层仅存在一次,但在 2 个网络中使用。可以称之为层共享或特征共享。请记住,锚点使得 Faster R-CNN 中的 2 个模块之间可以共享特征/层。

9、训练 Faster R-CNN

Faster R-CNN 论文提到了在共享卷积层的同时训练 RPN 和 Fast R-CNN 的 3 种不同方法:

  • 交替训练
  • 近似联合训练
  • 非近似联合训练

9.1 交替训练

第一种方法称为交替训练,其中首先训练 RPN 以生成区域提案。共享卷积层的权重基于 ImageNet 上的预训练模型进行初始化。RPN 的其他权重随机初始化。

在 RPN 生成区域提案的框后,RPN 和共享卷积层的权重都会进行调整。

RPN 生成的提案用于训练 Fast R-CNN 模块。在这种情况下,共享卷积层的权重使用 RPN 调整后的权重进行初始化。其他 Fast R-CNN 权重随机初始化。在训练 Fast R-CNN 时,Fast R-CNN 和共享层的权重都会进行调整。共享层中调整后的权重再次用于训练 RPN,并重复该过程。

根据论文,交替训练是训练这两个模块的首选方式,并应用于所有实验。

9.2 近似联合训练

第二种方法称为近似联合训练,其中 RPN 和 Fast R-CNN 都被视为单个网络,而不是两个单独的模块。在这种情况下,区域提案由 RPN 生成。

不更新 RPN 或共享层的权重,提案直接输入 Fast R-CNN,后者检测对象的位置。只有在 Fast R-CNN 产生输出后,Faster R-CNN 中的权重才会调整。

由于在生成区域提案后不更新 RPN 和共享层的权重,因此会忽略相对于区域提案的权重梯度。与第一种方法相比,这会降低该方法的准确性(即使结果接近)。另一方面,训练时间减少了约 25-50%。

9.3 非近似联合训练

在近似联合训练方法中,使用 RoI Warping 层来计算相对于建议边界框的权重梯度。

9.4 缺点

Faster R-CNN 的一个缺点是,RPN 的训练方式是,所有 256 个小批量的锚点都是从一张图像中提取的。由于一张图像中的所有样本可能相关(即它们的特征相似),因此网络可能需要很长时间才能达到收敛。

10、Mask R-CNN

作为 Faster R-CNN 的扩展,Mask R-CNN 模型包含另一个分支,该分支为每个检测到的对象返回一个掩码。

11、结束语

本文回顾了一种用于对象检测的深度卷积神经网络 Faster R-CNN,它可以准确地检测和分类图像中的对象。

本文首先回顾了任何对象检测模型的通用步骤。然后,它快速回顾了 R-CNN 和 Fast R-CNN 模型的工作原理,以便了解 Faster R-CNN 正在克服哪些挑战。

Faster R-CNN 是一个端到端训练的单阶段模型。它使用一种新颖的区域提议网络 (RPN) 来生成区域提议,与传统算法(如选择性搜索)相比,这节省了时间。它使用 ROI 池化层从每个区域提议中提取固定长度的特征向量。

我们看到的 Faster R-CNN 的一个缺点是,对于 RPN,小批量中的所有锚点都是从单个图像中提取的。由于来自单个图像的所有样本可能存在相关性(即它们的特征相似),因此网络可能需要很长时间才能达到收敛。

话虽如此,Faster R-CNN 是一种最先进的物体检测模型。此后,Mask R-CNN 已基于 Faster R-CNN 构建,以返回每个检测到的物体的物体掩码。


原文链接:Faster R-CNN快速指南 - BimAnt

相关推荐
阿伟*rui1 分钟前
java八股第一天
开发语言
盼海7 分钟前
Python 循环:解锁编程中的重复艺术
java·开发语言·python
狐凄7 分钟前
Python练习12
开发语言·python·pygame
无尽的大道9 分钟前
Java反射机制详解:动态访问和操作对象
java·开发语言
小白要加油哈40 分钟前
游戏开发--C#面试题
开发语言·笔记·学习·microsoft·unity·c#·游戏引擎
gsgbgxp1 小时前
C++类中的const成员变量和const成员函数
开发语言·c++·算法
皮克斯的进化之路1 小时前
RabbitMQ的死信队列
java·开发语言
好喜欢吃红柚子1 小时前
【卷积基础】CNN中一些常见卷积(1*1卷积、膨胀卷积、组卷积、深度可分离卷积)
人工智能·python·深度学习·计算机视觉·cnn
唐僧洗头爱飘柔95272 小时前
(Go语言)初上手Go?本篇文章帮拿捏Go的数据类型!
开发语言·golang·go语言·go数据类型·go开发·go初上手
唐僧洗头爱飘柔95272 小时前
(Go基础)变量与常量?字面量与变量的较量!
开发语言·后端·golang·go·go语言初上手