在这篇文章中,我将详细描述R-CNN(具有CNN特征的区域),最近引入的基于深度学习的目标检测和分类方法是如何工作的。事实证明,R-CNN在自然图像中检测和分类目标方面非常有效,其mAP分数远高于以前的技术。R-CNN方法在Ross Girshick等人的以下系列论文中描述。

  1. R-CNN (Girshick等人,2013年) *
  2. Fast R-CNN (Girshick 2015) *
  3. Faster R-CNN (Ren et al.2015) *

这篇文章描述了上一篇论文中描述的R-CNN方法的最终版本。我首先考虑描述该方法从第一次引入到最终版本的演变,然而事实证明这是一项非常雄心勃勃的事业。我决定详细描述最终版本。
幸运的是,在TensorFlow,PyTorch和其他机器学习库中,网上有许多R-CNN算法的实现。我使用了以下实现:
https://github.com/ruotianluo/pytorch-faster-rcnn
本文中使用的大部分术语(例如,不同层的名称)都遵循代码中使用的术语。理解本文中提供的信息应该可以更容易地遵循PyTorch实现并进行自己的修改。

目录

  • 邮政组织
  • 图像预处理
  • 网络组织
  • 实施细节:训练
  • 实施细节:推论
  • 附录
  • 参考书目

    组织编码

  • 第1部分 - 图像预处理:在本节中,我们将描述应用于输入图像的预处理步骤。这些步骤包括减去平均像素值和缩放图像。训练和推理之间的预处理步骤必须相同。

  • 第2节 - 网络组织: 在本节中,我们将描述网络的三个主要组成部分 - “头”网络,区域提议网络(RPN)和分类网络。
  • 第3节 - 实施细节(训练): 这是该帖子中最长的部分,详细描述了训练R-CNN网络所涉及的步骤
  • 第4节 - 实现细节(推理): 在本节中,我们将描述推理过程中涉及的步骤 - 即,使用经过训练的R-CNN网络来识别有前途的区域并对这些区域中的目标进行分类。
  • 附录: 这里我们将介绍R-CNN运行过程中一些常用算法的细节,如非最大抑制和Resnet 50架构的细节。

    图像预处理

    在通过网络发送图像之前,将以下预处理步骤应用于图像。对于训练和推理,这些步骤必须相同。平均向量(使用R-CNN的目标检测和分类 - 图1对应于每个颜色通道的一个数字)不是当前图像中的像素值的平均值,而是在所有训练和测试图像上相同的配置值。
    img_5aa46e9e0bbd7.png
    使用R-CNN的目标检测和分类 - 图3参数的默认值分别为600和1000。

    网络组织

    R-CNN使用神经网络解决两个主要问题:

  • 在输入图像中识别可能包含前景目标的有前景区域(感兴趣区域 - ROI)

  • 计算每个ROI的目标类概率分布 - 即,计算ROI包含特定类的目标的概率。然后,用户可以选择具有最高概率的目标类作为分类结果。

R-CNN由三种主要类型的网络组成:

  1. 区域提议网络(RPN)
  2. 分类网络

R-CNN使用预先训练的网络的前几层(例如ResNet 50)来识别来自输入图像的有希望的特征。使用在一个数据集上训练的网络可以解决不同的问题,因为神经网络表现出”转移学习” (Yosinski et al.2014) *的特点。网络的前几层学习检测边缘和颜色斑点等一般特征,这些特征是许多不同问题的良好区分特征。后面的图层学到的功能是更高级别,更具体问题的功能。可以移除这些层,或者可以在反向传播期间微调这些层的权重。从预训练网络初始化的前几层构成”头部”网络。然后,由头网络产生的卷积特征图通过区域提议网络(RPN),其使用一系列卷积和完全连接的层来产生可能包含前景目标的有希望的ROI(上面提到的问题1)。然后使用这些有希望的ROI从头网络产生的特征图中裁剪出相应的区域。这称为”裁剪池”。然后,通过裁剪池产生的区域通过分类网络,该分类网络学习对每个ROI中包含的目标进行分类。
另外,您可能会注意到ResNet的权重以奇怪的方式初始化:

  1. n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
  2. m.weight.data.normal_(0, math.sqrt(2. / n))

如果您有兴趣了解此方法的工作原理,请阅读我关于初始化卷积和完全连接层的权重的文章

网络架构

下图显示了上述三种网络类型的各个组件。我们展示了每个网络层的输入和输出的维度,这有助于理解网络的每个层如何转换数据。使用R-CNN的目标检测和分类 - 图4使用R-CNN的目标检测和分类 - 图5表示输入图像的宽度和高度(在预处理之后)。
img_5a9ffec911c19.png

实施细节:训练

在本节中,我们将详细描述训练R-CNN所涉及的步骤。一旦了解了训练的工作原理,理解推理就会轻松得多,因为它只是简单地使用了训练中涉及的一部分步骤。训练的目标是调整RPN和分类网络中的权重并微调头部网络的权重(这些权重从预先训练的网络(如ResNet)初始化)。回想一下,RPN网络的工作是产生有前景的ROI和分类网络的工作,以便为每个ROI分配目标类分数。因此,为了训练这些网络,我们需要相应的基础事实,即图像中存在的目标周围的边界框的坐标以及这些目标的类。这个基本事实来自免费使用的图像数据库,每个图像附带一个注释文件。此注释文件包含边界框的坐标和图像中存在的每个目标的目标类标签(目标类来自预定义目标类的列表)。这些图像数据库已被用于支持各种目标分类和检测挑战。两个常用的数据库是:

  • PASCAL VOC:VOC 2007数据库包含9963个训练/验证/测试图像,包含20,6个目标类别的24,640个注释。
    • _人: 人_
    • _动物:_``_ 鸟,猫,牛,狗,马,羊_
    • _车辆:_``_ 飞机,自行车,船,公共汽车,汽车,摩托车,火车_
    • _室内: 瓶子,椅子,餐桌,盆栽,沙发,电视/显示器_

person_06.jpg

  • COCO(上下文中的公共目标):COCO 数据集要大得多。它包含> 200K标记图像,包含90个目标类别。

我使用较小的PASCAL VOC 2007数据集进行训练。R-CNN能够在同一步骤中训练区域提议网络和分类网络。
让我们花一点时间来回顾一下本文其余部分广泛使用的”边界框回归系数”和”边界框重叠”的概念。

  • 边界框回归系数(也称为”回归系数”和”回归目标”):R-CNN的目标之一是产生紧密适合目标边界的良好边界框。R-CNN通过采用给定的边界框(由左上角的坐标,宽度和高度定义)并通过应用一组”回归系数”来调整其左上角,宽度和高度来生成这些边界框。这些系数计算如下((Anon.2014)的附录C*。让目标和原始边界框的左上角的x,y坐标使用R-CNN的目标检测和分类 - 图8分别表示目标和原始边界的宽度/高度盒子使用R-CNN的目标检测和分类 - 图9分别。然后,回归目标(将原始边界框转换为目标框的函数的系数)给出如下:
    • 使用R-CNN的目标检测和分类 - 图10

该函数易于反演,即,给定左上角的回归系数和坐标以及原始边界框的宽度和高度,可以容易地计算目标框的左上角和宽度和高度。注意,回归系数对于没有剪切的仿射变换是不变的。这是重要的一点,因为在计算分类损失时,目标回归系数以原始纵横比计算,而分类网络输出回归系数是在方形特征图(1:1纵横比)上的ROI汇集步骤之后计算的。当我们在下面讨论分类损失时,这将变得更加清晰。
img_5bac3708478ce-1024x479.png
联合交叉(IoU)重叠:我们需要测量给定边界框与另一个边界框的接近程度,该边界框与所使用的单位(像素等)无关,以测量边界框的尺寸。该度量应该是直观的(两个重合的边界框应该具有1的重叠,并且两个非重叠的框应该具有0的重叠)并且Fast 且易于计算。常用的重叠度量是”联合交叉(IoU)重叠,计算如下所示”。
img_5aa6f44a0a9c7.pngimg_5aa6f476535f7.png
通过这些预备课程,现在让我们深入了解训练R-CNN的实施细节。在软件实现中,R-CNN执行分为几个层,如下所示。一个层封装了一系列逻辑步骤,这些步骤可能涉及通过其中一个神经网络运行数据和其他步骤,例如比较边界框之间的重叠,执行非最大值抑制等。
img_5aa0053323ac5.png

  • 锚点生成层:该层通过首先生成9个不同比例和纵横比的锚点,然后通过跨越输入图像的均匀间隔的网格点平移它们来复制这些锚点,从而生成固定数量的”锚点”(边界框)。
  • 区域提议层:根据边界框回归系数转换锚点以生成转换锚点。然后通过使用锚点作为前景区域的概率应用非最大抑制(参见附录)来修剪锚点的数量。
  • 锚目标层:锚点目标图层的目标是生成一组”好”锚点和相应的前景/背景标签和目标回归系数,以训练区域提议网络。该层的输出仅用于训练RPN网络,并且不被分类层使用。给定一组锚点(由锚点生成层生成,锚点目标层识别有前途的前景和背景锚点。有前景的前景锚点是那些与某些地面实况框重叠高于阈值的那些。背景框是与任何重叠的那些地面实况框低于阈值。锚定目标层还输出一组边界框回归量,即每个锚定目标离最近边界框有多远的度量。
  • RPN损失: RPN损失函数是在优化过程中最小化以训练RPN网络的度量。损失函数是以下组合:
    • RPN生成的边界框的比例被正确分类为前景/背景
    • 预测回归系数和目标回归系数之间的距离度量。
  • 提议目标层:提议目标层 的目标是修剪提议层生成的锚点列表,并生成特定于类的边界框回归目标,这些目标可用于训练分类层以生成良好的类标签和回归目标
  • ROI池化层: 实现空间转换网络,该网络在给定由提议目标层生成的区域提议的边界框坐标的情况下对输入要素图进行采样。这些坐标通常不在整数边界上,因此需要基于插值的采样。
  • 分类层: 分类层采用ROI池化层生成的输出特征映射,并将它们传递给一系列卷积层。输出通过两个完全连接的层馈送。第一层为每个区域提议生成类概率分布,第二层生成一组特定于类的边界框回归量。
  • 分类损失: 类似于RPN损失,分类损失是在优化过程中最小化以训练分类网络的度量。在反向传播期间,误差梯度也流向RPN网络,因此训练分类层也会修改RPN网络的权重。我们稍后会谈到这一点。分类损失是以下组合:
    • RPN生成的边界框的比例被正确分类(作为正确的目标类)
    • 预测回归系数和目标回归系数之间的距离度量。

我们现在将详细介绍这些层中的每一层。

锚点生成层

锚生成层产生一组边界框(称为”锚框”),其具有在整个输入图像上扩展的不同大小和纵横比。这些边界框对于所有图像是相同的,即,它们与图像的内容无关。这些边界框中的一些将包围前景目标,而大多数不会。RPN网络的目标是学习识别哪些框是好框 - 即,可能包含前景目标并产生目标回归系数,当应用于锚框时,将锚框转换为更好的边界框(更紧密地拟合所包含的前景目标)。
下图演示了如何生成这些锚框。
img_5aa05d3ecef3e.png

区域提议图层

目标检测方法需要输入一个”区域建议系统”,它产生一组稀疏(例如选择性搜索(Anon。) *)或密集(例如用于可变形部分模型(Anon。) *)的一组特征。R-CNN系统的第一个版本使用选择性搜索方法来生成区域提议。在当前版本(称为”Faster R-CNN”)中,使用基于”滑动窗口”的技术(在前一部分中描述)来生成一组密集候选区域,然后使用神经网络驱动的区域提议网络。根据包含前景目标的区域的概率对区域提议进行排名。区域提议图层有两个目标:

  • 从锚点列表中,识别背景和前景锚点
  • 通过应用一组”回归系数”来修改锚点的位置,宽度和高度,以提高锚点的质量(例如,使它们更好地适应目标的边界)

区域提议层由区域提议 网络和三个层组成 - 提议层,锚点目标层和提议目标层。以下各节将详细介绍这三层。

区域提议网络

img_5aa0695484e3e.png

区域提议层运行头网络通过卷积层(代码中称为rpn_net),然后是RELU生成的特征映射。rpn_net的输出通过两(1,1)个核卷积层运行,以产生背景/前景类分数和概率以及相应的边界框回归系数。头网络的步幅与生成锚点时使用的步幅相匹配,因此锚箱的数量与区域提议网络产生的信息1-1对应(锚箱数量=类别得分数量=边界框回归系数= 使用R-CNN的目标检测和分类 - 图17)

提议图层

提议层获取锚生成层生成的锚框,并通过基于前景分数应用非最大抑制来修剪框的数量(有关详细信息,请参阅附录)。它还通过将RPN生成的回归系数应用于相应的锚框来生成变换的边界框。
img_5aa5766d53b63.png

锚目标层

锚目标层的目标是选择可用于训练RPN网络的有希望的锚点:

  1. 区分前景和背景区域
  2. 为前景框生成良好的边界框回归系数。

首先看一下如何计算RPN损失是很有用的。这将揭示计算RPN损失所需的信息,这使得易于遵循锚定目标层的操作。

计算RPN损失

请记住,RPN层的目标是生成良好的边界框。要从一组锚框中执行此操作,RPN图层必须学会将锚框分类为背景或前景,并计算回归系数以修改前景锚框的位置,宽度和高度,使其成为”更好”的前景框(更贴近前景目标)。RPN Loss的制定方式是鼓励网络学习这种行为。
RPN损失是分类损失和边界框回归损失的总和。分类损失使用交叉熵损失惩罚错误分类的框,回归损失使用真实回归系数之间的距离函数(使用最接近的前景锚框匹配地面实况框计算)和网络预测的回归系数(参见RPN网络架构图中的使用R-CNN的目标检测和分类 - 图19)。
使用R-CNN的目标检测和分类 - 图20

分类损失:
使用R-CNN的目标检测和分类 - 图21
边界框回归损失:
使用R-CNN的目标检测和分类 - 图22
对所有前景锚点的回归损失求和。为背景锚点执行此操作没有意义,因为背景锚点没有关联的地面实况框
使用R-CNN的目标检测和分类 - 图23
这显示了如何计算给定前景锚的回归损失。我们采用预测(通过RPN)和目标(使用最接近的真实性框计算到锚箱)回归系数之间的差异。有四个组件 - 对应于左上角的坐标和边界框的宽度/高度。平滑的L1功能定义如下:
使用R-CNN的目标检测和分类 - 图24
使用R-CNN的目标检测和分类 - 图25是任意选择的(在我的代码中设置为3)。请注意,在python实现中,前景锚点的掩码数组(称为”bbox_inside_weights”)用于计算作为向量操作的损失并避免for-if循环。
因此,要计算损失,我们需要计算以下数量:

  1. 类标签(背景或前景)和锚箱的分数
  2. 目标回归系数为前景锚框

我们现在将遵循锚定目标图层的实现,以查看这些数量的计算方式。我们首先选择位于图像范围内的锚框。然后,通过首先计算所有锚箱(在图像内)与所有地面实况框的IoU(联合交叉)重叠来选择好的前景框。使用此重叠信息,两种类型的框被标记为前景:

  1. 类型A:对于每个地面实况框,所有具有最大IoU的前景框与地面实况框重叠
  2. 类型B: 与某些地面实况框最大重叠的锚框超过阈值

这些框如下图所示:
img_5aa13d4d911d3.png
注意,仅选择与某些地面实况框重叠的锚框超过阈值作为前景框。这样做是为了避免向RPN提供学习离最佳匹配地面实况框太远的框的回归系数的”绝望学习任务”。类似地,重叠小于负阈值的框被标记为背景框。并非所有不是前景框的框都标记为背景。既不是前景也不是背景的框被标记为”不关心”。这些框不包括在RPN损失的计算中。
有两个额外的阈值与我们想要实现的背景和前景框的总数相关,以及应该是前景的这个数字的分数。如果通过测试的前景框数超过阈值,我们会将多余的前景框随机标记为”不关心”。类似的逻辑应用于背景框。
接下来,我们计算前景框和相应的地面实况框之间的边界框回归系数,最大重叠。这很容易,只需要按照公式计算回归系数。
这结束了我们对锚目标层的讨论。回顾一下,让我们列出该层的参数和输入/输出:
参数:

  • TRAIN.RPN_POSITIVE_OVERLAP:用于选择锚框是否为良好前景框的阈值(默认值:0.7)
  • TRAIN.RPN_NEGATIVE_OVERLAP:如果来自地面实况框的锚的最大重叠低于此保留,则将其标记为背景。重叠> RPN_NEGATIVE_OVERLAP但<RPN_POSITIVE_OVERLAP的框标记为”不关心”。(默认值:0.3)
  • TRAIN.RPN_BATCHSIZE:背景和前景锚点的总数(默认值:256)
  • TRAIN.RPN_FG_FRACTION:作为前景锚点的批量大小的一部分(默认值:0.5)。如果找到的前景锚点数大于TRAIN.RPN_BATCHSIZE 使用R-CNN的目标检测和分类 - 图27 TRAIN.RPN_FG_FRACTION,则超出(索引是随机选择的)标记为”不关心”。

输入:

  • RPN网络输出(预测的前景/背景类标签,回归系数)
  • 锚箱(由锚生成层生成)
  • 地面实况框

输出

  • 良好的前景/背景框和相关的类标签
  • 目标回归系数

其他层,提议目标层,ROI池化层和分类层旨在生成计算分类损失所需的信息。正如我们对锚目标层所做的那样,让我们首先看一下如何计算分类损失以及计算分类损失需要哪些信息

计算分类层损失

与RPN损失类似,分类层损失有两个组成部分 - 分类损失和边界框回归损失
使用R-CNN的目标检测和分类 - 图28
RPN层和分类层之间的关键区别在于,虽然RPN层只处理两个类 - 前景和背景,但分类层处理我们的网络正在训练分类的所有目标类(加上背景)。
分类损失是以实际目标类别和预测类别得分为参数的交叉熵损失。它的计算方法如下所示。
img_5aa1cd250f265-1.png
边界框回归损失也与RPN类似地计算,除了现在回归系数是类特定的。网络计算每个目标类的回归系数。目标回归系数显然仅适用于正确的类,该类是与给定锚盒具有最大重叠的地面实况边界框的目标类。在计算损耗时,使用掩码数组,该掩码数组标记每个锚盒的正确目标类。忽略不正确的目标类的回归系数。该掩码数组允许将损失计算为矩阵乘法,而不是需要for-each循环。
因此,计算分类层损失需要以下数量:

  1. 预测类标签和边界框回归系数(这些是分类网络的输出)
  2. 每个锚箱的类标签
  3. 目标边界框回归系数

现在让我们看一下如何在提议目标和分类层中计算这些数量。

提议目标层

提议目标层的目标是从提议层输出的ROI列表中选择有希望的ROI。这些有希望的ROI将用于从头层产生的特征图执行裁剪池并传递到网络的其余部分(head_to_tail),其计算预测的类别得分和框回归系数。
与锚目标层类似,重要的是选择好的提议(与GT框重叠的那些)以传递给分类层。否则,我们将要求分类层学习”无望的学习任务”。
提议目标层以提议层计算的ROI开始。使用每个ROI与所有地面实况框的最大重叠,它将ROI分类为背景和前景ROI。前景ROI是最大重叠超过阈值的那些(TRAIN.FG_THRESH,默认值:0.5)。背景ROI是最大重叠落在TRAIN.BG_THRESH_LO和TRAIN.BG_THRESH_HI之间的值(默认值分别为0.1,0.5)。这是用于向分类器呈现困难背景示例的”硬负挖掘”的示例。
还有一些额外的逻辑试图确保前景和背景区域的总数是恒定的。如果找到的背景区域太少,它会尝试通过随机重复一些背景指数来填补批次,以弥补不足。
接下来,在每个ROI和最接近的匹配地面实况框之间计算边界框目标回归目标(这也包括背景ROI,因为这些ROI也存在重叠的地面实况框)。这些回归目标针对所有类进行了扩展,如下图所示。
img_5aa32302afc0b-1.png
bbox_inside_weights数组充当掩码。对于每个前景ROI,它仅适用于正确的类。背景ROI也为零。因此,在计算分类层损失的边界框回归分量时,仅考虑前景区域的回归系数。这不是分类损失的情况 - 包括背景ROI以及它们属于”背景”类。
输入:

  • 提议层生成的ROI
  • 地面真相信息

输出:

  • 选择符合重叠标准的前景和背景ROI。
  • ROI的类特定目标回归系数

参数:

  • TRAIN.FG_THRESH :(默认值:0.5)用于选择前景ROI。与地面实况框最大重叠超过FG_THRESH的ROI标记为前景
  • TRAIN.BG_THRESH_HI :(默认为0.5)
  • TRAIN.BG_THRESH_LO :(默认值为0.1)这两个阈值用于选择背景ROI。最大重叠落在BG_THRESH_HI和BG_THRESH_LO之间的ROI标记为背景
  • TRAIN.BATCH_SIZE :(默认为128)选中的最大前景和背景框数。
  • TRAIN.FG_FRACTION :(默认为0.25)。前景框的数量不能超过BATCH_SIZE * FG_FRACTION

    裁剪池

    提议目标层为我们提供了有希望的ROI,以便在训练期间使用相关的类标签和回归系数进行分类。下一步是从头网络产生的卷积特征图中提取对应于这些ROI的区域。然后,提取的特征图通过网络的其余部分(上面显示的网络图中的”尾部”)运行,以产生每个ROI的目标类概率分布和回归系数。Crop Pooling层的工作是从卷积特征映射执行区域提取。
    关于裁剪汇集的关键思想在关于”空间转型网络” (Anon.2016) *的论文中有所描述。目标是将变形函数(由使用R-CNN的目标检测和分类 - 图31仿射变换矩阵描述)应用于输入特征映射以输出变形特征映射。如下图所示
    img_5aa402baba3a1-1.png
    裁剪池有两个步骤:
  1. 对于一组目标坐标,应用给定的仿射变换以生成源坐标网格。
    使用R-CNN的目标检测和分类 - 图33。这使用R-CNN的目标检测和分类 - 图34是高度/宽度归一化坐标(类似于图形中使用的纹理坐标),所以使用R-CNN的目标检测和分类 - 图35
  2. 在第二步中,在源坐标处对输入(源)映射进行采样以产生输出(目标)映射。在此步骤中,每个使用R-CNN的目标检测和分类 - 图36坐标定义输入中的空间位置,其中应用采样内核(例如双线性采样内核)以获取输出要素图中特定像素的值。

空间变换中描述的采样方法提供了可微分的采样机制,允许损失梯度流回输入特征图和采样网格坐标。
幸运的是,裁剪池在PyTorch中实现,API由两个镜像这两个步骤的函数组成。 torch.nn.functional.affine_grid采用仿射变换矩阵并生成一组采样坐标,并且torch.nn.functional.grid_sample 对这些坐标处的网格进行采样 。后向步骤中的反向传播梯度由pyTorch自动处理。
要使用裁剪池,我们需要执行以下操作:

  1. 将ROI坐标除以”头部”网络的步幅。由提议目标层产生的ROI的坐标在原始图像空间(!800 使用R-CNN的目标检测和分类 - 图37600)中。为了将这些坐标带入由”head”产生的输出特征图的空间中,我们必须将它们除以步长(当前实现中的16)。
  2. 要使用上面显示的API,我们需要仿射变换矩阵。该仿射变换矩阵的计算如下所示
  3. 我们还需要目标要素图上的尺寸使用R-CNN的目标检测和分类 - 图38使用R-CNN的目标检测和分类 - 图39尺寸。这由配置参数cfg.POOLING_SIZE(默认为7)提供。因此,在裁剪合并期间,非方形ROI用于从卷积特征图中裁剪出区域,这些区域被扭曲成恒定大小的方形窗口。必须在将裁剪池的输出传递给需要输入固定维度的进一步卷积和完全连接的层时进行这种变形。

img_5aa4255fdacb6.png

分类层

裁剪池化层采用提议目标层输出的ROI框和”头”网络输出的卷积特征图,并输出方形特征图。然后通过沿空间维度的平均汇集,将特征图传递到ResNet的第4层。结果(代码中称为”fc7”)是每个ROI的一维特征向量。此过程如下所示。
img_5aa55c81eac0a-1024x757.png
然后,特征向量通过两个完全连接的层—bbox_pred_net和cls_score_net。cls_score_net层为每个边界框生成类别分数(可以通过应用softmax将其转换为概率)。bbox_pred_net层生成类特定的边界框回归系数,该回归系数与提议目标层产生的原始边界框坐标组合以产生最终边界框。这些步骤如下所示。
img_5aa55c97f3287.png
回想一下两组边界框回归系数之间的差异是很好的 - 一组由RPN网络产生,另一组由分类网络产生。第一组用于训练RPN层以产生良好的前景边界框(更紧密地围绕目标边界)。目标回归系数,即,将ROI框与其最接近的匹配地面实况边界框对齐所需的系数由锚目标层生成。很难准确识别这种学习是如何发生的,但我想象RPN卷积和完全连通的层学习如何将神经网络生成的各种图像特征解释为破译好的目标边界框。当我们在下一节考虑推理时,
第二组边界框系数由分类层生成。这些系数是类特定的,即,对于每个ROI框,每个目标类生成一组系数。这些目标回归系数由提议目标层生成。注意,分类网络在方形特征图上操作,该方形特征图是应用于头部网络输出的仿射变换(如上所述)的结果。然而,由于回归系数对于没有剪切的仿射变换是不变的,因此可以将由提议目标层计算的目标回归系数与由分类网络产生的目标回归系数进行比较,并且充当有效学习信号。事后看来这一点显而易见,但花了我一些时间来理解。
有趣的是,在训练分类层时,误差梯度也传播到RPN网络。这是因为在裁剪合并期间使用的ROI框坐标本身是网络输出,因为它们是将RPN网络生成的回归系数应用于锚框的结果。在反向传播期间,误差梯度将通过裁剪池化层传播回RPN层。计算和应用这些梯度将非常棘手,但幸运的是,裁剪池API由PyTorch作为内置模块提供,计算和应用梯度的细节在内部处理。这一点在Faster RCNN论文(Ren et al.2015 ) *的第3.2(iii)节中讨论 。

实施细节:推论

推理期间执行的步骤如下所示
img_5aa70ff399c57-1024x463.png
不使用锚定目标和建议目标图层。RPN网络应该已经学会了如何将锚盒分类为背景框和前景框并生成良好的边界框系数。提议层简单地将边界框系数应用于排名靠前的锚框并执行NMS以消除具有大量重叠的框。为清楚起见,下面显示了这些步骤的输出。生成的框被发送到分类层,在该分类层中生成类分数和类特定的边界框回归系数。
img_5aa580271bea6.png
红色框显示按分数排名的前6个锚点。应用RPN网络计算的回归参数后,绿框显示锚框。绿色框似乎更紧密地适合底层目标。请注意,应用回归参数后,矩形仍为矩形,即没有剪切。还要注意矩形之间的重要重叠。通过应用非最大值抑制来解决该冗余
img_5aa5809cc7206.png
红色框显示NMS前的前5个边界框,绿色框显示NMS之后的前5个框。通过抑制重叠的方框,其他方框(得分列表中的较低位置)有机会向上移动
img_5aa581709aa82.png
从最终的分类得分数组(dim:n,21),我们选择对应于某个前景目标的列,比如说汽车。然后,我们选择与此数组中最大分数对应的行。此行对应于最有可能是汽车的提议。设这个行的索引为car_score_max_idx现在,让最终边界框坐标数组(在应用回归系数之后)为bbox(dim:n,21 * 4)。从这个数组中,我们选择对应于car_score_max_idx的行。我们期望对应于汽车列的边界框应该比其他边界框(对应于错误的目标类)更好地适合测试图像中的汽车。确实如此。在红色框对应于原提议箱,蓝箱是计算汽车类的边界框,白框对应于其他(不正确的)前景类。可以看出,蓝色盒子比其他盒子更适合实际的汽车。
为了显示最终的分类结果,我们应用另一轮NMS并将目标检测阈值应用于类别分数。然后,我们绘制对应于满足检测阈值的ROI的所有变换的边界框。结果如下所示。
img_5aa5827c1d42c.png

附录

ResNet 50网络架构

img_5aa59c8da4c4b.png
img_5aa59d170c750.png

非最大抑制(NMS)

非最大抑制是一种通过消除重叠大于一个数量的框来减少候选框数量的技术。这些框首先按一些标准排序(通常是右下角的y坐标)。然后,我们浏览框的列表并禁止IoU与所考虑的框重叠的框超过阈值。按y坐标对框进行排序会导致保留一组重叠框中的最低框。这可能并不总是理想的结果。R-CNN中使用的NMS按前景分数对框进行排序。这导致保留一组重叠框中具有最高分数的框。下图显示了两种方法之间的差异。黑色数字是每个框的前景分数。右侧的图像显示了将NMS应用于左侧图像的结果。第一个数字使用标准NMS(方框按右下角的y坐标排列)。这导致保留较低分数的框。第二个数字使用修改的NMS(框按前景分数排名)。这导致保留具有最高前景分数的框,这是更期望的。在这两种情况下,假设框之间的重叠高于NMS重叠角度。这是更理想的。在这两种情况下,假设框之间的重叠高于NMS重叠角度。这是更理想的。在这两种情况下,假设框之间的重叠高于NMS重叠角度。
img_5aa7c828703ab.pngimg_5aa7c84451f81.png

参考书目

  1. 匿名。2014. 10月23日.https://arxiv.org/pdf/1311.2524.pdf
  2. 匿名。2016年 2月5日.https://arxiv.org/pdf/1506.02025.pdf
  3. 匿名。。http://link.springer.com/article/10.1007/s11263-013-0620-5
  4. 匿名。基于特定训练部分模型的物体检测 - IEEE期刊与杂志。https://doi.org/10.1109/TPAMI.2009.167
  5. Girshick,罗斯。2015.Fast R-CNN。arXiv.org。4月30日.https://arxiv.org/abs/1504.08083
  6. Girshick,Ross,Jeff Donahue,Trevor Darrell和Jitendra Malik。2013.丰富的要素层次结构,用于准确的目标检测和语义分割。arXiv.org。11月11日.https://arxiv.org/abs/1311.2524
  7. Ren,Shaoqing,Kaiming He,Ross Girshick和Jian Sun. 2015.Faster R-CNN:利用区域提议网络实现实时目标检测。arXiv.org。6月4日.https://appxiv.org/abs/1506.01497
  8. Yosinski,Jason,Jeff Clune,Yoshua Bengio和Hod Lipson。深度神经网络中的特征如何可转移?arXiv.org。11月6日.https://appxiv.org/abs/1411.1792