选型¶
预算:VisDrone2019-DET fraction=0.25、imgsz 640、从零训练 20 epoch、batch 32、YOLOv8n,一张 RTX 4090 D。各臂的数据、训练日程和数据增强完全相同,只改块的配置。原始记录在 results/,由 scripts/report.py 汇总成 results/summary.md。
来源¶
公开基线 acce839c7e895d6b179de7f7093fa879e237cc7b(YOLO-Master main,2026-08-21 23:59:59 +0800),发布参照 YOLO-Master-v26.08 → 43d40117c...。两者都基于 ultralytics 8.4.101,与本工具包对接的官方版本相同,所以插件路径和基线是在同一个库版本上测的。工具包开始写入自身版本之前产生的记录带 git_ref = "0.1.0";此后每条记录都写入提交号、ultralytics 版本和两个锁定的基线。
候选¶
| 变体 | 专家数 | top_k | 辅助损失权重 | 参数量 | mAP50 | 与基线之差 |
|---|---|---|---|---|---|---|
| baseline | - | - | - | 3.01M | 0.0933 | - |
| esmoe-e2k1 | 2 | 1 | 0.01 | 3.16M | 0.0903 | -0.0031 |
| esmoe-e4k1 | 4 | 1 | 0.01 | 3.33M | 0.0928 | -0.0006 |
| esmoe-e4k2 | 4 | 2 | 0.01 | 3.33M | 0.0950 | +0.0017 |
| esmoe-e4k2,关掉辅助损失 | 4 | 2 | 0.00 | 3.33M | 0.0938 | +0.0005 |
| esmoe-e8k2 | 8 | 2 | 0.01 | 3.78M | 0.0934 | +0.0000 |
results/summary.md
三个 seed¶
| 臂 | seed | mAP50 | mAP50-95 | 配对差均值 | 胜场 |
|---|---|---|---|---|---|
| baseline | 0,1,2 | 0.0909 ± 0.0022 | 0.0405 ± 0.0013 | - | - |
| esmoe-e4k2 | 0,1,2 | 0.0930 ± 0.0022 | 0.0410 ± 0.0013 | mAP50 +0.0021 | 3/3 |
全量数据¶
上面的选择是在 25% 子集上做的。在全量 VisDrone 训练集上,同样 20 epoch、三个 seed,把选中的臂和基线重跑一遍:
| 臂 | seed | mAP50 | mAP50-95 | 配对差均值 | 胜场 |
|---|---|---|---|---|---|
| baseline | 0,1,2 | 0.1496 ± 0.0022 | 0.0759 ± 0.0016 | - | - |
| esmoe-e4k2 | 0,1,2 | 0.1517 ± 0.0011 | 0.0778 ± 0.0005 | mAP50 +0.0021,mAP50-95 +0.0019 | 3/3 |
逐 seed 的 mAP50 差为 +0.0001、+0.0032、+0.0029。均值增益与子集上相同,mAP50-95 的增益是子集上的四倍(+0.0019 对 +0.0005),数据量翻四倍没有把效应冲淡。其中一个 seed 基本打平,由此可以给效应划界:幅度小,符号一致,单次运行不可靠。
训练长度¶
同一对臂在全量训练集上跑三档预算,各三个 seed:
| 预算 | 基线 mAP50 | esmoe mAP50 | 配对差 | 均值 | 胜场 |
|---|---|---|---|---|---|
| 20 epoch | 0.1496 | 0.1517 | +0.0001, +0.0032, +0.0029 | +0.0021 | 3/3 |
| 50 epoch | 0.2131 | 0.2143 | -0.0003, +0.0009, +0.0032 | +0.0013 | 2/3 |
| 100 epoch | 0.3004 | 0.3050 | +0.0104, -0.0011, +0.0044 | +0.0046 | 2/3 |
每档的均值都为正,但不随训练轮数单向变化;seed 之间的离散随预算变大,100 epoch 时三个配对差从 +0.0104 到 -0.0011。合起来看,这些运行支持一个小的正向平均效应,排除了单次运行稳定提升的说法;至于收敛时效应往哪个方向走,它们两边都不支持。
results/summary.md
换主干¶
同样的配对比较放到 YOLO11n 上,全量训练集、20 epoch、三个 seed(图 2 最右一格):
| 主干 | 基线 mAP50 | esmoe mAP50 | 配对差 | 均值 | 胜场 |
|---|---|---|---|---|---|
| YOLOv8n | 0.1496 | 0.1517 | +0.0001, +0.0032, +0.0029 | +0.0021 | 3/3 |
| YOLO11n | 0.1419 | 0.1410 | +0.0045, -0.0033, -0.0040 | -0.0009 | 1/3 |
增益没有迁移过去。 在 YOLO11n 上这个块至多打平:一个 seed 涨,两个跌,mAP50 与 mAP50-95 的均值都略为负。一种可能的解释是 YOLO11n 的主干末端已经带注意力(C2PSA),同一位置再插一个路由混合,得到的比 YOLOv8n 少;但这个实验没有检验这一解释,它只是假设,不是结论。
这一阶段(20 epoch 选型)能界定的是:README 里的兼容矩阵是机制层面的陈述,块在每一代上都能建、能训,辅助损失能反向传播;它不表示精度效应在每一代上都存在。这一阶段的精度证据只有 YOLOv8n,之后七代主干的协议矩阵见判读线。
决定¶
默认发 ESMoE(num_experts=4, top_k=2) 配 attach_aux_loss(weight=0.01)。
- 只路由到一个专家的配置输给基线(e2k1、e4k1)。在这个预算下,增益要靠混合,单选一个专家不行。
- 专家数翻倍到 8 没有可测的增益,参数量却比 e4k2 多 13%。
- 参数量不变、关掉辅助损失,mAP50 少 0.0012。因此要把辅助损失接进被优化的损失,而不是只算出来。
分量¶
各臂的标准差互相重叠,只有逐 seed 的配对比较撑得住这个排序,而且只在一个短预算、三个 seed 上。绝对增益(mAP50 相对提升 2.3%)的代价是参数量多 10.4%。同配置同 seed 重跑,在 RTX 4090 D 上 20 epoch 时指标完全相同;在曦云 C500 上 120 epoch 时,同一配置两次运行平均差 0.0045,与效应同量级。实验口径见实验。