跳转至

D3D-HOI default:全量预处理恢复待办

当前状态

  • full inventory:256 个 case。
  • 2026-07-20 自动预处理已完成:256/256;没有未完成 case。
  • contact_labels_raw.npz 已完成:256/256;逐文件检查 shape 均为对应 case 的 (T,2)
  • Contact final 当前为 20/256;下一步统一 review 尚未确认的 236 个 case。
  • 不要对全量 256 case 使用 --overwrite-preprocess--overwrite-contact:完整 preprocess、raw 以及既有 20 个 final 均应保留。

初始失败来源为 output/runs/d3dhoi_default/logs/preprocess_parallel/20260715T080717Z/summary.json 及其逐 case 日志。16 个 no-motion-onset case 的成功恢复记录在 output/runs/d3dhoi_default/logs/preprocess_parallel/20260719T145026Z/summary.json;2 个空采样 mask case 的成功恢复记录在 output/runs/d3dhoi_default/logs/preprocess_parallel/20260719T150726Z/summary.json;8 个无地面 case 的代表验证与批量记录分别在 20260719T163733Z/summary.json20260719T164200Z/summary.json

分组总览

优先级 根因 数量 影响阶段 恢复策略
完成 storage-prismatic active mask label 与 CAD part index 混淆 17 D3D-HOI SAM2 active-part 已解耦并完成 17/17 preprocess。
完成 画面中没有可见 floor 8 segmentation、world frame 仅这 8 个 case 使用 ground_source: noneworld_frame_source: human_upright,8/8 完成。
完成 object-init 未检测到运动起点 16 object init、active joints 已增加确定性最大非空 mask fallback,16/16 补跑完成。
完成 SAM3 首帧未识别 person 1 segmentation 起始阶段 显式使用 frame 35 作为 anchor,并用 SAM3 原生双向传播完成全段 mask。
P2 human mask 某帧为空 2 depth alignment 及后续 修复 mask propagation/补全该帧后,从 depth 开始恢复。
完成 object-init 采样到完全遮挡的空 full-object mask 2 object init、active joints selector 跳过空帧,2/2 补跑完成。

P0:17 个 storage-prismatic case 的 active-part 输入格式

失败 case

b108-0101_cad45132  b108-0102_cad45132  b108-0103_cad45132
b108-0104_cad45132  b108-0105_cad45132  b108-0106_cad45132
b108-0107_cad45132  b108-0108_cad45132  b108-0109_cad45132
b108-0110_cad45132  b108-0111_cad45132  b108-0112_cad45132
b108-0113_cad45132  b108-0114_cad45132  b108-0115_cad45132
b108-0116_cad45132  b108-0117_cad45132

初始失败证据:这些 case 当时只有稀疏全物体标注 gt_mask/*_object_mask.npy,没有 active-part 脚本要求的 object_masks/<sparse_idx>_2.npy。因此失败为:

D3D-HOI object_masks directory not found: .../storage_prismatic/b108-xxxx/object_masks

待办

  • 从 GT CAD pose + jointstate 为 17 个 case 渲染真实活动 CAD part mask;17/17 数量与帧数一致且全部非空,没有使用 full-object proxy。
  • 解耦两种 ID:3d_info.txt part_id 只用于选择 CAD link,D3D active mask 的文件标签统一使用 2;缺失 _2.npy 时直接报错,不做 proxy。
  • 17 个已渲染 mask 全部统一安装为 <sparse_idx>_2.npy;17/17 帧数一致、全部非空,且目录中不再残留 _0/_1.npy
  • b108-0104(CAD part 1)完整 preprocess smoke 成功;普通发布 case b003-0023(CAD part 0)在独立 output root 中完整回归成功。
  • 8 卡并行恢复全部 17 个 b108 case;batch summary 为 success,17/17 full/active/human masks、depth、motion、tracks、object-init、active-joints 齐全。

相关入口:pipeline/hoi_reconstructor.py::_write_d3dhoi_sam2_object_masks 调用的 scripts/experiments/d3dhoi_sam2_anchor_partmask.py;后者当前只读取 object_masks/

已完成:16 个 case 无运动起点

失败 case

b001-0001_cad12561  b001-0002_cad12561  b001-0005_cad12561  b001-0007_cad12561
b003-0020_cad10213  b003-0021_cad10213  b003-0022_cad10213  b003-0035_cad10213
b005-0117_cad10347
b006-0002_cad102156 b006-0004_cad102156 b006-0005_cad102156 b006-0007_cad102156
b006-0014_cad103635 b006-0015_cad103635 b006-0019_cad102156

统一错误

pre_track_motion_max_area found no motion onset:
threshold_px=8.0, stride=5, min_visible_tracks=64

frames、全物体/active-part/human masks、depth、motion 和 tracks 已成功产出;缺失的只有 object_initactive_joints

待办

  • pre_track_motion_max_area 增加显式 fallback:无 onset 时,从全视频的非空 full-object mask 中确定性选择最大面积帧;面积相同时选择最早帧。正常检测到 onset 的路径不变。
  • 单元测试覆盖 no-onset fallback、正常 onset 路径和全空 mask 报错;相关测试 7/7 通过。
  • 在 16 个真实 case 上先运行纯 selector 验证,全部选到非空帧。
  • 使用 8 张 GPU 从现有缓存补跑 object-init 和 active-joints,16/16 complete=True,result 数值全部 finite,每个 case 均选出至少 1 个 active joint。
  • 为这 16 个新恢复 case 生成 contact_labels_raw.npz;全量 raw 已达到 256/256。

P1:首帧 floor/person segmentation 失败

已完成:Floor 缺失的 8 个 case

b003-0005_cad10213  b003-0006_cad10213  b003-0007_cad10213  b003-0008_cad10213
b003-0009_cad10213  b003-0010_cad10213  b003-0011_cad10213  b004-0037_cad7221

错误为 SAM3 found no valid instance for prompt 'floor' on frame 0.。检查后确认 8 个视频都没有可用的可见地面,不能用 prompt fallback 伪造 floor mask。

待办

  • 逐 case 检查首帧,确认 8/8 都没有可用的可见地面。
  • 仅在 canonical 256-case inventory 的这 8 项显式设置 ground_source: noneworld_frame_source: human_upright;其余 case 保持 ground_plane
  • 修复 human_upright:MHR pred_joint_coords 使用 native 127-joint contract(root=1、head=113),用稳健 pelvis-to-head 方向估计 up;不再把 joint 69(右上臂 twist)误当 head,也不再使用会被坐姿双腿主导的 whole-body PCA。
  • b003-0006b004-0037 代表验证通过;人体方向、脚底高度和 object-init 正常。随后 6 卡并行恢复剩余 case,8/8 complete=True、object-init 数值全部 finite。
  • 批处理完成检查仅在 runtime world_frame_source=ground_plane 时要求 masks/ground/00000.png;相关测试通过。

已完成:Person 首帧缺失的 1 个 case

b006-0013_cad103635

错误为 SAM3 found no valid instance for prompt 'person' on frame 0.

处理结果

  • 人工检查视频:人物从画面左侧逐步进入,frame 35 可稳定看到全身;仅该 case 显式设置 human_prompt_frame_idx: 35,其余 case 默认仍为 0。
  • 修复通用 SAM3 wrapper 原先硬编码 forward 的问题,改用 SAM3 原生 both;anchor=0 的默认 case 没有可传播的更早帧,行为不变。
  • frame 35 双向传播得到 125/125 个非空 human masks;frame 10 面积 47,311 px,frame 20 面积 130,320 px,未复制或插值 mask。
  • 单 case 完整 preprocess 成功,motion/result.pt、depth alignment、tracks、object-init 和 active-joints 齐全;batch summary:20260719T171726Z/summary.json

P2:局部 mask 为空

已完成:Human mask 中断的 2 个 case

b005-0014_cad10900  # human/00017.png 为空
b006-0003_cad102156 # human/00170.png 为空

处理结果

  • b005-0014 的根因是 frame 0 有两人,SAM3 跟踪了会在 frame 17 离开的前景行人;仅在该 case JSON 中设置 human_prompt_frame_idx: 25 后,210/210 帧均锁定格子衫主角。
  • b006-0003 的目标人物在 frame 170 后真实离开画面;仅在该 case JSON 中设置 num_frames: 170,并让已有 reconstruction.num_frames 接口统一截断所有 preprocess 输入。没有修改 method YAML,也没有伪造 mask。
  • 两个 case 均完整生成 depth alignment、motion、tracks、object-init 和 active-joints;batch summaries 分别为 20260719T174050Z/summary.json20260719T174809Z/summary.json

已完成:object-init 候选 mask 为空的 2 个 case

b004-0010_cad7221   # full/00140.png 为空
b006-0001_cad102156 # full/00005.png 为空

待办

  • 确认空 mask 对应物体完全遮挡/出画,不修改 SAM2 mask,也不伪造插值 mask。
  • pre_track_motion_max_area 跳过空采样帧;显式 fixed frame 仍对空 mask 严格报错。
  • 真实 selector 验证:b004-0010 跳过 frame 140 后选择 frame 0,b006-0001 跳过 frame 5 后选择 frame 40。
  • 2/2 补跑 object-init 和 active-joints 完成,batch summary 为 success。

Contact review(46 个 case 全部修复后统一执行)

Contact 是显式的人机两步流程:VLM 生成的 contact_labels_raw.npz 不能直接供 HOI-align 使用;人工确认后才会写入同目录的 contact_labels.npz

当前状态:256 个 preprocess 与 256 个 raw 均已齐全,既有 final 保持 20 个;可以直接统一 review 剩余 236 个

启动 HTML review 服务(选择未被占用的端口):

/DATA/intern/hoi4d/miniconda3/envs/arthoi4d/bin/python \
  scripts/run/d3dhoi/serve_contact_review_editor.py \
  --cases-root output/runs/d3dhoi_default \
  --host 0.0.0.0 \
  --port 8035

待办

  • 修复 46 个 preprocess case,并单独为它们生成 raw;已有 210 个 raw 已自动跳过、没有覆盖。
  • 验收 raw 数量达到 256,且既有 final 仍为 20;所有 raw shape 均通过检查。
  • contact 代表帧在同一 interval 内按距中点从近到远选择,同时要求 object mask 非空且至少一只手框可见;全 interval 无可见手时确定为 no-contact。3 个边界失败项单独重跑成功。
  • 启动 review 服务,对其余 236 个 raw case 逐 interval 检查 left/right/both/none,并点击“确认该 case”写入 final。
  • 验收 final 数量达到 256。
  • 在任何 HOI-align/recon 阶段启动前,检查目标 case 已有 contact_labels.npz;只存在 raw 时应保持阻断。

恢复顺序与验收

  1. 已完成 16 个 no-motion-onset case。
  2. 已完成 2 个 object-init 空 mask case。
  3. 已解耦 active mask label 与 CAD part index,并恢复 17/17 个 b108 case。
  4. 已恢复 8 个无地面 case、1 个 person 首帧缺失 case 和 2 个 human-mask 中断 case。
  5. 每种 fallback 先跑 1 个代表 case,检查 recon/preprocess/timing.json、mask 序列、motion/result.ptobject_init/result.jsonactive_joints/result.json,再批量扩展。
  6. 256 个 case 自动 preprocess 已全部完整;原缺失 46 个 case 的 contact raw 已补齐,既有 210 个 raw 未被覆盖。
  7. raw 已达到 256;下一步统一 review 236 个尚无 final 的 case。

完成标准:run_default_preprocess_parallel.py_auto_preprocess_status 对 256 个 case 都返回 complete;所有 256 个 case 均有 contact_labels_raw.npz,并经人工确认得到 256 个 contact_labels.npz。只有 final label 完整后,D3D-HOI default 的 HOI-align 才具备输入条件。