Visual Human Contact Refine Plan¶
日期:2026-04-24
Historical/provisional design record
本页保存 2026-04 的问题分析与候选 implementation roadmap,不是当前论文 experiment contract, 也不表示未勾选项仍是正式承诺。当前状态与 formal gate 以 Paper Readiness、 Reconstruction metric review 和 Project Guide 为准。
本文整理当前 oven b009_0001 case 中“visual reconstruction 的 human contact 不准”问题、为什么 phys_refine 很难兜底、相关工作怎么处理遮挡与 contact 不准、以及下一阶段应如何实现 visual-side human/contact refine。
1. 结论先行¶
当前 pipeline 的主要瓶颈已经不是 object articulation,而是:
- object 侧已经基本恢复正确
- motion onset ≈ 39
- peak articulation ≈ 59.57°
- 主体轨迹先增后减
- 但 human 侧仍然几乎直接沿用 preprocess 阶段的
GVHMR + hand refiner结果 - 对
oven这种第三视角、全身 motion、强遮挡的 case,这会导致 active hand 长时间“脱空” phys_refine收到的是错误的 human/contact prior,因此很难通过后端物理优化补救
因此,下一步最高优先级不应继续单独调 phys_refine,而应先在 track_refine 之后加入一层:
它的目标不是让 visual 直接物理正确,而是先把:
- active hand 的接触位置
- active arm chain 的时序
- 人与门把/门边的几何关系
拉回到视觉上合理的范围,然后再把结果送给 phys_refine。
2. 当前问题为什么是结构性的¶
2.1 recon 导出的 human 其实没有被 object-conditioned refine¶
当前 result.pt 的 human 状态来自 preprocess motion,而不是 object 优化后再回头修过的人体:
- target 对应实现:
pipeline/reconstruction/optimization/solver/trainer.py(旧只读 checkout 的 line 195 审计)
在 build_result() 里:
- object 使用优化后的
object_state - 但 human 直接写入
context["smpl_incam"]["body_pose"] left_hand_pose / right_hand_pose也直接来自context["smpl_incam"]
也就是说当前 visual pipeline 近似是:
而不是:
2.2 preprocess hand refine 只 merge MANO,不解决 object-conditioned contact¶
- target 对应实现:
pipeline/reconstruction/preprocess/human/gvhmr.py(旧只读 checkout 的 line 720 审计)
现有 hand refine 的作用是:
- 用 HaMeR / DynHaMR 结果 merge 到 SMPL-X hand pose
- 提高手部自身姿态细节
但它并不会:
- 根据 object articulation 修 wrist / elbow / shoulder
- 根据 handle 位置把手拉回接触区
- 显式处理 object occlusion 下的观测缺失
所以这一步只能改善 hand pose prior,不能解决 left hand far from oven handle 这种 interaction-aware 几何错误。
2.3 现有 physics human refine 虽然能拉近手,但已经太晚¶
当前 phys_refine 里其实已经有一套 human active-chain refine:
- target 对应实现:
pipeline/physics/refine/human_dof.py(旧只读 checkout 的 line 69 审计)
它会根据 contact targets 去修:
human_root_transl_worldhuman_body_posehuman_left_hand_posehuman_right_hand_pose
但是它发生在 physics 阶段,并且只能在错误 visual prior 之上补救。
对于当前 oven case,现成结果已经说明它“能拉近,但不够”:
- 旧只读证据:
ArtHOI4D/output/bench_d3dhoi_oven_ours_b009_0001_track3d/recon/output/track3d/summary.json motion_onset_frame = 39hinge_max_deg = 59.5668- 旧只读证据:
ArtHOI4D/output/bench_d3dhoi_oven_ours_b009_0001_track3d/phys_refine/physics_fit.json human_refine.left.mean_dist_before = 0.2919human_refine.left.mean_dist_after = 0.0729human_refine.right.mean_dist_before = 0.3887human_refine.right.mean_dist_after = 0.0460mean_root_delta_xy = 0.2max_root_delta_xy = 0.2contact_ratio = 0.0rmse_to_recon = 0.4165max_abs_diff_to_recon = 0.9700
这些数值说明了三个问题:
- physics human refine 已经把 root XY 拉到了上限
0.2m - 手部虽然被拉近了 target,但仍没有形成稳定真实接触,
contact_ratio = 0 - object rollout 与 visual articulation target 仍然偏差很大
也就是说,它现在更像是在“补救一个坏的输入”,而不是“在一个好输入上做物理修正”。
2.4 当前 interaction 还被错误地当成双手问题¶
从同一个 physics_fit.json 可以看到:
enabled_hands = ["left", "right"]- 左右手都在 113 帧 active
但这个 case 的主导 interaction 是左手拉 oven 门。右手和身体反而是遮挡源之一。
这进一步说明:
- active hand detection 现在还不够保守
- 如果 visual 阶段不先把“谁在接触、接触哪里”做清楚,physics 阶段会收到过于宽松、甚至错误的双手监督
3. 当前相关工作的启发¶
下面只列和这个问题最相关的工作,不做无关综述。
3.1 ArtHOI¶
- 论文:ArtHOI: Articulated Human-Object Interaction Synthesis by 4D Reconstruction from Video Priors
- https://arxiv.org/abs/2603.04338
- https://arthoi.github.io/
- 旧只读本地代码审计:
models/ArtHOI/src/train.pyline 195
对我们最重要的结论:
- human 和 articulated object 在 monocular 下联合优化很不稳定
- 因此它采用 decoupled reconstruction
- 先恢复 object articulation
- 再根据 object state 合成人体 motion
本地代码里也能看到同样思路:
- 先用 object motion 得到
contact_mask - 再构造
contact_time_region - 然后在 human stage 里使用:
human_3dkptfoot_slidingcollision
这和我们现在最缺的一层完全一致:object-conditioned human refine。
3.2 CARI4D¶
- 论文:CARI4D: Category Agnostic 4D Reconstruction of Human-Object Interaction
- https://arxiv.org/abs/2512.11988
- https://nvlabs.github.io/CARI4D/
- 旧只读本地代码审计:
learning/training/opt_refineout.pyline 487
对我们最重要的结论:
- contact 不准时,不能只靠 foundation model 的初值
- 需要额外 refinement,把:
j2dcontactsilhouettepenetrationtemporal smoothness
联合起来优化
这说明 contact 不应被当作单独 post-process 标签,而应成为 visual refinement 的主约束之一。
3.3 GVHMR¶
- 论文:World-Grounded Human Motion Recovery via Gravity-View Coordinates
- https://arxiv.org/abs/2409.06662
- https://zju3dv.github.io/gvhmr/
它对我们更像是:
- 一个很好的 human motion initialization
- 但不是 contact-aware HOI solver
GVHMR 的长处是 world-grounded human motion,本来就不是“物体交互对齐”。 因此拿它直接当最终 HOI human state,本身就是超出它设计目标的。
3.4 MoRo¶
- 论文:Masked Modeling for Human Motion Recovery Under Occlusions
- https://arxiv.org/abs/2601.16079
- https://openreview.net/forum?id=bKPBJHONz6
对我们最重要的启发:
- 强遮挡下,纯回归式 monocular human motion 很脆弱
- masked modeling / generative prior 对 occlusion 更鲁棒
对当前任务的直接含义是:
- 对于 oven 这类重遮挡 case,不应盲信 preprocess 的 deterministic human pose
- visual refine 里必须显式引入 visibility-aware weighting,而不是把每一帧的 hand reprojection 一视同仁
3.5 PromptHMR¶
- 论文:PromptHMR: Promptable Human Mesh Recovery
- https://arxiv.org/abs/2504.06397
- https://is.mpg.de/ps/publications/phmr-2025
对我们最重要的启发:
- 困难场景下,human pose recovery 可以利用额外 side information
- 这种 side information 可以是:
- spatial prompt
- semantic prompt
- interaction label
对应到我们的任务里,object/contact 本身就应该成为 human refine 的 prompt 或 side information。
3.6 OccNeRF¶
- 论文:Rendering Humans from Object-Occluded Monocular Videos
- https://arxiv.org/abs/2308.04622
- https://cs.stanford.edu/~xtiange/projects/occnerf/
对我们最重要的启发:
- 处理 object-occluded human 时,visibility prior 必须显式建模
- 否则 occluded region 会被 naive regression 带偏
虽然 OccNeRF 是 human rendering,不是 HOI motion reconstruction,但对我们非常 relevant:
- 当前 left hand 正是被 body/right-hand/object 多重遮挡影响
- 因此 visual human refine 必须显式区分 visible / occluded frames
3.7 THO¶
- 论文 / 项目:End-to-End Spatial-Temporal Transformer for Real-time 4D HOI Reconstruction
- https://nianheng.github.io/THO-project/
对我们最重要的启发:
- 4D HOI reconstruction 要显式建模:
- human-object contact
- continuous interaction dynamics
- temporal coherence
即使我们不采用它的网络结构,至少也应把:
- contact prior
- temporal prior
- interaction-aware refinement
作为 visual stage 的核心组成,而不是事后补丁。
3.8 4DHOISolver / Open4DHOI¶
- 论文:Efficient and Scalable Monocular Human-Object Interaction Motion Reconstruction
- https://arxiv.org/abs/2512.00960
- https://wenboran2002.github.io/open4dhoi/
对我们最重要的结论:
- 精确 contact 预测在 monocular HOI 中仍然是未解决问题
- 他们甚至需要 sparse human-in-the-loop contact annotation 才能把问题约束住
这对我们是一个很重要的现实提醒:
- 不要把“仅凭 preprocess human motion 自动恢复精确 hand contact”当作默认成立
- 我们更合理的目标是:
- 先做 coarse-but-correct 的 visual contact refine
- 再让 physics 去补细节和接触力
4. 我们应该新增什么模块¶
建议新增:
插入位置:
这一步只改 human,不再改已经稳定下来的 object articulation。
5. 这个模块的最小可用设计¶
5.1 输入¶
- object articulation result
- 当前
track_refine输出的joint_values - 当前 object world pose
- human initialization
GVHMR的body_pose / root_orient / root_translDynHaMR/HaMeRmerge 后的 hand pose- contact prior
- D3D-HOI asset 的
contact_vertices - object motion onset / interaction window
- hand visibility / 2D keypoint confidence / mask overlap
5.2 只优化哪些自由度¶
第一版不要动全身,只优化 active chain:
- root XY,小范围 Z
- spine / clavicle 小范围补偿
- active-side shoulder
- active-side elbow
- active-side wrist
- active-side hand global orient
先不要:
- 改腿
- 改另一侧手臂
- 改大范围 torso
否则很容易把整个人拖坏。
5.3 active hand 应该怎么定¶
当前 phys_refine 里双手同时 active 明显过宽。
建议在 visual refine 里先做更保守的 active-hand selection:
- 对每一帧计算左右手到 object contact region 的距离
- 结合速度方向和接触窗口内的一致性
- 加上 visibility 置信度
- 得到主导手
active_hand
对 oven case,预期应优先判成 left。
5.4 contact target 应该怎么建¶
contact target 不应该是单个点,而应是逐帧的 soft region:
- 优先取 asset 自带
contact_vertices - 根据 object articulation 和 link pose,把它们变到世界坐标
- 再做局部采样 / top-k 邻域,形成 soft target region
- 输出:
target_world_points[t, k, 3]target_valid[t, k]target_weight[t, k]
这样可以避免“强行把 hand 拉到一个错误点上”。
5.5 loss 设计¶
建议第一版只做这些:
L_contact_pull¶
interaction window 内,把 active wrist / palm / fingertips 拉向 object target region。
L_j2d_visible¶
只对可见且高置信的 body / wrist / hand keypoint 做 2D reprojection。
L_prior¶
限制不要偏离原始 GVHMR / DynHaMR 太远。
L_temporal¶
对 active chain 的速度 / 加速度做平滑。
L_penetration¶
前臂 / 手掌与 oven 门之间的 coarse penetration penalty。
L_no_contact_motion¶
非 interaction window 不要被 contact target 吸过去。
5.6 visibility-aware weighting¶
这是第一版成败关键。
每帧权重不应固定,而应由以下信号综合决定:
- keypoint 2D confidence
- hand refiner 是否成功
- human/object mask overlap
- 当前 frame 是否被 object / body 遮挡
- reprojection residual 是否异常
推荐规则:
- 可见帧:以
L_j2d_visible + L_contact_pull为主 - 重遮挡帧:降低
L_j2d_visible,提高L_prior + L_temporal + L_contact_pull(soft)
6. 为什么优先复用现有 human_refine,而不是从零写¶
当前 repo 已经有可复用的 active-chain human refine 实现:
pipeline/physics/refine/human_dof.pypipeline/physics/refine/human_refine.py
推荐做法不是完全重写,而是:
- 把它的“局部 human chain 优化”能力前移到 visual stage
- 只替换 target 构造方式与 loss 组合
从:
改成:
这样可以:
- 复用已有 SMPL-X FK / active chain solver
- 避免在 physics 阶段之前完全没有 human correction
- 降低实现成本
7. 建议的开发计划¶
Phase V0:先做诊断和可视化¶
目标:把“脱空”量化清楚。
Historical implementation checklist(current status 需按 target code 复核):
- 导出左右手 wrist / palm / fingertip 到 handle region 的逐帧距离曲线
- 输出 2D overlay 视频
- human hand keypoints
- object contact region
- active hand label
- occluded / visible 标记
- 输出 3D overlay 可视化
- current hand trajectory
- object handle trajectory
- 标出 interaction window
产出:
contact_diagnostics.jsoncontact_overlay.mp4distance_plot.png
Phase V1:实现 active-hand + interaction-window 检测¶
Historical implementation checklist(current status 需按 target code 复核):
- 用当前 object articulation 自动求 interaction window
- 用距离 + 速度方向 + visibility 决定主导手
- 支持
left/right/both,但默认优先 single active hand
Phase V2:实现 object-conditioned contact target builder¶
Historical implementation checklist(current status 需按 target code 复核):
- 从 D3D-HOI
contact_vertices构造逐帧世界坐标 target - 对 articulated link 做 FK 更新
- 从单点 target 升级成 soft region / top-k surface target
Phase V3:实现 visual human active-chain refine¶
Historical implementation checklist(current status 需按 target code 复核):
- 新建
pipeline/reconstruction/optimization/solver/human_contact_refine.py - 以
SMPL-X active chain + root small correction为第一版优化变量 - 先只支持单 active hand
Phase V4:加 visibility-aware weighting¶
Historical implementation checklist(current status 需按 target code 复核):
- 估计 per-frame visibility / confidence
- 遮挡重的帧降低直接 2D 监督
- 增加 temporal / prior 权重占比
Phase V5:加 coarse collision / penetration¶
Historical implementation checklist(current status 需按 target code 复核):
- 手掌/前臂 vs object mesh 的 coarse penetration penalty
- 先不追求精确接触力,只消除明显穿插
Phase V6:接入导出链路¶
Historical implementation checklist(current status 需按 target code 复核):
-
result.pt默认写 refined human state - 同时保留:
human_*_pre_contact_refinehuman_*_recon_init
便于对比和回滚。
Phase V7:重跑 oven case,再进 physics¶
Historical implementation checklist(current status 需按 target code 复核):
- 重新生成 visual recon 结果
- 验证 object articulation 不退化
- 验证 active hand 不再明显脱空
- 再重新跑
phys_refine
8. 验收标准¶
8.1 object 侧¶
保持当前水平,不许退化:
- onset 在 38-39 附近
- peak articulation 在 55-65°
- 主体轨迹先增后减
8.2 human/contact 侧¶
至少满足:
- active hand 在 interaction window 内不再明显脱空
- wrist / palm 到 handle region 的中位距离显著下降
- 2D overlay 上 hand 与 handle 的关系基本合理
- 不依靠把整个人 root XY 拉满上限来“硬凑接触”
- 另一只非主导手不应被错误强拉到 object 上
8.3 physics 接口侧¶
至少满足:
phys_refine不再一开始就面对明显错误的 hand prior- active hand supervision 更接近单手真实 interaction
contact_ratio不应继续长期为 0
9. 当前建议¶
推荐的下一步不是继续盲调 phys_refine 权重,而是按下面顺序推进:
- 先做
V0诊断,把 oven case 的 contact 脱空量化出来 - 做
V1 + V2,把 active hand 和 target region 建准 - 复用
human_refine框架实现V3的 visual-side active-chain refine - 再做
V4 + V5 - 最后再把新的 visual result 送入
phys_refine
如果只允许做一个最小改动版本,优先级应是:
这三个完成后,physics 才有机会真正学到“接触后如何驱动 object”,而不是先被错误 visual prior 拖死。