Raw Ego-Exo4D dataset
Download the Ego-Exo4D dataset — see their downloader docs for the official CLI. You'll need:
takes.jsonandcaptures.json(per-take / per-capture metadata)- the
takes/directory, includingtrajectory/gopro_calibs.csvper take (GoPro fisheye calibration + extrinsics) annotations/ego_pose/, only if you want to run keypoint evaluation against ground truth
Then point the codebase at wherever you downloaded it:
export EGOEXO4D_DATASET=/path/to/EgoExo4d_dataset
slahmr/macros.py reads this environment variable at import time,
so it must be exported in every shell you run pipeline scripts from — see
Installation.
Pre-computed results (Hugging Face)
Pre-computed SLAHMR optimization results for the full Ego-Exo4D take set are
published at
Ego-Exo4D-HM/npz-datasets
— one merged .npz per take
(<take_name>/points_triangulated_world_results_merged.npz),
2649 takes, ~48GB total. This lets you render or evaluate results without
running the pipeline yourself — you still need EGOEXO4D_DATASET
set (see above), since rendering re-extracts the raw take's video frames.
Install the huggingface_hub CLI if you don't already have it:
pip install -U "huggingface_hub[cli]"
Download one take and render it
hf download Ego-Exo4D-HM/npz-datasets --repo-type dataset \
--include "cmu_bike02_4/*" --local-dir data_filtered
python scripts/run_mesh_vis_hands_egoexo.py \
--npz_path data_filtered/cmu_bike02_4/points_triangulated_world_results_merged.npz
This writes one rendered video per exo camera
(view_1.mp4–view_4.mp4) next to the npz — see
Rendering for details.
Pick a short take for a first try — take length varies a
lot. cmu_bike02_4 (110 frames, ~2.5 minutes to render all 4
views) is a good default; to check a different take's length first:
python3 -c "
import numpy as np
d = np.load('data_filtered/<take_name>/points_triangulated_world_results_merged.npz')
print(d['trans'].shape[1], 'frames')
"
Download the entire dataset
hf download Ego-Exo4D-HM/npz-datasets --repo-type dataset --local-dir data_filtered
This pulls all 2649 takes (~48GB). If it stalls partway with no visible progress (check with du -sh data_filtered):
hf download(default--max-workers 8) can wedge with all its HTTP connections stuck inCLOSE-WAIT— retry with--max-workers 4or lower.- Repeated retries in a tight loop can trip Hugging Face's API rate limit (1000 requests/5min —
429 Too Many Requests), since every invocation re-lists all 2649 files' metadata even just to resume. Wait ~5 minutes before retrying rather than looping immediately. - The command is safe to just re-run — already-downloaded files are skipped, so an interrupted or stalled download picks up where it left off.
Verify a complete download by comparing file counts:
python3 -c "
from huggingface_hub import HfApi
import os
remote = {f for f in HfApi().list_repo_files('Ego-Exo4D-HM/npz-datasets', repo_type='dataset') if f.endswith('.npz')}
local = {os.path.relpath(os.path.join(r, f), 'data_filtered')
for r, _, fs in os.walk('data_filtered') for f in fs
if f.endswith('.npz') and '.cache' not in r}
print(f'{len(local)}/{len(remote)} present, {len(remote - local)} missing')
"