1 多尺度锚框

锚框章节,我们以输入图像的每个像素为中心,生成了多个锚框,每个锚框代表一个样本。然而,若为每个像素都生成锚框,最终可能会得到太多需要计算的锚框。

怎样减少图像上的锚框数量呢?

比如,可以在输入图像中均匀采样一小部分像素,并以它们为中心生成锚框。此外,在不同尺度下,我们可以生成不同数量和不同大小的锚框。比起较大的目标,较小的目标在图像上出现的可能性更多样例如,1×1、1×2和2×2的目标可以分别以4、2、1种可能的方式出现在2×2图像上。因此,当使用较小的锚框检测较小的物体时,可以采样更多区域;对于较大的物体,我们可以采样较少的区域

首先读出图片:

from d2l.mxnet import set_figsize
%matplotlib
import torch
from d2l import torch as d2l

img = d2l.plt.imread('data/img/catdog.jpg')
h, w = img.shape[:2]
h, w

回顾卷积层章节,我们将卷积图层的二维数组输出称为特征图。通过定义特征图的形状,我们可以确定任何图像上均匀采样锚框的中心。

下面函数在特征图(fmap)上生成锚框(anchors),每个像素作为锚框的中心。由于锚框中的(x,y)轴坐标值已经被除以特征图的宽度和高度,因此这些值介于0和1之间,表示特征图中锚框的相对位置。

锚框的中心分布于特征图上的所有单位,因此这些中心必须根据其相对空间位置在任何输入图像上均匀分布。即给定特征图的宽fmap_w、高fmap_h,对任何输入图像中fmap_h行和fmap_w列中的像素进行采样。以这些均匀采样的像素为中心,将生成大小为s且宽高比不同的锚框。

def display_anchors(fmap_w, fmap_h, s):
    d2l.set_figsize()
    # 产生虚拟特征图
    fmap = torch.zeros((1, 10, fmap_h, fmap_w))
    anchors = d2l.multibox_prior(fmap, sizes=s,ratios=[1,2,0.5])
    bbox_scale = torch.tensor((w,h,w,h))
    d2l.show_bboxes(d2l.plt.imshow(img).axes, anchors[0] * bbox_scale)

为什么函数中前两个维度不影响输出?

因为生成锚框只关心特征图的的空间分辨率(fmap_h、fmap_w),我们只需要知道网络这一层把图像分成了$fmap\_h \times fmap\_w$个网格,而不需要真正的特征图像素值。

小目标的探测,由于s设置比较小,锚框未重叠:

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

将特征图的高宽减小一半,使用较大的锚框来检测较大目标,增大锚框尺度,部分锚框重叠:

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

特征图的宽高进一步减小一半,然后将锚框的尺度增加到0.8,此时锚框的中心即是图像的中心。

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


2 多尺度目标检测

在目标检测任务中,同一张图片里,目标的大小可能悬殊巨大(例如远处几十行像素的行人 VS 占满屏幕的大卡车。如果模型只是在一个固定的分辨率下提取特征,小目标很容易在深层网络下采样点过程中彻底丢掉细节。简单来说,多尺度目标检测的核心思路就是:“大目标看深层/低分辨率特征,小目标看浅层/高分辨率特征”

经典特征金字塔网络(FPN)工作原理.

为什么需要多尺度检测?

CNN随着层数加深,Feature Map的变化规律:

  • 浅层特征图:分辨率大,感受野小,包含丰富的位置、纹理和边缘信息,适合小目标检测,但语义信息不够(容易误判);
  • 深层特征图:分辨率小,感受野大,包含强烈的分类语义信息,适合检测大目标,但丢失了精确的位置和边缘细节。

如果没有多尺度机制,模型通常直接在最后一层特征图上预测,导致小目标检出率极低。

小结

  • 在多个尺度下,我们可以生成不同尺寸的锚框来检测不同尺寸的目标。

  • 通过定义特征图的形状,我们可以决定任何图像上均匀采样的锚框的中心。

  • 我们使用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。

课后练习

(1)在深度卷积神经网络 AlexNet 中的讨论中,深度神经网络学习图像特征级别抽象层次,随网络深度的增加而升级。在多尺度目标检测中,不同尺度的特征映射是否对应于不同的抽象层次?为什么?

思考:不完全对应。多尺度目标检测的不同尺度通常对应不同抽象层次,因为它们一般来自于网络不同深度的层;浅层特征具有较高空间分辨率但较低语义抽象,深层特征具有较低空间分辨率但较高语义抽象。但是,现代多尺度检测方法会进行特征融合,例如FPN(Feature Pyramid Network):

  • FPN通过自顶向下的路径和横向连接,将将深层语义信息通过上采样传递给浅层;
  • 结果:不同尺度特征可能同时包含多层次信息。

尺度反应的是空间分辨率和目标大小适应能力,而抽象层次反映的是语义表示能力。二者相关,但不是完全相同。

    Logo

    汇聚全球AI编程工具,助力开发者即刻编程。

    更多推荐