多尺度目标检测 Multiscale Object Detection

我们在输入图像的每个像素上生成多个锚框。这些定位框用于对输入图像的不同区域进行采样。但是,如果锚定框是以图像的每个像素为中心生成的,很快就会有太多的锚框供我们计算。例如,我们假设输入图像的高度和宽度分别为561和728像素。如果以每个像素为中心生成五个不同形状的锚框,则超过两百万个锚框(561×728×5)需要在图像上进行预测和标记。             

减少锚箱数量并不困难。一种简单的方法是对输入图像中的一小部分像素进行均匀采样,并生成以采样像素为中心的锚框。此外,我们可以在多个尺度上生成不同数量和尺寸的锚箱。请注意,较小的对象比较大的对象更有可能定位在图像上。这里,我们将使用一个简单的示例:

具有1, 1×2,和2在具有形状的图像上可能有4、2和1可能的位置2。 因此,当使用较小的锚定框来检测较小的对象时,我们可以采样更多的区域;当使用较大的锚框检测较大的对象时,我们可以采样较少的区域。             

为了演示如何在多个比例上生成锚框,让我们先读一个图像。它的高度和宽度561×728像素。

%matplotlib inline

from d2l import mxnet as d2l

from mxnet import image, np, npx

npx.set_np()

img = image.imread('../img/catdog.jpg')

h, w = img.shape[0:2]

h, w

(561, 728)

卷积神经网络(CNN)的二维阵列输出称为特征映射。通过定义特征映射的形状,可以确定任意图像上均匀采样的锚盒的中点。             

函数display_anchors定义如下。我们将在特征地图fmap上的每个单元(像素)上生成锚定框。因为坐标轴x和y在锚定框中,锚定被特征地图fmap的宽度和高度分割,0到1之间的值可以用来表示锚定框在特征地图中的相对位置。由于锚框锚定点的中点与特征地图fmap上的所有单元重叠,因此锚定点在任何图像上的相对空间位置必须具有均匀的分布。具体来说,当特征图的宽度和高度分别设置为fmap_w和fmap_h时,该函数将对fmap_h行和fmap_w列进行统一采样,并将它们作为中点生成大小为s(我们假设列表s的长度为1)和不同纵横比(比率)的锚框。

def display_anchors(fmap_w, fmap_h, s):

    d2l.set_figsize((3.5, 2.5))

    # The values from the first two dimensions will not affect the output

    fmap = np.zeros((1, 10, fmap_w, fmap_h))

    anchors = npx.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])

    bbox_scale = np.array((w, h, w, h))

    d2l.show_bboxes(d2l.plt.imshow(img.asnumpy()).axes,

                    anchors[0] * bbox_scale)

我们首先将重点放在小物体的探测上。为了便于在显示时进行区分,此处具有不同中点的锚定框不重叠。我们假设锚框的大小为0.15,特征映射的高度和宽度为4。我们可以看到图片上4行4列的锚框中点分布均匀。

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])

多尺度目标检测 Multiscale Object Detection

把特征地图的高度和宽度减少一半,并使用一个更大的定位框来检测更大的物体。当“大小”设置为0.4时,某些锚框的区域之间将发生重叠。

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])

多尺度目标检测 Multiscale Object Detection

最后,我们将把特征图的高度和宽度减少一半,并将锚框大小增加到0.8。现在锚框的中点就是图像的中心。

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])

多尺度目标检测 Multiscale Object Detection

由于我们已经在多个尺度上生成了不同大小的锚盒,因此我们将使用它们来检测不同尺度下不同大小的对象。现在我们将介绍一种基于卷积神经网络(CNNs)的方法。             

在一定的范围内,假设我们产生高×宽具有不同中点的锚定框集基于ci,带形状的特征地图高×宽,每组锚箱数量为a。

例如,对于第一个比例的实验,我们基于10个(通道数)特征映射生成16组具有不同中点的锚盒,形状为4个,每套含3个锚箱。

根据地面真实边界框的分类和位置,为每个锚框标记一个类别和偏移量。在当前尺度下,目标检测模型需要预测目标的类别和偏移量高×宽,基于输入图像具有不同中点的定位框集。             

我们假设ci特征图是CNN基于输入图像的中间输出。因为每个特征地图都有高×宽不同的空间位置,相同的位置会有ci单位。根据感受野的定义,ci同一空间位置的特征图单元在输入图像上具有相同的感受野。因此,它们表示输入图像在同一感受野中的信息。

因此,我们可以改变ci,在同一空间位置的要素映射单位生成一个定位框。不难看出,本质上,我们利用输入图像在某个接收野的信息来预测输入图像上靠近场的锚盒的种类和偏移量。             

当不同层次的特征映射在输入图像上有不同大小的接收野时,它们被用来检测不同大小的目标。例如,我们可以在一个更大的图像接收层设计一个更大的图像接收层。

Summary

  • We can generate anchor boxes with different numbers and sizes on multiple scales to detect objects of different sizes on multiple scales.
  • The shape of the feature map can be used to determine the midpoint of the anchor boxes that uniformly sample any image.
  • We use the information for the input image from a certain receptive field to predict the category and offset of the anchor boxes close to that field on the image.