points_triangulated_world_results_merged.npz
| Key | Shape | Description |
|---|---|---|
trans | (1, T, 3) | Global translation |
root_orient | (1, T, 3) | Root orientation (axis-angle) |
pose_body | (1, T, 63) | SMPL body pose (21 joints × 3, decoded from latent_pose) |
hand_pose | (1, T, 90) | MANO hand pose, both hands |
latent_pose | (1, T, 32) | VPoser latent body pose |
betas_per_frame | (1, T, 16) | SMPL shape parameters (constant within each optimization chunk, broadcast per frame) |
cam_R, cam_t | (5, T, 3, 3) / (5, T, 3) | Camera rotation/translation (fixed Ego-Exo4D calibration; cameras are not optimized) |
intrins, cam_dist | (5, T, 3, 3) / (5, T, 5) | Camera intrinsics/distortion |
joints3d | (1, T, 67, 3) | 3D joint positions (world frame) |
joints2d | (4, T, 67, 2) | Reprojected 2D joints, exo views only |
valid | (1, T), int8 | 0 for frames whose optimization chunk logged a NaN/Inf loss term, 1 otherwise |
chunk_ranges | (n_chunks, 2) | (start, end) frame index of each optimization chunk |
Quick load example:
import numpy as np
d = np.load("<take>/points_triangulated_world_results_merged.npz")
print(d["trans"].shape) # (1, T, 3)
print(d["valid"].mean()) # fraction of frames NOT from a NaN-loss chunk
67-keypoint layout
For joints3d/joints2d:
- 0–24: OpenPose body keypoints (19–24 are face/neck from ViTPose wholebody)
- 25–45: left hand (21 keypoints)
- 46–66: right hand (21 keypoints)