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 去负责。
具体怎么做?我习惯把它分成三步:
- 计算所有 Anchor 与 Ground Truth 的 IoU
- 找出 IoU 最大的那个 Anchor
- 把这个 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 的计算。
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 调优的基石,理解了它们,你就能更好地理解后续的聚类、损失函数等内容。