文章

08 Anchor Boxes(锚框)

08 Anchor Boxes(锚框)

08 Anchor Boxes(锚框)

一、问题背景

在基础的目标检测方法(如 YOLO v1)中,每个网格单元(grid cell)只能预测 一个对象
但现实中,多个对象的中心点可能落在同一个网格内,例如一张图中行人与汽车的中心几乎重合。

❗ 问题:若一个格子中存在多个对象,则无法同时检测它们。


二、Anchor Box 的核心思想

为解决上述问题,引入 Anchor Boxes(锚框) 的概念:

  • 预先定义 K 个不同形状的锚框(如高瘦型、宽扁型等)。
  • 每个网格单元不再只输出一个检测向量,而是为 每个锚框 输出一个完整的检测向量。
  • 对象不仅分配到其 中心所在的网格,还分配到与其 形状最匹配的锚框(通过 IoU 判断)。

✅ 核心优势:允许单个网格预测多个对象(最多 K 个,K = 锚框数量)。


三、标签编码方式的变化

1. 无 Anchor Box 时(原始 YOLO)

  • 输出维度:$S \times S \times (5 + C)$

    • $S$:网格大小(如 $3 \times 3$)
    • $5$:$[p_c, b_x, b_y, b_h, b_w]$

      • $p_c$:是否有对象(0/1)
      • $(b_x, b_y)$:边界框中心相对于网格左上角的偏移
      • $(b_h, b_w)$:边界框高宽(相对于整图)
    • $C$:类别数(one-hot 编码)

示例:3 类(行人、汽车、摩托车)→ $C=3$,输出向量长度为 $5+3=8$

2. 引入 Anchor Box 后

  • 输出维度:$S \times S \times K \times (5 + C)$

    • 或写作 $S \times S \times (K \cdot (5 + C))$

示例:$S=3$, $K=2$, $C=3$ → 输出为 $3 \times 3 \times 16$(即 $2 \times 8$)

标签分配规则:

对训练集中每个真实对象:

  1. 找到其中心所在的网格单元 $(i, j)$;
  2. 计算其真实边界框与每个预设锚框的 IoU(交并比)

    \[\text{IoU}(B_{\text{gt}}, A_k) = \frac{|B_{\text{gt}} \cap A_k|}{|B_{\text{gt}} \cup A_k|}\]
  3. 将该对象分配给 IoU 最大的那个锚框 $A_k$
  4. 在输出张量的 $(i, j, k)$ 位置填入对应的标签向量。

四、具体示例说明

假设:

  • 网格:$3 \times 3$
  • 锚框数:$K = 2$

    • Anchor Box 1:高瘦(适合行人)
    • Anchor Box 2:宽扁(适合汽车)
  • 类别:行人(class 1)、汽车(class 2)、摩托车(class 3)

某网格中同时有 行人汽车

  • 行人 → 与 Anchor Box 1 的 IoU 更高 → 填入前 8 维:

    \[[1, b_x^{(p)}, b_y^{(p)}, b_h^{(p)}, b_w^{(p)}, 1, 0, 0]\]
  • 汽车 → 与 Anchor Box 2 的 IoU 更高 → 填入后 8 维:

    \[[1, b_x^{(c)}, b_y^{(c)}, b_h^{(c)}, b_w^{(c)}, 0, 1, 0]\]

若某网格只有汽车(无行人):

  • Anchor Box 1 对应部分:$[0, ?, ?, ?, ?, ?, ?, ?]$($p_c=0$,其余为“don’t care”)
  • Anchor Box 2 对应部分:正常填写汽车信息

💡 注:“don’t care”在训练时通常忽略损失计算(如设 mask=0)。


五、局限性与注意事项

  1. 同一网格中对象数 > 锚框数(K)
    → 无法全部检测(如 3 个对象但只有 2 个锚框)
    → 实践中较少见(尤其使用 $19 \times 19$ 网格时)
  2. 多个对象匹配到同一个(网格, 锚框)对
    → 冲突,需“打破僵局”策略(如只保留一个,或按面积排序)
    → 通常影响不大,因概率较低

六、如何选择 Anchor Boxes?

方法 1:人工设计

  • 根据数据集中目标的常见形状,手工设定 5~10 个锚框
  • 例如:

    • 高瘦框:用于行人、电线杆
    • 宽扁框:用于汽车、桌子

方法 2:K-Means 聚类(高级方法,YOLO v2 引入)

  • 在训练集所有真实边界框上运行 K-Means 聚类
  • 距离度量使用 1 - IoU(而非欧氏距离),更符合检测任务
  • 得到 K 个最具代表性的锚框形状

✅ 优势:自动适配数据分布,提升召回率与定位精度


七、总结:Anchor Box 的价值

优势说明
✅ 多对象检测允许单网格预测多个对象
✅ 形状先验通过锚框提供形状先验,提升定位稳定性
✅ 任务解耦不同输出通道专注不同形状对象(如高瘦 vs 宽扁)
✅ 兼容性强是现代检测器(YOLO v2/v3, Faster R-CNN)的核心组件

八、关键公式汇总(KaTeX 兼容)

  1. IoU 计算

    \[\text{IoU}(B_1, B_2) = \frac{|B_1 \cap B_2|}{|B_1 \cup B_2|}\]
  2. 输出张量维度

    \[\text{Output Shape} = S \times S \times K \times (5 + C)\]
  3. 标签向量结构(每个锚框)

    \[\begin{bmatrix} p_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ \vdots \\ c_C \end{bmatrix} \in \mathbb{R}^{5 + C}\]
本文由作者按照 CC BY 4.0 进行授权