KID Domain Gap: Measuring the Distance Between Two Rendered Worlds, Part 2
把 UE4 图集随机对半分成两份,算”UE4 对 UE4”的 KID;UE5 同理:
rs = np.random.RandomState(1)
idx4 = rs.permutation(len(x4))
k4, s4 = kid_unbiased(x4[idx4[:len(x4)//2]], x4[idx4[len(x4)//2:]])
(tools/t32_kid.py。)两半来自同一个世界、同一条采集管线,任何渲染差异都不存在——量出来的值纯粹是估计器与抽样的底噪,即这把尺子的噪声地板(noise floor)。
| 对照 | KID |
|---|---|
| UE4 vs UE4 | (≈0.0001) |
| UE5 vs UE5 | (≈0.0000) |
| UE4 vs UE5(跨侧) | 0.0743,CI95 |
跨侧值是域内底噪的约 700 倍,置信区间与零完全不重叠——不存在任何把它解释成采样噪声的余地。
UE5 侧量出 是无偏估计器的签名行为:真值 (两半同分布)时,无偏估计以零为期望上下波动,取负完全正常。如果这里量出一个稳定的小正数,反而要怀疑估计器有偏。负数 ≈ 0 的读法是”测不出差异”,不是”差异为负”。
没有对照组的测量不是测量。域内基线回答了”同一把尺子在无差异时读数是多少”,给跨侧读数提供了刻度零点。这也是 KID 相对 FID 的隐形优势:FID 有偏,同分布拆两半也量出不可忽略的正数,“零点”随样本量漂移,地板本身不干净。
每张图在采集时就写入 meta.jsonl,含 route_type 字段(straight / left / right),由路线执行器在采集时刻直接落盘。分组计算时按文件名把图对齐回 meta:
key = by.get(os.path.basename(p), {}).get("route_type", "unknown")
groups.setdefault(key, {}).setdefault(tag, []).append(i)
(tools/t32_kid.py。)
“采集时打标”和”事后打标”的差别是实质性的:
if len(i4) < 100 or len(i5) < 100:
print(f"[t32] 组 {gname} 样本不足,跳过")
continue
任一侧不足 100 张的组直接跳过。KID 无偏但不免方差,方差 ;几十张的组会量出方差淹没信号的数字,留着只会污染结论。实测三组的规模都远超门槛:直行 4284/6980、左转 5803/8723、右转 2549/1731(UE4/UE5)。
三组各自独立算 KID,数值不可加、不可加权平均回 0.0743。每组是一个不同的子分布对(子总体), 对分布不是线性泛函——“总体的差异”和”各成分差异的平均”是两个不同的量。分组结果的正确读法是结构定位:回答”差距集中在哪类画面”,而不是”总体差距由哪组贡献多少”。
| 场景组 | KID |
|---|---|
| 右转 | 0.1955 |
| 左转 | 0.1215 |
| 直行 | 0.0944 |
右转组接近直行组的两倍。三组各自数千张样本,标准差都在 量级以下,排序与样本量无关。
KID 量的是 Inception 特征空间的分布距离,而特征由画面内容驱动。看两组场景的画面构成:
UE5 相对 UE4 的渲染升级——Lumen 全局光照(动态间接光)、软阴影、材质细节层次——都是表面相互作用的效果:光线打在墙面上反弹、漫射、遮蔽。路面和天空是”简单光源 + 简单材质”,两引擎画得差不多;建筑立面是”复杂材质 + 多次弹射光照”,管线差异在这里被放大到最大。转弯场景恰好把这些表面塞满整个视野,于是整面墙的纹理、整片天的高光全部贡献进特征距离——数值排序(0.196 > 0.122 > 0.094)与肉眼直觉(右转组最不像)对上了。
域差距不是均匀分布在画面上的,而是集中在光照与材质复杂的结构上。如果后续要缩小域差距(如领域自适应、微调),转弯/路口帧是高价值样本——这直接影响了本项目后续微调数据采集的场景侧重。
20 条对齐路线各自独立算一遍 KID:最小 0.2058(路线 10007,630/1064 张),最大 0.7185(路线 10000),中位约 0.47,多数落在 0.4–0.6 的带里。
两个叠加的原因:
注意第一条是被测量本身变了(子分布 ≠ 总体),第二条才是测量噪声变大——两者不能混为一谈。
项目口径:路线级 KID 的绝对值不与总体、不与场景组可比,只用于路线之间的相对排序。它给出一张”差距地图”——哪条路上两个世界分歧最大——作为后续 KID-vs-ΔDS 相关性分析的自变量。0.7185 的读法不是”这条路差距是总体的十倍”,而是”在 20 条路的相对坐标里,它排最右端”。
min(n) 对齐机制消化,不直接影响排序合法性,但帧数越小的路线误差棒越宽。渲染归因的间接证据链:如果”渲染域差距”真是模型分数变化的原因,那么域差距大的路线,分数变化应该也大。把 10 条路线的路线级 KID(自变量)与同路线的 ΔDS = DS_UE5 − DS_UE4(因变量)做 Spearman 秩相关。
Spearman 相关系数先把两个变量各自换成秩次(名次),再对秩次算 Pearson 相关。无并列时:
是第 条路线在两个变量上的名次差, 是样本数。它只检验单调关系,不要求线性,对离群值和变量量纲都不敏感——KID 与 ΔDS 量纲完全不同、样本又少,秩相关是稳的选择。
| 模型 | Spearman ρ | p 值(n=10) |
|---|---|---|
| SimLingo | −0.382 | 0.276 |
| AutoMoT | −0.044 | 0.904 |
时,α=0.05 双侧检验的临界 |ρ| 约 0.648——观察到的 −0.382 远够不着。SimLingo 的方向(KID 越大、提升越小)弱符合直觉,AutoMoT 几乎为零,但两个都不显著。
n=10 意味着即使总体里存在中等强度的真实相关(比如 ρ=0.5),这次采样也有很大概率测出不显著的结果(II 型错误)。“不显著”的正确读法是”在当前检验力下未观察到相关”,不是”证明了无相关”。此类结果只能作探索性线索入档,结论必须等 n 更大的终版分析(方案里 T5.1 的三档口径终版)。
“渲染域差距导致模型掉分”这条因果链,统计上需要三个环节:
实测三档对比里,两个模型在 UE5 上都是提升:SimLingo 49.59 → 56.35(Δ+6.76,小于 MDE 20.63,按口径报”不显著”);AutoMoT 67.10 → 100.00(Δ+32.90,显著)。因变量”掉分”根本不存在——没有 ΔDS < 0 的样本,KID-vs-ΔDS 的相关性再显著也无法支撑”域差距导致掉分”。归因链在第二环就断了,第三环的不显著只是追加确认。
实验前方案(03-risks.md R13)的预期是”zero-shot 会掉分,相关性分析用来论证掉分归因于渲染”。实测方向反转。诚实的报告口径是:
本设计内未获得”掉分与渲染域差距相关”的统计证据——因为没有掉分。渲染归因的间接证据链在本对齐集上不成立。
负结果(null result)照样入档:它排除了一条假设路径,把”UE5 高保真渲染伤害 E2E 模型”这个流行直觉在本实验条件下证伪。对后续研究的指引同样是信息量——域差距客观存在(环节 1 成立),但它没有转化为闭环分数的损失,说明当代 VLM 系模型的视觉表征对渲染域漂的鲁棒性比预期强。
同参数 LiDAR 传感器(channels、range、rotation_frequency、points_per_second 尽量对齐)下:
密度差 4 倍以上。两侧参数已对到 API 允许的最齐程度,剩余差异来自引擎的射线投射实现与场景几何本身——属于”换引擎”的固有后果,不是配置错误。
第二模型 AutoMoT 的动作分支消费 LiDAR(BEV token 几何输入)。这意味着它的 UE4→UE5 迁移分数变化(67.10 → 100.00)里,混着视觉域差距和几何传感器密度变化两个变量。点云稀到 1/4,BEV 表征的输入分布同样漂了——AutoMoT 的一切跨侧结论必须附带 LiDAR 稀释声明:观察到的效应不能全归因于渲染。
这也是主模型选 SimLingo(纯视觉)的原因之一:主模型的渲染变量不被几何传感器稀释,AutoMoT 只作对照并带声明使用。
KID 量的是 RGB 通道的域差距,但域差距是全模态的:LiDAR 点云密度、物理引擎(PhysX → Chaos)的车辆动力学响应、Town10 地图重制的几何细节,全部跟着引擎一起换。任何”UE4 vs UE5”的实验结论,作用域都是”整个仿真栈”,不是”渲染器”这一个部件——除非像本项目主模型那样把传感器面收窄到纯视觉,再用 KID 把渲染差异单独量化。
UE4 → UE5 不是只换渲染器,至少三样东西同时变了:
KID 是对齐图集在特征空间的距离——物理和地图差异会间接改变画面里有什么(车辆姿态、建筑位置),所以 0.0743 是换引擎的一切差异在视觉特征空间上的投影。这不是测量缺陷:研究问题本来就是”整个仿真世界换掉之后,模型看到的分布差多少”,投影恰好是要测的东西。但它框死了归因强度——这个数字不能读作”纯渲染差异”。
| # | 边界 | 后果 |
|---|---|---|
| 1 | 渲染/物理/地图复合差异 | zero-shot 分数变化不能全归因渲染;KID 相关性只是间接证据 |
| 2 | 特征权重为 torchvision 版 InceptionV3 | 绝对值不与文献 KID 可比,只做同口径相对比较 |
| 3 | 单一 Town10、锁白天、百米级短路线 | 结论限缩本对齐路线集,不外推到其他城镇/天气/长路线 |
| 4 | 对齐集 20 条收缩为 10 条分层子集 | 路线级样本 30/模型,MDE 检验力受限,相关性分析仅探索性 |
| 5 | AutoMoT 动作分支含 LiDAR | 其结论附 LiDAR 稀释声明(密度差 ~635 vs ~2800 点/帧) |
这些 limitation 不是结果出来后的找补——方案 v5 就把 limitation 固定节写进了报告模板(R4-N2 条款),CP3/CP5 两级人类门禁检查该节的存在性。动机很实际:结果出来后人总有把结论讲强的冲动,事先写死的边界条件是对抗这种冲动的机制设计。审稿式自检的顺序应该是:先念 limitation,再说结论能说到哪。