读书笔记《Deep Learning for Computer Vision with Python》- 第三卷 第13章 Faster R-CNNs

        第三卷 第十三章 Faster R-CNNs

        深度学习已经以一种有意义的方式影响了依赖机器学习的计算机视觉的几乎所有方面。 图像分类、图像搜索引擎(也称为基于内容的图像检索 (CBIR)、定位和映射 (SLAM)、图像分割等等,自神经网络和深度学习的最新复兴以来,都发生了变化。 对象检测也不例外。

        最流行的基于深度学习的对象检测算法之一是R-CNN算法系列。R-CNN 算法经历了多次迭代,优于传统的对象检测算法(例如,Haar级联、HOG+线性SVM)。

        在本章中,我们将讨论 Faster R-CNN 算法及其组件,包括锚点、基础网络、区域提议网络 (RPN) 和感兴趣区域 (ROI) 池化。 对Faster R-CNN构建块的讨论将帮助您了解核心算法、其工作原理以及端到端深度学习对象检测是如何实现的。

        在下一章中,我们将回顾 TensorFlow 对象检测 API,包括如何安装它、它是如何工作的,以及如何使用该 API 在自定义数据集上训练您自己的 Faster R-CNN 对象检测器。

        关于Faster R-CNN 的这两章,以及关于 Single ShotDetectors (SSD) 的以下两章,将从自动驾驶汽车的角度重点关注对象检测,展示如何训练对象检测器来定位图像和视频流中的路牌和车辆。

        1、对象检测和深度学习

左图:检测图像中的停车标志的示例。 预测的边界框以红色绘制,而真实边界框以绿色绘制。 我们的目标是计算这些边界框之间的联合交集。 右图:计算联合的交集就像将边界框之间的重叠区域除以联合的面积一样简单。

         在评估对象检测器性能时,我们使用称为联合相交 (IoU) 的评估指标。 但是,用于生成预测边界框的实际算法并不重要。

        2、(Faster)R-CNN 架构

        2.1 R-CNN 简史

        原始R-CNN

原始 R-CNN 架构包括(1)接受输入图像,(2)通过选择性搜索算法提取 2000 个建议,(3)使用预训练的 CNN(例如 作为在 ImageNet 上训练的人),以及(4)使用特定于类的线性 SVM 对每个 ROI 的特征进行分类。

         可以看到来自传统对象检测器(例如HOG + 线性SVM框架)的相似之处。

        1、我们没有应用详尽的图像金字塔和滑动窗口,而是换用了更智能的选择性搜索算法

        2、我们现在不是从每个 ROI 中提取 HOG 特征,而是提取 CNN 特征

        3、我们仍在为输入 ROI 的最终分类训练 SVM,只是我们在 CNN 特征而不是 HOG 特征上训练这个 SVM。

        原始 R-CNN 方法的问题在于它仍然非常慢。此外,实际上并不是在学习通过深度神经网络进行定位。

        Fast R-CNN

在 Fast R-CNN 架构中,我们仍然使用 Selective Search 来获得我们的提议,但现在我们通过从特征图中提取固定大小的窗口并使用这些特征来获得最终的类标签和边界框来应用 ROI Pooling。

         这里的主要好处是网络现在可以有效地进行端到端的训练:

        1.我们输入一个图像和相关的真实边界框

        2.提取特征图

        3. 应用ROI pooling,得到ROI特征向量

        4. 最后使用两组全连接层获得(1)类标签预测和(2)每个建议的边界框位置。

        虽然网络现在是端到端可训练的,但由于依赖于选择性搜索(或等效)区域提议算法,在推理(即预测)时的性能受到了极大的影响。为了使 R-CNN 架构更快,我们需要将区域提议直接合并到 R-CNN 中。

        Faster R-CNN

R-CNN 系列的最新版本 Faster R-CNN 引入了一个 RegionProposal Network (RPN),它直接在架构中区域提议,从而减少了对选择性搜索算法的需求。

         第一个组件 RPN 用于确定潜在对象可能位于图像中的哪个位置。在这一点上,我们不知道物体是什么,只是知道图像中的某个位置可能有一个物体。

        建议的边界框 ROI 基于网络的感兴趣区域 (ROI) 池化模块以及从上一步提取的特征。 ROI Pooling 用于提取固定大小的特征窗口,然后将这些窗口传递到两个完全连接的层(一个用于类标签,一个用于边界框坐标)以获得我们的最终定位。

        2.2 基础网络

        最初的Faster R-CNN论文使用VGG和ZF作为基础网络。今天,我们通常会换入更深、更准确的基础网络,例如ResNet,或者更小、更紧凑的网络,用于包含资源的设备,例如MobileNet。

基础网络用于从输入图像中提取特征。我们通过移除网络末端的全连接层并使用CONV和POOL层的输出来确保我们的网络是全卷积的。这个过程允许我们的网络处理任意空间维度的输入图像。然后将特征输入RPN和ROI池化模块。

        2.3 Anchors

        在传统的对象检测中,使用(1)滑动窗口+图像金字塔的组合或(2)类似选择性搜索的算法来为我们的分类器生成建议。但我们的目标是开发一个端到端的对象使用包含提案模块的深度学习检测器,我们需要定义一种方法来生成我们的建议ROI。

创建锚点从每 r 个像素(在原始 Faster R-CNN 实现中 r = 16)对图像的坐标进行采样的过程开始。 右:我们总共创建了以每个采样的 (x;y) 坐标为中心的九个锚点。

         首先需要在输入图像上均匀采样点(图左)。 在这里,我们可以看到一个 600 400 像素的输入图像——我们用蓝色圆圈标记了一个定期采样的整数(以 16 个像素为间隔)的每个点。

        下一步是在每个采样点处创建一组锚点。 正如在最初的 Faster R-CNN 出版物中一样,我们将在给定的采样点周围生成九个具有不同大小和纵横比的锚点(它们是固定的边界框)。

        如果我们在600*800张图像上使用16像素的步长(Faster R-CNN 的默认值),我们将总共获得 1,989 个位置。

        在 1,989 个位置的每个位置周围有 9 个锚点,我们现在总共有 1989*9=17901 个边界框位置供我们的 CNN 评估。

        2.4 (Region Proposal Network)RPN

区域提议模块的目标是接受一组锚点并快速确定图像中某个区域的“对象性”。也就是说,这涉及将 ROI标记为前景或背景。 背景锚区域被丢弃,而前景对象被传播到 ROI 池化模块。

         RPN 模块简单但功能强大,由两个输出组成。 RPN 模块的顶部接受卷积特征图输入。 然后应用3*3CONV,学习512个过滤器。这些滤波器并行馈入两条路径。 RPN 的第一个输出(左)是一个分数,表示 RPN 认为 ROI 是前景(值得进一步检查)还是背景(丢弃)。RPN 实际上并没有标记 ROI——它只是试图确定 ROI 是背景还是前景。

        2.5 感兴趣区域 (ROI) 池化

Region of Interest ROI Pooling 模块的目标是取所有 N 个proposal locations,然后从卷积特征图中提取相应的 ROI 特征。 然后,ROI Pooling 模块将 ROI 的提取特征的尺寸调整为 7*7*D(其中 D 是特征图的深度)。 此固定大小为下一个模块中的两个即将到来的 FC 层准备功能。

         从 ROI 池化模块获得的最终特征向量现在可以输入到基于区域的卷积神经网络,我们将使用它来获得每个对象的最终边界框坐标以及相应的类标签。

        2.6 基于区域的卷积神经网络

        最后一个组件是基于区域的卷积神经网络,或者我们所知的 R-CNN。 该模块有两个目的:

        1. 根据 ROI Pooling 模块的裁剪特征图,获得每个边界框位置的最终类标签预测

        2. 进一步细化边界框预测 (x;y) 坐标以获得更好的预测精度在实践中,R-CNN 组件是通过两个全连接层实现的,如图所示。 在最左边,我们有 R-CNN 的输入,它们是从 ROI Pooling 模块获得的特征向量。 这些特征通过两个完全连接的层(每个 4096-d),然后传递到最后两个 FC 层,这将产生我们的类标签(或背景类)以及边界框增量值。

Faster R-CNN 架构中的最后一个模块获取 ROIPooling 组件的输出,并将其通过两个 FC 层(每个 4096-d),类似于在 ImageNet 上训练的分类网络的最后一层。 这些 FC 层的输出馈入网络中的最后两个 FC 层。 一个 FC 层是 N+1-d,每个类标签的节点加上背景的附加标签。 第二个 FC 层是 4 N,表示最终预测的边界框的增量。

        在训练完整Faster R-CNN时,我们需要做出选择。第一种选择是训练RPN模块,获得令人满意的结果,然后继续训练R-CNN模块。第二种选择是组合四个损失函数(两个用于RPN模块,两个用于R-CNN模块)通过加权总和,然后联合训练所有四个。

        一般情况下,通过最小化四个损失函数的加权和来端到端地联合训练整个网络不仅需要更少的时间,而且还可以获得更高的准确率。

        在下一章中,我们将学习如何使用 TensorFlow 对象检测 API 来训练我们自己的 Faster R-CNN 网络。 如果您对 Faster R-CNN 管道、RPN 和 ROI 池化模块的更多细节感兴趣,以及关于我们如何共同最小化四个损失函数的附加说明,请参考原始Faster R-CNN 出版物作为以及 TryoLabs 文章。

        3、小结

        在本章中,我们首先回顾了Girshick等人的Faster R-CNN 架构及其早期变体。R-CNN 架构经过了几次迭代和改进,使用最新的 Faster R-CNN 架构,我们能够训练端到端的深度学习对象检测器。

        架构本身包括四个主要组件。

        第一个组件是用作特征提取器的基础网络(即 ResNet、VGGNet 等)。

        第二个组件是区域提议网络 (RPN),它接受一组锚点,并输出关于它认为对象在图像中的位置的提议。 需要注意的是,RPN 不知道图像中的对象是什么,只知道给定位置存在潜在对象。

        第三个组件Region of Interest Pooling 用于从每个提议区域中提取特征图。

        最后,基于区域的卷积神经网络用于 (1) 获得提案的最终类标签预测,以及 (2) 进一步细化提案位置以获得更好的准确性。

        鉴于R-CNN架构中的大量移动部件,手工实现整个架构是不可取的。相反,建议使用现有的实现,例如 TensorFlow Object Detection API或TryoLabs的Luminoth。

        在下一章中,我们将学习如何使用TensorFlow ObjectDetection API 训练 Faster R-CNN,以检测和识别常见的美国街道/道路标志。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/122276236