167、动态分配策略中 Anchor Ratio 的重新聚类:用 K-Means 调整 YOLOv11 默认 Anchor

📅 2026/7/10 13:21:13 👁️ 阅读次数 📝 编程学习
167、动态分配策略中 Anchor Ratio 的重新聚类:用 K-Means 调整 YOLOv11 默认 Anchor

167、动态分配策略中 Anchor Ratio 的重新聚类:用 K-Means 调整 YOLOv11 默认 Anchor

从一次线上翻车说起

上个月我在部署YOLOv11s到边缘设备时,遇到了一个让我血压飙升的问题:模型在公开数据集上mAP50有0.52,但换到我们自己采集的工业零件数据集上,直接掉到0.31。排查了两天,最后发现罪魁祸首是默认的Anchor Ratio——YOLOv11默认的anchor宽高比是[0.5, 1.0, 2.0],而我们数据集中大部分目标都是细长螺丝钉(宽高比0.150.3)和圆形垫片(宽高比0.91.1)。这就像让一个习惯了标准身材的检测器去识别竹竿和飞盘,能不翻车吗?

YOLOv11虽然引入了动态分配策略(TaskAlignedAssigner),但anchor ratio的初始化依然沿用YOLOv5时代的固定值。动态分配只是在训练过程中调整正样本匹配,如果初始anchor跟真实目标分布差太远,模型在早期训练阶段就会陷入混乱——梯度震荡、收敛缓慢,最终mAP上不去。今天我们就用K-Means重新聚类anchor ratio,把这个坑填上。

为什么动态分配救不了默认Anchor

先看YOLOv11的anchor生成逻辑。在ultralytics/ultralytics/nn/modules/head.py中,Detect类的_