downloader

August 28, 2026 · View on GitHub

Use this downloader to fetch CaptainCook4D data from the Box cloud.

  • download_gopro_data.py — GoPro video (360p and 4K)
  • download_hololens_data.py — Hololens 2D video (360p)
  • download_hololens_3d_data.py — Hololens 3D and sensor streams

All three read their links from metadata/download_links.json.

pip install -r requirements.txt

2D data

Only GoPro 360p:

python download_gopro_data.py --data2d

Both GoPro 360p and 4K:

python download_gopro_data.py --data2d --resolution4K

Hololens 360p video:

python download_hololens_data.py --data2d

3D and sensor data

Everything that describes the scene in 3D — depth, active brightness, depth pose, spatial (head and hand) pose, and the three IMU streams:

python download_hololens_3d_data.py --data3d

Every Hololens stream, including the PV video, PV frames and the microphone capture:

python download_hololens_3d_data.py --all --sync --raw

Pick individual streams or groups:

python download_hololens_3d_data.py --streams depth,imu

Restrict to specific recordings:

python download_hololens_3d_data.py --data3d --recordings 1_10,2_38

See what would be fetched without downloading anything:

python download_hololens_3d_data.py --all --dry_run

Sync and raw

Every Hololens stream exists in two variants:

  • --sync (default) — resampled and time aligned with the GoPro video
  • --raw — the untouched device output, at the device's own timestamps

Pass both to get each variant side by side.

Streams

StreamContentsSyncRaw
pv_video360p photo-video stream, mp4yesno
pv_framesPhoto-video frames, zipyesyes
pv_posePhoto-video camera pose, pklyesyes
depthAHAT depth maps, zipyesyes
abAHAT active brightness, zipyesyes
depth_poseDepth camera pose, pklyesyes
spatialHead and hand pose, pklyesyes
imu_accelerometerAccelerometer, pklyesyes
imu_gyroscopeGyroscope, pklyesyes
imu_magnetometerMagnetometer, pklyesyes
mcMicrophone capture, pklnoyes

Groups that expand to several streams: depth (depth + ab + depth_pose), pose (pv_pose + depth_pose + spatial), imu (all three IMU streams), pv (pv_video + pv_frames + pv_pose).

Coverage

Not every recording has every stream. Of the 384 recordings, roughly 60 were captured with the GoPro alone and have no Hololens data, and about 40 more lost the spatial and IMU streams to device instability. The scripts report how many recording/stream combinations were unavailable and simply skip them.

Output layout

<output_dir>/captain_cook_4d/
    gopro/
        resolution_360p/<recording_id>_360p.mp4
        resolution_4k/<recording_id>_4K.mp4
    hololens/
        sync/
            pv/<recording_id>_360p.mp4
            depth/<recording_id>_depth.zip
            ab/<recording_id>_ab.zip
            depth_pose/<recording_id>_depth_ahat_pose.pkl
            spatial/<recording_id>_spatial.pkl
            imu_accelerometer/<recording_id>_imu_accelerometer.pkl
            ...
        raw/
            ... same streams, plus mc/<recording_id>_mc.pkl

Downloads are resumable: a file whose size already matches the server is skipped, and partial downloads are written to a .part file so an interrupted run never leaves a truncated file behind.

The 3D archives are large. Downloading --data3d for all recordings is on the order of several terabytes, so restrict with --recordings or --streams unless you intend to pull the whole dataset.