v2.2 backbone 消融:微调过的 YOLO backbone 值不值?

在数据、任务头、训练方法全部一致的前提下,只替换冻结 backbone 的权重。 val n=9370 · 每臂 5 个 seed · 配对 bootstrap 2000 次 · → 定性核验子页(图片 + 视频抽帧)

结论:微调不但没有带来收益,反而显著有害—— 现役的微调 backbone 被两个原版 backbone 同时压制。

打分头 Spearman:A 微调 0.7640 vs B 原版 0.8015, 差值 -0.0406,95% CI [-0.0469, -0.0347],完全不含 0。 微调后甚至不如通用检测预训练(A−C 也显著为负),所以不是「微调没用」,而是微调主动破坏了特征。 收益可以干净地拆开:pose 预训练 +0.0252, cricket 微调 -0.0406。

但图片域和视频域给出了不同的赢家(下一段说明为什么视频那侧要打折扣)。视频门控召回:A 64.0% · B 64.5% · C 77.6%。图片域门控 AUC 几乎饱和(0.9885 vs 0.9927,差 0.4%),到了视频域却是 64% vs 78%,差 13.6 个点——图片域的验证指标严重低估了真实差距。

那 v2.2 该选哪个?这是个需要你拍板的权衡

臂打分头 ρ(图片域,唯一可测处)门控视频召回(部署口径)相对现役 A
A · 微调 backbone 0.764064.0%现役基准
B · 原版 yolo11n-pose 0.801564.5% 打分显著更好,门控基本持平
C · 原版 yolo11n(检测) 0.776677.6% 两个维度都优于 A

C 严格优于现役 A:打分头显著更好(Δρ +0.0153,CI 不含 0), 视频门控召回还高 13.6 个点。所以「换掉 A」这件事没有争议。

B 还是 C:B 的打分排序最好(比 C 高 +0.0252), C 的视频门控召回高出 13.1 个点。两个头共享同一次前向,不能各挑各的。

倾向 B。「+13.6 点」这个数字经不起看图:定性核验显示 C 多放行的帧是 观众席、天空树梢、球场建筑,没有一帧有可打分的动作,且 81% 集中在广播品类。 valid_frac 把「处在 cricket 转播里」和「画面里有 cricket 动作」混为一谈, 所以 C 的门控优势更接近泄漏而非召回。反过来打分头那侧,B 的优势是人工可验证的—— A 在静态非动作图上系统性给高分。

01实验怎么搭的

三个 backbone 在 [4,6,8,10] 层结构完全同构(128/128/256/256 → 1536-d),参数量差异全在 pose 头的 19 vs 17 关键点上。 更关键的是,B 就是 A 微调之前的初始化权重——对照组不是「另一个模型」,而是「同一个模型微调前的状态」,因果归因很干净。

唯一变量

  • 冻结 backbone 的权重
  • 随之必须逐臂重算的:1536-d 特征、以及标准化用的 mu/sd(它们是特征分布的属性,跨臂复用是 bug 不是控制)

全部锁死

  • 数据 generic_pose_score_v1 75,586 张
  • 划分:路径 sha1 哈希 → 与 backbone 无关,三臂天然同一批 val
  • 特征规格:LetterBox 640 · layer[4,6,8,10] · avg+max
  • 头:1536·128·1 + Dropout 0.3
  • 训练:wbce · 密度倒数权重 · AdamW 1e-3/1e-3 · 全批量 · 400 epoch
  • 门控负样本:cricket_negatives_v1 同一批 20,000

三道防错

  • 特征缓存带 backbone sha1 并在加载时断言 — 防的是「拿 A 的特征训 B 的头」这种看起来正常、结果完全错误的失败(和之前 GATE_BUNDLE 那个坑同类)。
  • 先复现 — 改动后用 A 臂跑一遍,Spearman 0.7569 / batting 0.8111,与 v2 已发布指标逐位一致,确认改动没破坏原行为。
  • 近重复排查 — backbone 训练图与打分头 val 图内容 MD5 重叠 0/9370;CLIP 最近邻只有 4 张 ≥0.98(真重复的边界,人工核验过)。剔除 ≥0.95 的 15 张后 Δ 从 -0.0406 变成 -0.0406——一点没变。

02图片域:逐 seed 的 Spearman

A · 微调 backbone · batsman_pose19_v0 · 现役B · 原版 yolo11n-pose · A 的初始化权重C · 原版 yolo11n(检测) · COCO 检测预训练
0.740.770.790.810.83A 微调seed ρ=0.7569seed ρ=0.7602seed ρ=0.7657seed ρ=0.7728seed ρ=0.76430.7640B 原版poseseed ρ=0.8130seed ρ=0.7959seed ρ=0.7722seed ρ=0.8102seed ρ=0.81600.8015C 原版detseed ρ=0.7833seed ρ=0.7669seed ρ=0.7879seed ρ=0.7824seed ρ=0.76240.7766Spearman ρ
每个圆点是一个 seed(唯一随机源是头初始化与 dropout),竖线是均值。 B 有 1 个 seed 落进 A 的区间,其余 4 个明显更高。

03图片域:分角色拆解

A · 微调 backbone · batsman_pose19_v0 · 现役B · 原版 yolo11n-pose · A 的初始化权重C · 原版 yolo11n(检测) · COCO 检测预训练
0.00.20.40.60.8A 微调 击球 ρ=0.815 (n=4485)0.81B 原版pose 击球 ρ=0.838 (n=4485)0.84C 原版det 击球 ρ=0.812 (n=4485)0.81击球n=4485A 微调 投球 ρ=0.757 (n=1600)0.76B 原版pose 投球 ρ=0.788 (n=1600)0.79C 原版det 投球 ρ=0.766 (n=1600)0.77投球n=1600A 微调 接球 ρ=0.595 (n=524)0.59B 原版pose 接球 ρ=0.672 (n=524)0.67C 原版det 接球 ρ=0.650 (n=524)0.65接球n=524A 微调 守门 ρ=0.718 (n=186)0.72B 原版pose 守门 ρ=0.736 (n=186)0.74C 原版det 守门 ρ=0.681 (n=186)0.68守门n=186A 微调 非动作 ρ=0.062 (n=2575)0.06B 原版pose 非动作 ρ=0.219 (n=2575)0.22C 原版det 非动作 ρ=0.186 (n=2575)0.19非动作n=2575ρ
B 在每一个角色上都赢,包括击球。
一个被证伪的预注册假设。实验前我押注:微调用的是「击球手关键点」目标,如果它有用,收益应当集中在击球。 实际是 B 在所有角色上全面领先(击球 0.838 vs 0.815),没有任何一处微调是有利的。

04差异是否可信:配对 bootstrap

0 = 无差异A 微调 − B 原版poseΔ=-0.0406 CI[-0.0469,-0.0347]-0.0406显著A 微调 − C 原版detΔ=-0.0153 CI[-0.0217,-0.0087]-0.0153显著B 原版pose − C 原版detΔ=+0.0252 CI[+0.0187,+0.0317]+0.0252显著
对 9370 张 val 重采样 2000 次,两臂用同一批索引(配对),取 Δρ 的 2.5/97.5 百分位。 区间不跨 0 即为显著。这通常比 seed 噪声大得多,是决定显著性的那把尺子。
臂Spearman (mean±std)MAE 击球投球接球守门非动作门控 AUC泄漏@0.5
A · 微调 backbone0.7640 ±0.00540.10800.815 0.757 0.595 0.718 0.0620.98850.0766
B · 原版 yolo11n-pose0.8015 ±0.01620.09950.838 0.788 0.672 0.736 0.2190.98940.0768
C · 原版 yolo11n(检测)0.7766 ±0.01000.10520.812 0.766 0.650 0.681 0.1860.99270.0669

05视频域:门控召回(56 段留出 test_data)

这一节只能回答一半的问题。56 段片段全部是 cricket,所以「有效帧占比」就是门控召回——这是真正的域外泛化证据(头在照片上训练,跑在视频帧上)。 但视频上没有打分 GT,所以本页不会声称哪个 backbone 在视频上打分更准,只报三臂之间的排序一致性。
A · 微调 backbone · batsman_pose19_v0 · 现役B · 原版 yolo11n-pose · A 的初始化权重C · 原版 yolo11n(检测) · COCO 检测预训练
0%25%50%75%100%A 微调 击球(手机) 97%97B 原版pose 击球(手机) 98%98C 原版det 击球(手机) 100%100击球(手机)A 微调 投球 88%88B 原版pose 投球 89%89C 原版det 投球 93%93投球A 微调 datateam 75%75B 原版pose datateam 79%79C 原版det datateam 84%84datateamA 微调 击球(广播) 75%75B 原版pose 击球(广播) 75%75C 原版det 击球(广播) 84%84击球(广播)A 微调 街头 52%52B 原版pose 街头 58%58C 原版det 街头 87%87街头A 微调 短视频集锦2 52%52B 原版pose 短视频集锦2 50%50C 原版det 短视频集锦2 66%66短视频集锦2A 微调 短视频集锦1 52%52B 原版pose 短视频集锦1 56%56C 原版det 短视频集锦1 72%72短视频集锦1
逐类别门控有效帧占比。数值直接标在柱顶。
臂总体有效帧占比gate 均值击球(手机)投球datateam击球(广播)街头短视频集锦2短视频集锦1
A · 微调 backbone64.0%0.63397% 88% 75% 75% 52% 52% 52%
B · 原版 yolo11n-pose64.5%0.63898% 89% 79% 75% 58% 50% 56%
C · 原版 yolo11n(检测)77.6%0.760100% 93% 84% 84% 87% 66% 72%

逐片段 raw_max 的排序一致性(无 GT,仅供参考)

  • A_finetuned vs B_stock_pose — Spearman 0.811
  • A_finetuned vs C_stock_det — Spearman 0.871
  • B_stock_pose vs C_stock_det — Spearman 0.876

视频域上门控表现最好的是 C · 原版 yolo11n(检测)(77.6%)。

06机制解读与局限

为什么微调会有害(这是解释,不是已验证的结论)

batsman_pose19_v0 是在 1.16 万张图上、用「定位击球手 19 个关键点」这个很窄的目标训了 100 epoch。 这会把表征往「找关节位置」上收窄,丢掉打分头真正需要的场景/纹理/上下文信息——典型的灾难性遗忘。 非动作那一列最能体现:A 掉到 ρ=0.062, B 是 0.219。

要坐实这个机制,可以再做一个便宜的验证:只取浅层 [4,6] 特征重跑——如果是高层被窄目标带偏,浅层差距应当明显更小。

本实验没有回答的

  • 视频上打分头哪个更准 —— 没有视频分数 GT,测不了。
  • 门控的视频域误报率 —— 留出集里没有确认的非 cricket 视频,这个空白依旧存在。
  • 解冻联合微调会怎样 —— 本实验只比较冻结特征。结论是「用这个微调过的 backbone 当冻结特征提取器不划算」, 不能推广成「微调本身没有价值」:batsman_pose19_v0 作为关键点检测器仍是有效的(box mAP50 0.949 / pose mAP50 0.828), 它只是不适合当通用特征塔。

数据 results/ablation_v22/{report.json, video_eval.json, dupcheck.json} · 脚本 ablation_v22_dupcheck.py → ablation_v22_run.py → ablation_v22_analyze.py → ablation_v22_video.py → build_ablation_v22_viewer.py
配色为验证过的 3 槽分类色板(浅色模式下 aqua 对比度 2.74:1,故每个图元都带直接数值标签并配完整表格)。