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.json 和 20260719T164200Z/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: none 和 world_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。因此失败为:
待办:
- 从 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 成功;普通发布 caseb003-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
统一错误:
frames、全物体/active-part/human masks、depth、motion 和 tracks 已成功产出;缺失的只有 object_init 与 active_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: none、world_frame_source: human_upright;其余 case 保持ground_plane。 - 修复
human_upright:MHRpred_joint_coords使用 native 127-joint contract(root=1、head=113),用稳健 pelvis-to-head 方向估计 up;不再把 joint 69(右上臂 twist)误当 head,也不再使用会被坐姿双腿主导的 whole-body PCA。 -
b003-0006与b004-0037代表验证通过;人体方向、脚底高度和 object-init 正常。随后 6 卡并行恢复剩余 case,8/8complete=True、object-init 数值全部 finite。 - 批处理完成检查仅在 runtime
world_frame_source=ground_plane时要求masks/ground/00000.png;相关测试通过。
已完成:Person 首帧缺失的 1 个 case¶
错误为 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的根因是 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.json与20260719T174809Z/summary.json。
已完成:object-init 候选 mask 为空的 2 个 case¶
待办:
- 确认空 mask 对应物体完全遮挡/出画,不修改 SAM2 mask,也不伪造插值 mask。
-
pre_track_motion_max_area跳过空采样帧;显式fixedframe 仍对空 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 时应保持阻断。
恢复顺序与验收¶
- 已完成 16 个 no-motion-onset case。
- 已完成 2 个 object-init 空 mask case。
- 已解耦 active mask label 与 CAD part index,并恢复 17/17 个 b108 case。
- 已恢复 8 个无地面 case、1 个 person 首帧缺失 case 和 2 个 human-mask 中断 case。
- 每种 fallback 先跑 1 个代表 case,检查
recon/preprocess/timing.json、mask 序列、motion/result.pt、object_init/result.json和active_joints/result.json,再批量扩展。 - 256 个 case 自动 preprocess 已全部完整;原缺失 46 个 case 的 contact raw 已补齐,既有 210 个 raw 未被覆盖。
- 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 才具备输入条件。