Skip to content

多尺度目标检测

一、为什么需要多尺度目标检测

在之前的锚框章节里,我们是给每个像素都生成锚框,这样会产生大量的锚框,计算量太大了。比如一张 561×728 的图片,每个像素生成 5 个锚框,就会有 200 多万个锚框,这显然不现实。

而且,不同大小的目标在图片里出现的频率不一样:小目标在图片里可能有很多种出现的位置,大目标的位置就少一些。所以我们需要在不同的尺度下生成不同数量和大小的锚框

  • 小目标: 小目标在图片里可能有很多种出现的位置,用小锚框,多采样一些区域。
  • 大目标: 大目标的位置就少一些,用大锚框,少采样一些区域。

二、多尺度锚框的生成

特征图:

卷积神经网络CNN章节里,我们介绍了卷积神经网络的特征图,它是卷积层的输出,尺寸比输入图片小。 alt text

我们可以通过特征图来生成多尺度的锚框。特征图是卷积神经网络的中间输出,它的尺寸比输入图片小,我们可以在特征图上均匀采样一些点,以这些点为中心生成锚框,这样就能减少锚框的数量。

1. 特征图和锚框的关系

特征图的尺寸决定了我们在输入图片上采样的锚框中心的数量。比如特征图是 4×4 的,我们就在输入图片上均匀采样 4 行 4 列的点,作为锚框的中心;如果特征图是 2×2 的,就采样 2 行 2 列的点。

2. 不同尺度的锚框生成

我们可以在不同的特征图上生成不同大小的锚框:

  • 小尺度的特征图(比如 1×1):生成大锚框,用来检测大目标。

  • 大尺度的特征图(比如 4×4):生成小锚框,用来检测小目标。

3. 生成多尺度锚框的代码实现(PyTorch 版)

python
import torch
from d2l import torch as d2l

def display_anchors(fmap_w, fmap_h, s):
    """在特征图上生成锚框"""
    d2l.set_figsize()
    # 生成一个虚拟的特征图,前两个维度不影响结果
    fmap = torch.zeros((1, 10, fmap_h, fmap_w))
    # 生成锚框,s是锚框的尺度,ratios是宽高比
    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.imread('../img/catdog.jpg'), anchors[0] * bbox_scale)

4. 不同尺度锚框的效果

  • 检测小目标:用 4×4 的特征图,生成尺度为 0.15 的锚框,这样锚框比较小,而且在图片上分布比较密集,能覆盖更多小目标的位置。
python
# 加载图片
img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]
# 生成小尺度锚框
display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
  • 检测中等目标:用 2×2 的特征图,生成尺度为 0.4 的锚框,锚框更大,分布更稀疏。
python
# 生成中等尺度锚框
display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
  • 检测大目标:用 1×1 的特征图,生成尺度为 0.8 的锚框,锚框最大,只有一个中心,覆盖整个图片。
python
# 生成大尺度锚框
display_anchors(fmap_w=1, fmap_h=1, s=[0.8])

三、多尺度检测的原理

我们可以用卷积神经网络的不同层的特征图来做多尺度检测:

  1. 卷积神经网络的浅层特征图:尺寸比较大,感受野比较小,适合检测小目标。
  2. 卷积神经网络的深层特征图:尺寸比较小,感受野比较大,适合检测大目标。

1. 感受野的概念

感受野:

感受野是指特征图上的一个像素对应输入图片上的区域大小。深层的特征图的感受野更大,能看到输入图片上更大的区域,所以可以用来检测大目标。

2. 多尺度检测的流程

  • 用卷积神经网络对输入图片进行前向传播,得到不同层的特征图。
  • 在每个特征图上生成锚框,标记这些锚框的类别和偏移量。
  • 用每个特征图的信息来预测对应锚框的类别和偏移量。
  • 最后把所有尺度的预测结果整合起来,得到最终的目标检测结果。

四、小结

  1. 多尺度目标检测是为了减少锚框的数量,同时检测不同大小的目标,小目标用小锚框,大目标用大锚框。

  2. 我们可以通过特征图来生成多尺度的锚框,特征图的尺寸决定了锚框中心的数量,锚框的尺度决定了检测的目标大小。

  3. 卷积神经网络的不同层的特征图有不同的感受野,浅层特征图适合检测小目标,深层特征图适合检测大目标。

  4. 多尺度检测就是利用不同层的特征图,在不同尺度下检测目标,提高检测的准确率。

(注:文档部分内容可能由 AI 生成)

京ICP备2024093538号-1