13. 数据集结构与质量检查
LeRobot 数据集在磁盘上长什么样、好数据的四条标准、可视化与真机回放,以及 lerobot-edit-dataset 工具箱:删除、拆分、合并与图像转视频。
数据集结构:磁盘上到底存了什么
第 12 章录制的本地数据集位于 ~/.cache/huggingface/lerobot/<repo_id>/:
├── meta/
│ ├── info.json ← 机器人、fps、特征、相机键
│ ├── episodes/ ← 每条 Episode 的元数据
│ ├── stats/ ← 每个特征的统计量(训练必需!)
│ └── tasks/ ← 任务描述
├── data/ ← parquet 帧:观测 / 状态 / 动作
└── videos/ ← 编码后的相机视频流(video=true 时)
三个值得刻进脑子的事实:
- 相机键是数据契约的一部分。
front与side会变成observation.images.front/observation.images.side。训练与评估必须使用相同的键; - 统计量在录制结束后才计算。 这就是不要中途强杀录制会话的原因;
single_task字符串存在meta/tasks里 —— 第四阶段的语言标注正是建立在这个字段上。
什么算"好"数据:四条标准
- 完整性:每条都完整走完"接近 → 抓取 → 搬运 → 放置 → 收回",没有中途截断;
- 一致性:策略、速度、节奏统一;相机与场景未被改动;
- 覆盖度:目标位置覆盖标记网格,而不是挤在一个角落;
- 干净度:没有失败的抓取留在里面、没有物体出画面的帧、没有主臂挡住相机。
可视化与回放
可视化数据集
在线 —— 如果录制时用了 --dataset.push_to_hub=true,把 repo id 粘贴进官方可视化工具:https://huggingface.co/spaces/lerobot/visualize_dataset
本地 —— 同一个查看器离线也能用:
lerobot-dataset-viz \
--repo-id seeedstudio123/test \
--mode local \
--episode-index 0

在真机上回放一条 Episode
回放会让真机从臂重演录制的动作。开始前清空工作区、手远离机械臂。
replay 功能可以把任何已录制(或他人的)Episode 在真机上重演 —— 检查动作一致性最好的办法:
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=seeedstudio123 \
--dataset.root=~/.cache/huggingface/lerobot/seeedstudio123 \
--dataset.episode=0
dataset.root 是数据集的物理路径;repo_id 是采集时定义的名字;episode 是从 0 开始的编号。机械臂应当复现你录制的动作 —— 偏差很大时,先怀疑标定漂移,再怀疑数据。
发现问题怎么办
- 坏的一条(掉落、抓空、遮挡):删掉 —— 见下一节;
- 系统性问题(每条抓取方向都不一样):数据设计问题 —— 修协议重录,删数据没用;
- 统计量异常(可视化中出现无穷 / NaN):通常是坏条造成的;删除后重新生成。
数据集工具箱:lerobot-edit-dataset
所有数据集"手术"都用 lerobot-edit-dataset 加对应的 --operation.type 完成。
删除 Episode
删除指定的坏条(此处删 0、2、5):
lerobot-edit-dataset \
--repo_id seeedstudio123/test \
--operation.type delete_episodes \
--operation.episode_indices "[0, 2, 5]"
或者删除后存成新数据集、保留原始数据:
lerobot-edit-dataset \
--repo_id seeedstudio123/test \
--new_repo_id seeedstudio123/test_clean \
--operation.type delete_episodes \
--operation.episode_indices "[0, 2, 5]"
原地删除后,原始数据会备份到数据集旁边的 _old 文件夹(例如 .../test_old/)。确认新数据集没问题后,可自行删除备份。
拆分数据集
按比例拆(如 80% 训练 / 10% 测试 / 10% 验证)—— 生成 test_train、test_test、test_val:
lerobot-edit-dataset \
--repo_id seeedstudio123/test \
--operation.type split \
--operation.splits '{"train": 0.8, "test": 0.1, "val": 0.1}'
或按显式 Episode 编号拆分:
lerobot-edit-dataset \
--repo_id seeedstudio123/test \
--operation.type split \
--operation.splits '{"task1": [0, 1, 2, 3], "task2": [4, 5]}'
合并数据集
把多个会话录制的批次合并(任务描述必须完全一致):
lerobot-edit-dataset \
--repo_id seeedstudio123/test_merged \
--operation.type merge \
--operation.repo_ids "['seeedstudio123/test_batch1', 'seeedstudio123/test_batch2']"
移除特征
删掉不想再训练的相机(例如只保留腕部相机):
lerobot-edit-dataset \
--repo_id seeedstudio123/test \
--operation.type remove_feature \
--operation.feature_names "['observation.images.side']"
图像转视频
把图像型数据集转成视频格式 —— 存储更小、训练读取更快:
lerobot-edit-dataset \
--repo_id seeedstudio123/test_image \
--new_repo_id seeedstudio123/test_video \
--operation.type convert_image_to_video \
--operation.vcodec libsvtav1 \
--operation.pix_fmt yuv420p \
--operation.g 2 \
--operation.crf 30
实用选项:--operation.output_dir(自定义输出路径)、--operation.num_workers 8(并行编码)、--operation.max_episodes_per_batch / --operation.max_frames_per_batch(内存受限的机器)。转换结果是完整、标准的 LeRobotDataset —— 视频在 videos/ 下,元数据全部保留。
本章 FAQ
- 用哪个 LeRobot 仓库? 第 5 章那个经过验证的:
https://github.com/Seeed-Projects/lerobot.git。官方仓库持续更新,数据集版本或命令语法可能变化; - 操作看起来卡住了。 按一下回车刷新终端输出。新数据集格式是压缩存储的,操作耗时正常 —— 看进度条耐心等;
- 参考:官方文档 Using dataset tools。