跳转至

Track3D Refine 与 VideoArtGS Tracking Loss 对比

本文对比三套 loss:

  1. ours 原始 track_3d_refine:本轮改动前的实现。
  2. VideoArtGSsubmodules/VideoArtGS 中实际用于 TAPIP3D 的 tracking 约束。
  3. 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:

total = w_anchor * anchor_loss
      + w_pair * pair_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 lossO2O-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 init32 tracks;但是实验结果仍然不够。主要问题有两个:

  1. door_joint_0 还有可见抖动。虽然 smooth/accel loss 降低了极端跳变,但 per-frame joint value 仍由 noisy/occluded TAPIP3D tracks 直接驱动,没有单调开门或低维时间曲线约束。
  2. 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 错,而是:

  1. tracks_3d.npz 的 3D 坐标被 per-frame depth/global offset 漂移污染。早期静止物体已经出现约 20 cmz 方向伪运动。
  2. 3D C2O / pair loss 会把这个 z drift 当成 door revolute motion。freeze_pre_onset_joints 只是挡住了 onset 前的假开门,onset 后仍然受污染。
  3. 当前 raw track signal 本身只支持约 56 deg peak,且时间上非单调;优化器输出接近这个 peak,说明“优化没跟上 tracks”不是主因。
  4. 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 cmz 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_qualitybinding_link_quality
track_3d_rerun_current_gpu/hoi.mp4 当前可视化,问题是 door 抖动且未打开到最大角度

建议下一步按这个顺序做:

  1. 先实现 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
  2. refine3d.py / config 中加 target_joint_names: ["door_joint_0"]freeze_non_target_joints: true,先验证 door-only optimize。新输出建议命名为 track_3d_door_only_gpu
  3. door_joint_0 加 motion-onset 后的单调约束或低维曲线参数化。优先实现简单版本:relu(q_t - q_{t+1}) 作为 monotonic loss,只作用于 motion_onset_frame 之后。新输出建议命名为 track_3d_door_only_monotonic_gpu
  4. 加 endpoint/open-angle weak prior,初值来自视觉检查或 global/warm-start 的可信 peak,先设小权重,避免硬拉到错误值。评估目标是 peak 接近 70 度以上且结尾不明显回落。
  5. 若仍受遮挡影响,再加 occlusion-aware mask loss:object silhouette loss 只在 object_mask & ~human_mask 可见区域计算,权重从很小开始,例如 0.010.02
  6. 每次 rerun 后都渲染 hoi.mp4,并记录五个指标:depth drift z mediandoor max/enddoor velocity_sign_changesplate range、视觉抖动。