Object Detection and Classification using R-CNNs

  • 1. Faster RCNN
  • 1.1. 图片预处理
  • 1.2. 网络组织
  • 1.3. 网络结构
  • 1.4. 实现细节:训练
  • 1.5. Anchor Generation Layer
  • 1.6. Region Proposal Layer
  • 1.6.1. Region Proposal Network
  • 1.6.2. Proposal Layer
  • 1.6.3. Anchor Target Layer
  • 1.6.4. Calculating RPN Loss
  • 1.6.5. Calculating Classification Layer Loss
  • 1.6.6. Proposal Target Layer
  • 1.7. Crop Pooling
  • 1.8. Classification Layer
  • 1.9. Implementation Details: Inference
  • 1.10. 附录
  • 1.10.1. ResNet 50 Network Architecture
  • 1.10.2. Non-Maximum Suppression (NMS)


1. Faster RCNN

主要看的下面这个链接,写的很好,还需要多看几遍。
Faster rcnn解读

Faster RCNN Pytorch的实现版本。
Faster rcnn code

1.1. 图片预处理

fastrcnn源码解读 faster rcnn batch size_Faster RCNN

在图片送入网络前需要进行预处理阶段。这些步骤在训练和推断的时候必须保持一致。均值向量(一个数字对应于每个颜色通道)并不意味着当前图像的像素值但配置值是相同的所有训练和测试图像。
默认的targetSizemaxSize参数分别是600和1000.
重新缩放图片:

  • targetSize:短一点的图片维度的目标大小。
  • maxSize:不允许超过的图片维度的最大值。

1.2. 网络组织

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

  1. 证明输入图片中有希望的区域(感兴趣区域ROI)可能包含前景目标。
  2. 计算每个ROI分布的目标类的可能性。计算ROI包含确定类中的一个目标的可能性。用户然后可以选择得分最高的目标类作为分类结果。

R-CNNs有三种类型网络组成:

  1. Head
  2. Region Proposal Network(RPN)
  3. Classification Network

R-CNNs使用前几层预训练网络如ResNet 50从输入图像识别有前途的特征。(迁移学习),前几层从预训练网络初始化权重的层构成“head”网络。
由head网络产生的卷积特征图然后传递到RPN网络(使用一系列的卷积和全连接层)去产生可能包含前景目标的有前途的ROIs。
这些有前途的ROIs然后被用去裁剪由head网络产生的特征图的对应区域。这个过程叫"Crop Pooling"。
由"Crop Pooling"产生的区域然后被经过一个分类网络(学习如何分类每个ROI中包含的目标)。

1.3. 网络结构

fastrcnn源码解读 faster rcnn batch size_目标检测_02


w,h是经过预处理的输入图片的宽和高。

1.4. 实现细节:训练

在这个部分,详细介绍训练R-CNN的步骤细节。一旦理解如何训练网络,理解推理就是太简单了。使用训练步骤的子集就好了。训练的目标是调整RPN网络和分类网络的权重,微调head网络的权重(这些权重从预训练模型。)回顾RPN网络的工作是产生有前图的ROIs,分类网络的任务是给每个ROI分配目标类得分。因此,为了训练这些网络,我们需要对应的真实范围(图片中呈现的对象周围的边界框的坐标)和这些对象的类别。真实范围来自免费使用的图像数据库中有一个每张图片的注释文件。注释文件包含图片中显示的每个对象的边界框的坐标和对象类标签。(对象类来自于预定义的对象类列表)。这些数据集支持目标分类和检测调整。PASCAL VOC,COCO。

  • Bounding Box Regression Coefficients :边界框回归系数,也叫(regression coefficients , regression targets).R-CC的目标之一就是产生好的边界框尽可能拟合对象边界。R-CNN产生这些边界框通过使用一个给定的边界框(定义了左上角坐标,宽和高),对它的左上角,宽,高用回归系数集合做调整。目标边界框和原始边界框的左上角x,y坐标分别记为:fastrcnn源码解读 faster rcnn batch size_目标检测_03,宽和高分别记为:fastrcnn源码解读 faster rcnn batch size_卷积_04。然后,回归目标(regression targets)(将原始边界框转换至目标边界的函数的系数)如下给定:
  • fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_05
    这个函数是可逆的,给定回归系数和原始边界框的左上角的坐标、宽和高,目标框的左上角、宽和高可以很简单低计算出来。注意,回归系数是一个没有剪切的放射变换不变量。这一点很重要,当计算分类损失时,目标回归系数是在原始长宽比计算的,而分类网络输出的回归系数是在正方形特征图(长宽比1:1)ROI池化步骤后计算的。

fastrcnn源码解读 faster rcnn batch size_目标检测_06

  • Intersection over Union (IoU) Overlap:交并比重叠。我们需要测量一个给定的边界框与另一个边界框的距离,这个边界框与用来测量边界框尺寸的单位(像素等)无关。这种方法应该是计算直观(两个重合的边界框应该有一个1的重叠量和两个非重叠框应该有0的重叠量)、快速和简单。一种常用的重叠计算方法是交并比重叠。

fastrcnn源码解读 faster rcnn batch size_目标检测_07


fastrcnn源码解读 faster rcnn batch size_卷积_08

和这些预赛的方式,让我们现在深入训练R-CNN的实现细节吧。在软件实现,R-CNN执行分解成几层,如下所示。一层封装了一个逻辑步骤的序列包含通过神经网络运行数据和其他步骤,如比较边界框的重叠,进行非极大值抑制操作。

fastrcnn源码解读 faster rcnn batch size_卷积_09

  • Anchor Generation Layer:这一层生成固定数量的“anchors”(边界框),首先生成9个不同比例和高宽比的anchors,然后通过跨越跨越输入图像的均匀间隔的网格点来复制这些锚点anchors。
  • Proposal Layer:根据边界框回归系数转换这些anchors去生成被转换的anchors。然后修剪anchors的数目通过应用非极大值抑制使用anchor是前景区域的概率。
  • Anchor Target Layer:anchor target layer的目标是产生“好”的anchors集合和对应的前景/背景标签和目标回归系数去训练RPN。本层的输出仅仅被用来训练RPN网络,不被分类层使用。给定anchors集(由anchor generation layer生成的),anchor target layer确定有希望的前景和背景anchors。有希望的前景anchors是那些与真实范围(ground truth)重叠部分大于一个阈值的anchors。背景框是那些和任意真实范围框的重叠区域都小于某个阈值的anchors。这个anchor target layer 输出一些列的边界回归器,度量每个目标anchor与最近的边界框的距离。这些回归其只对前景框有意义,因为对于背景框没有最近边界框的概念。
  • RPN Loss:在训练优化RPN网络时,RPN 损失函数是被最小化的度量。损失函数由以下两部分组合:
  • 由RPN产生的边界框正确分类为前景/背景的比例
  • 一些预测和目标回归系数之间的距离测量.
  • Proposal Target Layer:本层的目标是修剪由Proposal layer生成的anchors列表和产生特定类边界回归目标可以用于训练分类层去产生好的类标签和回归目标。
  • ROI Pooling Layer:实现空间变换网络。实现了一个空间转换网络,该网络对输入的特征图进行采样,给出proposal target layer生成的建议区域的边界框坐标。这些坐标通常不会位于整数边界上,因此需要基于插值的采样。
  • Classification Layer:分类层采用ROI Pooling layer生成的输出特征图,通过一系列卷积层进行传递。输出喂入两个全连接层。第一层生成每个建议的类概率分布,第二层生成一组特定于类的边界框回归器。
  • Classification Loss:和RPN Loss类似,在训练优化分类网络时,分类损失是被最小化的度量。在反向传播过程中,误差梯度也会流向RPN网络,因此训练分类层也会修改RPN网络的权值。分类损失由以下两部分组成:
  • RPN生成的包围框正确分类的比例(作为正确的对象类)。
  • 预测和目标回归系数之间的距离。

1.5. Anchor Generation Layer

Anchor Generation Layer产生一组边界框(称为“锚点框”),大小和长宽比各不相同,散布在整个输入图像中。这些边界框对所有图像都是一样的。它们不知道图像的内容。有些包围框会包围前景对象,而大多数不会。RPN网络的目标是学会识别这些盒子中哪些是好盒子,即,它可能包含一个前景对象,并产生目标回归系数,回归系数当应用到一个锚框时,它会将锚框变成一个更好的边界框(更紧密地适合封闭的前景对象)。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_10

1.6. Region Proposal Layer

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

  • 从anchor列表中,识别背景和前景anchor。
  • 通过应用一组“回归系数”来修改锚点的位置、宽度和高度,以提高锚点的质量(例如,使锚点更适合物体的边界)。

region proposal layer由RPN网络和三层组成–Proposal Layer,Anchor Target Layer ,Proposal Target Layer.

1.6.1. Region Proposal Network

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_11

region proposal layer在由head网络生成的特征图上运行一个卷积层(代码中成为rpn_net),然后是ReLU。rpn_net的输出运行两个1x1卷积核的卷积层去产生背景/前景类分数核概率以及对应边界框回归系数。head网络的步长与生成anchors时使用的步长相匹配,因此,anchor 框的数量与区域建议网络产生的信息是1-1对应的。(anchor 框数=类分数数目=边界框回归系数个数=fastrcnn源码解读 faster rcnn batch size_Faster RCNN_12)

1.6.2. Proposal Layer

Proposal Layer获取由anchor generation layer生成的anchors,并根据前景得分应用非最大抑制来删除盒的数量.它还通过将RPN生成的回归系数应用于相应的锚盒来生成转换后的边界盒。

fastrcnn源码解读 faster rcnn batch size_目标检测_13

1.6.3. Anchor Target Layer

anchor target layer的目标是选择有前途的anchor,用来训练RPN网络:

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

首先看看如何计算RPN损失是很有用的。这将揭示所需的信息,以计算RPN损失,使它很容易跟踪操作的Anchor Target Layer。

1.6.4. Calculating RPN Loss

请记住,RPN层的目标是生成良好的边界框。为了做这个,RPN层必须学会从一组anchor中分类anchor作为背景或前景和计算回归系数修改位置,宽度和高度的前景锚箱使它成为一个“更好的”前景盒子(更紧密地配合前景对象)。RPN损失的表述方式是这样的:鼓励网络学习这种行为。
RPN损失是分类损失和边界框回归损失的和。分类损失使用交叉熵损失来惩罚分类错误的箱子。回归损失采用真实回归系数(使用最接近匹配的地面真相框为前景锚框计算)与网络预测回归系数(请参阅RPN网络架构图中的rpn_bbx_pred_net)之间距离的函数。

fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_14
Classification Loss:
cross_entropy(predicted_class, actual_class)

Bounding Box Regression Loss:

fastrcnn源码解读 faster rcnn batch size_Pytorch_15
对所有前景锚点的回归损失求和。这样做的背景锚没有意义,因为没有相关的地面真相框的背景锚.

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_16

这显示了如何计算给定前景锚的回归损失。我们取预测值(RPN)与目标值(使用距离锚箱最近的ground truth box计算)之间的回归系数之差。有四个组件–对应左上角的坐标和边界框的宽度/高度。光滑L1函数定义如下:

KaTeX parse error: Expected '}', got '_' at position 16: \text { smooth_̲{L1} }(x)=\left…

这里fastrcnn源码解读 faster rcnn batch size_目标检测_17是任意选择的。注意,在python实现中,一个用于前景锚的掩码数组(称为“bbox_inside_weights”)被用来作为向量操作计算损失,并避免for-if循环。

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

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

现在,我们将跟踪anchor target layer的实现,以了解如何计算这些数量。我们首先选择位于图像范围内的锚框。然后,通过计算所有锚点盒(图像内)与所有地面真值盒的IoU(相交大于并集)重叠来选择良好的前景盒。使用这个重叠信息,两种类型的框被标记为前景:

  1. type A:对于每个地面真相框,所有的前景框是和地面真实框具有最大IoU重叠的。
  2. type B:与某些地面真值框最大重叠超过阈值的锚框

fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_18


注意,只有与某些ground truth框重叠超过阈值的锚框才被选为前景框。这样做是为了避免向RPN提出“无望学习任务”,即学习距离最佳匹配地真值框太远的框的回归系数。类似地,重叠小于负阈值的框被标记为背景框。并非所有不是前景框的框都被标记为背景。既不是前景也不是背景的方框被标记为“不在乎”。这些盒子不包括在RPN损失的计算中。

还有两个额外的阈值,它们与我们想要实现的背景和前景框的总数相关,并且与应该作为前景的这部分数量相关。如果通过测试的前景框的数量超过了阈值,我们就将多余的前景框随机标记为“don 't care 不在乎”。类似的逻辑也适用于背景框。

接下来,我们计算了最大重叠的前景盒和相应的地面真值盒之间的边界盒回归系数。这很简单,只需按照公式计算回归系数即可。

这就结束了我们对anchor target layer的讨论。总结一下,让我们列出参数和输入/输出这一层:

参数:

  • TRAIN.RPN_POSITIVE_OVERLAP: anchor box是一个好的前景盒的阈值,默认0.7.
  • TRAIN.RPN_NEGATIVE_OVERLAP:重叠比小于该阈值,标记为背景盒,默认0.3. 前景阈值和背景阈值之间的为不关心的。
  • TRAIN.RPN_BATCHSIZE: 前景和背景盒的总数,默认256.
  • TRAIN.RPN_FG_FRACTION: batch_size中前景盒部分的分数,默认0.5.如果发现的前景盒的数目大于TRAIN.RPN_BATCHSIZExTRAIN.RPN_FG_FRACTION,则将超过的部分(索引随机选择)标记为不关心的。

输入:

  • RPN Network Output(predicted foreground/background class labels, regression coefficients)
  • Anchor boxes (generated by the anchor generation layer)
  • Ground truth boxes

输出:

  • Good foreground/background boxes and associated class labels
  • Target regression coefficients

其他层,proposal target layer,ROI Pooling Layer,Classification layer,都是用来产生计算分类损失所需的信息。就像我们对anchor target layer所做的一样,让我们首先看看如何计算分类损失,以及需要哪些信息来计算它.

1.6.5. Calculating Classification Layer Loss

与RPN损失类似,分类层损失也有两个组成部分:分类损失和边界盒回归损失:
fastrcnn源码解读 faster rcnn batch size_目标检测_19
RPN层和分类层之间的关键区别是,RPN层只处理前景和背景这两个类,而分类层处理我们的网络正在训练来分类的所有对象类(加上背景)。

分类损失是以真实对象类和预测类得分为参数的交叉熵损失。计算方法如下:

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_20

fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_21

边界盒回归损失的计算方法与RPN相似,只是回归系数是类特异性的。该网络计算每个对象类的回归系数.目标回归系数显然只适用于正确的类,即与给定锚盒重叠最大的ground truth包围盒的对象类。在计算损失时,使用一个掩码数组,它为每个锚盒标记正确的对象类。不正确的对象类的回归系数将被忽略。这个掩模阵列允许损失的计算是一个矩阵乘法,而不需要for-each循环。

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

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

现在让我们看看如何在Proposal Target Layer和classification layers中计算这些数量。

1.6.6. Proposal Target Layer

Proposal Target Layer的目标是从 Proposal Layer输出的roi列表中选择有前途的roi。这些有前图的ROIs会被用来从head层生成的特征图执行crop pooling然后传递给剩下的网络(head_to_tail 头到尾)计算预测类别分数和框回归系数。
与anchor target layer类似,选择好的建议(那些与gt box有明显重叠的建议)传递到分类层是很重要的。否则,我们将要求分类层学习一个“无望的学习任务”。
Proposal Target Layer从proposal layer计算的roi开始。利用每个ROI与所有地面真值框的最大重叠,将ROI分为背景ROI和前景ROI。前景roi是那些最大重叠超过阈值(TRAIN.FG_THRESH,默认值0.5)的roi。背景roi指那些最大重叠在TRAIN.BG_THRESH_LOTRAIN.BG_THRESH_HI(默认0.1,0.5)之间的roi。这是一个“hard negative mining”的例子,用来向分类器提供困难的背景例子。

有一些额外的逻辑,试图确保前景和背景区域的总数是恒定的。如果发现的背景区域太少,则尝试通过随机重复一些背景索引来填补空白。
然后,计算每个ROI与最匹配的地面真值框之间的边界盒目标回归目标(这也包括背景ROI,因为这些ROI也存在重叠的地面真值框)。如下图所示,对所有类展开了这些回归目标。

fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_22


bbox_inside_weights数组充当掩码。对于每个前景ROI,正确的类仅为1。对于背景roi也是0。因此,在计算分类层损失的边界盒回归分量时,只考虑前景区域的回归系数。这不是分类损失的情况——包括了背景roi,并且它们属于“背景”类。

输入:

  • 由proposal layer产生的rois
  • ground truth information

输出:

  • 满足重叠条件的前景和背景rois被选择
  • ROIs的特定目标回归系数

参数:

  • TRAIN.FG_THRESH: (default: 0.5) 前景ROIs的阈值
  • TRAIN.BG_THRESH_HI: (default 0.5)
  • TRAIN.BG_THRESH_LO: (default 0.1) 0.1~0.5之间为背景ROIs
  • TRAIN.BATCH_SIZE: (default 128)最大的前景背景框被选择数
  • TRAIN.FG_FRACTION: (default 0.25)前景最大的比例

1.7. Crop Pooling

Proposal target layer给我们产生有前途的ROIs,我们可以根据相关的类标签和训练中使用的回归系数进行分类。下一步是从head网络生成的convolutional feature map中提取这些roi对应的区域。然后,将提取出的特征图遍历网络的其余部分(上图中的“tail”),以生成每个ROI的对象类概率分布和回归系数。 Crop Pooling层的工作是从卷积特征图中进行区域提取。
关于“空间转换网络”的论文(Anon. 2016)*描述了crop pooling背后的关键思想。目标是将一个翘曲函数(由2x3仿射变换矩阵描述)应用到一个输入特征映射以输出一个翘曲的特征映射。如下图所示。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_23


crop pooling包含两步:

  1. 对于一组目标坐标,应用给定的仿射变换生成源坐标网格。

fastrcnn源码解读 faster rcnn batch size_目标检测_24
这里,fastrcnn源码解读 faster rcnn batch size_目标检测_25是归一化后的高/宽坐标(类似于图形中使用的纹理坐标),所以fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_26

  1. 在第二步中,在源坐标处采样输入(源)映射,以生成输出(目标)映射。在这步,每一个fastrcnn源码解读 faster rcnn batch size_Pytorch_27坐标定义了输入中采样核(例如,双线性采样核)的空间位置,以获得输出特征图中特定像素处的值。

空间变换中描述的采样方法提供了一种可微分的采样机制,允许损失梯度流回输入特征图和采样网格坐标。
幸运的是,PyTorch实现了crop pooling,API包含两个函数,反映了这两个步骤。torch.nn.functional.affine_grid接受一个仿射变换矩阵,并生成一组采样坐标和torch.nn.functional.grid_sample在这些坐标处对网格进行采样。向后步中的反向传播梯度由pyTorch自动处理。

要使用crop pooling,我们需要做以下工作:

  1. 将ROI坐标除以“head”网络的步长。proposal target layer层生成的roi坐标在原始图像空间(!800x600)。为了将这些坐标带入“head”生成的输出特征图的空间,我们必须将它们除以步幅长度(当前实现中为16)。
  2. 要使用上面显示的API,我们需要仿射变换矩阵。这个仿射变换矩阵的计算如下所示
  3. 我们还需要目标feature map上的x和y维度上的点的数量。这是由配置参数cfg.POOLING_SIZE(默认7)提供的。因此,在crop pooling过程中,非正方形的roi被用来从卷积特征图中裁剪出被扭曲成恒定大小的方形窗口的区域。这种扭曲作为crop pooling的记过传递到更远的卷积和需要固定维输入的全连接层前必须完成。

fastrcnn源码解读 faster rcnn batch size_Pytorch_28

1.8. Classification Layer

Crop Pooling采用Proposal Target Layer输出的ROI盒和“head”网络输出的卷积特征图,输出方形特征图。然后通过ResNet后续的第4层,通过空间维度上的平均池来传递特征图。结果(在代码中称为“fc7”)是每个ROI的一维特征向量。这个过程如下所示。

fastrcnn源码解读 faster rcnn batch size_Pytorch_29


这个特征向量然后被传送至两个全连接层–bbox_pred_net,cls_score_net.cls_score_net层为每个边界框生成类得分(可以通过应用softmax将其转换为概率),bbox_pred_net层生成类特定的边界框回归系数,这些回归系数与Proposal Target Layer生成的原始边界框坐标相结合,生成最终的边界框。这些步骤如下所示。

fastrcnn源码解读 faster rcnn batch size_Pytorch_30


最好回忆一下这两组边界框回归系数之间的差异-- 一组由RPN网络生成,另一组由分类网络生成。第一组用于训练RPN层生成良好的前景边界框(更紧密地适应对象边界)。目标回归系数即Anchor target layer生成将ROI框与其最匹配的ground truth包围框对齐所需的系数。很难准确地识别这种学习是如何发生的,但是我可以想象RPN卷积和全连接层学习如何将神经网络生成的各种图像特征解释为解密好的对象边界框。当我们在下一节考虑推论时,我们将看到如何使用这些回归系数。

第二组边界框系数由分类层生成。这些系数是特定于类的,即。,每个对象类为每个ROI框生成一组系数。这些目标的目标回归系数由Proposal Target Layer生成。请注意,分类网络是在应用于head网络输出的仿射变换(如上所述)的结果的方形特征图上操作的。但由于回归系数对无剪切仿射变换不发生变化,因此建议目标层计算出的目标回归系数可以与分类网络生成的目标回归系数进行比较,作为有效的学习信号。这一点事后看来是显而易见的,但我花了一些时间才明白。

值得注意的是,在训练分类层时,错误梯度也会传播到RPN网络。这是因为在Crop Pooling期间使用的ROI箱坐标本身就是网络输出,因为它们是将RPN网络生成的回归系数应用到锚箱的结果。在反向传播期间,错误梯度将通过作Crop Pooling传播回RPN层。计算和应用这些梯度是很难实现的,但是值得庆幸的是,PyTorch提供了一个内置模块的裁剪池API,而且计算和应用梯度的细节是在内部处理的。这一点在更快的RCNN论文(Ren et al. 2015)*的3.2节(iii)中进行了讨论。

1.9. Implementation Details: Inference

在进行推理的步骤如下所示:

fastrcnn源码解读 faster rcnn batch size_目标检测_31

Anchor target and proposal target layers 不被使用。RPN网络应该学会了如何将锚盒分为背景盒和前景盒,并生成良好的边界盒系数。Proposal Layer简单地将边界框系数应用于排名靠前的锚框,并执行NMS来消除大量重叠的框。为了更加清晰,这些步骤的输出如下所示。结果框被发送到分类层,在那里生成类分数和类特定的边界框回归系数。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_32

红色方框显示的是排名前6位的anchor。绿框表示应用RPN网络计算的回归参数后的锚框。绿色方框似乎更适合底层对象。注意,应用回归参数后,矩形仍然是矩形,即没有剪切。还要注意矩形之间的明显重叠。这种冗余通过应用非极大值抑制来解决。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_33


红色方框显示NMS之前的前5个边框,绿色方框显示NMS之后的前5个边框。通过抑制重叠的方框,其他方框(得分列表中较低的方框)有机会向上移动。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_34


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

为了显示最终的分类结果,我们应用了另一轮的NMS,并对类分数应用了对象检测阈值。然后,我们绘制所有符合检测阈值的roi对应的转换边界框。结果如下所示。

fastrcnn源码解读 faster rcnn batch size_目标检测_35

1.10. 附录

1.10.1. ResNet 50 Network Architecture

fastrcnn源码解读 faster rcnn batch size_目标检测_36

fastrcnn源码解读 faster rcnn batch size_fastrcnn源码解读_37

1.10.2. Non-Maximum Suppression (NMS)

非最大抑制是一种技术,用于减少候选框的数量,方法是消除重叠超过阈值的框。首先根据一些标准(通常是右下角的y坐标)对这些框进行排序。然后我们遍历方框列表,并禁止那些IoU与考虑中的方框重叠超过阈值的方框。根据y坐标对这些盒子进行排序,会在一组重叠的盒子中保留最低的那个盒子。这可能并不总是理想的结果。在R-CNN中使用的NMS是根据前景得分来排序的。这将导致在一组重叠的框中保留得分最高的框。下图显示了这两种方法的区别。黑色的数字是每个框的前景得分。右边的图像显示了对左边的图像应用NMS的结果。第一个图使用标准的NMS(方框按右下角的y坐标排列)。这将导致框中保留较低的分数。第二个图使用了修改过的NMS(按前景得分对框进行排序)。这将导致保留前景得分最高的框,这更可取。在这两种情况下,盒之间的重叠被认为是高于NMS重叠保持。

fastrcnn源码解读 faster rcnn batch size_卷积_38


组重叠的盒子中保留最低的那个盒子。这可能并不总是理想的结果。在R-CNN中使用的NMS是根据前景得分来排序的。这将导致在一组重叠的框中保留得分最高的框。下图显示了这两种方法的区别。黑色的数字是每个框的前景得分。右边的图像显示了对左边的图像应用NMS的结果。第一个图使用标准的NMS(方框按右下角的y坐标排列)。这将导致框中保留较低的分数。第二个图使用了修改过的NMS(按前景得分对框进行排序)。这将导致保留前景得分最高的框,这更可取。在这两种情况下,盒之间的重叠被认为是高于NMS重叠保持。

fastrcnn源码解读 faster rcnn batch size_Faster RCNN_39


fastrcnn源码解读 faster rcnn batch size_Pytorch_40