跳转至

Infinigen Object Reconstruction

Development / historical ledger;不是 formal Generated-video Results。 Infinigen 是 asset source, VideoGen 才是 video input。正式 generator/prompt/seed/camera/reference manifest 尚未冻结;当前设计见 Reconstruction metric reviewPaper tables

Historical note (2026-07-15): the temporary object_sam3_debug path described below has been promoted and replaced by the production object_mask schema documented in docs/project/infinigen_masks.md. References to the old debug path are retained only as an experiment record and are not runnable interfaces.

日期:2026-07-07

Objective

为 35 个 Infinigen object-recon case 准备稳定的 V41R-style 跑法。 当前已完成 handoff 文档指定的 3-case smoke:

  • 8: infinigen_door_p00_i01_videogen
  • 14: infinigen_drawer_p00_i00_videogen
  • 20: infinigen_microwave_p00_i02_videogen

Current Best Run

  • Run ID: infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1
  • Env: /tmp/arthoi4d-tmp
  • Base config: configs/methods/recon/ours_track_refine_synthetic.yaml
  • Exp JSON: output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/exp_8_14_20.json

Drawer Scale Diagnostics

日期:2026-07-12

只针对 infinigen_drawer_p00_i00_videogen 做了 3 组单点诊断,不重跑 full recon protocol,只看 scale 相关因素。

运行目录:

  • pose-mode ablation: output/runs/drawer_pose_mode_scale_diag_20260712
  • object-init depth diagnostic: output/runs/drawer_objectinit_depth_diag_20260712
  • HOI-align scale diagnostic: output/runs/drawer_hoialign_scale_diag_20260712
  • unified summary + panels: output/runs/drawer_scale_compare_20260712

关键结果:

  • baseline result_object_pose_recon.pt scale = 0.175551
  • yaw_only + ground_support -> 0.174963
  • yaw_only + full_xyz -> 0.175273
  • 结论:去掉 ground_support 几乎不改 drawer scale,yaw_only 本身也不是当前大误差的主因
  • full_so3 + ground_support/full_xyz 最后迭代 scale 约 0.1786 / 0.1781
  • 但两者都在 export 时失败: drawer_slider_1 超出允许 clamp 阈值(max_abs_delta 0.0130 / 0.0167 > 0.01
  • 因此当前不能把 full_so3 视为可接受修复
  • source object-init init.object_scale = 0.193956
  • object-init refine nodepth -> scale_after = 0.179218
  • object-init refine depth_abs1 -> scale_after = 0.175275
  • 与 baseline 0.175551 已几乎重合,且 IoU 0.8366 -> 0.8898
  • 当前 drawer scale 最有效的单点修复是:在 object-init refine 打开 aligned-depth abs loss
  • HOI-align translate_only -> 0.175551(完全不变)
  • HOI-align translate_plus_scale -> 0.175075
  • 说明 HOI-align 放开 scale 后只产生很小修正(约 -4.76e-4),不能指望它补救 drawer 的大 scale 偏差

本轮最可能的错误位置判断:

  • 第一嫌疑仍是 object-init / object-pose 前段的 metric-scale 恢复,而不是 HOI-align
  • 仅改 joint-search pose mode(yaw_onlyground_support)对 drawer scale 基本无效
  • 真正有用的是把 depth 直接接到 object-init residual refine;这说明当前 scale 偏差主要缺少早期 metric-depth 约束,而不是后段 HOI 接触优化没放开 scale

可视化:

  • metrics csv: output/runs/drawer_scale_compare_20260712/drawer_scale_metrics_summary.csv
  • pose-mode panel: output/runs/drawer_scale_compare_20260712/pose_mode_scale_panel.png
  • object-init depth panel: output/runs/drawer_scale_compare_20260712/object_init_depth_panel.png
  • HOI-align panel: output/runs/drawer_scale_compare_20260712/hoi_align_scale_panel.png

Object Mask Debug Diagnostics

日期:2026-07-12

前述 drawer / door scale 诊断建立在错误 object mask 上,因此这部分结论优先级高于前述 scale ablation。

本轮目标:

  • 只跑 object SAM3 mask debug,不重跑其它 preprocess 和 recon
  • 针对 drawer / door 各测两种临时策略:
  • multi_instance_union_reject(对应 2+5)
  • candidate_label_union(对应 3)
  • 代码保持 legacy path,不覆盖原逻辑,只通过 object_sam3_debug 分支软接入
  • 运行环境改为 conda env arthoi4d

关键代码:

  • pipeline/reconstruction/preprocess/segmentation/sam3_masks.py
  • pipeline/hoi_reconstructor.py
  • scripts/experiments/run_sam3_object_mask_debug.py

临时 runtime config:

  • drawer:
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_drawer_p00_i00_videogen/runtime/pipeline_config_maskdebug_multi_instance_union_reject.yaml
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_drawer_p00_i00_videogen/runtime/pipeline_config_maskdebug_candidate_label_union.yaml
  • door:
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_door_p00_i01_videogen/runtime/pipeline_config_maskdebug_multi_instance_union_reject.yaml
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_door_p00_i01_videogen/runtime/pipeline_config_maskdebug_candidate_label_union.yaml

mask debug 运行目录:

  • output/runs/object_mask_debug_refimg_20260712

状态:

  • drawer:
  • multi_instance_union_reject: success
  • candidate_label_union: fail
  • door:
  • multi_instance_union_reject: success
  • candidate_label_union: success

汇总文件:

  • run status: output/runs/object_mask_debug_refimg_20260712/run_status.tsv
  • metrics csv: output/runs/object_mask_debug_refimg_20260712/comparison/mask_compare_summary.csv
  • drawer panel: output/runs/object_mask_debug_refimg_20260712/comparison/infinigen_drawer_p00_i00_videogen_mask_compare.png
  • door panel: output/runs/object_mask_debug_refimg_20260712/comparison/infinigen_door_p00_i01_videogen_mask_compare.png

关键结果:

  • drawer multi_instance_union_reject
  • area_ratio_frame0 = 0.03982
  • reference_iou = 0.51911
  • 选中的仍是多个抽屉面板:[3, 6, 7, 8]
  • drawer candidate_label_union
  • 失败于 reject gate: reference_iou = 0.2179 < 0.2200
  • 当前 drawer_base + drawer_door 没有恢复出整柜体 silhouette
  • door multi_instance_union_reject
  • area_ratio_frame0 = 0.07429
  • reference_iou = 0.67340
  • 仅选中 obj_id = 0
  • door candidate_label_union
  • 结果与 legacy / 2+5 基本一致
  • door_frame prompt 没有选出额外实例;有效部分仍只有 door

本轮结论:

  • drawer 的主要问题不是“单实例太少”,而是 SAM3 语义上把多个 drawer_door 当成 object;把它们 union 以后仍不是整柜体
  • 当前 reference gate 采用归一化 crop silhouette IoU,会把多个矩形抽屉面板误认为和 canonical drawer 外形足够相似,因此无法可靠拒绝 drawer face union
  • door 的主要问题不是 reject gate,而是 text prompt 本身没有把 door_frame 实例召回;因此 3 和 2+5 都没有真正补到门框
  • 结论上,scale 错误的直接来源仍是 object mask 缩到 active part,而不是 joint search / HOI-align 本身

下一步更合理的修复方向:

  1. drawer: 不再只用 cropped normalized IoU,改成更强的 whole-object prior(例如保留 canvas 上下文的 silhouette / bbox extent / support extent)
  2. door: 给 door_frame 增加 prompt alias 或独立 whole-object prior,否则 label union 也只会退化成 door
  3. 两类 case 都应继续保留 debug-only 分支,确认 whole-object mask 可恢复后再考虑是否并回默认 preprocess

Object Mask Debug Round 2

日期:2026-07-14

本轮把上一轮失败的两条临时 debug 策略直接替换掉:

  • 删除旧 debug mode:
  • multi_instance_union_reject
  • candidate_label_union
  • 新 debug mode:
  • reference_subset_select
  • prompt_alias_select
  • label_alias_union_select
  • 原始默认 object-mask 路径保持不变,仍由 hoi_reconstructor.py 中的 legacy else -> run_sam3_masks(...) 处理

额外本地修复:

  • submodules/sam3/sam3/model_builder.py 去掉对 pkg_resources.resource_filename(...) 的依赖,直接用本地 assets/bpe_simple_vocab_16e6.txt.gz
  • 动机:arthoi4d 环境中有不可读的 .dist-info 目录,pkg_resources import 会提前失败

批量实验:

  • run root: output/runs/object_mask_debug_suite_20260714
  • summary: output/runs/object_mask_debug_suite_20260714/summary.csv
  • drawer panel: output/runs/object_mask_debug_suite_20260714/comparison/infinigen_drawer_p00_i00_videogen_panel.png
  • door panel: output/runs/object_mask_debug_suite_20260714/comparison/infinigen_door_p00_i01_videogen_panel.png

本轮 2 个方向、2 轮方法:

  1. whole-object prior 方向
  2. prior_loose
  3. prior_hard
  4. prompt alias 方向
  5. alias_object
  6. alias_label
  7. 第二轮 completion / hull
  8. alias_object_hull
  9. alias_label_hull

Drawer 结论

  • prior_loose / prior_hard / alias_object / alias_object_hull
  • 都退化为选择单个小抽屉面板
  • selected_prompt = drawer
  • selected_obj_ids = [1]
  • area_ratio_frame0 = 0.00778
  • 说明单靠更强 prior 打分,仍会被“局部 drawer face 的 shape 很像 canonical 正面”误导
  • alias_label / alias_label_hull
  • drawer_base 最优 prompt 变成 dresser
  • 成功召回整柜体 mask,area_ratio_frame0 = 0.12731
  • drawer_door 分支只补了一个小 drawer face,但对最终 union 影响不大
  • completion/hull 基本没再带来额外收益
  • 定性上真正有用的是: label aliases for static body labels

Door 结论

  • prior_loose / prior_hard / alias_object
  • 与 legacy 基本一致,仍是门板本体
  • door frame / arched door frame / doorway / archway 都没有召回实例
  • alias_label
  • door_frame 仍然完全空
  • door 分支从 wooden door 得到的 mask 与 legacy 近似
  • alias_object_hull / alias_label_hull
  • 通过 completion 把多连通门板 mask 压成单连通 arch silhouette
  • normalized_iou 从约 0.652 提升到 0.693 / 0.706
  • component_count6/7 降到 1
  • 但仍没有真正召回 reference 中左侧/后侧 frame 几何,只是 shape-completion 改善

综合判断

  • drawer: 当前最有效的方向已经很明确,不是更强 subset prior,而是 把 whole-object static body label 用更合适 alias 重新 prompt 出来
  • door: 当前 alias 词表仍不足以真正召回 door_frame
  • 现阶段唯一有效增益来自 completion/hull
  • 但这更像几何补全,不是语义召回
  • 因此如果继续迭代:
  • drawer 应把 drawer_base -> dresser/cabinet 这类 alias 机制正式化
  • door 需要继续扩 door_frame 专用 alias,或引入单独的 frame-aware completion/prior,而不是只靠 generic hull

日期:2026-07-14

已将当前 best 策略直接写入 configs/datasets/infinigen/summary.json 的 case override:

  • infinigen_drawer_p00_i00_videogen
  • 启用 reconstruction.preprocess.segmentation.object_sam3_debug
  • 使用 mode = label_alias_union_select
  • drawer_base aliases: dresser body / cabinet body / dresser / cabinet / chest of drawers
  • drawer_door aliases: drawer / drawer front
  • mask_completion.enabled = false
  • infinigen_door_p00_i01_videogen
  • 启用 reconstruction.preprocess.segmentation.object_sam3_debug
  • 使用 mode = label_alias_union_select
  • door_frame aliases: door frame / arched door frame / arched doorway / doorway / archway
  • door aliases: door / arched door / wooden door
  • mask_completion.enabled = true
  • fill_convex_hull = true
  • close_kernel_px = 9

备注:

  • 当前这一步只是把 best 策略推广到 case-level config,尚未基于新 summary 重跑真实 preprocess / recon
  • 因为 hoi_reconstructor.py 仍保留默认 legacy else -> run_sam3_masks(...),只有这两个 case 会走额外恢复分支

Final Smoke Status

  • preprocess: 实际 3/3 可用
  • recon: 3/3 完成,均写出 recon/output/result.pt

结果文件:

  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_door_p00_i01_videogen/recon/output/result.pt
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_drawer_p00_i00_videogen/recon/output/result.pt
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_microwave_p00_i02_videogen/recon/output/result.pt

active-joint 产物:

  • .../infinigen_door_p00_i01_videogen/recon/preprocess/active_joints/result.json
  • .../infinigen_drawer_p00_i00_videogen/recon/preprocess/active_joints/result.json
  • .../infinigen_microwave_p00_i02_videogen/recon/preprocess/active_joints/result.json

Real Fixes Applied

  1. CoTracker3 sliding-window 本地化修复

  2. 文件: pipeline/reconstruction/preprocess/tracks/point_tracks.py

  3. 修复: sliding-window 聚合后的 tensor 显式 .detach().cpu().numpy()
  4. 原始报错: TypeError: can't convert cuda:0 device type tensor to numpy

  5. FoundationPose init-frame 参数对齐

  6. 文件: pipeline/reconstruction/preprocess/object_init/foundation_pose.py

  7. 修复: run_foundation_pose_object_init(...) 显式接受 init_frame_index
  8. 现状: 当前只支持 init_frame_index == 0,非零会显式报错

  9. no-VLM solver 配置闭合

  10. 文件: configs/methods/recon/ours_track_refine_synthetic.yaml

  11. 修复: 显式设置 optimization.loss.contact: 0.0
  12. 原始报错: recon 阶段仍要求 contact labels,触发 FileNotFoundError: optimization.loss.contact > 0.0 requires VLM contact labels

  13. active_joint_names 的 Infinigen case 改为显式 manual active-joint 选择

  14. 文件: configs/datasets/infinigen/summary.json

  15. 变更: 为 15 个已有 object.active_joint_names 但未声明策略的 case 写入 reconstruction.preprocess.active_joints.selection: manual
  16. 直接动机: drawer case 在 selection=auto 下会报 RuntimeError: Active-joint detection found no track/link assignments
  17. 当前 smoke 中: infinigen_drawer_p00_i00_videogen 已通过 manual 路径补跑成功

Important Logs

  • clean preprocess log: output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/logs/preprocess_smoke.log
  • drawer manual rerun: output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/logs/preprocess_drawer_manual.log
  • recon success log: output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/logs/recon_smoke_rerun.log

注意:

  • preprocess_summary.json 仍记录第一次 multi-batch 的 2 success / 1 failed
  • 这是因为 drawer 的 manual 补跑是单 case 追加完成的
  • 真实最终状态以 preprocess_drawer_manual.log 和各 case 产物为准

Full35 Readiness

当前可以按 no-VLM 路线继续准备 full35,但需沿用以下约束:

  1. 使用 configs/methods/recon/ours_track_refine_synthetic.yaml
  2. 不要用 scripts/run/infinigen/full.sh full.sh 仍默认走 VLM-contact config
  3. create_exp_json.py 生成 exp,再分 stage 跑
  4. 对带 object.active_joint_names 的 case,保留 summary 里的 reconstruction.preprocess.active_joints.selection: manual

Next Commands

full35 推荐仍按 no-VLM 分两段:

  1. preprocess python scripts/run/infinigen/preprocess_from_exp.py --exp_json <full35_exp_json>
  2. recon python cli/pipeline/run_all.py --exp_json <full35_exp_json> --stage recon

Microwave Diagnosis

case:

  • infinigen_microwave_p00_i02_videogen

结论:

  • active-joint 选择本身是对的:recon/preprocess/active_joints/result.json 正确选中 door_joint_0
  • 主要适配问题不在 active_part mask
  • 当前 no-VLM smoke 实际没有启用 part_mask loss
  • runtime/pipeline_config.yamloptimization.loss.part_mask.value: 0.0
  • 真正不对的是 track_refine 默认的一次性 multi_anchor_2d_loss
  • track_refine 会对每个 CoTracker3 point_source_frame 用 warm-start 关节值渲染 source_vertices
  • 但 microwave 的 warm-start 在后半段已经错了,例如:
    • result_object_pose_recon.pt: frame 75 = 60.46 deg, frame 90 = 0.0 deg, frame 105 = 0.0 deg
    • result_object_articulation_recon.pt: frame 80 = 74.74 deg, frame 90 = 33.2 deg, frame 100 = 0.0 deg
  • 这意味着后半段 source frame(尤其 90/105)上的 2D tracks 会被绑定到错误门姿的 mesh 上,再进入 one-shot joint refine
  • 最终轨迹证据:
  • recon/output/result.ptdoor_joint_0 只在 frame 63-91 非零
  • 峰值在 frame 86,约 89.64 deg
  • frame 100 已重新回到 0 deg
  • 源视频和 object mask 不支持“关回去”的结论
  • 可视化见:
    • recon/output/microwave_debug/mask_keyframes_panel.png
    • recon/output/microwave_debug/object_human_mask_overlap.png
    • recon/output/microwave_debug/door_joint_trajectory.png
  • frame 100 的源帧和 object mask 仍显示门处于打开状态

建议修复路线:

  • 不直接继续用 ours_track_refine_synthetic.yaml 的 one-shot multi_anchor_2d_loss
  • 改用新增 config: configs/methods/recon/ours_track_refine_synthetic_sequential_multibind.yaml
  • 该 config 显式:
  • 关闭 track_refine.multi_anchor_2d_loss
  • 启用 track_refine.sequential_multibind.enabled
  • 这样后续 source frame 会分阶段重绑,减少“错误 warm-start source pose 参与后半段绑定”的问题

Sequential Multibind Rerun

日期:2026-07-07

run:

  • Run ID: infinigen_v41r_object_microwave_seqmb_fix1
  • Base config: configs/methods/recon/ours_track_refine_synthetic_sequential_multibind.yaml
  • Exp JSON: output/runs/infinigen_v41r_object_microwave_seqmb_fix1/exp_20.json

执行说明:

  • 新 run 的 preprocess 在当前 shell 下无法直接重跑
  • SAM3 video inference expects CUDA, but no GPU is available.
  • 为保持“只换 recon config”的对比,这次复用了旧 smoke 的 preprocess:
  • output/runs/infinigen_v41r_object_smoke_arthoi4d_tmp_novlm_local_fix1/cases/infinigen_microwave_p00_i02_videogen/recon/preprocess 拷到新 run case
  • recon 通过非沙箱 GPU 跑通

结果:

  • sequential multibind 确实生效:
  • recon/output/object_articulation_recon/joint_refine/sequential_multibind_summary.json
  • source frames: [30, 45, 60, 75, 90, 105]
  • 但 microwave 没有修好,且比旧版更早错误关上

新旧对比:

  • old multi-anchor:
  • 峰值 89.64 deg @ frame 86
  • door_joint_0 > 5 deg 区间:64-91
  • frame 100/110/120 = 0 deg
  • new sequential multibind:
  • 峰值 67.93 deg @ frame 80
  • door_joint_0 > 5 deg 区间:63-84
  • frame 86/90/100/110/120 = 0 deg

对比图:

  • 轨迹: output/runs/infinigen_v41r_object_microwave_seqmb_fix1/cases/infinigen_microwave_p00_i02_videogen/recon/output/compare_debug/door_joint_compare.png
  • 渲染关键帧: output/runs/infinigen_v41r_object_microwave_seqmb_fix1/cases/infinigen_microwave_p00_i02_videogen/recon/output/compare_debug/render_keyframes_compare.png

当前判断:

  • sequential_multibind 解决了“后半段错误 source pose 参与 one-shot multi-anchor 绑定”的一部分协议问题
  • 但对这个 microwave case,仍缺少足够强的“门在后半段应保持打开”的监督
  • 现状看,它把峰值提前到更早阶段,同时更早衰减回零位

Microwave Sequential Ablations

日期:2026-07-07

目标:

  • 检查当前 microwave 的“提前关”是否来自某种“结尾必须保持关闭 / 关闭后不能再开”的监督,而不是纯粹的 track-refine 协议问题

已确认的配置事实:

  • optimization.loss.no_contact_articulation.enabled: false
  • 当前 no-VLM microwave 路线不存在启用中的显式“post-contact no-reopen / end-closed”loss

本轮 ablation:

  1. w_mask=0

  2. Run ID: infinigen_v41r_object_microwave_ablate_maskloss

  3. 做法:
  4. fresh runtime config 后只改 track_refine.w_mask: 0.0
  5. 结果:
  6. 峰值 68.67 deg @ frame 81
  7. door_joint_0 > 5 deg 区间:63-85
  8. frame 86/90/100/110 = 0 deg
  9. 判断:
  10. 去掉 full-sequence mask supervision 也没有阻止“提前关”
  11. 因此当前错误不是由 track_refine.w_mask 单独驱动的

  12. max_stages=4

  13. Run ID: infinigen_v41r_object_microwave_ablate_stop4

  14. 做法:
  15. fresh runtime config 后只改 track_refine.sequential_multibind.max_stages: 4
  16. 相当于去掉最后两个 late stages:source=90,105
  17. 结果:
  18. 峰值 68.35 deg @ frame 80
  19. door_joint_0 > 5 deg 区间:63-84
  20. frame 86/90/100/110 = 0 deg
  21. 判断:
  22. 去掉后半段 source=90/105 也没有修好
  23. 因此“提前关”不是由最后两段 sequential stage 单独造成的

统一对比:

  • 轨迹汇总 JSON: output/runs/infinigen_v41r_object_microwave_ablation_compare/door_joint_compare_all.json
  • 四组轨迹图: output/runs/infinigen_v41r_object_microwave_ablation_compare/door_joint_compare_all.png
  • 关键帧面板: output/runs/infinigen_v41r_object_microwave_ablation_compare/render_keyframes_compare_all.png
  • 主视角裁剪关键帧: output/runs/infinigen_v41r_object_microwave_ablation_compare/render_keyframes_compare_incoming_crop.png

当前结论更新:

  • 没有证据表明 microwave 的“提前关”来自显式“结尾保持关闭 / 不许 reopen”的监督
  • 也没有证据表明它主要由 track_refine.w_mask 或最后两个 late sequential stages 驱动
  • 更可能是 sequential_multibind 早期阶段本身就已把门角度拉回零附近,后续 freeze_previous_frames=true / resume 只是在延续这个错误状态

清理:

  • 失败的临时 method config configs/methods/recon/ours_track_refine_synthetic_sequential_multibind.yaml 已删除
  • fresh ablation 只保留各自 run 内的 runtime config 与结果,未再新增仓库级 method config
  • seqmb_fix1 / ablate_* 目录下的 exp_20.json 现在只作为历史记录保留;若要复现,直接使用各 case 的 runtime/pipeline_config.yaml

Microwave Warm-Start Recovery Attempts

日期:2026-07-08

目标:

  • 做 4 个彼此独立的 stage2 尝试,检查是否能修掉 baseline 的 microwave “提前关”

已加的 track-refine 调试能力:

  • infinigen_default.yaml
  • 显式新增: track_refine.multi_anchor_source_frame_allowlist track_refine.multi_anchor_source_min_mask_iou track_refine.two_pass_rebind.*
  • pipeline/reconstruction/optimization/tracks/refine3d.py
  • 支持按 source-frame allowlist 过滤 multi-anchor 绑定
  • 支持 source-frame render mask IoU 诊断并写入 summary.json
  • pipeline/reconstruction/optimization/run.py
  • 支持 two_pass_rebind 包装:先用受限 source 做 pass0,再从 pass0 结果进入完整 pass1

4 个 fresh run:

  1. 1A cap75

  2. Run ID: infinigen_v41r_object_microwave_try_1a_cap75

  3. 改动: multi_anchor_source_frame_allowlist = [0,15,30,45,60,75]
  4. 结果:
  5. 峰值 88.75 deg @ frame 87
  6. >5 deg 区间:64-92
  7. frame 90 = 43.24 deg
  8. frame 100/110 = 0 deg
  9. 判断:
  10. 比 baseline 只多撑了约 1 帧
  11. “提前关”基本未修好

  12. 1B src-iou

  13. Run ID: infinigen_v41r_object_microwave_try_1b_sourceiou

  14. 改动: multi_anchor_source_min_mask_iou = 0.65
  15. 结果:
  16. 峰值 88.36 deg @ frame 86
  17. >5 deg 区间:63-91
  18. frame 100/110 = 0 deg
  19. source-frame IoU: 75=0.742, 90=0.745, 105=0.680
  20. 判断:
  21. 阈值没挡掉任何晚期 source frame
  22. 效果与 baseline 几乎相同,说明这版 IoU gate 太弱

  23. 1C two-pass

  24. Run ID: infinigen_v41r_object_microwave_try_1c_twopass

  25. 改动:
  26. pass0:source=[0,15,30,45,60,75]
  27. pass1:从 pass0 结果 warm start,再跑完整 source 集合
  28. 结果:
  29. 峰值 87.39 deg @ frame 88
  30. >5 deg 区间:63-107
  31. frame 90 = 73.34 deg
  32. frame 100 = 53.08 deg
  33. frame 110 = 0 deg
  34. 判断:
  35. 明显延后了错误关门
  36. 但仍在后段突然塌回关闭,并出现 90-105 一段偏平的“半开平台”

  37. joint-search

  38. Run ID: infinigen_v41r_object_microwave_try_jsparse

  39. 改动:
  40. 开启 joint_search.enabled = true
  41. run_before_track_refine = true
  42. optimizer = grid_dp
  43. frame_interval = 15
  44. 结果:
  45. 峰值 103.13 deg @ frame 108
  46. >5 deg 区间:65-120
  47. frame 90 = 90.27 deg
  48. frame 100 = 93.75 deg
  49. frame 110/120 = 103.13 deg
  50. 判断:
  51. 原来的“提前关”现象消失
  52. 但出现新的 warm-start / refine drift:门后段继续增大并停在过开状态

统一对比产物:

  • JSON: output/runs/infinigen_v41r_object_microwave_try_compare/attempt_compare_summary.json
  • 曲线图: output/runs/infinigen_v41r_object_microwave_try_compare/door_joint_compare_attempts.png
  • 关键帧拼图: output/runs/infinigen_v41r_object_microwave_try_compare/render_keyframes_compare_attempts.png

当前结论:

  • baseline 的问题更像是:
  • late warm-start source pose 错,导致 multi-anchor binding 把后半段 tracks 绑到错误关门几何上
  • 之后 track-refine 主要在这个错误 basin 里做平滑和细调,无法靠现有 2D/mask 项把门再拉开
  • 1A 说明单纯砍掉 90/105 source frame 不够
  • 1B 说明当前 render-mask IoU 还不能有效区分“几何姿态虽错但 silhouette 仍像”的 source frame
  • 1C 说明“先用早期 source 重绑,再进入完整 refine”是有效方向,但 pass1 重新引入晚期 source 后仍会把结果拖回错误 basin
  • joint-search 说明只要 warm start 足够接近正确开门轨迹,track-refine 可以保持打开;但缺少后段约束时又会继续漂到过开

下一步优先级:

  1. 优先沿 1C 路线继续
  2. 让 pass1 不再完全恢复 baseline 式 late-source 绑定,或者降低晚期 source 的绑定权重
  3. 次优先尝试在 joint-search 成功 warm start 的基础上
  4. 给后段加轻量稳定项,抑制继续过开,而不是重新允许塌回关闭
  5. 不优先继续 1B
  6. 这版 source-mask IoU 对 microwave 不够判别