Download docs/impl/genbench4.md from teawhite/maliang: direct link, hf CLI and curl.
- Browser
- Download file 14.2 kB
-
https://huggingface.co/teawhite/maliang/resolve/main/docs/impl/genbench4.md
- Command line
-
hf download hf://teawhite/maliang/docs/impl/genbench4.md
-
curl -L -o genbench4.md https://huggingface.co/teawhite/maliang/resolve/main/docs/impl/genbench4.md
genbench4 — DMD 学生在没见过的场景类型上的泛化(2026-10-25)
用户:「应该不是不同的 style 而是不同的场景?比如城堡比如地牢比如岩浆什么的?」+「再多测几十个 case」,前提仍是首帧符合语义、不自相矛盾。
被测模型 = 480p stage3 DMD outputs/distill/gc25d_v10/stage3_dmd/ema/ema_step500.safetensors(部署回路:4 步 renoise、sink 3 / window 17,
TAEHV 解码,60 s = 241 cell);对照 = 双向 SFT 教师 outputs/sft_v10/step-8000.safetensors(81 帧,50 步)。
代码 scripts/genbench4/(复用 genbench3 的 rollout / metrics / QwenVL),输出 outputs/genbench4/,冒烟 outputs/genbench4_smoke/。
场景(scenes.py)
训练里的 10 个场景:地中海庭院 / 秋林神社 / 沙漠商队驿站 / 雪山哨所 / 日式春日神社 / 热带水神殿 / 蒸汽朋克铸造区 / 哥特大教堂区 / 赛博朋克霓虹区 / 水下研究站。测的 10 个都不在其中:castle 城堡、dungeon 地牢、lava 熔岩、icecave 冰窟、graveyard 墓地、swamp 沼泽、 alien 外星、wildwest 西部小镇、mushroom 蘑菇林、ruins 废墟城市。每个场景按语义类写「这一类在该场景里是什么」(建筑 → 城墙 / 地牢砖墙 / 玄武岩要塞…,石头 → 该场景的石头,植被 → 树篱 / 枯树 / 发光蘑菇…,空地 → 该场景的地面)+ 光照一句。
起点(sources.py)
10 个训练场景 × {v10_real, v9_stylized} 各取 1 条能接满 60 s 的 train 长链(跳过 genbench3 用过的链首)+ held-out val 里仅有的 3 条 (val 每 run 50 clip,能接满 60 s 且首帧合格的只有 genbench3 那 3 条)⇒ 22 个起点(v10 水下站没有合格长链)。首帧条件同 genbench3 (frame0_ok)。v2:在全部合格链里取帧 0 语义最丰富的(非地面静态类覆盖 + 有建筑加分)—— v1 的 v10 起点帧 0 有 86–97 % 是 terrain, FLUX 为了「像城堡」只能往空地上加墙。v10_real 相机贴地,最丰富的也只有 rich 0.06–0.35(基本是地面 + 少量石头 / 植被);v9 有 1.15–1.3 (铺地 + 建筑 + 石头 + 植被 + 道具)。
首帧生成(make_scene.py,FLUX.2 klein-9B 4 步)—— 冒烟的教训
map(从语义图直接生成,map2frame v4 + 场景色表):VLM 布局一致中位 0.001、角色 0 —— 到处加建筑、角色被重画成带标记色的小人 ⇒ 弃用。edit(编辑原帧,RETHEME:逐类换成该场景的东西、不增删):场景 / 角色都好,但 FLUX 有很强的「构图本能」:沿画面边缘加一圈城墙 / 岩壁 / 树,把石头画成塔 / 小屋 ⇒ 与语义矛盾。edit2(帧 0 没有的类写「没有、不许加」+ 不许沿边缘加框)几乎没改善。pad(采用):edit2 提示词 + 原帧四周反射补边到 4/3 倍画布(1664×960)再裁回中间 1248×720 → 832×480。FLUX 想加的「框」落在补边里 被裁掉(模糊补边 / 灰边仍往中间加框)。空地为主的起点不再冒出墙;仍有少量石头 → 塔 / 小屋,交给门槛拦。- 默认每槽 edit2 ×2 + pad ×4;没通过、但有候选被判出是该场景(scene ≥ 0.5)的槽再补 pad 种子 4–9(
--extra 4-9)。
语义一致性门槛(gate.py,Qwen3-VL-32B P(yes))
- 整图:layout(不许换类别:空地不许变墙 / 悬崖 / 石堆 / 树,石头 / 植物不许变建筑;冒烟 v1 的措辞「不管变成了哪一种」把石头 → 城墙也 放过了)≥ 0.3;only2(只有两个角色)≥ 0.5;scene(是不是该场景)≥ 0.5。
- 逐区域(按帧 0 语义图切,原帧问同样的题作基线):open = terrain / paving ≥ 92 % 的 96×96 格(≤ 10 个)「只是地面,没有立着的墙 / 建筑 / 悬崖 / 石阵 / 树 / 大物体」;obj = 建筑 / 石头 / 植被 / 道具连通块(≥ 300 px,≤ 8 个,品红描出语义轮廓)「是不是 {该类通称}」。原帧答 Yes 的区域里候选也答 Yes 的比例:open_ok ≥ 0.8、obj_ok ≥ 0.7(面积加权)。冒烟目测:拦下的都是真违规(空地角落的树篱 / 枯灌木 / 城墙块、铺地上 多出的门 / 火把 / 旗帜、石头变树篱 / 木架)。
- 角色:逐角色放大比对(同框裁原帧 / 候选「同一个角色还在、同位置 / 姿势 / 体型吗」)≥ 0.5;基线(原帧对原帧)< 0.5 的角色不判。 整图 chars 题对小 / 被叶子挡 / 重叠的角色连原帧都答 No(train_v9_05 / v9_10 全失败),genbench3 的 bg_fill 在暗场景里误报(深色 Boss 与熔岩 / 地牢背景对比低)⇒ 都不用。
- 自动:语义边界边缘召回 ≥ 0.4 × 原帧(只防糊成一片)。
第一轮结果被独立复核推翻的部分(wf_599ae571-de7,3 个 agent:v9 目测 / v9+v10 目测 / 数据 + 方法)
证据图在 outputs/genbench4/verify/{v9set_rev,rv_v9b_v10,dataskeptic}/。
- 「通过的首帧没有语义矛盾」是错的:随机 6 张里 4 张有明显矛盾。train_v9_04 的 9 张通过帧里 Boss 全被画成石头 / 水晶 / 圆顶 / 蘑菇(charcrop 对「形状像角色的物体」照样给 1.0);train_v9_05 alien、val_v9_02 mushroom 多出小人(only2 = 0.50 正好卡线放行);铺地变水面 / 熔岩池; 画面边缘加塔 / 地窖 / 高脚屋;train_v9_10 的玻璃建筑被画成可走地面(全图没有纯空地格,open 检查根本没跑)。
- VLM 单帧 P(scene) 噪声大:相邻采样时刻 ≥ 0.5 的判定 15.7 % 翻转,22/82 个 case 丢了又回来;2 s 处的「丢失」多是 VLM 阈值 + FLUX 在空地上加的 场景道具(墓碑、睡莲、火把)被模型按语义图抹掉,不是外观变了。dungeon 是 1/5(5–10 s)而不是 0/5。
- 训练片段记忆的混杂:22 个起点里 19 个是 train run,有的变体后期出现与 orig rollout 一模一样的灌木 / 地面斑块(v9_07 dungeon 55 s、v10_08 45 s)。
- edge_rel 刻度压缩:错位的语义图相对值也有 0.5–0.7,且看不出凭空多画的东西;「是不是源场景」探针在 13/14 个源上连 orig 都答 0,不能用来说「没退回」。
- DMD vs 教师 @5 s 在 icecave / swamp 上的 VLM 差距一部分是噪声(成对帧几乎一样,CLIP 持平或 DMD 更高);2 s 时 DMD 丢 dungeon 更快(2/5 vs 4/5)。
门槛 v2(gate2.py)与分档
在 v1 整图题上加:格子按语义类分题(terrain「只有天然地面」、paving「只有铺装地板,没变成水 / 熔岩」、architecture「是建筑」;内部格纯度 ≥ 0.92, 边缘一圈 ≥ 0.75);每个角色放大框问「是不是一个活的角色,不是石头 / 植物 / 雕像 / 物件」;整图 chars 题以原帧为基线恢复;阈值收紧。 全部 2184 张候选里只有 18 张过(12 个槽,A 档)—— 边缘格 57 % 不过(内部 26 %)。试过两种补救都无效:补边画布放大到 5/3、2 倍(padk_test: border_ok 0.51 → 0.52 / 0.56,内部与角色更差);RePaint 修补(repair.py:参考图换原帧、掩码外钉回候选,klein 4 步会照周围把城墙 / 蘑菇原样重画)。 B 档(角色安全、内部干净):角色题(生物 / 比对 / only2 ≥ 0.8)、scene ≥ 0.6、建筑格照旧严,空地格允许 ≤ 25 % 不过(实际都在边缘一圈: B 档内部格全部通过)、layout ≥ 0.3、obj ≥ 0.7。A 12 + B 43 = 55 个槽(alien 9、lava 12、icecave 11、swamp 9、graveyard 6、mushroom 3、 dungeon 2、castle 1、ruins 1、wildwest 1)。B 档的已知矛盾:边缘加墙 / 房 / 植物(如 train_v9_08 castle / dungeon / wildwest 顶边的城墙、木屋)。 评估 v2(evalvlm2.py):2AFC「第 t 秒的帧更像新首帧还是原首帧(只看环境)」两种顺序平均 + orig 对照;三帧窗口平均;报「每个 t ≥ 5 s 都保持」。 semfit.py:edge_recall / sep_miou 用正确语义图 vs 错位语义图(机会水平)。
v2 结果(55 槽 = A 12 + B 43;DMD 60 s + 教师 81 帧;第二轮复核 wf_4b0a76b4-201 后的表述)
证据:outputs/genbench4/verify2/{visaudit_r2,skeptic_method}/;数字:vlm2_{dmd,bidir}.json、summary2_*.json、semfit_*.json、metrics2_dmd.json。
- 首帧仍不完全干净(复核 2 推翻「A 档无矛盾、B 档只在边缘」):A 档 12 张里目测干净的约 5 张(其余:边缘冰墙 / 水晶、红树、铺地上的 熔岩、train_v10_03 swamp 空地上十几块长苔巨石);B 档角色全部完好(无变物体、无多人),但 gate2 自己就判 13/43 张有内部格违规 (空地上的石头 / 墓碑 / 箱子,树被抹掉,train_v9_08 右上的喷泉 + 铺地在 6 个变体里都被画成该场景的建筑)。「边缘一圈」= 外圈 96 px 格 = 画面 58 %。⇒ FLUX klein 做重主题换场景做不到大批量严格符合语义;要干净的测试集需要按语义图出图的生成器或手工 / 程序化首帧。
- 色调 / 光照不会退回原样:2AFC(第 t 秒的帧更像新首帧还是原首帧,两种顺序平均,预填答案读 1/2)55/55 在每个 t ≥ 5 s 都 > 0.5, 均值 0.99–1.0;orig 对照均值 0.045(长尾:8/55 某时刻 ≥ 0.3,val_v9_02 graveyard 0.54,train_v9_08 dungeon 0.32–0.50);目测 20 条 也没有退回。但 2AFC 基本由颜色决定(Lab 直方图代理 54/55 同结论、把 orig 帧调成 V0 色调也会判「新」)⇒ 只能说明颜色 / 光照不退; 材质 / 物体会退:train_v10_07 lava 5–30 s 是原来的草地 + 灰石 + 枯树染成暗红、裂纹没了;train_v9_08 dungeon 60 s 是原布局去饱和; CLIP 版 2AFC 每个 t 都更像 V0 的只有 30/55。train_v10_05 swamp 50–60 s 褪成灰白(离 O0 远,2AFC 仍 ≈ 1)。
- 场景身份(VLM「是不是 <场景>」,三帧窗口平均)每个 t ≥ 5 s 都 ≥ 0.5:20/55(alien 8/9、lava 7/12、icecave 4/11、castle 1/1; graveyard 0/6、swamp 0/9、mushroom 0/3、dungeon 0/2、ruins / wildwest 0/1)—— 阈值敏感:19/55 掉下去又回来,6 个只在单个时刻掉; 只看 60 s 是 31/55。v10 的 swamp / icecave 目测全程保持色调,VLM 因为没有红树 / 冰晶而判否;train_v9_10 icecave 的 orig 自己也被判 icecave。 机制(目测):新区域按语义图出现,拿到新色调,材质有时转有时不转;场景专属物体(墓碑、地窖、高脚屋)基本不会新造;帧 0 里语义图不支持的 场景道具 2–10 s 内消失(墓碑 3–4 s,蘑菇屋可留到 8–10 s 并被带到新区域)。
- 模型自己也会违反语义:60 s 前后常见凭空的大结构(train_v10_02 alien 霓虹板、train_v10_01 / v10_08 mushroom 花毯 / 发光小路、 train_v10_07 / v10_08 lava 横穿空地的熔岩流),现有指标(2AFC、edge recall、sep_miou)都抓不到 —— 需要「精度型」指标(大片 terrain 内部出现强边缘 / 异色,对比 orig)。
- 语义贴合(中位数):edge_recall 比值 0.94 / 0.98 / 1.00 / 0.98(5 / 15 / 30 / 60 s),错位语义图 0.52–0.61;sep_miou 0.83 / 0.89 / 0.89 / 0.75,错位 0.29–0.48 ⇒ 远高于机会水平,但 30 → 60 s 下降(成对 0.89 → 0.73,16/42 降 > 0.2),弱尾到 edge 0.5 / sep 0.2。
- DMD vs 教师 @5 s:颜色层面相同(2AFC 1.0 vs 1.0、R_clip 0.87 vs 0.86);场景身份 DMD 更差:P(scene) ≥ 0.5 37/55 vs 45/55,8 个只在 DMD 上丢、0 个反向,成对差 −0.069(bootstrap 95 % CI [−0.135, −0.010])。教师只有 81 帧,只能比 5 s。
- 混杂:47/55 是 train run(可能记得这些训练片段的样子);R_clip 无界,单个 case 不能用来判退回(val_v10_01 lava R_clip 0.41 目测仍是熔岩)。
第一轮(v1 门槛,82 槽)的数字(保留作对照;结论以 v2 为准)
门槛:220 槽通过 82(alien 18/22、lava 14、icecave 14、swamp 10、wildwest 6、dungeon 5、graveyard 5、mushroom 5、ruins 3、castle 2; pad 77 / edit2 5)。候选级失败原因计数(2184 张):open_ok 1433、layout 1365、obj_ok 567、scene 453、only2 286、chars 160、edge 25。 rollout:82 个换场景 + 22 个 orig,DMD 60 s + 双向教师 81 帧,同源同噪声配对。
新区域占比 new_frac(novelty.py,地面平面近似):中位 2 s 0.21、5 s 0.59、10 s 0.95、15 s 1.0、30 s 0.93、45 s 0.92、60 s 0.47(bot 常绕回 起点附近)。
VLM(evalvlm.py,P(是该场景);orig 同帧基线 ≈ 0.03):
| t | 0 | 2 | 5 | 10 | 15 | 30 | 45 | 60 |
|---|---|---|---|---|---|---|---|---|
| 全部 P(scene) | 0.97 | 0.90 | 0.69 | 0.65 | 0.55 | 0.62 | 0.64 | 0.60 |
| 全部 ≥ 0.5 | 81/82 | 75 | 57 | 54 | 45 | 52 | 53 | 49/82 |
按场景 ≥ 0.5 @60 s:alien 18/18(全程)、lava 13/14、icecave 12/14、castle 1/2、wildwest 1/6(45 s 5/6)、swamp 3/10、ruins 1/3、dungeon 0/5 (5 s 已 1/5)、graveyard 0/5(5 s 0/5)、mushroom 0/5(30 s 起 0/5)。只看「画面 ≥ 90 % 是新区域」的时刻:120/206 = 0.58 仍判为新场景 (alien 42/42、lava 33/36、icecave 22/31、wildwest 9/16、castle 3/6、swamp 7/29、ruins 2/10、mushroom 1/11、dungeon 1/13、graveyard 0/12)。 「是不是源(训练)场景」探针不可用:orig 自己只有 0.15–0.23。coherent:变体 0.88–0.95,orig 0.55–0.77(v9 后处理画风被 VLM 当成噪点), mushroom 降到 0.60(60 s)。
配对指标(metrics4.py,summary_dmd.json):R_clip 2 s 0.87、5 s 0.85、15 s 0.81、30 s 0.80、60 s 0.83;R_lab ≈ 1.0–1.05(颜色分布与 orig 的差 到 60 s 都没缩小);edge_rel 5 s 0.94、30 s 1.00、60 s 1.01(mushroom 0.76–0.88);清晰度 0.94–0.97。dungeon / graveyard 的 R_clip 0.6–0.76: VLM 判「不是地牢 / 墓地」时整帧外观仍明显不同于 orig。
DMD vs 双向教师 @5 s:R_clip 0.85 vs 0.86;VLM ≥ 0.5 57/82 vs 65/82(icecave 8/14 vs 14/14、swamp 4/10 vs 8/10、wildwest 6/6 vs 4/6,其余 相近;dungeon 1/5 vs 1/5、graveyard 0/5 vs 0/5);edge_rel 0.94 vs 0.91。