重温Faster RCNN算法(1)--原理

原文:http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/
在这篇文章中,我将详细描述VGG16 的 R-CNN(Regions with CNN features),最近引入的基于深度学习的目标检测和分类方法是如何工作的。事实证明,R-CNN在自然图像中检测和分类对象方面非常有效,其mAP分数远高于以前的技术。R-CNN方法在Ross Girshick等人的以下系列论文中描述。

  1. R-CNN (Girshick et al. 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
还有:
https://github.com/facebookresearch/maskrcnn-benchmark
本文中使用的大部分术语(例如,不同层的名称)都遵循代码中使用的术语。理解本文中提供的信息应该可以更容易地遵循PyTorch实现并进行自己的修改。

Post Organization

  • 第1部分 - 图像预处理:在本节中,我们将描述应用于输入图像的预处理步骤。这些步骤包括减去平均像素值和缩放图像。training和inference之间的预处理步骤必须相同
  • 第2节 - 网络组成: 在本节中,我们将描述网络的三个主要组成部分 - Head (backbone)网络,区域提议网络(RPN)和分类网络。
  • 第3节 - 实现细节(training): 这是该帖子中最长的部分,详细描述了training R-CNN网络所涉及的步骤
  • 第4节 - 实现细节(inference): 在本节中,我们将描述inference过程中涉及的步骤 - 即,使用经过训练的R-CNN网络来识别候选的区域并对这些区域中的对象进行分类。
  • 附录: 这里我们将介绍R-CNN运行过程中一些常用算法的细节,如非最大值抑制和Resnet 50架构的细节。

图像预处理

在给网络发送图像之前,将以下预处理步骤应用于图像。对于training和inference,这些步骤必须相同。平均向量(对应于每个颜色通道的一个数字)不是当前图像中的像素值的平均值,而是在所有训练和测试图像上相同的配置值。
在这里插入图片描述
targetSize和maxSize参数的默认值分别为600和1000。

网络组成

R-CNN使用神经网络解决两个主要问题:
  • 在输入图像中识别可能包含前景目标的候选区域(感兴趣区域 - ROI)
  • 计算每个ROI的目标类概率分布 - 即,计算ROI包含特定类的目标的概率。然后,用户可以选择具有最高概率的目标类作为分类结果。
R-CNN由三种主要类型的网络组成:
  1. Head (backbone)
  2. Region Proposal Network (RPN)
  3. Classification Network
    R-CNN使用预先训练的网络的前几层(例如ResNet 50)来识别来自输入图像的候选的特征。使用在一个数据集上训练的网络可以解决不同的问题,因为神经网络表现出“迁移学习” (Yosinski et al.2014) *。网络的前几层学习检测一般特征,例如边缘和颜色斑点,这些特征是许多不同问题的良好区分特征。后面的层学到是更高级别,更具体问题的特征。我们可以移除这些层,或者可以在反向传播期间微调这些层的权重。从预训练网络初始化的前几层构成“Head”(backbone)网络。然后,由Head (backbone)网络产生的卷积特征图通过区域提议网络(RPN),其使用一系列卷积和完全连接的层来产生可能包含前景目标的候选的ROI(上述问题1)。然后使用这些候选的ROI从Head (backbone)网络产生的特征图中裁剪出相应的区域。这称为“Crop Pooling”。然后,通过Crop Pooling产生的区域通过分类网络,该分类网络学习对每个ROI中包含的目标进行分类。

另外,您可能会注意到ResNet的权重以奇怪的方式初始化:

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

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

网络架构

下图显示了上述三种网络类型的各个组件。我们展示了每个网络层的输入和输出的维度,这有助于理解网络的每个层如何转换数据。并表示输入图像的宽和高(在预处理之后)。
在这里插入图片描述

实现细节:training

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

  • PASCAL VOC:VOC 2007数据集包含9963个training/验证/测试图像,包含20,6个对象类别的24,640个注释。
  • Person: person
  • Animal: bird, cat, cow, dog, horse, sheep
  • Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
  • Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor
    在这里插入图片描述
  • COCO(Common Objects in Context):COCO 数据集要大得多。它包含> 200K标记图像,包含90个对象类别。
    一般使用较小的PASCAL VOC 2007数据集进行training 学习。R-CNN能够在同一步骤中训练region proposal network 和 the classification network 。

让我们花一点时间来回顾一下本文其余部分广泛使用的“边界框回归系数”( “bounding box regression coefficients”)和“边界框重叠”(bounding box overlap)的概念。

  • 边界框回归系数(也称为“回归系数”和“回归目标”):R-CNN的目标之一是产生紧密适合对象边界的良好边界框。R-CNN通过采用给定的边界框(由左上角的坐标,宽度和高度定义)并通过应用一组“回归系数”来调整其左上角,宽度和高度来生成这些边界框。这些系数计算如下((Anon.2014)的附录C *。x,y表示左上角坐标,w,h表示宽和高,那么定义Tx, Ty, Ox, Oy 转换后的目标和原始边界框的左上角的x,y坐标,Tw, Th, Ow, Oh表示真实目标和原始边界框的宽度,高度。然后,回归目标(将原始边界框转换为转换后的目标框的函数的系数)如下给出:
    在这里插入图片描述
    。该函数易于反演,例如,给定左上角的回归系数和坐标以及原始边界框的宽度和高度,可以容易地计算目标框的左上角和宽度和高度。注意,回归系数对于没有剪切的仿射变换是不变的。这是重要的一点,因为在计算分类损失时,目标回归系数以原始纵横比计算,而分类网络输出回归系数是在方形特征图(1:1纵横比)上的ROI Pooling步骤之后计算的。当我们在下面讨论分类损失时,这将变得更加清晰易懂。
    在这里插入图片描述
  • (IoU)Intersection over Union Overlap: 我们需要测量给定边界框与另一个边界框的接近程度,该边界框与所使用的单位(像素等)无关,以测量边界框的尺寸。该度量应该是直观的(两个重合的边界框应该具有1的重叠,并且两个非重叠的框应该具有0的重叠)并且快速且易于计算。常用的重叠度量是“联合交叉(IoU)重叠,计算如下所示”。

在这里插入图片描述
通过上面的预备课程,现在让我们深入了解training R-CNN的实现细节。在代码实现中,R-CNN执行分为几个层,如下所示。一个层封装了一系列逻辑步骤,这些步骤可能涉及通过其中一个神经网络运行数据和其他步骤,例如比较边界框之间的重叠,执行NMS等。
在这里插入图片描述

  • 锚点生成层 Anchor Generation Layer:该层首先生成9个不同尺度和宽高比 (scales and aspect ratios)的锚点,然后通过跨越输入图像的均匀间隔的网格点平移它们来复制这些锚点,从而生成固定数量的“锚点 anchors”(边界框)。

  • 推选层 Proposal Layer:根据边界框回归系数转换锚点以生成转换锚点。然后通过使用锚点作为前景区域的概率应用NMS来修剪锚点的数量。

  • 锚目标层 Anchor Target Layer:锚点目标图层的目标是生成一组“好”锚点和相应的前景/背景标签和目标回归系数,以训练Region Proposal Network。该层的输出仅用于训练RPN网络,并且不被分类层使用。给定一组锚点(由锚点生成层生成,锚点目标层识别有前景的前景和背景锚点。有前景的前景锚点是那些与某些地面实况框重叠的高度超过阈值。背景框是与任何重叠的那些地面实况框低于阈值。锚定目标层还输出一组边界框回归量,即每个锚定目标离最近边界框有多远的度量。

  • RPN loss: RPN loss功能是在优化过程中最小化以训练RPN网络的度量。损失函数是以下组合:

    • RPN生成的边界框的比例被正确分类为前景/背景
    • 预测回归系数和目标回归系数之间的距离度量。
  • ** 推选目标层 Proposal Target Layer**: 推选目标层 的目标是修剪推选层生成的锚点列表,并生成特定于类的边界框回归目标,这些目标可用于训练分类层以生成良好的类标签和回归目标

  • ROI Pooling Layer: 实现空间转换网络,该网络在给定由提议目标层产生的区域提议的边界框坐标的情况下对输入要素图进行采样。这些坐标通常不在整数边界上,因此需要基于插值的采样。

  • 分类层 Classification Layer: 分类层采用ROI池层生成的输出特征映射,并将它们传递给一系列卷积层。输出通过两个完全连接的层馈送。第一层为每个区域提议生成类概率分布,第二层生成一组特定于类的边界框回归量。

  • Classification Loss: 类似于RPN Loss,分类Loss是在优化过程中最小化以训练分类网络的度量。在反向传播期间,误差梯度也流向RPN网络,因此训练分类层也会修改RPN网络的权重。我们稍后会谈到这一点。分类损失是以下组合:

    • RPN生成的边界框的比例被正确分类(作为正确的对象类)
    • 预测回归系数和目标回归系数之间的距离度量。

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

锚点生成层 Anchor Generation Layer

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

下图演示了如何生成这些锚框。
在这里插入图片描述

区域提案图层 Region Proposal Layer

目标检测方法需要输入一个“区域建议系统”,它产生一组稀疏(例如选择性搜索(Anon。) *)或密集(例如用于可变形部分模型(Anon。) *)的一组特征。R-CNN系统的第一个版本使用选择性搜索方法来生成区域提议。在当前版本(称为“更快的R-CNN”)中,使用基于“滑动窗口”的技术(在前一部分中描述)来生成一组密集候选区域,然后使用神经网络驱动的区域提议网络。根据包含前景对象的区域的概率对区域提议进行排名。区域提案图层有两个目标:
从锚点列表中,识别背景和前景锚点
通过应用一组“回归系数”来修改锚点的位置,宽度和高度,以提高锚点的质量(例如,使它们更好地适应对象的边界)
区域提议层由区域提议 网络和三个层组成 - 提议层,锚点目标层和提议目标层。以下各节将详细介绍这三层。

区域提案网络 Region Proposal Network

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

推选层 Proposal Layer

推选层获取锚生成层生成的锚框,并通过基于前景分数应用非最大值抑制来修剪框的数量(有关详细信息,请参阅附录)。它还通过将RPN生成的回归系数应用于相应的锚框来生成变换的边界框。
在这里插入图片描述

锚目标层 Anchor Target Layer

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

  1. 区分前景和背景区域
  2. 为前景框生成良好的边界框回归系数。
    首先看一下如何计算RPN损失是很有用的。这将揭示计算RPN损失所需的信息,这使得易于遵循锚定目标层的操作。

计算RPN损失

请记住,RPN层的目标是生成良好的边界框。要从一组锚框中执行此操作,RPN图层必须学会将锚框分类为背景或前景,并计算回归系数以修改前景锚框的位置,宽度和高度,使其成为“更好”的前景框(更贴近前景对象)。RPN Loss的制定方式是鼓励网络学习这种行为。

RPN损失是分类损失和边界框回归损失的总和。分类损失使用交叉熵损失惩罚错误分类的框,回归损失使用真实回归系数之间的距离函数(使用最接近的前景锚框匹配地面实况框计算)和网络预测的回归系数(参见RPN网络架构图中的rpn_bbx_pred_net)。
在这里插入图片描述

分类损失:

cross_entropy(预测_class,actual_class)

边界框回归损失:

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

因此,要计算损失,我们需要计算以下数量:

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

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

  1. 类型A:对于每个地面实况框,所有具有最大IoU的前景框与地面实况框重叠
  2. 类型B: 与某些地面实况框最大重叠的锚框超过阈值
    这些框如下图所示:
    在这里插入图片描述
    注意,仅选择与某些地面实况框重叠的锚框超过阈值作为前景框。这样做是为了避免向RPN提供学习离最佳匹配地面实况框太远的框的回归系数的“绝望学习任务”。类似地,重叠小于负阈值的框被标记为背景框。并非所有不是前景框的框都标记为背景。既不是前景也不是背景的框被标记为“不关心”。这些框不包括在RPN损失的计算中。

有两个额外的阈值与我们想要实现的背景和前景框的总数相关,以及应该是前景的这个数字的分数。如果通过测试的前景框数超过阈值,我们会将多余的前景框随机标记为“不关心”。类似的逻辑应用于背景框。

接下来,我们计算前景框和相应的地面实况框之间的边界框回归系数,最大重叠。这很容易,只需要按照公式计算回归系数。

这结束了我们对锚目标层的讨论。回顾一下,让我们列出该层的参数和输入/输出:

参数Parameters:

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

输入Input:

  • RPN网络输出(预测的前景/背景类标签,回归系数)
  • Anchor boxes (generated by the anchor generation layer)(由锚生成层生成)
  • Ground truth boxes

Output:

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

其他层,proposal target layer, ROI Pooling layer and classification layer 旨在生成计算分类loss所需的信息。正如我们对锚目标层所做的那样,让我们​​首先看一下如何计算分类损失以及计算分类损失需要哪些信息。

计算分类层损失 Calculating Classification Layer Loss

与RPN损失类似,分类层损失有两个组成部分 - 分类Loss和边界框回归损失
在这里插入图片描述
RPN层和分类层之间的关键区别在于,虽然RPN层只处理两个类 - 前景和背景,但分类层处理我们的网络正在训练分类的所有对象类(加上背景)。

分类损失是以实际对象类别和预测类别得分为参数的交叉熵损失。它的计算方法如下所示。

在这里插入图片描述
边界框回归损失也与RPN类似地计算,除了现在回归系数是类特定的。网络计算每个对象类的回归系数。目标回归系数显然仅适用于正确的类,该类是与给定锚盒具有最大重叠的地面实况边界框的对象类。在计算损耗时,使用掩码数组,该掩码数组标记每个锚盒的正确对象类。忽略不正确的对象类的回归系数。该掩码数组允许将损失计算为矩阵乘法,而不是需要for-each循环。

因此,计算分类层损失需要以下数量:

  1. 预测类标签和边界框回归系数(这些是分类网络的输出)
  2. 每个锚箱的类标签
  3. 目标边界框回归系数
    现在让我们看一下如何在提案目标和分类层中计算这些数量。

推选目标层 Proposal Target Layer

推选目标层的目标是从提议层输出的ROI列表中选择候选的ROI。这些候选的ROI将用于从Head (backbone)层产生的特征图执行裁剪池并传递到网络的其余部分(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也存在重叠的地面实况框)。这些回归目标针对所有类进行了扩展,如下图所示。
在这里插入图片描述
bbox_inside_weights数组充当掩码。对于每个前景ROI,它仅适用于正确的类。背景ROI也为零。因此,在计算分类层损失的边界框回归分量时,仅考虑前景区域的回归系数。这不是分类Loss的情况 - 包括背景ROI以及它们属于“背景”类。

输入:

  • 推选层生成的ROI ,ROIs produced by the proposal layer
  • ground truth information

输出:

  • 选择符合重叠标准的前景和背景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

Crop Pooling

推选目标层为我们提供了候选的ROI,以便在training期间使用相关的类标签和回归系数进行分类。下一步是从Head (backbone)网络产生的卷积特征图中提取对应于这些ROI的区域。然后,提取的特征图通过网络的其余部分(上面所示的网络图中的“尾部”)运行,以产生每个ROI的对象类概率分布和回归系数。Crop Pooling层的工作是从卷积特征映射执行区域提取。

关于作物汇集的关键思想在关于“空间转型网络” (Anon.2016) *的论文中有所描述。目标是将变形函数(由仿射变换矩阵描述)应用于输入特征映射以输出变形特征映射。如下图所示
在这里插入图片描述
Crop Pooling有两个步骤:
对于一组目标坐标,应用给定的仿射变换以生成源坐标网格。

在这里插入图片描述。这是在这里插入图片描述高度/宽度标准化坐标(类似于图形中使用的纹理坐标),所以
在这里插入图片描述

在第二步中,在源坐标处对输入(源)映射进行采样以产生输出(目标)映射。在此步骤中,每个在这里插入图片描述坐标定义输入中的空间位置,其中应用采样内核(例如双线性采样内核)以获取输出要素图中特定像素的值。
空间变换中描述的采样方法提供了可微分的采样机制,允许损失梯度流回输入特征图和采样网格坐标。

幸运的是,裁剪池在PyTorch中实现,API包含两个镜像这两个步骤的函数。 torch.nn.functional.affine_grid采用仿射变换矩阵并生成一组采样坐标,并且torch.nn.functional.grid_sample 对这些坐标处的网格进行采样 。后向步骤中的反向传播梯度由pyTorch自动处理。

要使用裁剪池,我们需要执行以下操作:

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

分类层 Classification Layer

裁剪池层采用提议目标层输出的ROI框和Head (backbone)网络输出的卷积特征图,并输出方形特征图。然后通过沿空间维度的平均汇集,将特征图传递到ResNet的第4层。结果(代码中称为“fc7”)是每个ROI的一维特征向量。此过程如下所示。
在这里插入图片描述
然后,特征向量通过两个完全连接的层–bbox_pred_net和cls_score_net。cls_score_net层为每个边界框生成类别分数(可以通过应用softmax将其转换为概率)。bbox_pred_net层生成类特定的边界框回归系数,该回归系数与提议目标层产生的原始边界框坐标组合以产生最终边界框。这些步骤如下所示。
在这里插入图片描述
回想一下两组边界框回归系数之间的差异是很好的 - 一组由RPN网络产生,另一组由分类网络产生。第一组用于训练RPN层以产生良好的前景边界框(更紧密地围绕对象边界)。目标回归系数,即,将ROI框与其最接近的匹配地面实况边界框对齐所需的系数由锚目标层生成。很难准确识别这种学习是如何发生的,但我想象RPN卷积和完全连通的层学习如何将神经网络生成的各种图像特征解释为破译好的对象边界框。当我们在下一节考虑inference时,

第二组边界框系数由分类层生成。这些系数是类特定的,即,对于每个ROI框,每个对象类生成一组系数。这些目标回归系数由 推选目标层生成。注意,分类网络在方形特征图上操作,该方形特征图是应用于Head (backbone)网络输出的仿射变换(如上所述)的结果。然而,由于回归系数对于没有剪切的仿射变换是不变的,因此可以将由提议目标层计算的目标回归系数与由分类网络产生的目标回归系数进行比较,并且充当有效学习信号。事后看来这一点显而易见,但花了我一些时间来理解。

有趣的是,在训练分类层时,误差梯度也传播到RPN网络。这是因为在作物合并期间使用的ROI框坐标本身是网络输出,因为它们是将RPN网络生成的回归系数应用于锚框的结果。在反向传播期间,误差梯度将通过Crop Pooling层传播回RPN层。计算和应用这些梯度将非常棘手,但幸运的是,Crop PoolingAPI由PyTorch作为内置模块提供,计算和应用梯度的细节在内部处理。这一点在更快的RCNN论文(Ren et al.2015 ) *的第3.2(iii)节中讨论 。

实现细节:inference

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

附录

ResNet 50网络架构

在这里插入图片描述

非最大值抑制(NMS)

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

Bibliography

Anon. 2014. . October 23. https://arxiv.org/pdf/1311.2524.pdf.
Anon. 2016. . February 5. https://arxiv.org/pdf/1506.02025.pdf.
Anon. . http://link.springer.com/article/10.1007/s11263-013-0620-5.
Anon. Object Detection with Discriminatively Trained Part-Based Models - IEEE Journals & Magazine. https://doi.org/10.1109/TPAMI.2009.167.
Girshick, Ross. 2015. Fast R-CNN. arXiv.org. April 30. https://arxiv.org/abs/1504.08083.
Girshick, Ross, Jeff Donahue, Trevor Darrell, and Jitendra Malik. 2013. Rich feature hierarchies for accurate object detection and semantic segmentation. arXiv.org. November 11. https://arxiv.org/abs/1311.2524.
Ren, Shaoqing, Kaiming He, Ross Girshick, and Jian Sun. 2015. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. arXiv.org. June 4. https://arxiv.org/abs/1506.01497.
Yosinski, Jason, Jeff Clune, Yoshua Bengio, and Hod Lipson. 2014. How transferable are features in deep neural networks? arXiv.org. November 6. https://arxiv.org/abs/1411.1792.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值