2、Anchor的数学原理:IoU计算、Anchor与Ground Truth的匹配策略

Anchor 这东西,说白了就是一组预设的框。你想想看,让模型直接从零开始预测物体的位置和大小,那太难了。给它一些“参考线”,它只需要在这个基础上微调就行。这一讲,我们就来拆解 Anchor 背后最核心的两个数学工具:IoU 和 匹配策略。

2.1 IoU:衡量两个框的重合程度

IoU,全称 Intersection over Union,中文叫交并比。它是目标检测里最基础、也最重要的指标。我刚开始做检测时,觉得这东西简单,不就是算个重叠吗?后来才发现,很多调优的坑,根源都在 IoU 的计算细节上。

公式其实很直观:

IoU = (两个框的交集面积) / (两个框的并集面积)

如果两个框完全重合,IoU = 1。如果完全不挨着,IoU = 0。嗯,就是这么简单。

核心要点: IoU 的值域是 [0, 1]。在 YOLO 中,我们通常用 IoU 来判断一个 Anchor 是否“匹配”上了某个真实物体(Ground Truth)。

我在项目中遇到过一个问题:两个框只有一个小角重叠,IoU 算出来只有 0.05。这种 Anchor 如果被强行拿去训练,模型会学到非常模糊的特征。所以,匹配策略里通常会设一个阈值,比如 0.5,低于这个值的 Anchor 直接忽略。

2.2 匹配策略:谁该去预测这个物体?

有了 IoU 这个工具,接下来就是怎么用它来分配任务。YOLO 的匹配策略,说白了就是一句话:每个 Ground Truth 框,只交给最合适的 Anchor 去负责。

具体怎么做?我习惯把它分成三步:

  1. 计算所有 Anchor 与 Ground Truth 的 IoU
  2. 找出 IoU 最大的那个 Anchor
  3. 把这个 Ground Truth 分配给这个 Anchor

你可能会问:“那 IoU 不是最大的 Anchor 怎么办?” 答案是:它们去负责“背景”类,也就是告诉模型“这里没有物体”。

我的经验: 早期 YOLOv1 没有 Anchor,每个格子只能预测两个框,效果很差。YOLOv2 引入 Anchor 后,mAP 直接提升了 10 个点。这就是“给模型一个支点”的力量。

2.3 匹配策略的细节:正样本与负样本

匹配策略决定了哪些 Anchor 是正样本(负责预测物体),哪些是负样本(负责预测背景)。这里有一个常见的坑:正负样本不平衡。

一张 416x416 的图片,如果用了 9 个 Anchor,特征图是 13x13,那总共有 13x13x9 = 1521 个 Anchor。但图片里可能只有 3 个物体。正负样本比例接近 1:500。如果不做处理,模型会倾向于把所有东西都预测为背景。

YOLO 怎么解决?它用了两个技巧:

  • 忽略那些 IoU 不高不低的 Anchor(比如 IoU 在 0.3 到 0.7 之间的),不让它们参与损失计算。
  • 只保留 IoU 最大的那个 Anchor 作为正样本,其他的要么是负样本,要么被忽略。

避坑指南: 我曾经在调参时,把 IoU 正样本阈值设得太低(比如 0.3),结果模型把很多背景区域也当成了物体,误检率飙升。后来我把阈值提到 0.6,效果才稳定下来。记住:阈值不是越高越好,也不是越低越好,得根据你的数据集来试。

2.4 多尺度匹配:YOLOv3 的改进

YOLOv3 引入了一个重要的改进:多尺度匹配。简单说,就是不同大小的 Anchor 分配给不同尺度的特征图去预测。

比如:

  • 大 Anchor(如 373x326)分配给 13x13 的特征图(感受野大,适合检测大物体)。
  • 中 Anchor(如 156x198)分配给 26x26 的特征图。
  • 小 Anchor(如 30x61)分配给 52x52 的特征图(感受野小,适合检测小物体)。

这样做的好处是:每个尺度的特征图只负责它擅长的大小。我在做小目标检测时,就靠调整这个分配策略,把召回率从 60% 提到了 85%。

2.5 知识结构图:Anchor 匹配流程

下面这张图,把整个匹配流程串起来了。你可以看到,从 Anchor 生成到最终分配,每一步都离不开 IoU 的计算。

Anchor 匹配流程 Anchor 与 Ground Truth 匹配流程 输入:Anchor 集合 + GT 框 计算每个 Anchor 与 GT 的 IoU IoU 是否大于阈值(如 0.5)? 是 标记为正样本 否 标记为负样本 输出:正/负样本分配结果 注意事项 • 阈值需根据数据集调整 • 正样本过多会导致过拟合 • 负样本过多会导致欠拟合 • 建议从 0.5 开始尝试

2.6 匹配策略的对比:YOLOv3 vs YOLOv5

不同版本的 YOLO,匹配策略略有不同。我整理了一个表格,方便你对比:

版本 匹配策略 正样本数量 特点
YOLOv3 每个 GT 只匹配 IoU 最大的 Anchor 1 个 简单直接,但正样本太少
YOLOv4 IoU 大于阈值的都算正样本 多个 增加了正样本数量,训练更稳定
YOLOv5 基于宽高比的匹配 多个 不再依赖 IoU,而是看形状是否相似

我的建议: 如果你刚开始做 Anchor 调优,先用 YOLOv3 的策略,简单可靠。等你对数据分布有了感觉,再尝试 YOLOv5 的宽高比匹配,效果可能会更好。

2.7 实战中的常见问题

最后,分享几个我在实战中踩过的坑:

  • 问题一: 所有 Anchor 都匹配不上 GT。原因通常是 Anchor 的尺寸设置不合理,或者阈值太高。解决办法:重新聚类 Anchor,或者降低阈值。
  • 问题二: 一个 GT 匹配了太多 Anchor。这会导致模型对同一个物体产生多个预测,造成重复检测。解决办法:使用 NMS(非极大值抑制)后处理,或者在匹配时限制每个 GT 最多匹配 3 个 Anchor。
  • 问题三: 小物体总是漏检。原因可能是小 Anchor 太少,或者特征图分辨率不够。解决办法:增加小 Anchor 的数量,或者使用更高分辨率的特征图。

嗯,这一讲的内容就到这里。IoU 和匹配策略是 Anchor 调优的基石,理解了它们,你就能更好地理解后续的聚类、损失函数等内容。