[SSD: Single Shot MultiBox Detector]:开源项目a-PyTorch-Tutorial-to-Object-Detection

学习 翻译开源项目a-PyTorch-Tutorial-to-Object-Detection

paper:SSD: Single Shot MultiBox Detector

如有错误,欢迎指正,感激不尽

Object Detection

Objective

  • 建立一个可以检测并定位图片中特定对象的模型

Concepts

  • Single-Shot Detetion 单发检测:早期的目标检测架构由两部分构成(1)一个用于对象定位的区域处理网络(2)用于检测该区域的分类器。这些所需到计算量非常大,因此不适用于真实世界场景和实时应用。单发模型将定位和检测任务封装在网络的一次前向扫描中,显著增加量检测速度,同时也使模型可以部署在轻量级的硬件上。

  • Multiscale Feature Maps 多尺度特征图:在图像分类任务中,我们的预测基于最终的卷积特征图——原始图像的最小但最深的表示。在目标检测中,来自中间卷积层的特征图也可以被直接使用,因为它们在不同到尺度上表示原始图像。因此,在不同特征图上运行的固定大小的过滤器将能够检测各种尺度的对象。

  • Priors 预选框?:这些预先计算的框被定义为特定特征图上的特定位置,他们具有特定的长宽比和比例。它们被仔细的挑选以匹配数据集中对象真实的边界框。

  • Multibox 多框体:这是一种将预测对象的边界框装换为回归问题的技术,将检测到的对象的坐标回归到其真实的坐标。另外,对于每个预测的框体,针对各种对象类型生成分数。预选框是预测的可行起点,因为它们是根据真实数据建模的。因此,将有与预选框一样多的预测框,其中大多数将不包含任何对象。

  • Hard Negative Mining 困难负样本挖掘?:这是指从模型的预测结果中精确的选则那些最严重到错误预测,而后迫使模型学习这些样例。换句话说,我们只挖掘那些模型认为最难预测正确的附样本。在对象检测中,绝大多数预测框都不包含对象,这样做也有助于减少负-正样本的不平衡性。

  • Non-Maximum Suppression 非最大抑制:在任何给定位置,多个预选框可能会明显重叠。 因此,这些预选框产生的预测实际上可能是同一对象的重复。 非最大抑制(NMS)是一种通过抑制除得分最高的预测之外的所有预测来消除冗余预测的方法。

Overview

Some definition

关于框:其中边界框(bounding box)是环绕对象的框,表示其边界。所有的框都在图中显示,我们需要描述(测量)他们的位置、形状、大小等其他属性。

Boundary coordinates 边界坐标

  • 表示框的最容易想到方法是通过构成框的边界的x和y轴方向线的像素坐标。框体的边界坐标为(x_min, y_min, x_max, y_max)

  • 但是,如果并不知道图像的实际尺寸,像素坐标就没用了。一个更好的表示所有坐标的方法是使用他们到分数形式。现在,坐标是尺寸具有了不变性,所有图像的所有方框都以相同的比例尺进行测量。

Center-Size coordinates 中心尺寸坐标

  • 这是一个更明确的表示框体位置和尺寸的方法。框体的中心尺寸的坐标为(c_x, c_y, w, h)

Jaccard Index 交并比

  • Jaccard Index or Jaccard Overlap or Intersection-over-Union(Io):描述两集合的重合程度
  • 若交并比为1,则两者为相同到框体;若交并比为0,则表示两者为完全不相交

Multibox 多框体

Multibox是一个用于对象检测的技术,其由两部分组成——

  • 标记可能包含或不包含目标的框体坐标: 回归任务
  • 对这些框体中的多种目标进行评分,包括意味着没有目标存在的背景类别:分类任务

Single Shot Detector(SSD)

SSD是一个纯卷积神经网络,其由三部分组成——

  • Base convolutions 基础卷积: 源于一个已有的分类架构,用于提供较低级的特征图
  • Auxiliary convolutions 辅助卷积: 添加在基础网络之上用于提高较高级的特征图
  • Prediction convolutions 预测卷积: 将从特征图中定位和标记对象

Base Convolutions-part 1

首先,为何基于一个已经存在的网络?

因为,有些网络已被证明可以在图像分类中取得较好效果,那些网络已尽能够很好的捕获图像的本质信息。同样的卷积特征对于目标检测很有用,尽管从局部意义上说,相对于整个图像,我们更关心目标存在的特定区域。

使用在可靠分类数据集上预选练的层还有些额外优势。即所谓 迁移学习(Transfer learning) 。通过从不同但密切相关的任务中借用知识,我们甚至在开始之前就已经取领先了一步。

本文的作者采用VGG-16架构作为其基本网络。 它的原始形式相当简单。

他们建议使用已经在 ImageNet Large Scale Visual Recognition Competition (ILSVRC) 分类任务中使用的预训练网络。相对于其他流行的架构,该网络已经用PyTorch中实现了。不过也可以选择其他跟大规模的网络例如残差网络。只要注意其对算力的需求就好。

根据文章,我们需要对预训练的网络进行一些调整以应对目标检测中的挑战。有些调整是复合逻辑且必要的,同时,也有部分是为了方便和偏好。

  • 如上说明,输入图像尺寸 将调整为 300, 300
  • 对于用于减半特征图尺寸的第三池化层,将使用向上取整函数代替向下取整函数来决定输出尺寸。这意味着,只对奇数尺寸的输入特征图有效。从计算图可以算出,图像的输入尺寸为300, 300conv3_3的输出特征图尺寸为75_75,将它减半为38, 38而不是不便于计算的37, 37
  • 我们将 第五池化层 的 步长为22, 2卷积核改为步长为13, 3卷积核。这使得它不再对上一卷积层输出的特征图进行减半操作。
  • 我们不需要全连接接层。我们将完全抛弃fc8,但是将fc6, fc7重做为卷积层conv6, conv7

前三个改变很直观,当最后一个可能需要一些解释。

FC → Convolutional Layer

我们如何将完全连接的层重新参数化为卷积层?

考虑以下情形。

在点型的图像分类设置中,第一个全连接层不能由先前的特征图或图像直接映射得到。我们需要将他们展平到一维结构。

在这个例子中,输入图像的尺寸为2, 2, 3,展平到长度为12的一维向量。为了使输出尺寸为2,全连接层需要用两个长度同样为12的向量与展平的图像进行两次点乘。这两个灰色的向量即为全连接层参数

现在,考虑使用卷积层得到2个输出的情况。

输入图像尺寸为2, 2, 3不需要展平。卷积层使用两个12个元素且与图像尺寸相同的滤波器,与图像进行两次卷积。这两个灰色的滤波器即为卷积层参数

这里有个关键点——在这两种情况中Y0Y1相同

两种情况等价

这说明了什么?

当输入图像尺寸为H,WI通道时,输出尺寸N的全连接层等价于N通道输出、尺寸为H,W的卷积层,前提是全连接网络N,H * W * I与卷积层N,H,W,I的参数相同。

因此,任何全连接层可以被等价的转换为卷积层,仅通过简单的reshaping its parameters

Base Convolutions – part 2

现在我们知道如何将原VGG-16架构中的fc6fc7分别转换为conv6conv7

VGG-16的输入图像尺寸为224, 224, 3,可以看到conv5_3的输出尺寸为7, 7, 512,因此——

  • fc6展平的输入为7 * 7 * 512、输出为4096,其参数维度为4096, 7 * 7 * 512等效的卷积层conv64096通道、7, 7的卷积核,这需要将参数维度调整到4096, 7, 7, 512

  • fc7输入尺寸为4096输入为4096,需要的参数维度为4096, 4096。其输出可被认为是1, 14096输入通道的图像。等价的卷积层conv71, 14096输出通道的卷积核,需要将参数维度调整到4063, 1, 1, 4096

我们可以看到conv64096个滤波器,每一个的维度为7, 7, 512conv74096个滤波器,每个尺寸为1, 1, 4096

这些滤波器数量巨大,计算耗时长。

为了避免这种情况,作者选择同时减小滤波器数量和尺寸通过对转换而来的卷积层进行下采样。

  • conv6将使用1024个滤波器,每一个维度为3, 3, 512。因此,因此参数维度通过上采样从4096, 7, 7, 512调整到1024, 3, 3, 512

  • conv7将使用1024个滤波器,每一个维度为1, 1, 1024。 因此,因此,因此参数维度通过上采样从4096, 7, 7, 4096调整到1024, 3, 3, 1204

基于本文的参考,我们将沿特定维度选择每个第m个参数来进行采样。这个过程被称为decimation.

由于conv6的卷积核仅通过保持每个第3个值从7、7减少到3、3,因此卷积核中现在存在漏洞。因此,我们需要make the kernel dilated or atrous(空洞卷积)。

这对应于3的膨胀(与抽取因子m = 3相同)。 但是,作者实际上使用的是6的膨胀,这可能是因为第5个合并层不再将前面的特征图的尺寸减半。

现在,我们可以展示我们的基础网络,修改后的VGG-16

在上图中,要特别注意conv4_3和conv_7的输出。您会很快明白为什么。

Auxiliary Convolutions 空洞卷积

现在,我们将在基础网络之上堆叠更多的卷积层。 这些卷积提供了附加的特征图,每个特征图都逐渐小于最后一个。

我们展示了4个卷积块,每个包含两层。尽管通过在基础网络中是通过池化来实现尺寸减小,但在这里,每第二层的卷积步长设置为2即可。

同样,注意conv8_2, conv9_2, conv10_2conv11_2的特征映射。

A detour 一个插曲

在我们转向预测卷积之前,我们必须首先明白我们要预测什么。当然,是目标和其位置,但以什么形式表示呢?

在这里,我们必须了解**priors**及其在SSD中扮演的关键角色。

Priors 预选框

目标预测可以是多种多样的,并不是仅指他们的类型。目标可能出现在任何位置,以任何的尺寸和形状。我们并不能说如何出现有无限的可能。尽管数学意义上可以这么说,但许多情况是根本不可能或我们不关心的。此外,我们不需要坚持边界框达到像素级别的完美。

实际上,我们可以将潜在预测的数学空间离散为成千上万的可能性。

预选框是预先计算得到的固定的框,它们共同代表了可能的框和近似框预测的范围

预选框是根据我们数据集中地面真实对象的形状和大小手动选择的,但要谨慎选择。通过将这些预选框放置在特征图中的每个可能位置,我们还需要考虑位置的变化。

在定义预选框时,作者指出——

  • 他们将被应用于各个高级和低级的特征图,这些特征图来自conv4_3, conv7, conv8_2, conv9_2, conv10_2, 和 conv11_2。这些与上图中所指的特征图相同。

  • 如果预选框的尺度为s,则其面积为边长为s的正方形的面积。尺寸最大的特征图conv4_3的优先级为0.1,即图像尺寸的10%,其余的优先级的比例从0.2线性增加到0.9。所以,较大的特征图具有较小比例的预选框,因此非常适合检测较小的对象。

  • 在每特征图的每一个位置,存在不同纵横比的预选框。所有的特征图都有比例为1:1, 2:1, 1:2的预选框。这其中conv7, conv8_2, 和conv9_2输出的特征图同时具有比例为3:1, 1:3。此外,所有的特征图将还会有一个额外的预选框,其长框比为1:1,这个尺寸是但前和后续特征图尺寸的几何平均。

Feature Map From Feature Map Dimensions Prior Scale Aspect Ratios Number of Priors per Position Total Number of Priors on this Feature Map
conv4_3 38, 38 0.1 1:1, 2:1, 1:2 + an extra prior 4 5776
conv7 19, 19 0.2 1:1, 2:1, 1:2, 3:1, 1:3 + an extra prior 6 2166
conv8_2 10, 10 0.375 1:1, 2:1, 1:2, 3:1, 1:3 + an extra prior 6 600
conv9_2 5, 5 0.55 1:1, 2:1, 1:2, 3:1, 1:3 + an extra prior 6 150
conv10_2 3, 3 0.725 1:1, 2:1, 1:2 + an extra prior 4 36
conv11_2 1, 1 0.9 1:1, 2:1, 1:2 + an extra prior 4 4
Grand Total 8732 priors

SSD300一共有8732个预选框!

Visualizing Priors

我们根据它们的 尺寸纵横比 定义预选框。

解这个方程组可以得到预选框的尺寸wh

现在我们可以将他们绘制在各自的特征图上。

例如,让我们尝试在conv9_2中的特征图的中心图块上显示预选框。

其他的样例

Predictions vis-à-vis Priors

之前,我们说使用回归的方法寻找对象边界框的坐标。但是显然,预选框无法表示最终的预测框吗?

不能。

同样,我想重申,预选框近似地表示预测的可能性。

这一位这,我们需要实验每一个预选框作为预测的近似起点,然后找出为了获取对边界框的更精确的预测,需要作出多少调整

因此,如果每个预测的边界框与预选框都略有偏差,而我们的目标是计算该偏差,则需要一种方法来对其进行度量或量化。

考虑这只猫,它的预测边界框以及从预选框中作出的预测。

假设它们以我们熟悉的中心尺寸坐标表示。

这就是之前哪个问题的答案(a-detour)。考虑调整每一个预选框以包含精确的预测。这四项偏差(g_c_x, g_c_y, g_w, g_h)将由边界框的坐标回归得到

如图,每个偏移量都通过预选框的相应尺寸进行归一化。 这是有道理的,因为对于同样的偏移,对于预选框的大小将不那么重要。

Prediction convolutions

之前,我们为六个不同比例和粒度的特征图标记并为其定义了预选框。分别是conv4_3conv7conv8_2conv9_2conv10_2conv11_2

随后,对于每个特征图上每个位置的预选框,我们想要预测 ——

  • 与边界框的偏差(g_c_x, g_c_y, g_w, g_h)

  • 框体的n_classes分数,其中n_classes表式,对象的类型总数(包括背景类)。

为了以最简单的方式做到这一点,每个特征图我们都需要两个卷积层 ——

  • 一个定位预测卷积层,其使用3, 3的卷积核(步长和填充皆为1)估计每个区域,以及该区域每个预选框的四个滤波器。

    预选框的4滤波器是为了从该预选框预测的边界框中计算四个编码的偏移量(g_c_x,g_c_y,g_w,g_h)

  • 一个类别预测卷积层,其使用3, 3的卷积核(步长和填充皆为1)估计每个区域,以及该区域每个预选框的n_classes滤波器。

    预选框的n_classes 滤波器是为了从该预选框预测的边界框中计算n_classes 分数。

我们所有的滤波器都使用3, 3的卷积核。

实际上,我们并不需要与预选框形状相同的卷积核(或滤波器),因为不同的滤波器将通过学习,以针对不同的预选框形状做出预测。

让我们看一下这些卷积的输出。再次考虑conv9_2输出的特征图。

位置和类别的输出层分别表示为蓝色和黄色。可以看出截面尺寸(5,5)没有改变。

我们真正感兴趣的是第三维,即通道数。 这些包含实际的预测。

如果选择位置预测中的一个块(任意块)并将其展开,将会看到什么?

在定位预测中,每个位置处的通道值表示相对于该位置处预选框的编码的偏差。

接下来,类别预测也相同,假设 n_classes = 3

与之前相同,这些通道表示了该位置预选框的类别得分。

现在,我们明白conv9_2的特征图长啥样了,我们可以将其重塑为更合适的形式。

我们已经将150个预测按顺序排列,对人类而言,这应该看起来更直观。

但是别在这儿止步,我们可以对所有的层做同样的预测,然后将他们堆叠在一起。

我们先前计算过,我们的模型中一共计算了8732个预选框。因此,一共有8732个使用偏差编码形式的预选框,8732组类别分数

这就是预测部分的最终输出。

Multibox loss 多框体损失函数?

根据我们预测的本质,可以看出我们需要一个独一无二的损失函数。很多人之前可能计算回归和分类任务的损失,但很少能够将二者结合。

显然,我们的损失函数必定由两中类型的预测组成——框体定位和分类分数。

这将引出以下几个问题——

回归边界框将使用什么损失函数?

我们是否将多类交叉熵用于分类分数?

我们将以什么比例合并它们?

我们如何将预测的框体与实际相匹配?

我们有8732个预测!这些大多数都不会包含任何对象吗?我们需要考虑他们吗?

……

Matching predictions to ground truths 匹配预测和真实值

记住,任何监督学习算法都有一个缺点:我们需要能够将预测与真实值相匹配。这很棘手,因为对象检测比普通学习任务更开放。

为了使模型能够学习,我们需要使得预测和图像中实际存在的对象之间进行比较。

预选框能够是我们做到这一点。

  • 计算8732个预选框和N个真实目标的交并比,这将会得到一个尺寸为8732, N的张量。

  • 将每个预选框匹配到与其重叠最大的目标。

  • 如果预选框与目标的交并比小于0.5,则不能认为其包含目标,应测这是一个**负面 匹配**。考虑到我们有几千个预选跨国,大多数预选框经过测试都是负面匹配。

  • 另一方面,有一半的预选框将会与目标显著重叠 (交并比大于0.5),可以说其包含对象。这是**正面 匹配**。

  • 现在我们已经将每个预选框都与真实值进行了匹配,实际上,我们也已尽将每个预测框与真实值进行了匹配。

让我们通过一个示例展示这个逻辑。

简单的,我们假设有7个红色的预选框,3个黄色的真实框。

按照上述的步骤进行操作,产生以下匹配结果——

现在,每个预选框都有一个正面或负面的匹配项。通过拓展,每个预测框也匹配了一个正面或负面的项。

与一个真实目标匹配的预测项现在有真实的坐标,这些坐标将作为定位的目标,用于回归。自然的,负面匹配则没有目标坐标。

所有的预测框都有了真实的标签,同时若是正面匹配则有相应的类别,负面匹配则为背景类。这些作为类别预测的目标,即为分类任务。

Localization loss 定位损失

负面匹配没有真实的坐标,这很合理。为何要训练模型框出空的区域呢?

因此,我们将仅根据正面匹配预测框回归到相应真实坐标的准确度,来计算定位损失。

由于我们以偏移量(g_c_x, g_c_y, g_w, g_h)的形式预测定位框,因此在计算损失之前,我们还需要相应地编码真实框的坐标。

定位损失是正面匹配定位框的编码偏移量和真实值之间的平均*Smooth L1**损失。

s m o o t h L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 = o t h e r w i s e smooth_{L1}(x) =\left\{ \begin{aligned} 0.5x^2 & & if|x|<1 \\ |x| - 0.5 & = & otherwise \\ \end{aligned} \right. smoothL1(x)={0.5x2x0.5=ifx<1otherwise

Confidence loss 置信损失

每一个预测,不论是正面还是负面,都有会有一个与之相关的真实标签。模型可以识别包含或缺少目标,这一点很重要。

考虑到通常一个图像中只有少量目标,然而大量数以千计的预测实际上并不包含目标。如果负面匹配压倒了肯定匹配,我们得到的模型将很难检测目标,因为我们总是教他检测背景类。

很容易想到解决方案——限制用于计算损失的负面匹配的数量。但如何选择呢?

那么,为什么不使用模型中最错误的那些呢?换句话说,只在模型发现很难识别没有对象的地方使用这些预测。这称为困难负样本挖掘

我们将使用的困难负样本数量N_hn通常是此图像的正面匹配数量的固定倍数。在这种特殊情况下,作者决定使用三倍的困难负样本,即N_hn = 3 * N_p。通过找到每个负面匹配预测的交叉熵损失,并选择具有最高N_hn损失的预测,可以发现最难负样本。

那么,置信度损失就是正负匹配中交叉熵损失的总和。

可以注意到它通过正匹配的数量求平均值。

Total loss 总损失

多框体损失是两种损失的总和,以α加权。

通常,我们不需要决定α,它是一个可学习的参数。

然而,对于SSD来说,作者简单的将两个损失函数相加,即α = 1

Processing predictions 预测过程

模型训练号后,我们可以在实际图像上进行应用。然而这些预测仍然是原始形式——两个张量分别包含8732个预选框的偏移量和每一类的分数。这些需要进行处理,以获得最终的带有标签的人类可理解的边框。

这需要以下操作——

  • 有8732个预测框,表示为相对于它们各预选框的偏移量(g_c_x, g_c_y, g_w, g_h) 。将它们解码为实际上可以直接得到的边界坐标。

  • 然后,对于每个非背景类,

    • 为每个8732个框提取该类的分数。
    • 消除不符合此分数特定阈值的框。
    • 其余(未排除)框是此特定对象类别的候选项。

此时,如果要在原始图像上绘制这些候选框,则会看到许多高度重叠的框,这些框显然是多余的。这是因为从我们掌握的成千上万个预选框中选择,一个以上的预测对应于同一对象是十分可能的。

如下图

显然其中只有三个物体–两只狗和一只猫。但是根据模型,有三只狗和两只猫。

请注意,这个例子还凑合。实际可能会更糟。

现在,对于人来说,很明显可以看出哪些框在指向同一对象。这是因为人脑可以处理某些框体和一个特定目标之间的重合。

实际上该如何操作呢?

首先,根据可能性排列每个类的候选。

我们已经按照他们的分数对其进行了排序。

下一步是找到哪些候选者是多余的。我们已有一种工具来判断两个框之间的重叠,通过交并比。

因此,如果我们要绘制给定类在中所有候选之间的交并比,我们可以评估每一对,如果发现有显着重叠,则仅保留更可能的候选人。

这样,我们淘汰了多余的候选——每只动物各一。

此过程称为非最大抑制 Non-Maximum Suppression (NMS) 因为当发现多个候选者彼此之间有明显重叠,表示它们指向相同的对象时,我们将压制除得分最高的对象以外的所有对象。

从算法上讲,执行过程如下:

  • 在为每个非背景类选择候选后,
    • 按照可能性降序排列该类别的候选
    • 考虑得分最高的候选人。消除所有分数较低且交并比大于0.5的候选
    • 考虑仍在池中的下一个得分最高的候选者。消除所有分数较低交并比大于0.5的候选
    • 重复直到遍历完整个候选序列。

最终结果是,对于图像中的每个对象,只有一个最优边界框。

非最大抑制对于取得质量检测至关重要。

你可能感兴趣的:(笔记,卷积,python,pytorch,神经网络,深度学习)