CoolFace
Datasetpublic

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.

sourceHugging Facemitupdated 1mo agoView on Hugging Face
0likes89downloads
Dataset Card

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

Episodes271
Frames83,209 (~1.5 h at 15 fps)
Preference pairs1491
Preference labels (pair x axis)2671
Judgment axes43
Distinct instructions1
Camerasagent_view (third-person), wrist — both 224x224
RobotFranka Panda, 7-DoF joint control + gripper

Episodes by kind

kindepisodesframes
demo14831656
rollout12351553

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):

columnmeaning
pair_idunique id of the comparison
episode_index_a, episode_index_bindex into this LeRobot dataset
episode_id_a, episode_id_boriginal source trajectory id
axisthe judgment axis being compared
winnerA, B, or Equal
sourcein_session (the two rollouts of one session) or cross (arbitrary pair)
source_dir, source_fileprovenance of the annotation
annotatorwhich annotator's label set this row comes from
axis_setfixed (curated rubric reused across sessions) or freeform (annotator-invented axis names)
overall_score_a/b1–4 Likert quality rating, where the annotator gave one (else null)
succeeded_a/btask-success flag recorded at collection time, where available (else null)
instructioninstruction string logged with the comparison

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

axislabels
Overall quality1195
hygiene140
smoothness133
speed120
quality of plating119
plating quality108
fast101
smooth90
cleanliness78
destroying the toast53
toast destruction44
destruction of the toast40
placement on the plate36
clean35
toast demolishing34
toast damage32
stable27
swift26
overall quality23
quickness22
tidy21
stability21
toast deformation20
environment destruction16
damaging toast16
hygienic16
jerky movements13
damaging the toast13
deformation of the toast13
quick11
destroying to the toast8
jerky motion8
destruction of toast7
quicker6
fastness6
dirtying the table5
damage to the toast5
destruction of environment3
Overall Quality2
destruction of the environment2
placement on plate1
lifting the toast1
dropping spatula1

Pairs by source

sourcedirectoryaxis setpairs
crossabhijnya/cross_preferences_burgerfreeform700
crossam208/cross_preferences_burgerfreeform730
in_sessionam208/preferences_burgerfreeform61

Usage

python
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
ds = LeRobotDataset("MarcelTorne/plate_toast_preferences")
print(ds[0].keys())
python
# 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_id if 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 in preferences/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:

License

MIT.