Faster-RCNN利用代码实现讲解算法原理

​ Faster-RCNN利用代码实现讲解原理

​ 在学习Faster-RCNN时,阅读论文发现很多的细节不是很清楚,突然之间在网上看见Object Detection and Classification using R-CNNs 从代码的角度分析了Faster-RCNN的实现细节,本文中使用的代码为Pytorch实现的Faster-RCNN,github地址为:https://github.com/ruotianluo/pytorch-faster-rcnn, 本文参考原文并结合自己的理解进行了翻译,方便后续查阅理解,如有理解不妥之处,望指正。

1.图像预处理

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

2. 网络结构

​ Faster R-CNN利用神经网络结构主要解决如下两个问题:

  • 在输入图像中识别可能包含前景对象的区域(感兴趣区域 - ROI(Region of Interest))

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

    Faster R-CNN主要包含如下三个类型的网络:

    1.Head

    2.Region Proposal Network(RPN)

    3.Classification Network;

    R-CNN使用预先训练的网络的前几层(例如ResNet 50)来识别来自输入图像的特征。利用迁移学习可以使用在一个数据集上训练的网络可以解决不同的问题。网络的前几层学习检测一般特征,例如边缘和颜色信息,这些特征可用于解决许多不同问题。网络的后面的层学到的是更高级别,更具体问题的特征。可以移除这些层,或者可以在反向传播期间微调这些层的权重。从预训练网络初始化的前几层构成“Head”网络。然后,由“Head”网络产生的特征图通过区域提议网络(RPN),RPN网络使用一系列卷积和全连接的层来产生可能包含前景对象的ROI(上面提到的问题1)。使用这些推荐的ROI从“head”网络产生的特征图中裁剪出相应的区域,实现这一功能的称为“Crop Pooling”。然后,通过Crop pooling产生的区域通过分类网络,该分类网络对每个ROI中包含的对象进行分类。
    下图显示了上述三种网络类型的各个组件。 我们展示了每个网络层的输入和输出的维度,这有助于理解网络的每个层如何转换数据。 w和h表示输入图像的宽度和高度(在预处理之后)。
    在这里插入图片描述

3. 实现细节:训练

​ 在本节中,我们将详细描述训练一个R-CNN所涉及的步骤。一旦了解了训练的工作原理,理解推理就会轻松得多,因为它只是简单地使用了训练中的一部分步骤。训练的目的是调整RPN和分类网络中的权重并微调头部网络的权重(这些权重从预先训练的网络(如ResNet)初始化)。RPN网络的作用是产生图中的可能目标区域,分类网络的作用是为每个可能的目标区域得到一个属于某类物体的得分。因此,为了训练这些网络,我们需要相应的参考基准(Ground Truth),即图像中存在的对象周围的边界框坐标和那些对象的类。这些参考基准来自一些免费的图像数据库,并且每个图像附带一个注释文件。此注释文件包含边界框的坐标和图像中存在的每个对象的对象类标签(对象类来自预定义对象类的列表)。这些图像数据库已被用于各种对象分类和检测比赛。两个常用的数据库是:

PASCAL VOC:VOC 2007数据库包含9963个训练/验证/测试图像,其中包含20个对象类的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个对象类别。

​ 首先介绍两个常用的方法“bounding box regression coefficients ”和“bounding box overlap ”

  • Bounding Box Regression Coefficients(边界框回归系数)

    ​ R-CNN的目标之一是生成图像中物体边界框。 R-CNN通过给定的边界框(由左上角的坐标,宽度和高度定义)应用一组“回归系数”来调整给定边界的左上角,宽度和高度。目标和原始边界框的左上角的 x , y x,y x,y坐标分别由 T x , T y , O x , O y T _ { x } , T _ { y } , O _ { x } , O _ { y } Tx,Ty,Ox,Oy表示,目标和原始边界框的宽度/高度分别由 T w , T h , O w , O h T _ { w } , T _ { h } , O _ { w } , O _ { h } Tw,Th,Ow,Oh表示。则回归目标(将原始边界框转换为目标框的函数系数)如下所示:
    t x = ( T x − O x ) O w , t y = ( T y − O y ) O h , t w = log ⁡ ( T w O w ) , t h = log ⁡ ( T h O h ) t _ { x } = \frac { \left( T _ { x } - O _ { x } \right) } { O _ { w } } , t _ { y } = \frac { \left( T _ { y } - O _ { y } \right) } { O _ { h } } , t _ { w } = \log \left( \frac { T _ { w } } { O _ { w } } \right) , t _ { h } = \log \left( \frac { T _ { h } } { O _ { h } } \right) tx=Ow(TxOx),ty=Oh(TyOy),tw=log(OwTw),th=log(OhTh)
    上述函数是可逆的,即给定回归系数和原始边界框的左上角坐标和原始边界框的宽度和高度,可以计算出目标框的左上角坐标,以及宽度和高度。 注意,回归系数对于没有剪切的仿射变换是不变的。 这是重要的一点,因为在计算分类损失时,目标回归系数以原始纵横比计算,而分类网络输出回归系数是在方形特征图(1:1纵横比)上的ROI汇集步骤之后计算的。 当我们在下面讨论分类损失时,这将变得更加清晰。下图说明了图像经过缩放为长宽比为1:1时的回归系数计算方式的变化。
    在这里插入图片描述

  • Intersection over Union (IoU) Overlap(边框重叠)

    ​ 我们需要测量给定边界框与另一个边界框的接近程度,该边界框与所使用的单位(像素等)无关,以测量边界框的尺寸。 该测量应该是直观的(两个重合的边界框应该具有1的重叠,并且两个非重叠的框应该具有0的重叠)并且快速且容易计算。 常用的重叠度量是“联合交叉(IoU)重叠“,计算方法如下如下所示。
    在这里插入图片描述

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

  • Anchor Generation Layer(Anchor 产生层)

    ​ 该层通过首先生成9个不同比例和纵横比的锚点(Anchors),然后在输入图像上在均匀间隔的网格点上平移它们来复制这些锚点,从而生成固定数量的“锚点”(边界框)。

  • Proposal Layer

    ​ 根据边界框回归系数变换锚点以生成变换锚点。 然后通过使用锚点作为前景区域的概率应用非最大抑制来修剪锚点的数量。

  • Anchor Target Layer

    ​ Anchor Target layer的目标是产生一组“好”的Anchor和相应的前景/背景标签和目标回归系数用于训练Region Proposal Network。 该层的输出仅用于训练RPN网络,并不被分类层使用。 给定一组Anchor(由Anchor Generator Layer生成),anchor target layer 识别可能是前景和背景的Anchor。前景Anchor是那些与某些给定的Ground Truth边界框重叠高于阈值的Anchor。背景框是与任一Ground Truth边界框低于阈值的Anchor。anchor target layer 还输出一组边界框回归量,即每个Anchor与最近的GT边界框的距离。这些回归量只对前景框有意义,因为没有背景框的“最接近的边界框”的概念。注:前景认为是有检测物体,背景是没有检测物体。

  • RPN Loss

    利用最小化RPN损失函数来优化训练RPN网络,损失函数包含如下:

    • RPN生成的边界框被正确分类为前景/背景的比例;
    • 预测回归系数与目标回归系数之间的距离;
  • Proposal Target Layer

    该层的目标是修剪Proposal layer生成的Anchor列表,并生成特定的边界框回归指标,这些指标可用于训练分类网络以生成更好的类别标签和回归目标;

  • ROI Pooling Layer

    由于生成的Anchor大小各不相同,进入后序网络之前需要根据上述网络得到的Anchor和特征图对Anchor特征图进行采样;

  • Classification Layer

    该层获取ROI Pooling层产生的输出特征图,并将它们传递给一系列卷积层。 输出通过两个全连接层。 第一层为每个推荐区域(Proposal region)生成类概率分布,第二层生成一组关于某类的边界框回归量。

  • Classification Loss

    与RPN损失类似,分类损失用于优化训练分类网络。 在反向传播期间,误差梯度也流向RPN网络,因此训练分类层也修改RPN网络的权重。 我们稍后会谈到这一点。分类损失函数包括如下:

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

下面,对上述提到的每层的具体细节进行分析。

3.1 Anchor Generation Layer

​ 该层产生一组边界框(称为“anchor boxes”),边界框具有不同大小和纵横比。 这些边界框对所有图像都是相同的。即,它们不知道图像的内容。 其中一些边界框将包围前景对象,而大多数不会。 RPN网络的目标是学习识别哪些框是好框 - 即,可能包含前景对象,同时产生目标回归系数,利用回归系数可以将anchor box换为更好的边界框 (更紧密地拟合目标物体边框)。

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

3.2 Region Proposal Layer

​ 物体检测方法需要输入一个“区域建议系统(region proposal system)”,它产生一组稀疏(例如选择性搜索)或密集(例如用于可变形零件模型)的一组特征。 最早的R-CNN系统使用选择性搜索方法来生成推荐区域。 在当前版本(称为“faster R-CNN”)中,使用基于“滑动窗口”的技术(在前一部分中描述)来生成一组密集候选区域,然后使用Region Proposal Network 根据包含前景对象的概率对推荐的区域进行排名。 Region Proposal Layer有两个目标:

  • 从Anchor列表中,识别出背景和前景Anchor;
  • 通过应用一组“回归系数”来修改Anchor的位置,包括宽度和高度,以提高Anchor的质量(例如,使它们与Ground Truth边界框更接近)

Region Proposal Layer 包含Region Proposal Network和另外三层Proposal Layer, Anchor Target Layer and Proposal Target Layer,如下详细介绍。

3.2.1 Region Proposal Network

​ 前序网络产生的特征图经过卷积层(代码中称为rpn_net),然后是RELU生成的特征映射。 rpn_net的输出通过两个卷积核为 ( 1 , 1 ) (1,1) (1,1)的卷积层,分别产生背景或前景的分类分数概率、相应的边界框回归系数。 Head Network的步幅与生成Anchor时使用的步幅相匹配,因此Anchor的数量与区域提议网络产生的信息一一对应(Anchor数量=类别得分数量= 边界框回归系数= w 16 × h 16 × 9 \frac {w} {16} \times \frac {h} {16} \times9 16w×16h×9,网络结构如下:
在这里插入图片描述

3.2.2 Proposal Layer

​ 该层获取由anchor generation layer生成的Anchor,同时基于前景分数应用非最大抑制来修剪框的数量。 它还将RPN生成的回归系数应用于相应的Anchor box来生成更加精细的边界框。
在这里插入图片描述

3.2.3 Anchor Target Layer

​ 该层的作用是挑选好的Anchor,用于训练RPN网络,该网络能实现如下两个功能:

​ 1.能区分前景和背景;

​ 2.为前景边界框生成好的边界回归系数;

​ 首先看一下如何计算RPN损失。将展示计算RPN损失所需的信息,这使得易于理解Anchor Target Layer所做的操作。

3.2.4 Calculating RPN Loss

​ RPN层的目标是生成良好的边界框。 要从一组anchor boxes中执行此操作,RPN图层必须学会将Anchor分为背景或前景,同时计算回归系数以修正前景Anchor的位置,宽度和高度,使其成为“更好”的前景框(和Ground Truth更接近)。 RPN Loss的作用能鼓励网络学习这种行为。

​ RPN损失包含分类损失和边界框回归损失。 分类损失使用交叉熵损失惩罚错误分类的框,回归损失使用真实回归系数(使用最接近Ground Truth的前景Anchor box)和网络预测的回归系数 (参见RPN网络架构图中的rpn_bbx_pred_net)之间的距离函数。

R P N L o s s =  Classification Loss  + Bounding Box Regressiong Loss R P N L o s s = \text { Classification Loss } +\text{Bounding Box Regressiong Loss} RPNLoss= Classification Loss +Bounding Box Regressiong Loss

Classification Loss:

​ 交叉熵损失函数 cross_entropy(predicted _class, actual_class)

Bounding Box Regression Loss:
L l o c = ∑ u ∈  all foreground anchors  l u L _ { l o c } = \sum _ { u \in \text { all foreground anchors } } l _ { u } Lloc=u all foreground anchors lu
​ 计算所有前景Anchor的回归损失。 对背景Anchor执行此操作没有意义,因为背景Anchor没有与之相对应的Ground Truth.
l u = ∑ i ∈ x , y , w , h s m o o t h L 1 ( u i ( predicted ) − u i ( target ) ) l _ { u } = \sum _ { i \in x , y , w , h } s m o o t h _ { L 1 } \left( u _ { i } ( \text {predicted} ) - u _ { i } ( \text {target} ) \right) lu=ix,y,w,hsmoothL1(ui(predicted)ui(target))
​ 上述公式给出了如何计算给定的前景Anchor的回归损失,计算预测(RPN网络得到)和目标(最接近ground truth的Anchor)之间的回归系数之间的差异,包含四个部分,边界框左上角坐标,宽度和高度.平滑的L1损失函数定义如下:
smooth ⁡ L 1 ( x ) = { σ 2 x 2 2 ∥ x ∥ < 1 σ 2 ∥ x ∥ − 0.5 σ 2  otherwise  \operatorname { smooth } _ { L 1 } ( x ) = \left\{ \begin{array} { l l } { \frac { \sigma ^ { 2 } x ^ { 2 } } { 2 } } & { \| x \| < \frac { 1 } { \sigma ^ { 2 } } } \\ { \| x \| - \frac { 0.5 } { \sigma ^ { 2 } } } & { \text { otherwise } } \end{array} \right. smoothL1(x)={2σ2x2xσ20.5x<σ21 otherwise 
​ 上式中的 σ \sigma σ是任意选择的(code中设置为3). 请注意,在python实现中,为了避免使用for-if循环,利用一个数组(bbox_inside_weights)来计算前景Anchor的损失.

​ 因此,为了计算损失,首先需要计算如下量:

​ 1.前景和背景的类标签,以及每个Anchor boxes的得分;

​ 2.目标前景Anchor boxes的回归系数;

​ 我们通过了解Anchor target layer的实现方式来理解上述两个量的计算方式。 我们首先选择位于图像内的Anchor boxes。 通过计算所有Anchor boxes(在图像内)与所有Ground Truth的IoU(交叉联合)来选择好的前景框。 使用此重叠信息,两种类型的框被标记为前景:

​ 1.type A:对于每个Ground Truth 框,所有与之具有最大IoU的前景框;

​ 2.type B:与某些Ground Truth框的IOU超过某阈值的Anchor boxes;

上述两种边框如下图所示:
在这里插入图片描述

​ 注意,仅选择与某些Ground Truth重叠并超过阈值的Anchor作为前景框。 这样做是为了避免向RPN提供离Ground Truth太远的框的回归系数作为学习数据,导致RPN出现“hopeless learning task”。 类似地,重叠区域小于另一个阈值的框被标记为背景框。 并非所有不是前景的Anchor都标记为背景。 既不是前景也不是背景的Anchor标记为“don’t care”。 这些框不包括在RPN损失的计算中。

​ 有两个额外的阈值与我们想要获得的背景和前景框的总数以及前景框的数量有关。 如果通获得的前景框数超过阈值,我们会将多余的前景框随机标记为“don’t care”,背景框也利用相类似的处理方式.

​ 接下来,利用之前描述的回归系数计算公式计算Ground Truth与该GT具有最大IOU的前景Anchor之间的边界框回归系数。

​ 上述讨论了 Anchor target layer的实现方式,总结一下,Anchor target layer的参数和输入输出:

Parameters:

  • TRAIN.RPN_POSITIVE_OVERLAP: Anchor boxes是好的前景阈值(0.7);
  • TRAIN.RPN_NEGATIVE_OVERLAP: Anchor boxes 和Ground Truth的IOU低于此阈值(0.3),该Anchor标记为背景,若某Anchor的 RPN_NEGATIVE_OVERLAP<IOU<RPN_POSITIVE_OVERLAP,设置为“don’t care”;
  • TRAIN.RPN_BATCHSIZE:背景和前景的Anchors数量和(256);
  • TRAIN.RPN_FG_FRACTION: Batchsize中作为前景Anchor的比例(0.5),如果前景Anchor数量大于RPN_FG_FRACTION*RPN_BATCHSIZE,超出部分随机选择设置我“don’t care”;

Input:

  • RPN网络输出(前景背景标签,回归系数);
  • Anchor boxes(anchor generation layer产生的);
  • Ground Truth boxes;

output:

  • 较好的前景和背景,以及对应的labels;
  • 目标回归系数;

其他层,Proposal layer,ROI Pooling和classification旨在生成计算分类损失(classification loss)所需的信息。 正如我们描述Anchor target layer所做的那样,让我们首先看看如何计算分类损失以及计算分类损失需要哪些信息.

3.2.5 Calculating Classification Layer Loss

​ 与RPN类似,classification layer 损失包含两部分:分类损失和边界框回归损失.
C l a s s i f i c a t i o n L a y e r L o s s = C l a s s i f i c a t i o n L o s s + B o u n d i n g B o x R e g r e s s i o n L o s s Classification Layer Loss =Classification Loss + Bounding Box Regression Loss ClassificationLayerLoss=ClassificationLoss+BoundingBoxRegressionLoss
​ RPN层和分类层之间的主要区别在于,RPN层只处理两个类:前景和背景,但分类层处理所有的在训练集上的类(包括背景)。

​ 分类损失是计算实际对象类别和预测类别得分的交叉熵损失。 它的计算方法如下所示。
在这里插入图片描述

​ 边界框回归损失计算与RPN的边界框回归损失类似,但现在回归系数是针对特定类的。 网络计算每个对象类的回归系数。 目标回归系数仅适用于正确的类,该类是与给定Anchor与Ground Truth具有最大IOU的对象类。 在计算损失时,使用mask数组,该mask数组标记每个Anchor的正确对象类。 不正确的对象类的回归系数被忽略。 该mask数组可以利用矩阵乘法计算损失,而不使用for-each循环。

​ 如下量是计算分类损失的必备数据:

​ 1.预测的labels和边框回归系数(分类网络的输出);

​ 2.每个Anchor的类标签;

​ 3.目标边框的回归系数;

​ 现在让我们看一下如何在Proposal target和classification layers中计算这些数量。

Proposal Target Layer

​ 该层的目标是从Proposal layer的输出的ROI列表中选择较精确的ROI。 这些较精确的ROI将用于从head layer 产生的特征图中执行裁切pooling处理,处理结果传递到网络的其余部分(head_to_tail),计算预测的类别得分和框回归系数。

​ 与Anchor target layer类似,选择好的anchor(与GT框重叠的Anchor)以传递给分类层。 否则,我们将要求分类层学习“hopeless learning task”。

​ Proposal target layer以proplsal layer计算的ROI开始。 利用ROI与Ground Truth的最大重叠将ROI分为背景和前景。 前景ROI与GT重叠超过阈值(TRAIN.FG_THRESH,默认值:0.5)。 背景ROI是最大重叠落在TRAIN.BG_THRESH_LO和TRAIN.BG_THRESH_HI之间的值(默认值分别为0.1,0.5)。 这是用于向分类器提供难以分类的背景数据,这种数据被称为“hard negative mining”。

​ 还有一些额外的逻辑试图确保前景和背景区域的总数是固定的。 如果找到的背景区域太少,它会尝试通过随机重复一些背景索引来填补批次,以弥补不足。

​ 接下来,计算每个ROI与最接近的Ground Truth边界框的回归目标(包括背景ROI,因为这些ROI也与GT也存在重叠)。 这些回归目标针对所有的类,如下图所示。
在这里插入图片描述

​ bbox_inside_weights数组充当掩码, 对于正确的分类前景ROI,用1表示,用0表示背景ROIs, 因此,在计算边界框回归分量的分类损失时,仅考虑前景区域的回归系数。 包括背景ROI以及属于“背景”类不属于分类损失函数计算需要考虑的。

  • Input:

    • Proposal layer 产生的ROIs;
    • Ground Truth 信息;
  • Output:

    • 符合重叠要求的背景和前景ROI;
    • ROI特定类的回归系数;
  • Parameters:

    • TRAIN.FG_THRESH:(默认0.5),用于选择前景ROI, 与Ground Truth框的最大重叠超过FG_THRESH的ROI标记为前景;
    • TRAIN.BG_THRESH_HI:(默认0.5)
    • TRAIN.BG_THRESH_LO:(默认是0.1),HI和LO两个参数用于选择背景ROIs,ROI与GT的重叠落在BG_THRESH_LO和BG_THRESH_HI之间的标记为背景;
    • TRAIN.BATCH_SIZE:(默认128),背景和前景最大选择数量;
    • TRAIN.FG_FRACTION:(默认0.25),前景框的数量不能超过BATCH_SIZE * FG_FRACTION

Crop Pooling

​ Proposal target layer为我们提供了较准确的ROI,同时提供了相关的类别标签和回归系数用于模型训练。 下一步是从Head network产生的卷积特征图中提取对应于这些ROI的区域。 然后,提取的ROI特征图通过网络的其余部分(上面显示的网络图中的“尾部”),以产生每个ROI的对象类概率和回归系数。 Crop Pooling层的工作是从卷积特征映射执行区域提取。

​ 关于crop pooling的关键思想“空间转型网络”(Anon,2016)*的论文中有所描述。 目标是将变形函数(由 2 × 3 2\times3 2×3仿射变换矩阵描述)应用于输入要素图以输出变形要素图。 如下图所示:
在这里插入图片描述

​ Crop Pooling 主要包含两步:

  1. 对于一组目标坐标,应用给定的仿射变换以生成源坐标网格。
    [ x i s y i s ] = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] [ x i t y i t 1 ] \left[ \begin{array} { c } { x _ { i } ^ { s } } \\ { y _ { i } ^ { s } } \end{array} \right] = \left[ \begin{array} { l l l } { \theta _ { 11 } } & { \theta _ { 12 } } & { \theta _ { 13 } } \\ { \theta _ { 21 } } & { \theta _ { 22 } } & { \theta _ { 23 } } \end{array} \right] \left[ \begin{array} { c } { x _ { i } ^ { t } } \\ { y _ { i } ^ { t } } \\ { 1 } \end{array} \right] [xisyis]=[θ11θ21θ12θ22θ13θ23]xityit1
    这里 x i s , y i s , x i t , y i t x_i ^ s,y_i ^ s,x_i ^ t,y_i ^ t xisyisxityit是高度/宽度归一化坐标(类似于图形中使用的纹理坐标),因此, − 1 ≤ x i s , y i s , x i t , y i t ≤ 1 - 1 \leq x _ { i } ^ { s } , y _ { i } ^ { s } , x _ { i } ^ { t } , y _ { i } ^ { t } \leq 1 1xis,yis,xit,yit1

  2. 在第二步中,在源坐标处对输入(源)映射进行采样以产生输出(目标)映射。 在此步骤中,每个( x i s , y i s x_i ^ s,y_i ^ s xisyis)坐标定义为输入的空间位置,应用采样(例如双线性采样)以获取输出特征图中特定像素的值。

    空间变换中描述的采样方法提供了可微分的采样方法,允许损失梯度传回输入特征图和采样网格坐标

    幸运的是,crop pooling在PyTorch中已经实现,API由两个镜像函数组成上述的两个步骤。 torch.nn.functional.affine_grid采用仿射变换矩阵生成一组采样坐标,torch.nn.functional.grid_sample对这些坐标处的网格进行采样。 反向传播梯度计算由pyTorch自动处理。

    使用crop pooling,需要执行以下操作:

  3. 将ROI坐标除以head network的步幅。 由proposal target layer产生的ROI的坐标在原始图像空间中( 800 × 600 800\times600 800×600)。 为了将这些坐标带入由“head”产生的输出特征映射的空间中,我们必须将它们除以步长(当前实现中的16)。

  4. 要使用上面提到的API,我们需要仿射变换矩阵。 该仿射变换矩阵的计算如下所示;

  5. 我们还需要目标特征图上x和y维度的点数。 这由配置参数cfg.POOLING_SIZE(默认为7)提供。 因此,在crop pooling,非方形ROI用于从卷积特征图中裁剪出区域,这些区域被变换成恒定大小的方形窗口。 输出用于卷积层和全连接层,因此Crop pooling的输出必须是相同大小的特征;
    在这里插入图片描述

Classification Layer

​ crop pooling层采用proposal target layer输出的ROI框和“head”网络输出的卷积特征图,输出方形特征图。 将特征图传递到ResNet的第4层,然后在空间维度上利用平均池化层。 结果(代码中称为“fc7”)是每个ROI的一维特征向量,此过程如下所示。
在这里插入图片描述

​ 然后,特征向量通过两个全连接层bbox_pred_net和cls_score_net。 cls_score_net层为每个边界框生成类别分数(可以通过应用softmax将其转换为概率)。 bbox_pred_net层生成类特定的边界框回归系数,该回归系数与Proposal target layer产生的原始边界框坐标组合以产生最终的边界框。 这些步骤如下所示。
在这里插入图片描述

​ 回想一下两组边界框回归系数之间的差异 , 一组由RPN网络产生,另一组由分类网络产生。 第一组用于训练RPN层以产生良好的前景边界框(与对象边界更接近)。 目标回归系数,即,Anchor target layer计算ROI框与其最接近的Ground Truth边界框的回归系数。 很难准确地识别这种学习是如何发生的,但是我想象RPN卷积和全连接层学习如何将神经网络生成的各种图像特征编码为好的对象边界框。 当我们在下一节中考虑推理时,我们将看到如何使用这些回归系数。

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

​ 有趣的是,在训练分类层时,误差梯度也传播到RPN网络。 这是因为在crop pooling期间使用的ROI框坐标本身是网络输出的,因为这些输出是将RPN网络生成的回归系数应用于Anchor boxes的结果。 在反向传播期间,误差梯度将通过crop pooling层传播回RPN层。 计算和应用这些梯度将非常难以实现,但幸运的是,Pytorch内置了crop pooling的API函数,计算和应用渐变的细节在内部处理。 这一点在Faster RCNN论文的第3.2(iii)节中有讨论.

4. 实现细节:推理

​ 推理过程的实现过程如下:

在这里插入图片描述

​ Anchor target layer和Proposal target layer未使用。 RPN网络应该已经学会了如何将anchor分类为背景框和前景框并生成良好的边界框系数。 proposal layer 简单地将边界框系数应用于排名靠前的锚框,并执行NMS以消除具有大量重叠的框。 为清楚起见,下面显示了这些步骤的输出。 生成的框被发送到分类层,在该分类层中生成类分数和类特定的边界框回归系数。
在这里插入图片描述

​ 红色框显示按分数排名的前6个anchor。 应用RPN网络计算的回归参数后,绿框显示anchor box 。 绿色框似乎与真实对象更接近。 注意,在应用回归参数之后,矩形仍然是矩形,即没有剪切。 还要注意矩形之间的重叠。 通过应用非最大值抑制来解决该冗余.
在这里插入图片描述

​ 红色框显示NMS前的前5个边界框,绿色框显示NMS之后的前5个框。 通过抑制重叠的方框,其他方框(得分列表中的较低位置)有机会向上移动.
在这里插入图片描述

​ 从最终的分类得分数组(dim:n,21),我们选择对应于某个前景对象的列,比如说汽车。 然后,我们选择与此数组中的最大分数对应的行。 此行对应于最有可能是汽车的提案。 设这个行的索引为car_score_max_idx, 现在,让最终边界框坐标数组(在应用回归系数之后)为bbox(dim:n,21 * 4)。 从这个数组中,我们选择对应于car_score_max_idx的行。 我们期望对应于汽车列的边界框应该比其他边界框(对应于错误的对象类)更好地适应测试图像中的汽车。 确实如此。 红色框对应于原始Proposal框,蓝色框是计算的汽车类边界框,白色框对应于其他(不正确的)前景类。 可以看出,蓝色盒子比其他盒子更适合实际的汽车。

​ 为了显示最终的分类结果,我们应用另一轮NMS并将对象检测阈值应用于类别分数。 然后,我们绘制对应于满足检测阈值的ROI的所有变换的边界框。 结果如下所示。
在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihDQ17Ek-1629875515820)(/…/faster-rcnn/19.png)]

5. Appendix(附录)

ResNet 50 Network Architecture

在这里插入图片描述

Non-Maximum Suppression (NMS)

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

6. 参考文献

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.

  • 6
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值