Raw Ego-Exo4D dataset

Download the Ego-Exo4D dataset — see their downloader docs for the official CLI. You'll need:

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.mp4view_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):

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')
"