Track3D Refine 与 VideoArtGS Tracking Loss 对比¶
本文对比三套 loss:
ours原始track_3d_refine:本轮改动前的实现。VideoArtGS:submodules/VideoArtGS中实际用于 TAPIP3D 的 tracking 约束。ours当前改法:本轮改动后的工作区实现,尚需继续实验验证。
结论摘要¶
| 维度 | 原始 ours | VideoArtGS | 当前 ours 改法 |
|---|---|---|---|
| TAPIP3D 的使用方式 | 先把 TAPIP3D 点硬绑定到 CAD movable face,再优化 CAD joint 序列 | 直接把 TAPIP3D frame 0 当 canonical 点,学习 deformation / segmentation / joint time function | 保留 CAD face/barycentric 绑定,但主信号改成 anchor-relative 3D displacement |
| 主 tracking 坐标系 | 默认配置是 2D reprojection pixel loss | 3D camera/world track point loss | 默认改为 3D track loss |
| canonical 点来源 | CAD surface closest point + barycentric | TAPIP3D track3d[0] 本身 |
CAD surface point,但 C2O loss 用相对位移弱化 CAD 初始贴合误差 |
| 优化变量 | 每帧 hinge/slider joint value;root pose/scale 固定 | canonical Gaussian、segmentation、joint origin/axis、time function 等 | 每帧 hinge/slider joint value;root pose/scale 仍固定 |
| track 数量 | max_tracks=32 |
每步随机采样 512 条 | max_tracks=512,batch 512 |
| microwave 失败主因 | door joint 从 global opt 的约 74 度被 opt_joint_init_mode=zero 丢掉;2D/absolute loss 对 wrong joint 也能降 loss |
模型自由度更大,且 canonical 直接来自 tracks,静态 CAD 对齐误差不会淹没运动信号 | 保留 resume 初始化,增加 relative 3D C2O 和 long-offset pair 后有改善,但 2026-04-30 rerun 仍不够:door 抖动,且没有打开到最大角度 |
原始 ours Tracking 阶段¶
入口:pipeline/reconstruction/optimization/tracks/refine3d.py
原始配置:configs/methods/recon/ours_track_refine.yaml
| Loss / 机制 | 原始配置 | 数学含义 | 作用 | 对 microwave 的问题 |
|---|---|---|---|---|
anchor_loss |
w_anchor: 1.0 |
Huber(pred_t - obs_t),默认在 2D reprojection 空间 |
让 CAD surface 上的绑定点在每帧投影到 TAPIP3D 观测点 | 这是 absolute loss,混入 CAD pose/scale/depth 初始误差;可能优先修几何偏差,而不是解释开门运动 |
pair_loss |
w_pair: 0.15, pair_offsets: "1,2" |
Huber((pred_t - pred_{t-k}) - (obs_t - obs_{t-k})) |
约束短时间位移一致性,减弱 absolute 偏差 | offset 只有 1/2 帧,microwave 开门是长时段慢变化,短 offset 信号弱 |
| 2D reprojection mode | use_2d_reprojection_loss: true |
把 3D CAD 点投影成 pixel 后算 anchor/pair |
避免直接相信 TAPIP3D depth | 对开门角度约束弱,深度方向运动容易被压扁;wrong joint 也可能通过 2D 投影降低 loss |
| Track selection | max_tracks: 32, motion_score_power: 8.0 |
只保留 32 条高运动/近表面 track | 降计算量,偏向动态点 | 32 条太少,容易集中在少数 face 或错误 link;对多个 hinge 的区分能力弱 |
| Binding | binding_joint_init_mode: "resume" |
用 global opt joint state 预测 anchor CAD mesh,再绑定 TAPIP3D 点 | 用已有 CAD 状态提高绑定准确度 | 绑定可过,但后续优化没有继续使用 resume 作为初始值 |
| Optimize init | opt_joint_init_mode: "zero" |
优化变量从全 0 joint 序列开始 | 试图让 tracks 独立重估 articulation | 对 microwave 是严重问题:global opt 已经给 door joint 约 74 度,但 refine 从 0 开始,最后 door 只到约 5 度 |
| Joint limits | URDF limits | step 后 clamp hinge/slider 到 joint limits | 防止越界 | 不能防止能量流向错误可动关节,例如 plate_joint_0 |
原始代码里曾有一个默认权重为 0 的闭合正则残留项,不是有效 loss;当前实现已将它从代码和配置中移除。
原始总 loss:
这个设计的问题不是“没有 tracking loss”,而是 tracking signal 的表达方式太弱:默认在 2D,tracks 太少,短 offset pair 太弱,而且从 zero 初始化会抹掉 global opt 已经找到的 door opening。
VideoArtGS Tracking Loss¶
相关位置:
| 文件 | 关键代码 |
|---|---|
submodules/VideoArtGS/trainer.py |
每步 torch.randperm(... )[:512] 采样 512 条 track,并调用 track_loss_c2o(...) |
submodules/VideoArtGS/scene/videoartgs.py |
sample_track_c2o, track_loss_one_sample_c2o, track_loss_o2o |
VideoArtGS 的训练总 loss 不只有 tracking:
| Loss | 代码位置 | 作用 | 备注 |
|---|---|---|---|
| RGB L1 + SSIM | trainer.py render loss |
保证 Gaussian 渲染外观对齐视频 | 主 reconstruction loss |
| metric depth loss | metric_depth_loss_weight |
对齐 metric depth | 若有可靠 depth,则约束 3D |
| mono depth loss | mono_depth_loss_weight |
对齐 monocular depth/ranking | 可选 |
| deformation / segmentation regularization | reg_loss(...) |
稳定 part segmentation 和 deformation | 3000 iter 后启用 |
track_loss_c2o |
track_loss_weight |
从 canonical frame 0 tracks 变换到目标帧 tracks | 训练时实际启用 |
track_loss_o2o |
函数存在 | 任意 observed frame 到任意 observed frame 的一致性 | 当前 trainer.py 默认没有调用,但实现可借鉴 |
VideoArtGS 的 C2O loss¶
| 步骤 | 含义 |
|---|---|
xc = track3d[0] |
直接把 TAPIP3D 第 0 帧 3D 点作为 canonical 点 |
随机采样 tgt_id |
在 window_size 内采样目标帧 |
mask = get_mask(xc) |
学习每个点属于哪个 part |
qr_tgt, qd_tgt = get_slot_deform(t_tgt) |
学习每个 part 的目标帧刚体/关节变换 |
xt_pred = deform_pts_batch(xc, mask, qr_tgt, qd_tgt) |
从 canonical 点预测目标帧观测点 |
mean(norm(xt_pred - xt_tgt)) |
直接做 3D track point L2 loss |
VideoArtGS C2O 的关键优势是:canonical 就是 TAPIP3D 自己的第 0 帧点,所以初始 CAD 贴合误差不存在。它不需要先把 track 点投到 CAD surface 上,因此不会被 CAD pose/scale/depth 的几厘米偏差淹没。
VideoArtGS 的 O2O loss¶
| 步骤 | 含义 |
|---|---|
随机采样 src_id/tgt_id |
从任意 observed frame 到另一个 observed frame |
obs2cano(xt, t) |
把源帧点逆变换回 canonical |
cano2obs(xc, t_tgt) |
再从 canonical 变换到目标帧 |
mean(norm(pred - xt_tgt)) |
约束跨帧运动一致性 |
O2O 的优势是不会只依赖 frame 0;它能利用更多时间对,尤其适合长视频里慢速 articulation。但 VideoArtGS 当前训练主循环实际调用的是 track_loss_c2o,不是 track_loss_o2o。
当前 ours 改法¶
当前改动目标:保留 CAD 的优势,但把 tracking signal 改得更接近 VideoArtGS 的 3D C2O/O2O 约束。
| Loss / 机制 | 当前配置 | 数学含义 | 作用 | 风险 |
|---|---|---|---|---|
anchor_loss |
w_anchor: 0.1 |
Huber(pred_t - obs_t) |
仍保留弱 absolute 约束,防止整体漂移 | 权重降低,否则会继续被 CAD 初始误差主导 |
c2o_loss |
w_c2o: 1.0 |
Huber((pred_t - pred_anchor) - (obs_t - obs_anchor)) |
以绑定帧为 anchor,对齐相对 3D 位移;借鉴 VideoArtGS C2O 的运动约束思想 | 仍依赖 CAD joint/axis 正确;不能像 VideoArtGS 一样学习 axis/segmentation |
pair_loss |
w_pair: 0.5, pair_offsets: "1,2,4,8,16,32" |
Huber((pred_t - pred_{t-k}) - (obs_t - obs_{t-k})) |
Pairwise relative displacement consistency;只借鉴 O2O 的跨帧思想,不能直接称为 O2O | TAPIP3D 长间隔 drift 会被引入 |
joint_prior |
w_joint_prior: 0.02 |
mean((q_t - q_resume_t)^2) |
保护 global opt 已经找到的 door opening,不让 track refine 从头抹掉 | 若 global opt 错了,会阻碍修正 |
joint_smooth |
w_joint_smooth: 0.005 |
mean((q_t - q_{t-1})^2) |
抑制 per-frame 乱跳和 wrong joint 吸收噪声 | 过大时会压制真实快速运动 |
| Track selection | max_tracks: 512, min_bound_tracks: 64 |
绑定更多 CAD surface tracks | 接近 VideoArtGS 每步 512 条 track 的统计稳定性 | 如果绑定包含错误 link,更多 track 也会放大错误 |
| Optimize init | opt_joint_init_mode: "resume" |
从 global opt joint 序列继续优化 | 避免 microwave door 从 74 度掉回 0 附近 | 如果 warm start 很差,需要降低 w_joint_prior |
| Loss space | use_2d_reprojection_loss: false |
默认用 3D TAPIP3D coords | 让 depth/开门幅度直接进入 objective | 依赖 TAPIP3D 3D 坐标质量 |
当前总 loss:
total = w_anchor * anchor_loss
+ w_c2o * c2o_loss
+ w_pair * pair_loss
+ w_joint_prior * joint_prior
+ w_joint_smooth * joint_smooth
pair_loss 和 VideoArtGS O2O 的区别¶
w_pair 只是 pair_loss 的权重;真正需要比较的是 pair_loss 与 VideoArtGS 的 track_loss_o2o。
| 项 | ours pair_loss |
VideoArtGS track_loss_o2o |
|---|---|---|
| 形式 | 比较两帧的位移差:(pred_t - pred_s) - (obs_t - obs_s) |
把源帧观测点逆变换回 canonical,再正变换到目标帧:F_t(F_s^{-1}(obs_s)) - obs_t |
| 是否做 source-to-canonical inverse | 否 | 是 |
| canonical 点 | 固定来自 CAD anchor-frame face+barycentric binding | 由 source observed point 通过 learned inverse deformation 得到 |
| part assignment | 固定 CAD link / face id | learned observed-space soft mask |
| 约束强度 | 较弱,只要求相对位移一致 | 更强,要求源帧观测点能通过模型真实 transport 到目标帧 |
| 鲁棒性 | 对 absolute CAD pose/scale 偏差更鲁棒,实现简单 | 对 source-frame track noise、inverse deformation 和 part mask 更敏感 |
| 论文表述 | pairwise relative displacement loss 或 O2O-inspired pair loss |
O2O track loss |
因此不能把当前 pair_loss 直接写成 O2O loss。只有在额外实现 CAD 版 source-to-canonical inverse 时,才可以称为 O2O。一个 CAD O2O 版本应大致是:
source canonical estimate: c_s = FK_link(q_s)^(-1) obs_s
target prediction: pred_t = FK_link(q_t) c_s
loss: || pred_t - obs_t ||
这个版本利用 CAD link assignment 和 FK inverse,但会更敏感:TAPIP3D 源帧点可能不在 CAD 表面上,inverse 后的 c_s 可能偏离 canonical surface。所以当前 pair_loss 更适合作为稳定的跨帧相对运动约束;论文里应避免把它命名为 O2O。
CAD-specific 创新点与消融模块¶
这些模块是相对 VideoArtGS 更贴合 CAD model 的设计点,可以作为论文中的 ablation 组。闭合偏置项不建议放进 ablation;它不是 CAD-specific 贡献。
| 模块 | 当前实现 / 建议实现 | CAD-specific 点 | 消融设置 | 预期验证的问题 |
|---|---|---|---|---|
| CAD face+barycentric track binding | 将 TAPIP3D anchor 点绑定到 movable CAD face,并保存 face id + barycentric coordinate | 用 CAD surface 建立 track-to-part correspondence,而不是学习 soft segmentation | CAD binding vs track3d[0] as canonical point / nearest point without link filtering |
CAD 对应关系是否比 VideoArtGS 的 learned segmentation 更稳定 |
| Movable-link filtering | 只在 hinge/slider link 对应的 faces 上绑定 tracks | 用 CAD kinematic tree 排除静态 body tracks | movable-only vs all-object faces | 静态壳体 tracks 是否会稀释 articulation 信号 |
| Degenerate-face robust binding | 过滤非有限/零面积 movable faces 后再做 closest point | CAD mesh 清理鲁棒性,解决 Infinigen 退化三角面导致 NaN 的问题 | with vs without degenerate face filtering | 绑定成功率、有效 track 数是否提升 |
| CAD FK-constrained prediction | 用 URDF/SAPIEN tensor asset 的 forward kinematics 预测绑定点位置 | 预测空间被 CAD joint topology、axis、limits 约束 | CAD FK vs free per-part SE(3) / unconstrained point deformation | CAD 先验是否减少不物理的 deformation |
| Joint-limit projection | 每步优化后按 URDF limit clamp hinge/slider | 使用 CAD/URDF 的物理 articulation range | with vs without joint limits | 是否减少 wrong-angle 或越界解 |
| Resume binding state | 用 global opt 的 joint state 生成 anchor CAD mesh 后绑定 | 将前一阶段 CAD silhouette/depth 结果作为 track binding 先验 | binding_joint_init_mode=resume vs zero |
好的 CAD warm start 是否提高 track-to-face 对应质量 |
| Resume optimize init | 从 global opt joint 序列继续优化 | 将 CAD 全局优化结果作为 articulation prior | opt_joint_init_mode=resume vs zero |
microwave door 是否避免从 74 度被拉回 0 |
| CAD-aware relative C2O loss | Huber((pred_t - pred_anchor) - (obs_t - obs_anchor)) |
保留 CAD surface correspondence,但只监督相对运动,弱化 CAD pose/scale/depth 初始误差 | relative C2O vs absolute anchor vs 2D reprojection | 是否更直接驱动 door opening |
| Long-offset CAD pair loss | 多 offset 的 pred_t-pred_{t-k} 对齐 obs_t-obs_{t-k} |
在 CAD FK 轨迹上做 pairwise relative motion consistency,不等同于 O2O | offsets 1,2 vs 1,2,4,8,16,32 vs no pair |
慢速开门是否需要长时间跨度监督 |
| CAD O2O transport loss | 建议新增:FK_link(q_t) FK_link(q_s)^(-1) obs_s -> obs_t |
用 CAD link assignment 和 FK inverse 实现真正 O2O | pair relative loss vs CAD O2O transport loss | 更强 transport 约束是否优于稳定的相对位移约束 |
| Warm-start joint prior | mean((q_t - q_resume_t)^2) |
用 CAD global-opt state 抑制 track 噪声和错误 link 吸收运动 | prior weight 0 / 0.02 / 0.1 | 如何平衡修正能力与保持已有开门 |
| Temporal joint smoothness | mean((q_t - q_{t-1})^2) |
在 CAD joint space 而非 point space 约束平滑性 | smooth weight 0 / 0.005 / 0.05 | 是否减少 plate/button 关节抖动 |
| Link-aware sampling / weighting | 建议新增:按 CAD link 统计 tracks,避免单一 link/face 垄断 batch | 用 CAD part labels 控制监督分布 | motion-score-only vs link-balanced | 多关节物体上是否减少 wrong joint dominance |
| Target-joint gating | 建议新增:对 microwave 等类别只优化高置信 movable link 或 downweight button/plate joints | 使用 CAD joint semantics/name/category prior | all joints vs door-only / semantic-weighted | 是否解决 plate_joint_0 吸收 door motion |
建议论文主 ablation 先做四组:
| Ablation 名称 | 关闭 / 替换内容 | 目的 |
|---|---|---|
| w/o CAD binding | 不用 face+barycentric CAD correspondence,改用 TAPIP3D frame 0 canonical | 证明 CAD surface correspondence 的价值 |
| w/o relative C2O | 用 absolute anchor 或 2D reprojection 替代 relative C2O | 证明相对运动 loss 解决 CAD 初始误差 |
| w/o CAD warm start | opt_joint_init_mode=zero,不加 joint prior |
证明 global CAD optimization 与 track refine 的级联价值 |
| w/o CAD joint constraints | 去掉 joint-limit projection 或改成 free SE(3) part motion | 证明 CAD kinematic prior 提升物理合理性 |
为什么我们理论上应该比 VideoArtGS 更好,但原始结果反而差¶
| 理论优势 | 原始实现为何没有吃到优势 | 应该怎么用 CAD 优势 |
|---|---|---|
| CAD 有准确 part topology | 原始只用 CAD 做 hard binding,但后续从 zero 优化,且 tracks 少 | CAD 应该提供 part/link/axis 先验,同时从 global opt resume |
| CAD 有真实 joint limits | 原始 limits 只防越界,不防 wrong joint 吸收 motion | 加入 warm-start prior、joint smooth、必要时按 link/part 重权重 |
| CAD surface 能给 point-to-part 对应 | absolute CAD surface loss 对 pose/scale/depth 误差敏感 | 用 CAD 绑定对应关系,但主 loss 用 relative 3D displacement |
| 我们不需要学习 axis/segmentation | 如果 CAD 轴或 part 选择正确,这是优势 | 如果 Infinigen URDF 有额外 button/plate joints,仍需抑制非目标关节或加 part prior |
microwave case 的直接诊断¶
当前 case 里已经观测到:
| 指标 | 数值 / 现象 |
|---|---|
| TAPIP3D tracks | 总数约 3938,anchor frame 可见约 2786 |
| 修复退化 face 后有效绑定候选 | total_valid_tracks=1810 |
| 原始绑定数 | bound_tracks=32 |
| 原始 refine 后 door joint | 最大约 5 度 |
| global opt 中 door joint | 最大约 74 度 |
| 原始 refine 中最大变化 joint | plate_joint_0 约 -122 度,而不是 door |
所以 microwave 没打开的核心不是 TAPIP3D 没信号,而是原始 track refine 的 objective 和初始化把信号导向了错误解:从 zero 开始、2D absolute loss、32 条 tracks、短 offset pair,都会让 door opening 很容易被压掉。
2026-04-30 当前 rerun 结果¶
本轮已用当前工作区配置重跑:
| 项 | 值 |
|---|---|
| 输出目录 | /DATA/intern/hoi4d/projects/zhanbaiting/ArtHOI4D/output/runs/infinigen_selected/cases/infinigen_microwave_p00_i02_videogen/recon/output/track_3d_rerun_current_gpu |
| 使用 tracks | recon/preprocess/tracks/tapip3d/tracks_3d.npz,即 filter 前 TAPIP3D 3D tracks |
| 渲染检查 | track_3d_rerun_current_gpu/hoi.mp4 已生成,121 帧,24 fps,5120x720 |
| 配置要点 | max_tracks=512, track_batch_size=512, binding_joint_init_mode=resume, opt_joint_init_mode=resume, use_2d_reprojection_loss=false |
| 绑定结果 | total_valid_tracks=1305, bound_tracks=512,512 条全部绑定到 door_joint_0/link_2 |
| 当前 door 结果 | door_joint_0 最大约 56.63 deg,结束约 28.21 deg,velocity sign changes 32 |
| global/warm-start door | 最大约 74.14 deg |
| 非目标关节 | plate_joint_0 仍有约 31.13 deg range,说明非目标 joint 还会参与吸收/补偿 |
结论:当前改法已经修掉了原始配置的两个硬伤,即 zero init 和 32 tracks;但是实验结果仍然不够。主要问题有两个:
door_joint_0还有可见抖动。虽然 smooth/accel loss 降低了极端跳变,但 per-frame joint value 仍由 noisy/occluded TAPIP3D tracks 直接驱动,没有单调开门或低维时间曲线约束。- door 没有打开到最大角度。当前结果 peak 只有约
56.63 deg,低于 global opt/warm start 的约74.14 deg;而且结尾回落到约28.21 deg,视觉上会表现为打开幅度不足或打开后回收。
这说明“更多 tracks + 3D relative loss + resume init”只是必要修复,不是最终方案。下一步需要显式利用 microwave 的目标 joint 语义、时间先验和可见区域 mask,而不是只靠 track loss 自己解释严重遮挡后的运动。
2026-05-01 进一步诊断:坏信号主要来自 3D depth drift¶
这轮重点把“优化器没拟合好”和“track signal 本身有问题”分开看。结论是:当前 rerun 的优化器基本是在拟合 TAPIP3D 3D tracks 给出的信号,真正的问题是 3D tracks 里存在很强的全局深度漂移。
关键观测:
| 检查项 | 结果 |
|---|---|
| 当前绑定 | 512/512 tracks 全部绑定到 door_joint_0/link_2,binding 本身不是错 part |
| mask overlap | 选中 tracks 每帧约 99% 落在 object mask 内,human overlap 中位数约 0%,最大也只有约 3.8% |
| 早期静止段 2D 位移 | frame 20 / 40 的 door tracks median 2D displacement 只有约 0.30 px / 0.42 px |
| 早期静止段 3D 位移 | 同一批 tracks frame 20 / 40 median 3D displacement 已有约 0.210 m / 0.197 m |
| 早期 3D 位移方向 | 几乎全是 z drift:frame 20 median delta xyz 约 [0.011, -0.021, -0.208] m |
| all-track 全局 drift | 全部可见 tracks 的 median delta 在 frame 20 约 [0.014, -0.017, -0.202] m,说明不是 door 局部运动,而是 depth/global 3D lifting 漂移 |
用选中 512 条 door tracks 做离线 door-only grid fit,也能复现这个问题:
| 曲线 | start | end | max | peak frame | sign changes | 说明 |
|---|---|---|---|---|---|---|
| raw 3D tracks door-only fit | 0.0 deg |
44.1 deg |
56.2 deg |
105 |
48 |
和当前 track refine 的 56.6 deg @ frame 106 很接近,说明优化器主要是在跟随 raw 3D track signal |
| 当前 track refine | 0.0 deg |
28.2 deg |
56.6 deg |
106 |
32 |
smooth/accel 和 warm-start prior 把 raw fit 平滑了一些,但没有改变 peak 低估 |
| warm/global opt | -1.8 deg |
-2.1 deg |
71.5 deg |
79 |
51 |
peak 幅度更接近视觉开门,但后段回落不合理 |
| subtract all-track median drift 后的 fit | 0.0 deg |
9.7 deg |
32.1 deg |
72 |
33 |
早期假开门消失,但也说明当前没有可靠的 static-depth reference,简单全局平移校正会吃掉一部分真实 door motion |
逐帧例子:
| frame | 视频现象 | raw door-only fit | 当前 refine | warm/global |
|---|---|---|---|---|
| 20 | 门视觉上仍关闭 | 36.1 deg |
0.2 deg |
0.0 deg |
| 40 | 手刚接近/门仍基本关闭 | 34.4 deg |
0.4 deg |
0.3 deg |
| 70 | 开门开始明显 | 45.8 deg |
49.5 deg |
44.7 deg |
| 79 | warm peak 附近 | 32.7 deg |
46.6 deg |
71.5 deg |
| 106 | 视频里门仍开着 | 54.4 deg |
56.6 deg |
-1.2 deg |
| 120 | 视频末尾门仍开着 | 44.1 deg |
28.2 deg |
-2.1 deg |
所以现在的 tracking 不好,不是因为 TAPIP3D 2D tracks 完全坏,也不是因为 CAD binding 错,而是:
tracks_3d.npz的 3D 坐标被 per-frame depth/global offset 漂移污染。早期静止物体已经出现约20 cm的z方向伪运动。- 3D C2O / pair loss 会把这个
zdrift 当成 door revolute motion。freeze_pre_onset_joints只是挡住了 onset 前的假开门,onset 后仍然受污染。 - 当前 raw track signal 本身只支持约
56 degpeak,且时间上非单调;优化器输出接近这个 peak,说明“优化没跟上 tracks”不是主因。 plate_joint_0的残余运动更多是非目标 joint 没被冻结、warm-start 中已有 motion 且没有 door tracks 约束它;当前不是主要的 door under-open 原因,但会污染可视化和后续物理。
下一步修复方向应该调整为:
| 优先级 | 改动 | 原因 |
|---|---|---|
| P0 | 先做 depth-drift-aware tracking:用静态 body/link tracks 或 CAD-rendered static visible surface 估计每帧 global 3D translation/depth offset,再对 door tracks 做相对运动 loss | 当前全部 tracks median 可以证明 drift 存在,但不能直接当最终校正,因为会吃掉一部分真实 door motion;需要 static-link reference |
| P0 | Target-joint gating 仍要做:只优化 door_joint_0,冻结 plate_joint_0/knobs |
清掉无监督关节残余运动,减少 visual/physics 污染,但它不是 depth drift 的根因修复 |
| P0 | 加单调/低维时间先验时,应作用在 drift-corrected signal 或 mask/2D signal 上 | 否则会把 depth drift 平滑成一条看似合理但幅度错误的 door curve |
| P1 | 重新引入 2D/object mask 约束作为 amplitude/time support,而不是只依赖 3D C2O | 早期 2D tracks 是稳定的,3D depth 才是主要污染源 |
| P1 | 重新评估 VideoDA/global depth offset 的生成方式,检查 object median depth 是否应被时序固定或弱平滑 | 当前 depth 序列在静止段仍产生 10-20 cm 级累计漂移 |
后续建议¶
| 优先级 | 改动 | 原因 |
|---|---|---|
| 已完成 | 固定使用 opt_joint_init_mode: "resume" |
已避免从 0 度重新估计,但还不能保证打开到正确幅度 |
| 已完成 | 主 loss 用 3D relative C2O,而不是 2D absolute anchor | 已能直接监督 articulation 位移,但遮挡后 track 噪声仍会影响幅度 |
| 已完成 | 增加 track 数到 512 | 已提高统计稳定性;当前 512 条全部绑定到 door link |
| 已完成 | 加 long-offset pair loss、joint prior/smooth/accel | 有帮助,但仍不能彻底消除 door 抖动和回落 |
| P0 | Depth-drift-aware tracking:先估计静态 body/link 的每帧 3D drift,再对 door tracks 做相对运动 loss | 2026-05-01 诊断显示早期静止段已有约 20 cm 的 z drift,这是当前 3D tracking 的根因 |
| P0 | Target-joint gating:microwave case 只优化 door_joint_0,冻结或强 prior 约束 plate_joint_0/knobs |
当前所有有效 tracks 都绑定到 door,非 door joint 不应自由变化;这能清掉无监督关节残余运动,但不是 depth drift 的根因修复 |
| P0 | 加低维/单调时间先验:motion onset 之后 door angle 应基本非减,或用 B-spline / sigmoid / piecewise-linear curve 参数化 | 必须作用在 drift-corrected / 2D+mask 支撑的信号上;否则会把 depth drift 平滑成错误 door curve |
| P0 | 加 endpoint/open-angle prior:弱约束 peak 或 end angle 不低于可信视觉/全局优化幅度 | 当前 raw 3D tracks 本身只支持约 56 deg peak;open-angle prior 需要和 depth drift 修正配合,否则是在和错误 3D signal 对抗 |
| P1 | 加 occlusion-aware object mask loss:渲染 object silhouette,与 object mask 对齐,但 human/hand mask 区域不参与 loss | 严重手部遮挡时,object mask 里取点会漏;mask loss 可以补足 track loss 的幅度约束,但必须排除人手遮挡区域,权重要弱 |
| P1 | Track robust weighting:按 TAPIP3D visibility、human-mask occlusion、长时间漂移、hinge 运动方向一致性给 track 降权或剔除 | 遮挡后 tracks 可能 lost/drift,继续强监督会让 door 抖或幅度变小 |
| P1 | CAD O2O transport loss:实现 FK(q_t) FK(q_s)^(-1) obs_s -> obs_t,从多个可见 source frame 约束 target frame |
不再只依赖 frame 0 anchor,可缓解后半段遮挡和慢速开门的信号弱问题 |
| P2 | object inpainting 后重跑 TAPIP3D | 可作为备选;它可能改善被手遮挡的 object 点,但成本高,优先级低于 target-joint gating、单调先验和 occlusion-aware mask loss |
Handoff 给下一个 agent¶
下一位 agent 可以从以下状态继续:
| 文件 / 输出 | 用途 |
|---|---|
configs/methods/recon/ours_track_refine.yaml |
当前 track refine 配置,已经是 512 tracks、resume init、3D relative loss |
scripts/experiments/run_microwave_track_refine_current.py |
复现实验入口,可改 --output-name 产出新目录 |
track_3d_rerun_current_gpu/summary.json |
当前结果指标,重点看 hinge_quality 和 binding_link_quality |
track_3d_rerun_current_gpu/hoi.mp4 |
当前可视化,问题是 door 抖动且未打开到最大角度 |
建议下一步按这个顺序做:
- 先实现 depth-drift diagnostic / correction:用静态 body/link tracks 或 CAD-rendered static visible surface 估计 per-frame global 3D drift,输出 drift curve,并在 C2O/pair loss 中对 door tracks 使用 drift-corrected displacement。新输出建议命名为
track_3d_depth_drift_corrected_gpu。 - 在
refine3d.py/ config 中加target_joint_names: ["door_joint_0"]或freeze_non_target_joints: true,先验证 door-only optimize。新输出建议命名为track_3d_door_only_gpu。 - 给
door_joint_0加 motion-onset 后的单调约束或低维曲线参数化。优先实现简单版本:relu(q_t - q_{t+1})作为 monotonic loss,只作用于motion_onset_frame之后。新输出建议命名为track_3d_door_only_monotonic_gpu。 - 加 endpoint/open-angle weak prior,初值来自视觉检查或 global/warm-start 的可信 peak,先设小权重,避免硬拉到错误值。评估目标是 peak 接近 70 度以上且结尾不明显回落。
- 若仍受遮挡影响,再加 occlusion-aware mask loss:object silhouette loss 只在
object_mask & ~human_mask可见区域计算,权重从很小开始,例如0.01或0.02。 - 每次 rerun 后都渲染
hoi.mp4,并记录五个指标:depth drift z median、door max/end、door velocity_sign_changes、plate range、视觉抖动。