CoolFace
Datasetpublic

kabilanKB/reactor_x2_100

reactor_x2_100 79 episodes, 6,818 frames of so101_follower arm data, each episode built by adding a different distractor-fruit combo to one real recorded pick-and-place episode with Reactor XMAX X2 video editing. Standard LeRobot v2.1 layout (meta/, data/, videos/ at the repo root), so it loads directly with: from lerobot.common.datasets.lerobot_dataset import LeRobotDataset ds = LeRobotDataset("kabilanKB/reactor_x2_100") Task "Grab orange and place into plate" —… See the full description on the dataset page: https://huggingface.co/datasets/kabilanKB/reactor_x2_100.

sourceHugging Facecc-by-4.0updated 1mo agoView on Hugging Face
0likes149downloads
Dataset Card

reactorx2100

79 episodes, 6,818 frames of so101_follower arm data, each episode built by adding a different distractor-fruit combo to one real recorded pick-and-place episode with Reactor XMAX X2 video editing. Standard LeRobot v2.1 layout (meta/, data/, videos/ at the repo root), so it loads directly with:

python
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
ds = LeRobotDataset("kabilanKB/reactor_x2_100")

Task

"Grab orange and place into plate" — every episode keeps the same recorded grasp; only the scene around the target orange changes.

Source data

  • Base episode: LightwheelAI/leisaac-pick-orange, episodes/orange_ep0
  • Robot: SO-101 follower arm, 6-DoF action / state, single front camera (480x640, 30 fps)

How it was built

build_fruit_addition_dataset.py re-renders the source episode 95 times (one per scene in fruit_scenes95.json), each time asking Reactor X2 to add a different distractor fruit under a different lighting style, while the original orange, plate, and arm motion stay put. Every output frame is gated on the recorded orange surviving per-frame (not just a per-episode average) — a scene only keeps the frames where the target is still identifiable, and is truncated at the first sustained run of frames where it isn't. This is the "add distractor objects" result from this project's PROJECT.md: it works, conditionally, because the original action labels are only valid where the target the policy was reaching for is still visibly the same object.

Of 95 scenes attempted, 79 survived with enough usable frames to keep; 16 were dropped for producing too few frames after the survival gate (see meta/dropped.json — mostly heavy occlusion cases like kiwi_lamp and pear_plum_midday, which kept 0 frames).

Scene variation

  • 9 distractor fruits: apple, banana, grape, kiwi, lemon, peach, pear, plum, strawberry (single fruits and multi-fruit combinations)
  • 5 lighting styles: gold (warm late-afternoon), overcast, midday, lamp, morning

Dataset stats

Episodes79 (of 95 scenes attempted)
Frames6,818
FPS30
Action / state dims6
Cameraobservation.images.front, 480x640
Mean per-frame coverage0.873
Mean target ΔE (median / p90)20.7 / 24.8
Episodes truncated by the survival gate10 / 79
Frames kept vs. rendered6,818 / 7,108 (96%)

Per-episode provenance (scene id, prompt, coverage, ΔE, truncation, source frame range) is recorded in meta/augmentations.jsonl.

Caveats

  • This augments an existing action-labeled episode; X2 is pixels-only and contributes no actions, proprioception, or camera pose of its own.
  • Whether training on this augmented data actually improves a policy is unproven — no A/B run against the un-augmented source has been done yet.
  • Coverage and ΔE are automated proxies for "does the label still match the pixels," not a guarantee of visual quality.