LeonOverload/primo-video-media

Dataset

PRIMO Video Media

0

65 commits

1 linked in READMEs

updated Sep 3, 2026

See the code

README

PRIMO Video Media

The video half of the PRIMO R1 release (paper): source clips plus the pre-extracted anchor frames, packaged as multipart ZIP archives, one group per data source. The JSON annotations that reference these files live in separate repos β€” primo-bench-json, primo-sft-json, primo-rl-json.

Read this before you download anything

The full release is 6.58 TB across 1,231 archive parts, and behavior-1k alone is 5,981 GB of it β€” 91%. Nobody needs all of it. Every group is independently downloadable and independently extractable, and one group is enough to run a complete benchmark split or train on a subset mixture.

GroupPartsSize
behavior-1k11155,981 GB
agibot66349 GB
seed-bench-r128148 GB
real-humanoid627.6 GB
perceptiontest524.9 GB
nextqa417.9 GB
robotwin312.5 GB
robovqa29.8 GB
star15.1 GB
sharerobot10.97 GB

Start with robotwin (12.5 GB). It backs both benchmark robotwin splits and both robotwin training subsets, so it is the cheapest way to get an end-to-end run working before committing disk to anything larger.

Which group does my split need?

Benchmark (primo-bench-json)

SplitGroup
primo-bench-{id,ood}-robotwinrobotwin
primo-bench-{id,ood}-agibotagibot
primo-bench-{id,ood}-behavior-1kbehavior-1k
primo-bench-ood-real-humanoidreal-humanoid

Training (primo-sft-json Β· primo-rl-json)

SubsetGroup
robotwin-clean, robotwin-randomizedrobotwin (shared)
agibotagibot
behavior-1kbehavior-1k
robovqarobovqa
sharerobotsharerobot
seed-bench-r1 (SFT only)seed-bench-r1
nextqa (SFT only)nextqa
perceptiontest (SFT only)perceptiontest
star (SFT only)star

Download

One glob per group. --include "robotwin.z*" matches every part including the final .zip:

hf download LeonOverload/primo-video-media --repo-type dataset \
    --include "robotwin.z*" --local-dir /tmp/primo-video-zips

Several groups at once:

hf download LeonOverload/primo-video-media --repo-type dataset \
    --include "robotwin.z*" --include "sharerobot.z*" --include "robovqa.z*" \
    --local-dir /tmp/primo-video-zips

Or from Python:

from huggingface_hub import snapshot_download

for group in ["robotwin", "sharerobot"]:
    snapshot_download(
        "LeonOverload/primo-video-media",
        repo_type="dataset",
        allow_patterns=[f"{group}.z*"],
        local_dir="/tmp/primo-video-zips",
    )

Add --dry-run to any hf download to see the file list and total size before committing. Use --include / --exclude on their own β€” passing filenames positionally makes the client ignore both.

Verify

Per-part SHA256 is published in two equivalent forms: SHA256SUMS.txt (checksum + filename) and manifest.csv (file,size_bytes,sha256).

cd /tmp/primo-video-zips

# Only the parts you actually downloaded
grep -E '^\S+  robotwin\.' /path/to/SHA256SUMS.txt | sha256sum -c -

# macOS
grep -E '^\S+  robotwin\.' /path/to/SHA256SUMS.txt | shasum -a 256 -c -

Running sha256sum -c SHA256SUMS.txt unfiltered reports every part you did not download as missing, which is expected rather than an error.

Reassemble and extract

Each group is a zip split into ~5.37 GB parts named <group>.z01, <group>.z02, …, with the last part being <group>.zip β€” not the first. All parts must sit in the same directory.

7-Zip reads multipart archives directly, so this is the path to prefer:

cd /tmp/primo-video-zips
7z x robotwin.zip -o"$VIDEO_DATA_ROOT/primo-video/"

Without 7-Zip, concatenate first with zip -FF, then extract:

zip -FF robotwin.zip --out robotwin_fixed.zip
unzip robotwin_fixed.zip -d "$VIDEO_DATA_ROOT/primo-video/"

The zip -FF route needs roughly double the disk of the group while it runs, since robotwin_fixed.zip is a full second copy.

Where to extract, and why

Extract into $VIDEO_DATA_ROOT/primo-video/. Archive entries are rooted at <group>/, and the JSON paths resolve against exactly this prefix β€” DatasetLoader joins $VIDEO_DATA_ROOT/primo-video/ with the relative path field, and init_frame_path / current_frame_path already start with ./primo-video/. Extracting one level up or down is the usual cause of "video not found" at load time.

The resulting tree, alongside annotations:

$VIDEO_DATA_ROOT/
β”œβ”€β”€ primo-bench/robotwin/{id,ood}.json
β”œβ”€β”€ primo-sft/robotwin-clean/train_cot.json
β”œβ”€β”€ primo-rl/robotwin-clean/train.json
└── primo-video/
    └── robotwin/
        β”œβ”€β”€ videos/...
        └── frames/...

Frames are already here

Each archive ships the pre-extracted anchor frames next to the clips β€” for example sharerobot/videos/entity_25460.mp4 alongside sharerobot/frames/videos/entity_25460_init.jpg and ..._current.jpg. Training reads those JPEG paths straight from the JSON, so there is no preprocessing step for these archives. src/preprocess_video_frames.py in the code repo exists for datasets you add yourself.

Evaluation is different: eval_interleave.py ignores the frame fields and re-derives the first and last frame with OpenCV at run time. Either way, nothing to run ahead of time.

Repo contents

  • <group>.z01 … <group>.zip β€” the multipart archives, 10 groups, 1,231 parts
  • SHA256SUMS.txt β€” per-part SHA256 for all parts
  • manifest.csv β€” file,size_bytes,sha256, same data with sizes
  • .pack_tmp/<group>.{manifest,sha} β€” per-group subsets of the above, written during packaging

Resources

Citations

If you find our work helpful for your research, please consider citing our work.

@misc{liu2026passiveobserveractivecritic,
      title={From Passive Observer to Active Critic: Reinforcement Learning Elicits Process Reasoning for Robotic Manipulation}, 
      author={Yibin Liu and Yaxing Lyu and Daqi Gao and Zhixuan Liang and Weiliang Tang and Shilong Mu and Xiaokang Yang and Yao Mu},
      year={2026},
      eprint={2603.15600},
      archivePrefix={arXiv},
      primaryClass={cs.RO},
      url={https://arxiv.org/abs/2603.15600}, 
}

Contributors

LeonOverload

65 commits

LeonOverload/primo-video-media

Dataset

PRIMO Video Media

0

65 commits

1 linked in READMEs

updated Sep 3, 2026

See the code

README

PRIMO Video Media

The video half of the PRIMO R1 release (paper): source clips plus the pre-extracted anchor frames, packaged as multipart ZIP archives, one group per data source. The JSON annotations that reference these files live in separate repos β€” primo-bench-json, primo-sft-json, primo-rl-json.

Read this before you download anything

The full release is 6.58 TB across 1,231 archive parts, and behavior-1k alone is 5,981 GB of it β€” 91%. Nobody needs all of it. Every group is independently downloadable and independently extractable, and one group is enough to run a complete benchmark split or train on a subset mixture.

GroupPartsSize
behavior-1k11155,981 GB
agibot66349 GB
seed-bench-r128148 GB
real-humanoid627.6 GB
perceptiontest524.9 GB
nextqa417.9 GB
robotwin312.5 GB
robovqa29.8 GB
star15.1 GB
sharerobot10.97 GB

Start with robotwin (12.5 GB). It backs both benchmark robotwin splits and both robotwin training subsets, so it is the cheapest way to get an end-to-end run working before committing disk to anything larger.

Which group does my split need?

Benchmark (primo-bench-json)

SplitGroup
primo-bench-{id,ood}-robotwinrobotwin
primo-bench-{id,ood}-agibotagibot
primo-bench-{id,ood}-behavior-1kbehavior-1k
primo-bench-ood-real-humanoidreal-humanoid

Training (primo-sft-json Β· primo-rl-json)

SubsetGroup
robotwin-clean, robotwin-randomizedrobotwin (shared)
agibotagibot
behavior-1kbehavior-1k
robovqarobovqa
sharerobotsharerobot
seed-bench-r1 (SFT only)seed-bench-r1
nextqa (SFT only)nextqa
perceptiontest (SFT only)perceptiontest
star (SFT only)star

Download

One glob per group. --include "robotwin.z*" matches every part including the final .zip:

hf download LeonOverload/primo-video-media --repo-type dataset \
    --include "robotwin.z*" --local-dir /tmp/primo-video-zips

Several groups at once:

hf download LeonOverload/primo-video-media --repo-type dataset \
    --include "robotwin.z*" --include "sharerobot.z*" --include "robovqa.z*" \
    --local-dir /tmp/primo-video-zips

Or from Python:

from huggingface_hub import snapshot_download

for group in ["robotwin", "sharerobot"]:
    snapshot_download(
        "LeonOverload/primo-video-media",
        repo_type="dataset",
        allow_patterns=[f"{group}.z*"],
        local_dir="/tmp/primo-video-zips",
    )

Add --dry-run to any hf download to see the file list and total size before committing. Use --include / --exclude on their own β€” passing filenames positionally makes the client ignore both.

Verify

Per-part SHA256 is published in two equivalent forms: SHA256SUMS.txt (checksum + filename) and manifest.csv (file,size_bytes,sha256).

cd /tmp/primo-video-zips

# Only the parts you actually downloaded
grep -E '^\S+  robotwin\.' /path/to/SHA256SUMS.txt | sha256sum -c -

# macOS
grep -E '^\S+  robotwin\.' /path/to/SHA256SUMS.txt | shasum -a 256 -c -

Running sha256sum -c SHA256SUMS.txt unfiltered reports every part you did not download as missing, which is expected rather than an error.

Reassemble and extract

Each group is a zip split into ~5.37 GB parts named <group>.z01, <group>.z02, …, with the last part being <group>.zip β€” not the first. All parts must sit in the same directory.

7-Zip reads multipart archives directly, so this is the path to prefer:

cd /tmp/primo-video-zips
7z x robotwin.zip -o"$VIDEO_DATA_ROOT/primo-video/"

Without 7-Zip, concatenate first with zip -FF, then extract:

zip -FF robotwin.zip --out robotwin_fixed.zip
unzip robotwin_fixed.zip -d "$VIDEO_DATA_ROOT/primo-video/"

The zip -FF route needs roughly double the disk of the group while it runs, since robotwin_fixed.zip is a full second copy.

Where to extract, and why

Extract into $VIDEO_DATA_ROOT/primo-video/. Archive entries are rooted at <group>/, and the JSON paths resolve against exactly this prefix β€” DatasetLoader joins $VIDEO_DATA_ROOT/primo-video/ with the relative path field, and init_frame_path / current_frame_path already start with ./primo-video/. Extracting one level up or down is the usual cause of "video not found" at load time.

The resulting tree, alongside annotations:

$VIDEO_DATA_ROOT/
β”œβ”€β”€ primo-bench/robotwin/{id,ood}.json
β”œβ”€β”€ primo-sft/robotwin-clean/train_cot.json
β”œβ”€β”€ primo-rl/robotwin-clean/train.json
└── primo-video/
    └── robotwin/
        β”œβ”€β”€ videos/...
        └── frames/...

Frames are already here

Each archive ships the pre-extracted anchor frames next to the clips β€” for example sharerobot/videos/entity_25460.mp4 alongside sharerobot/frames/videos/entity_25460_init.jpg and ..._current.jpg. Training reads those JPEG paths straight from the JSON, so there is no preprocessing step for these archives. src/preprocess_video_frames.py in the code repo exists for datasets you add yourself.

Evaluation is different: eval_interleave.py ignores the frame fields and re-derives the first and last frame with OpenCV at run time. Either way, nothing to run ahead of time.

Repo contents

  • <group>.z01 … <group>.zip β€” the multipart archives, 10 groups, 1,231 parts
  • SHA256SUMS.txt β€” per-part SHA256 for all parts
  • manifest.csv β€” file,size_bytes,sha256, same data with sizes
  • .pack_tmp/<group>.{manifest,sha} β€” per-group subsets of the above, written during packaging

Resources

Citations

If you find our work helpful for your research, please consider citing our work.

@misc{liu2026passiveobserveractivecritic,
      title={From Passive Observer to Active Critic: Reinforcement Learning Elicits Process Reasoning for Robotic Manipulation}, 
      author={Yibin Liu and Yaxing Lyu and Daqi Gao and Zhixuan Liang and Weiliang Tang and Shilong Mu and Xiaokang Yang and Yao Mu},
      year={2026},
      eprint={2603.15600},
      archivePrefix={arXiv},
      primaryClass={cs.RO},
      url={https://arxiv.org/abs/2603.15600}, 
}

Contributors

LeonOverload

65 commits