MarcelTorne/plate_toast_preferences
plate_toast — pairwise preferences on a Franka Panda Real-robot trajectories for "put the toast in the plate" with human pairwise preference labels on multiple judgment axes. Built for reward-model / preference-learning research: every label is a comparison of two trajectories on one named axis, not a scalar score. The trajectory data is a standard LeRobot v2.1 dataset, so it also loads directly as an imitation-learning dataset. Contents Episodes 271… See the full description on the dataset page: https://huggingface.co/datasets/MarcelTorne/plate_toast_preferences.
plate_toast — pairwise preferences on a Franka Panda
Real-robot trajectories for "put the toast in the plate" with human pairwise preference labels on multiple judgment axes. Built for reward-model / preference-learning research: every label is a comparison of two trajectories on one named axis, not a scalar score.
The trajectory data is a standard LeRobot v2.1 dataset, so it also loads directly as an imitation-learning dataset.
Contents
Episodes by kind
demo episodes are human teleoperated demonstrations. rollout episodes are policy rollouts recorded in preference-collection sessions; those are the ones that vary in quality, which is what makes the comparisons informative.
Preference labels
preferences/pairs.parquet — one row per (pair, axis):
preferences/pairs.jsonl is the same data with the axes nested per pair. preferences/episodes.parquet maps episode_index to the source trajectory.
Winner distribution: B 1175, A 1131, Equal 365.
Axes
Pairs by source
Usage
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
ds = LeRobotDataset("MarcelTorne/plate_toast_preferences")
print(ds[0].keys())# train a reward model on the pairwise labels
import pandas as pd
from huggingface_hub import hf_hub_download
prefs = pd.read_parquet(hf_hub_download("MarcelTorne/plate_toast_preferences", "preferences/pairs.parquet",
repo_type="dataset"))
decisive = prefs[prefs.winner != "Equal"] # drop ties
overall = decisive[decisive.axis.str.lower().str.contains("overall")]Both cameras are dtype: video. observation.state is [joint_0..joint_6, gripper], observation.ee is [x, y, z, roll, pitch, yaw], and action is the commanded [joint_position(7), gripper_position(1)].
Caveats
- Frames are h264 (crf 16), not bit-exact. The source HDF5 held raw uint8 frames; re-encoding at the same 224x224 resolution shrinks the release ~100x at 41.8 dB PSNR (mean absolute error 1.1/255, 99th pct 7/255), measured on fold_pants cloth texture. Do not expect byte-level reproduction of the originals.
- `Equal` is common on some axes. Annotators used it freely; filter deliberately.
- `freeform` axis names are not a closed vocabulary. They were invented per session, so the same idea appears under several names (
fast/speed,smooth/smoothness). Normalise before aggregating across sessions. - A pair can be labelled by more than one annotator. The two annotators' cross-pair sets are near-disjoint, but not perfectly; group by
pair_idif you need unique pairs. - Instructions on `rollout` episodes sometimes carry reward conditioning (e.g.
"put the toast in the plate, fast: 1.0, ...") because the policy that produced them was reward-conditioned. The LeRobot task string is the plain instruction; the logged string is kept inpreferences/episodes.parquet. - No success labels on `demo` episodes — they are demonstrations, assumed good.
Related datasets
Same robot, same collection pipeline, same schema — four tasks released together:
- `MarcelTorne/fold_pants_preferences` — fold the shorts
- `MarcelTorne/setup_table_preferences` — set up the table
- `MarcelTorne/put_cube_in_bowl_preferences` — put the cube in the bowl
- `MarcelTorne/plate_toast_preferences` (put the toast in the plate) — this dataset
License
MIT.
