LeRobot数据集v3.0格式深度解析:OpenLET具身智能挑战赛Parquet+多目视频存储结构完全指南
本文是LeRobot 数据集 v3.0 格式的完全指南:基于OpenLET 具身智能挑战赛的官方数据集,拆解 Parquet 帧级数据、多目 AV1 视频与 meta 元信息三大存储模块,带你快速读懂并加载这份面向真实工业任务的人形机器人操作数据集。
📊 先览全局:三大任务的数据规模
OpenLET 具身智能挑战赛面向高校实验室、企业研发团队与个人开发者,邀请你围绕真实工业任务开发算法、持续打榜。仓库sim/目录下提供了 3 个任务的数据集,全部遵循 LeRobot 数据集 v3.0 规范:
| 任务 | 目录 | 集数 | 总帧数 | 状态维度 | 动作维度 | 相机配置 |
|---|---|---|---|---|---|---|
| 🧩 零件抓取 | sim/task1_parts_pick/ | 500 | 237,813 | 18 | 21 | 头部 + 右腕 |
| 📦 箱子搬运 | sim/task2_box_move/ | 500 | 294,678 | 36 | 39 | 头部 + 左腕 + 右腕 |
| 🔁 循环投料 | sim/task3_loop_feed/ | 500 | 316,791 | 18 | 21 | 头部 + 右腕 |
三个共同点值得记住:
- 机器人平台:
kuavo-5w人形机器人,每条机械臂 7 自由度(zarm_*_link)+ 11 维sg100手部维度 - 采样率:10 fps(单集约 30~50 秒,约 487 帧封顶)
- 动作空间:状态维度 + 底盘速度
vx / vy / vyaw,所以 task2 是 36→39 维、task1/task3 是 18→21 维
🗂️ v3.0 目录结构:一张图看懂数据集布局
以零件抓取任务为例(sim/task1_parts_pick/meta/info.json 所在层级):
sim/task1_parts_pick/ ├── data/ # ① 帧级数据(Parquet) │ └── chunk-000/ │ └── file-000.parquet # 状态+动作+索引,单文件 ≤100MB ├── meta/ # ② 元信息 │ ├── info.json # 数据集"身份证":特性、路径模板、帧率 │ ├── stats.json # 各字段统计量(min/max/均值/分位数) │ ├── tasks.parquet # 任务索引 ↔ 自然语言指令 │ └── episodes/ │ └── chunk-000/ │ └── file-000.parquet # 每集 ↔ 视频文件帧偏移 索引 └── videos/ # ③ 多目视频(MP4) ├── observation.images.head_cam_h/ # 头部相机 │ └── chunk-000/file-000.mp4 ... # 多集拼接,单文件 ≤200MB └── observation.images.wrist_cam_r/ # 右腕相机v3.0 的核心设计思想就一句话:数值数据进 Parquet,图像数据进 MP4,二者用 meta 里的索引对齐。按每 1000 集切一个chunk-000、chunk-001……,方便大规模数据集并行处理。
🪪 info.json 逐字段解析:数据集的"身份证"
打开 sim/task1_parts_pick/meta/info.json,关键字段如下:
| 字段 | 示例值 | 含义 |
|---|---|---|
codebase_version | v3.0 | LeRobot 数据格式版本 |
robot_type | kuavo-5w | 采集用机器人平台 |
total_episodes/total_frames | 500 / 237,813 | 集数与总帧数 |
fps | 10 | 采样帧率 |
chunks_size | 1000 | 每个 chunk 的集数上限 |
splits | {"train": "0:500"} | 训练/验证划分 |
data_path/video_path | 见下方 | 文件路径模板 |
data_path与video_path是路径模板,读取器靠它把 (chunk, file) 编号还原成真实文件:
"data_path": "data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet", "video_path": "videos/{video_key}/chunk-{chunk_index:03d}/file-{file_index:03d}.mp4"features区块则定义了每一列的dtype、shape和维度名称。比如 task2 双臂数据集的observation.state是 36 维 float32(sim/task2_box_move/meta/info.json):
"observation.state": { "dtype": "float32", "shape": [36], "names": { "state_names": ["zarm_l1_link", "...", "right_sg100_11"] } }🧮 Parquet 帧数据:一行就是一帧
data/chunk-000/file-000.parquet 是整个数据集的心脏——表格的每一行对应一帧,包含 7 类列:
| 列名 | 类型 | 说明 |
|---|---|---|
observation.state | float32[18/36] | 本帧本体状态:臂关节 + 手部维度 |
action | float32[21/39] | 本帧指令:状态维度 + 底盘vx/vy/vyaw |
timestamp | float32 | 相对本集起点的秒数(如 0.0~48.7) |
frame_index | int64 | 集内帧号(0 开始) |
episode_index | int64 | 集编号(0~499) |
index | int64 | 数据集全局帧索引 |
task_index | int64 | 任务编号,指向tasks.parquet |
💡 视频列(如
observation.images.head_cam_h)不存在 Parquet 里,只在features中声明元信息,真实像素放在 MP4 中,这正是 v3.0 比"单文件存一切"高效的原因。
🎥 多目视频存储:AV1 编码与按体积切分
videos/下每个相机 key 一个子目录,MP4 的关键参数(见info.json的features):
- 编码:AV1,像素格式
yuv420p,480×640,10 fps,无音轨 - 体积上限:
video_files_size_in_mb: 200,单文件接近 200MB 即自动开新文件 - 多集拼接:一个 MP4 内连续存放约 30 集的画面(500 集 ÷ 16 文件 ≈ 31 集/文件)
⚠️ 注意各相机的文件数可以不同。例如 task1 头部相机是 16 个文件(file-000~file-015.mp4),右腕相机是 23 个——因为各目画面体积不同,切分时机不同。每集在各目视频里的精确起止位置,由 meta/episodes/chunk-000/file-000.parquet 中的偏移索引记录,读取时"先查索引、再定帧"。
📈 stats.json 与 tasks.parquet:统计与任务索引
- meta/stats.json:对每个数值字段给出
min / max / mean / std / count / q01~q99全量统计。做动作归一化(如 min-max、z-score)时无需重新扫全量数据,直接查表即可。图像字段同样统计了 RGB 三通道的分布(均值约 0.34~0.45,说明画面曝光适中)。 - meta/tasks.parquet:
task_index→ 自然语言指令的映射表。本仓库每个任务目录只含 1 个任务(total_tasks: 1),但格式上天然支持一集数据混合多个任务,训练 VLA 模型做多任务泛化。
🚀 快速上手:两种加载方式
方式一:直接读 Parquet(最轻量)
import pyarrow.parquet as pq t = pq.read_table("sim/task1_parts_pick/data/chunk-000/file-000.parquet") print(t.column_names) # ['observation.state', 'action', 'timestamp', ...]方式二:用 LeRobot 官方数据加载器
安装lerobot后,以root指向任务目录即可得到统一的 Dataset 对象,按集取帧、对齐视频帧都是内置能力。配合meta/info.json的路径模板,加载器会自动把数值列与 MP4 帧对齐好。
❓ 常见问题 FAQ
Q1:为什么下载下来的 .parquet / .mp4 只有一百多字节?这些大文件通过git-lfs存储,未拉取 LFS 对象时目录里只是文本指针(内容形如version https://git-lfs.github.com/spec/v1+ sha256 哈希)。安装 git-lfs 后执行git lfs pull即可还原为真实文件(task1 的数据文件约 25MB,单段视频约 200MB)。
Q2:任务目录下的20261015/子目录是什么?按日期命名的快照子集,例如 sim/task1_parts_pick/20261015/meta/info.json 中只有 200 集(主数据集的 40%),且相机配置与主目录不同(如 task1 快照是双目 36 维配置)。适合下载量小、快速验证数据管线。
Q3:怎么算 chunk 编号?episode_index // chunks_size。本数据集chunks_size=1000且每任务 ≤500 集,所以都落在chunk-000;若扩展到 1500 集,第 1200 集就会进入chunk-001。
✨ 小结
| 要点 | 一句话总结 |
|---|---|
| 格式标准 | LeRobot v3.0:Parquet 存数值,MP4 存视频,meta 做对齐 |
| 路径规则 | 模板chunk-{03d}/file-{03d}+ 每 1000 集一切分 |
| 视频编码 | AV1 / 480×640 / 10fps,200MB 自动切分 |
| 加速训练 | stats.json免扫描归一化,tasks.parquet支持多任务 |
读懂这套 OpenLET 具身智能挑战赛的数据结构后,你就可以直接对接 LeRobot 生态的训练与评测流程,围绕三大工业任务迭代你的操作算法、冲击榜单排名了 🏁
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考