在第 14.3 节到第 14.6 节中,我们介绍了边界框、锚框、多尺度目标检测和目标检测数据集。现在我们准备使用这些背景知识来设计一个目标检测模型:单次多框检测(SSD)(Liu et al. , 2016)。该模型简单、快速、应用广泛。虽然这只是大量目标检测模型中的一种,但本节中的一些设计原则和实现细节也适用于其他模型。
14.7.1。模型
图 14.7.1提供了单次多框检测设计的概述。该模型主要由一个基础网络和几个多尺度特征图块组成。基础网络用于从输入图像中提取特征,因此可以使用深度 CNN。例如,原始的单次多框检测论文采用在分类层之前截断的VGG网络 (Liu et al. , 2016),而 ResNet 也被普遍使用。通过我们的设计,我们可以让基础网络输出更大的特征图,从而生成更多的锚框来检测更小的物体。随后,每个多尺度特征图块从前一个块减少(例如,减半)特征图的高度和宽度,并使特征图的每个单元增加其在输入图像上的感受野。
回想一下14.5 节中深度神经网络通过图像的分层表示进行多尺度目标检测的设计 。由于靠近图 14.7.1顶部的多尺度特征图较小但具有较大的感受野,因此它们适用于检测较少但较大的对象。
简而言之,通过其基础网络和多个多尺度特征图块,单次多框检测生成不同数量的不同大小的锚框,并通过预测这些锚框的类别和偏移量(因此边界盒);因此,这是一个多尺度目标检测模型。
下面,我们将描述图14.7.1中不同块的实现细节。首先,我们讨论如何实现类和边界框预测。
14.7.1.1。类别预测层
让对象类的数量为q. 然后anchor boxes有 q+1类,其中类 0 是背景。在某种程度上,假设特征图的高度和宽度是h和w, 分别。什么时候a以这些特征图的每个空间位置为中心生成anchor boxes,一共 hwaanchor boxes需要分类。由于参数化成本可能很高,这通常会使完全连接层的分类变得不可行。回想一下我们在8.3 节中如何使用卷积层的通道来预测类别。单次多框检测使用相同的技术来降低模型的复杂性。
具体来说,类预测层使用卷积层而不改变特征图的宽度或高度。这样,在特征图的相同空间维度(宽度和高度)下,输出和输入之间可以存在一一对应关系。更具体地说,输出特征映射的通道在任何空间位置(x, y) 表示以 (x,y) 输入特征图。为了产生有效的预测,必须有a(q+1)输出通道,其中对于相同的空间位置,具有索引的输出通道i(q+1)+j 代表类别的预测j (0≤j≤q) 对于锚框i (0≤i).
下面我们定义这样一个类预测层,指定a和 q分别通过参数num_anchors
和num_classes
。该层使用了3×3填充为1的卷积层。该卷积层的输入和输出的宽度和高度保持不变。
14.7.1.2。边界框预测层
边界框预测层的设计与类预测层的设计类似。唯一的区别在于每个锚框的输出数量:这里我们需要预测四个偏移量而不是q+1类。
14.7.1.3。连接多个尺度的预测
正如我们提到的,单次多框检测使用多尺度特征图来生成锚框并预测它们的类别和偏移量。在不同的尺度下,特征图的形状或以同一单元为中心的锚框数量可能会有所不同。因此,不同尺度的预测输出的形状可能会有所不同。
在下面的例子中,我们构建了两种不同比例的特征图,Y1
并且Y2
,对于同一个小批量,其中 的高度和宽度Y2
是 的一半Y1
。让我们以类别预测为例。Y1
假设分别为和中的每个单元生成 5 个和 3 个锚框Y2
。进一步假设对象类的数量为 10。对于特征图Y1
和Y2
类预测输出中的通道数为5×(10+1)=55 和3×(10+1)=33,其中任一输出形状为(批量大小、通道数、高度、宽度)。
(torch.Size([2, 55, 20, 20]), torch.Size([2, 33, 10, 10]))
def forward(x, block):
block.initialize()
return block(x)
Y1 = forward(np.zeros((2, 8, 20, 20)), cls_predictor(5, 10))
Y2 = forward(np.zeros((2, 16, 10, 10)), cls_predictor(3, 10))
Y1.shape, Y2