CoolFace
Datasetpublic

cloudwalk-research/psi0-g1-sneaker-199ep-v2

Psi0 G1 Sneaker-in-Box — 199 episodes (v2 training) Training subset of the 205-episode v2 canonical source, with 6 episodes held out for open-loop evaluation. Used as the input for the v2 Psi0 fine-tune (CloudWalk Research). Bimanual: roughly half LEFT-hand demos, half RIGHT-hand. Same task as v1 — "Pick up the sneaker and place it inside the box." — same Unitree G1 + Inspire RH56DFTP hardware. The held-out 6 episodes live in psi0-g1-sneaker-6ep-v2-eval. 199 + 6 = 205… See the full description on the dataset page: https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-199ep-v2.

sourceHugging Faceapache-2.0updated 4mo agoView on Hugging Face
0likes57downloads
Dataset Card

Psi0 G1 Sneaker-in-Box — 199 episodes (v2 training)

Training subset of the 205-episode v2 canonical source, with 6 episodes held out for open-loop evaluation. Used as the input for the v2 Psi0 fine-tune (CloudWalk Research). Bimanual: roughly half LEFT-hand demos, half RIGHT-hand. Same task as v1 — "Pick up the sneaker and place it inside the box." — same Unitree G1 + Inspire RH56DFTP hardware.

The held-out 6 episodes live in `psi0-g1-sneaker-6ep-v2-eval`. 199 + 6 = 205 reconstructs the canonical source exactly.

Quick facts

Episodes199
Frames60 656 @ 30 fps
FormatLeRobot v2.1
Cameraegocentric, 640×480, H.264 yuv420p
RobotUnitree G1 + Inspire RH56DFTP (5-finger, 6 active DoF/side, padded to 14-D)
Hand-side composition108 LEFT + 91 RIGHT (slightly LEFT-heavy after eval split)
Action dim36
State dim32
Task instruction"Pick up the sneaker and place it inside the box."
Derived from`psi0-g1-sneaker-205ep-v2-source` (205 ep) minus the 6 held-out eval episodes
LicenseApache-2.0

Bimanual coverage (verified post-build)

meta/stats_psi0.json — action.std:

Index rangeMeaningstdActive?
[0:6]LEFT hand 6 DoF0.4192✅
[6]LEFT hand pad0.0000constant zero (intact)
[7:13]RIGHT hand 6 DoF0.3749✅
[13]RIGHT hand pad0.0000constant zero (intact)
[14:28]Arms (LEFT + RIGHT, 7+7 rad)nonzeroactive in all episodes
[28:31, 31, 32:36]Torso RPY, height, locomotion0.0 (stationary) / near-constantnot learned

Ill-conditioned (zero-range) action dims: {6, 13, 28, 29, 30, 32, 33, 34, 35}. (Compare v1's {0..6, 13, 28..30, 32..35} — the LEFT hand is no longer zero-range, which is the data-level signature of bimanual coverage.)

Renumbering and provenance

  • —episode_index is renumbered 0..198 contiguously; videos and parquet files match (episode_000000.mp4 ↔ episode_index = 0, etc.).
  • —Inside each parquet, the episode_index and index (global frame index) columns were rewritten to match the new numbering. frame_index (within-episode) is unchanged.
  • —meta/episodes.jsonl carries an extra orig_episode_index field per entry, mapping each new index back to its position in the canonical source. Use this for any cross-reference work.
  • —meta/stats.json and meta/stats_psi0.json were recomputed over the 199 frames in this dataset (NOT copied from the parent). This is the training-time normalization the v2 model will see — different from the canonical's stats by design.
  • —meta/tasks.jsonl is byte-identical to the parent (single task, unchanged instruction).

How to download

python
import os
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id='cloudwalk-research/psi0-g1-sneaker-199ep-v2',
    repo_type='dataset',
    local_dir='data/real/psi0-g1-sneaker-199ep-v2',
)

After download, run scripts/data/patch_lerobot_meta.py to strip stale huggingface metadata keys (required for datasets==3.6.0).

How to use for training

The v2 fine-tune launches Psi0 with:

bash
bash scripts/train/psi0/finetune-real-psi0.sh psi0-g1-sneaker-199ep-v2 sneaker-ext-left-real

40 000 steps, batch 16/GPU × 8 GPUs (B200), bf16, cosine LR with 1e-4 peak, RTC enabled (max_delay=8), VLM frozen. Step count is intentionally kept the same as v1 despite the larger dataset — at 199 episodes this drops effective epochs from ~196 (v1) to ~89, an explicit intervention against v1's observed overfitting.

Open-loop eval (v2 fine-tune, 2026-05-07 summary)

This dataset is the training distribution (ID = in-distribution) anchor for the v2 fine-tune's open-loop eval. The held-out generalization signal (OOD) is on the partner dataset `psi0-g1-sneaker-6ep-v2-eval`. Both evals use byte-for-byte identical eval code (scripts/eval/openloop_eval_psi0.py, commit f094c20 on finetune-to-real); only the dataloader source changes.

Checkpoint quality radial view — 4 axes (ID, OOD all-6, OOD-LEFT, OOD-RIGHT) × 3 polygons (one per ckpt). Outer edge = perfect, bigger polygon = better checkpoint

Figure 1 — Glance view: each polygon is one checkpoint; bigger polygon area = better overall on that metric. Score per axis is `1 − (error / max_error_in_panel)`, so the outer edge = perfect (zero error) and the origin = worst observed. `hand_joints` panel: `ckpt_30k` (teal) and `ckpt_40k` (red) areas dominate; `ckpt_20k` (purple) collapses at OOD-RIGHT. `arm_joints` panel: every polygon is a thin spike pointing only at ID — all three ckpts collapse on every OOD axis, visualizing that OOD arm fails uniformly across training. Full per-side asymmetry on the [eval-set card](https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-6ep-v2-eval).

Open-loop ID vs OOD convergence curves across ckpts 20k/30k/40k for hand_joints and arm_joints

Figure 2 — ID (blue, random 6 from this dataset) keeps improving 20k → 40k while OOD curves (red/green/orange, on `psi0-g1-sneaker-6ep-v2-eval`) plateau or regress past 30k. The growing ID-vs-OOD divergence IS the overfitting signature; the model decoded this dataset cleanly but did not generalize. `ckpt_30000` sits at the OOD optimum.

Across-checkpoint magnitude comparison — 4 series × 3 ckpts grouped bars

Figure 3 — Same data as Figure 2, laid out as bars for direct ckpt-by-ckpt magnitude comparison. ID (blue, on this dataset) drops monotonically while OOD bars (on the held-out partner) plateau or creep upward. The blue ID bar shrinks; the OOD bars do not. `ckpt_30000` is the Pareto-better deploy candidate.

Per-checkpoint denormalized L1 error norm (smaller is better). ID is a random 6-episode sample of this dataset (seed 42 → eps [17, 85, 86, 128, 150, 170], 1 771 frames). OOD is all 6 episodes of psi0-g1-sneaker-6ep-v2-eval (1 791 frames).

ckptID hand_jointsID arm_jointsOOD hand_jointsOOD arm_jointsOOD/ID handOOD/ID arm
20 0000.04170.20450.12010.60902.9×3.0×
30 0000.01730.13690.10090.62785.8×4.6×
40 0000.01380.11400.10000.63187.2×5.5×

Reading specific to this training set:

  • —The ID curve is monotonically healthy (hand 0.042 → 0.017 → 0.014, arm 0.205 → 0.137 → 0.114). The model fits this dataset cleanly; the inference path is sane.
  • —The *OOD/ID gap grows with training: 2.9× → 5.8× → 7.2× on `hand_joints`. This dataset has the capacity for the model to memorize within 40 k steps; the gap-growth is the data-level fingerprint of memorization, not generalization. The headline implication is `ckpt_30000` is a better deploy candidate than `ckpt_40000`* (OOD arm regresses past 30k while ID arm keeps improving — see eval-set card for the full per-ckpt OOD numbers).
  • —Per-side coverage on this dataset is 108 LEFT / 91 RIGHT (1.19× LEFT-heavy). The OOD per-side breakdown (on the eval-set card, not duplicated here) shows hand_joints on RIGHT-pickup episodes is 3× harder than LEFT-pickup. The 1.19× episode-count ratio cannot explain a 3× error gap by itself — the more likely contributor is scene-level diversity on the RIGHT side (sneaker pose, lighting, distractors). v3 dataset design should target RIGHT-side scene variation, not just RIGHT-side episode count.
  • —Schedule implication for v3: at 199 episodes & batch 128, 40 k steps cover ~84 effective epochs and OOD already plateaus by ~30 k. A v3 with comparable step count will need ~1.5–2× more episodes (to keep effective-epochs lower) OR an OOD probe wired into the inner training loop as an early-stopping signal.

Full results, per-side breakdown tables, decision logic, and reproduce-snippet live on the eval-set card. Model decision: see the v2 model card.

bash
# Reproduce the ID anchor (no flags = random 6 from this dataset, training distribution).
RUN_DIR=".runs/finetune/sneaker-ext-left-real-eval"
python scripts/eval/openloop_eval_psi0.py \
    --run-dir "$RUN_DIR" --ckpt-steps 20000 30000 40000 \
    --num-episodes 6 --stride 1 --num-inference-steps 10 \
    --output openloop_id_v2.json

Related datasets

RepoEpisodesHand splitPurpose
`psi0-g1-sneaker-94ep-v1`940 L / 94 Rv1 fine-tune (right-hand only)
`psi0-g1-sneaker-205ep-v2-source`205111 L / 94 Rcanonical immutable source
`psi0-g1-sneaker-199ep-v2` (this)199108 L / 91 Rv2 training
`psi0-g1-sneaker-6ep-v2-eval`63 L / 3 Rv2 held-out eval

Attribution

Developed by cloudwalk-research in the CloudWalk Robotics Lab (CW-RL). Part of the Psi0 collection. Built to fine-tune the Psi0 base model; stored in the LeRobot v2.1 format.

Citation

bibtex
@misc{cwrl_psi0_g1_sneaker_199ep_v2_2026,
  title        = {Psi0 G1 Sneaker-in-Box --- 199 episodes (v2 training, bimanual)},
  author       = {{CloudWalk Robotics Lab}},
  year         = {2026},
  howpublished = {Hugging Face dataset},
  url          = {https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-199ep-v2}
}

@article{psi0_2026,
  title         = {Psi0: A Generalist Vision-Language-Action Model for Humanoid Robots},
  author        = {Wei, Songlin and others},
  year          = {2026},
  eprint        = {2603.12263},
  archivePrefix = {arXiv},
  url           = {https://arxiv.org/abs/2603.12263}
}

@article{black2024pi0,
  title   = {{$\pi_0$}: A Vision-Language-Action Flow Model for General Robot Control},
  author  = {Black, Kevin and Brown, Noah and Driess, Danny and others},
  journal = {arXiv preprint arXiv:2410.24164},
  year    = {2024}
}

@software{lerobot2024,
  title  = {{LeRobot}: State-of-the-art Machine Learning for Real-World Robotics in {PyTorch}},
  author = {{Hugging Face}},
  url    = {https://github.com/huggingface/lerobot},
  year   = {2024}
}