163、SimOTA 的 dynamic k 策略消融:固定 k vs 动态 k vs 基于 IoU 分布的 k 对比

发布时间:2026/7/10 0:27:51
163、SimOTA 的 dynamic k 策略消融:固定 k vs 动态 k vs 基于 IoU 分布的 k 对比 163、SimOTA 的 dynamic k 策略消融:固定 k vs 动态 k vs 基于 IoU 分布的 k 对比从一次诡异的 mAP 抖动说起去年年底调一个 YOLOv11 的工业检测项目,SimOTA 的 positive sample 分配一直让我头疼。模型在验证集上 mAP 忽高忽低,同一个 checkpoint 跑两次能差 0.8 个点。排查了数据加载、随机种子、甚至 CUDA 版本,最后发现是 SimOTA 的 k 值在作祟——默认的 dynamic k 策略在某些 batch 里会突然给一个极端值,导致正样本数量剧烈波动。当时我直接在源码里把 k 写死成 10,mAP 稳定了,但 recall 掉了 2 个点。后来花了三周时间,把 SimOTA 的 k 策略从头到尾撸了一遍,做了三组消融实验。今天把踩过的坑和结论写清楚,代码直接能跑,数据真实可复现。SimOTA 的 k 到底在干什么先别急着改代码,理解 SimOTA 的 k 机制比调参重要。SimOTA 的核心是给每个 ground truth 动态分配正样本,k 值决定了每个 gt 最多能匹配多少个 anchor。YOLOv11 的官方实现里,k 是通过 cost 矩阵的 top-k 动态计算的——具体来说,对每个 gt,取所有 anchor 的 cost 值,排序后取前 k 个作为正样本,这个 k 不是固定的,而是根据 cost 的分布自适应调整。官方 dynamic k 的逻