机器人数据集格式比较
机器人数据集格式的完整比较 <unk> HDF5,RLDS,LeRobot.
对于机器人工程师来说,这是一本绝对的指南,他们需要理解,生产和转换ACT,Octo,LeRobot和Open X-Embodiment使用的三个主导机器人数据集格式.
为什么数据集格式重要
您可以推迟的数据格式不是一个细节.
1. 培训框架兼容性
每个主要的培训框架都会预期数据在特定格式中.ACT和扩散政策读取HDF5本土.Octo和开放X-Embodiment数据组合脚本预期RLDS/TFRecord.LeRobot培训库读取LeRobot Parquet.如果您的数据在错误格式中,您在训练
2.存储效率和访问模式
500 集的数据集,有 30 摄像头的 30 个摄像头,在原始 HDF5 中占用 25-50 GB,在压缩 HDF5 中占用 15-30 GB,在 LeRobot (MP4 视频) 中占用 3-8 GB,或者在 RLDS/TFRecord 中占用 20-40 GB. 但存储效率与数据忠诚度相比较差:勒罗波的MP4压缩量是低迷的,而HDF5和RLDS保留了精确的像素值.
3 社区与共享
如果您想公开分享数据集,LeRobot格式将您在Hugging Face Hub上传一个命令,并可内置网络可视化.RLDS为您提供与开放X-Embodiment生态系统 (50+数据集,22种机器人类型).HDF5为您提供最大的灵活性,但没有标准化的共享平台.
我们的建议: 使用HDF5作为您的真相来源收集和存储格式.转换为LeRobot用于共享和RLDS用于跨体体训练.这让您获得所有三个生态系统中最好的,而没有任何单个格式的锁定.
HDF5:机器人数据存储的黄金标准
HDF5 (层次数据格式5) 存储数据在类型 (目录) 和数据集 (阵列) 的文件系统等层次结构中.它最初用于科学计算,并已成为机器人示范数据的现实标准,因为其灵活性,成熟的工具和高效的随机访问.
剧情结构
标准ACT/ALOHA HDF5布局将每个集集存为一个最高级别的集群,具有观察,行动和元数据属性:
/episode_0/
observations/
images/
cam_high # uint8 [T x 480 x 640 x 3] overhead camera
cam_wrist_left # uint8 [T x 480 x 640 x 3] left wrist camera
cam_wrist_right # uint8 [T x 480 x 640 x 3] right wrist camera
qpos # float32 [T x 14] joint positions (7 per arm)
qvel # float32 [T x 14] joint velocities
action # float32 [T x 14] leader arm positions (supervision signal)
attrs:
task = "pick_cube_bimanual"
operator_id = "op_03"
success = True
num_timesteps = 450
timestamp = "2026-04-10T14:32:00Z"
使用Python读取HDF5
阅读h5py的节目很简单. 以下是一个完整的例子,
import h5py
import numpy as np
# Open a single episode file
with h5py.File("episode_0.hdf5", "r") as f:
# Read joint positions and actions
qpos = f["/observations/qpos"][:] # shape: [T, 14]
action = f["/action"][:] # shape: [T, 14]
# Read a specific camera frame (random access)
frame_100 = f["/observations/images/cam_high"][100] # shape: [480, 640, 3]
# Read all frames for a camera
all_frames = f["/observations/images/cam_high"][:] # shape: [T, 480, 640, 3]
# Read metadata
task = f.attrs.get("task", "unknown")
success = f.attrs.get("success", False)
print(f"Task: {task}, Success: {success}")
print(f"Episode length: {qpos.shape[0]} timesteps")
print(f"Joint positions range: [{qpos.min():.3f}, {qpos.max():.3f}]")
强度高效率5项最佳实践
- **
缩:** 始终沿时间轴进行数据集的 缩. 使用 缩_size=1进行随机访问 (调整,可视化) 或 缩_size=32进行连续阅读效率 (训练).永远不会存储未 缩的图像数据.它将作为单个单一块加载. - 压缩: 使用LZF用于图像数据 (相机框架的相似比例比GZIP快3-5倍).用于联合轨迹 (比率较高,速度不关键).在收集时不要压缩图像.
- ** 转载数据属性:** 存储事件转载数据为 HDF5 组属性:
T10 , T11 , T12 , T13 . 文件根上包含一个 T14 属性来跟踪格式变化. - **每集对每集数据集的文件:**对于每集的数据集,每集的一个HDF5文件比平行处理和部分重新收集更简单.对于较大的数据集,考虑每文件包装50-100集,以减少文件系统的总费用.
HDF5优势与缺点
- 已成熟的库支持 (h5py, HDFView, Julia, C++)
- 任何框架的有效随机访问
- 灵活的方案
自由添加自定义传感器类型 - 无损存储保持了确切的像素值
- 根据ACT,ALOHA和传播政策的原始
- 通过HDFViewGUI可由人检查
- 没有内置的版本或来源追踪
- 无法在云中流 (必须下载完整文件)
- 没有视频压缩的大型文件大小
- 实验室之间的方案不一致
- 没有标准化的共享平台
- 同时的写作需要仔细锁定
体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体型体
RLDS (Reinforcement Learning Datasets) 是Open X-Embodiment数据集使用的格式.它是最大的机器人操纵数据集,在22种机器人类型和527K独特轨迹中进行了2.2M+集.它将数据作为通过TensorFlow数据集 (TFDS) 处理的TFRecord文件串行.
农业发展计划
每个RLDS数据集由一个TensorFlow数据集构造器定义,该数据集规格指定功能方案.
# Standard RLDS step structure
step = {
"observation": {
"image": tf.uint8, # shape: [H, W, C]
"state": tf.float32, # shape: [D] (joint positions + gripper)
"wrist_image": tf.uint8, # shape: [H, W, C] (optional)
},
"action": tf.float32, # shape: [D]
"reward": tf.float32, # scalar
"discount": tf.float32, # scalar (typically 1.0)
"is_terminal": tf.bool, # True on terminal state
"is_first": tf.bool, # True on first step
"is_last": tf.bool, # True on last step
"language_instruction": tf.string, # natural language task description
}
输入 RLDS 数据
import tensorflow_datasets as tfds
# Load an Open X-Embodiment dataset
dataset = tfds.load("berkeley_autolab_ur5", split="train")
# Iterate over episodes
for episode in dataset.take(5):
steps = episode["steps"]
for step in steps:
image = step["observation"]["image"].numpy() # [H, W, 3]
state = step["observation"]["state"].numpy() # [D]
action = step["action"].numpy() # [D]
instruction = step["language_instruction"].numpy().decode()
print(f"Instruction: {instruction}")
print(f"State shape: {state.shape}, Action shape: {action.shape}")
break # just first step
们的优势与缺点
- 标准化方案可实现跨数据集培训
- 通过 tf.data管道进行高效流媒体
- 云原生 (从GCS/S3无需下载的流媒体)
- 已提供50多个数据集,可用兼容格式
- 基于Octo,RT-2和OXE数据组合
- 语言教学内置字段
子流的依赖性 (PyTorch团队的重量) - 仅有序访问 (没有有效的随机框架)
- 强硬方案
定制传感器需要数据集构造器 - 编写数据集构建器需要2~4小时
- 检查需要TF工具
- 对于调试功能,比HDF5更不直观
们的脸
勒罗бот由 Hugging Face开发,用于表格数据 (联合位置,行动,元数据) 和 MP4 视频文件用于摄像头观测. 它是为开源研究工作流设计的:在本地收集,推到 Hugging Face Hub,与勒罗бот图书馆进行训练,与社区分享结果.
雷罗特数据集结构
在"
my_dataset/
data/
train-00000-of-00001.parquet # tabular data (all episodes)
videos/
observation.images.cam_high/
episode_000000.mp4 # overhead camera video
episode_000001.mp4
observation.images.cam_wrist/
episode_000000.mp4 # wrist camera video
episode_000001.mp4
meta/
info.json # dataset metadata, features schema
episodes.jsonl # per-episode metadata
stats.json # per-feature mean/std/min/max
载入LeRobot数据
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
# Load a dataset from Hugging Face Hub
dataset = LeRobotDataset("lerobot/aloha_sim_transfer_cube_human")
# Access a single frame (returns a dict of tensors)
frame = dataset[0]
print(f"State: {frame['observation.state'].shape}") # [D]
print(f"Action: {frame['action'].shape}") # [D]
print(f"Image: {frame['observation.images.cam_high'].shape}") # [C, H, W]
# Get episode-level info
print(f"Number of episodes: {dataset.num_episodes}")
print(f"Number of frames: {dataset.num_frames}")
print(f"FPS: {dataset.fps}")
莱罗伯特的优势与缺点
- 单命令上传到拥抱面孔中心
- 在 hf.co/datasets/内置的网络可视化
- 紧
存储 (MP4视频比原料小5-10倍) - 300多个公共数据集,增长迅速
- 支持本土ACT和传播政策培训
- 统计数据 (平均/日) 自动计算
- MP4压缩是损失的
不是来源的真相质量 - 视频解码在训练期间增加延迟
- 适合变长节目的场景不理想
- 方案变更需要全数据集重建
- 新的格式,工具的发展
- 没有无码视频的随机框架访问
格式比较表
| Feature | HDF5 | RLDS / TFRecord | LeRobot / Parquet |
|---|---|---|---|
| Native frameworks | ACT, Diffusion Policy, custom | Octo, RT-2, OXE data mix | LeRobot, ACT (via lib), DP (via lib) |
| Storage size (500 eps, 3 cams) | 15-30 GB (compressed) | 20-40 GB | 3-8 GB (MP4) |
| Image fidelity | Lossless (raw uint8) | Lossless (raw uint8) | Lossy (MP4 H.264/H.265) |
| Random frame access | Efficient (chunked) | Inefficient (sequential) | Requires video decode |
| Cloud streaming | No (download required) | Yes (tf.data from GCS/S3) | Yes (HF Hub streaming) |
| Schema flexibility | High (any structure) | Low (fixed DatasetBuilder) | Medium (Parquet columns) |
| Sharing platform | None (manual hosting) | TFDS catalog | Hugging Face Hub |
| Community datasets | Many (no central catalog) | 50+ (Open X-Embodiment) | 300+ (Hugging Face Hub) |
| Python tooling | h5py (mature, lightweight) | tensorflow-datasets (heavy) | lerobot, datasets (growing) |
| Recommended for | Primary storage, ACT/DP training | Cross-embodiment, Octo training | Sharing, community, quick start |
转换格式
您最终需要多种格式的数据. 以下是转换的实际指南,
转载到雷罗特
莱罗波特库为ALOHA式HDF5数据集提供本地转换:
# Convert ALOHA HDF5 to LeRobot format and push to Hub
python -m lerobot.scripts.push_dataset_to_hub \
--raw-dir /path/to/hdf5/episodes \
--raw-format aloha_hdf5 \
--repo-id your-org/dataset-name \
--push-to-hub 1
对于自定义的 HDF5 方案 (而不是 ALOHA),您需要编写一个小的适配器函数,将您的关键名称映射到 LeRobot 的预期方案中.这通常需要30-60分钟.
转移到RLDS
转换到RLDS需要编写一个定制的TensorFlow数据集构造器.这是最耗费劳动力的转换 (2-4小时用于新方案),但每一个数据集格式的一次性成本:
# Skeleton RLDS DatasetBuilder (simplified)
import tensorflow_datasets as tfds
class MyRobotDataset(tfds.core.GeneratorBasedBuilder):
VERSION = tfds.core.Version("1.0.0")
def _info(self):
return tfds.core.DatasetInfo(
builder=self,
features=tfds.features.FeaturesDict({
"steps": tfds.features.Dataset({
"observation": tfds.features.FeaturesDict({
"image": tfds.features.Image(shape=(480, 640, 3)),
"state": tfds.features.Tensor(shape=(14,), dtype=tf.float32),
}),
"action": tfds.features.Tensor(shape=(14,), dtype=tf.float32),
"is_terminal": tf.bool,
"is_first": tf.bool,
"is_last": tf.bool,
"language_instruction": tfds.features.Text(),
}),
}),
)
def _generate_examples(self, path):
# Read from your HDF5 files and yield episodes
for episode_path in sorted(path.glob("*.hdf5")):
with h5py.File(episode_path, "r") as f:
# Map HDF5 fields to RLDS schema
yield episode_id, {"steps": steps_list}
转移到雷罗波特
雷罗бот为RLDS数据集提供内置转换器,包括所有开放X-Embodiment数据集:
# Convert any RLDS dataset to LeRobot format
python -m lerobot.scripts.push_dataset_to_hub \
--raw-dir /path/to/rlds/dataset \
--raw-format rlds \
--repo-id your-org/converted-dataset \
--push-to-hub 1
雷罗特到HDF5
没有官方指导工具,但可以直接写 (30-60分钟):
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
import h5py
import numpy as np
dataset = LeRobotDataset("your-org/dataset-name")
for ep_idx in range(dataset.num_episodes):
ep_frames = [dataset[i] for i in range(len(dataset))
if dataset[i]["episode_index"] == ep_idx]
with h5py.File(f"episode_{ep_idx:05d}.hdf5", "w") as f:
qpos = np.stack([fr["observation.state"].numpy() for fr in ep_frames])
action = np.stack([fr["action"].numpy() for fr in ep_frames])
f.create_dataset("observations/qpos", data=qpos, chunks=(1, qpos.shape[1]))
f.create_dataset("action", data=action, chunks=(1, action.shape[1]))
# Decode and store video frames as image arrays
# ... (video decode step adds complexity)
**重要警告:**将LeRobot转换为 HDF5无法恢复原始像素级忠诚度,因为LeRobot将图像存储为 MP4 视频损失.转换的 HDF5 将包含解码的 MP4 框架,而不是原始原始原始图像.
转换总结表
| From → To | Tool | Effort | Notes |
|---|---|---|---|
| HDF5 → LeRobot | lerobot.scripts.push_dataset_to_hub | 30 min | Native ALOHA support; custom schemas need adapter |
| HDF5 → RLDS | Custom DatasetBuilder | 2-4 hours | One-time per schema; requires TF knowledge |
| RLDS → LeRobot | lerobot.scripts.push_dataset_to_hub --raw-format rlds | 15 min | Works for all OXE datasets |
| LeRobot → HDF5 | Custom script | 30-60 min | Lossy: MP4 frames, not original raw images |
| Any → Any | RCSV Platform | 5 min | Upload once, export to any format via UI |
如何提供RCSV数据
当你参与RCSV进行数据收集活动时,
收集格式
我们总是以 HDF5 收集真理的来源.原始传感器数据无损地存储,以每个框架的时间标签,完整的元数据和碎片数据集进行高效访问.
交付格式
您在项目简报中指定您的目标格式.
- HDF5: 直接输送真相源文件.包括方案文档和Python示例脚本用于加载.
- RLDS / TFRecord: 用一个与您的方案匹配的自定义数据集构造器转换.包含数据集构造器源代码,以便您可以自行重新执行转换.
- LeRobot / Parquet: 转移到您的组织下一个私人 Hugging Face Hub 存储库. 包括数据集卡,包含完整的元数据,统计数据和可视化.
- ** 定制格式:** ROS包,CSV,JSON线条或专有方案.我们写出口适配器并将其纳入交付中.
包含的内容
每个数据集交付包括:
- 要求的格式中的数据集文件
- 一个数据表 (JSON) 列出所有集中的元数据,质量分数和统计数据
- 描述每个字段,数据类型和单位的方案文档
- 编写一个节目,打印形状和范围的 Python 例子脚本
- 培训期间正常化的性能统计 (平均,学分,min,max)
- 总结整个数据集的质量指标的QA报告
国际贸易委员会 (RCSV) 平台出口
如果您使用[RCSV无畏平台]
常见的问题
如果我刚刚开始,我应该使用哪种格式?
开始使用 HDF5. 它具有最简单的工具 (仅仅是 h5py),最灵活的方案,并且是最受欢迎的培训框架 (ACT,扩散政策) 的本土.您总是可以稍后转换为LeRobot或RLDS.如果你想立即在 Hugging Face Hub上共享你的数据集,请从开始使用LeRobot
莱罗伯特的MP4压缩是训练问题吗?
在大多数操作任务中,没有.在合理的质量设置 (CRF 20-23) 上,H.264压缩的视觉器件低于典型的摄像头传感器的噪音水平.然而,在像素级准确度重要的工作中,使用无损的HDF5作为训练来源. 雷罗特团队正在探索未来版本的无损视频编程器 (FFV1).
我可以混合不同格式的数据集?
训练前最实用的方法是将所有内容转换为单个格式.如果你正在训练与Octo或做跨体体体实验,将所有内容转换为RLDS.如果你正在训练与LeRobot图书馆,将所有内容转换为LeRobot格式. RCSV 平台可以将混合格式上传正常化和出口到统一的数据集中.
我如何控制机器人数据集?
在Hugging Face Hub上的LeRobot数据集中,版本编程是通过git-lfs内置的.对于 HDF5,在 HDF5 文件旁边使用数据表文件 (JSON),记录了方案_版本,创建日期,集集列表和统计.当您改变传感器配置时,按计划版本进行弹
如何使用ROS包格式?
罗斯袋 (ROSbag2在ROS2) 对于收集数据记录是非常好的,因为它以原生方式捕捉所有ROS主题,并以时间
让RCSV处理数据集格式
您将机器人数据上传到RCSV平台,可进行可视化,质量评估,并单击将其导出到 HDF5,LeRobot Parquet或RLDS格式.







