外观
教程huggingface.co6 天前
LeRobotDataset v3:目录结构、meta/info.json、加载与转换实操
> 本文依据以下官方文档整理:huggingface.co/docs/lerobot/lerobot-dataset-v3。命令与版本以文档当前版本为准。
前置条件
- LeRobotDataset v3.0 will be included in lerobot >= 0.4.0
- Until that stable release, you can use the main branch by following the build from source instructions
- 用于录制示例的 SO-101:so101_follower 与 so101_leader
- 用于训练加载示例的 PyTorch 与 torch.utils.data.DataLoader
- 可访问 Hugging Face Hub dataset repo 或 HF Storage Bucket
1. 理解 v3.0 的文件化存储设计
LeRobotDataset v3.0 将存储与用户 API 解耦:底层使用较少的大文件,高层仍提供直观的 episode 级访问。Tabular data 存在 Apache Parquet;Visual data 将相机帧拼接并编码进 MP4;Metadata 用 JSON/Parquet 描述 schema、FPS、统计信息和 episode 分段。
2. 按目录结构定位 meta/info.json 与数据分片
简化目录中,meta/info.json 是 canonical schema,包含 features、shapes/dtypes、FPS、codebase version,以及定位 data/video shards 的 path templates。meta/stats.json 暴露为 dataset.meta.stats;meta/tasks.jsonl 映射自然语言任务与整数 ID;meta/episodes/ 保存每个 episode 的长度、任务和 offsets;data/ 是 Parquet shards,videos/ 是各 camera 的 MP4 shards。
3. 录制 v3.0 数据集并推送到 Hub
文档示例使用 SO-101 录制数据集,并通过 --dataset.repo_id=${HF_USER}/record-test 推送到 Hub。命令中还设置了相机、任务、episode 数、streaming encoding 与 encoder threads。
bash
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube" \
--dataset.streaming_encoding=true \
# --dataset.rgb_encoder.vcodec=auto \
--dataset.encoder_threads=24. 用 LeRobotDataset 加载训练数据
LeRobotDataset 返回 PyTorch tensors 的 Python dictionaries,并能接入 torch.utils.data.DataLoader。示例先从 Hub 加载 yaak-ai/L2D-v3,再按索引随机访问,并用 delta_timestamps 为指定图像 key 取时间窗口。
python
import torch
from lerobot.datasets import LeRobotDataset
repo_id = "yaak-ai/L2D-v3"
## 1) Load from the Hub (cached locally)
dataset = LeRobotDataset(repo_id)
## 2) Random access by index
sample = dataset[100]
print(sample)
## {
## 'observation.state': tensor([...]),
## 'action': tensor([...]),
## 'observation.images.front_left': tensor([C, H, W]),
## 'timestamp': tensor(1.234),
## ...
## }
## 3) Temporal windows via delta_timestamps (seconds relative to t)
delta_timestamps = {
"observation.images.front_left": [-0.2, -0.1, 0.0] # 0.2s and 0.1s before current frame
}
dataset = LeRobotDataset(repo_id, delta_timestamps=delta_timestamps)
## Accessing an index now returns a stack for the specified key(s)
sample = dataset[100]
print(sample["observation.images.front_left"].shape) # [T, C, H, W], where T=3
## 4) Wrap with a DataLoader for training
batch_size = 16
data_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size)
device = "cuda" if torch.cuda.is_available() else "cpu"
for batch in data_loader:
observations = batch["observation.state"].to(device)
actions = batch["action"].to(device)
images = batch["observation.images.front_left"].to(device)
# model.forward(batch)5. 使用 StreamingLeRobotDataset 直接流式读取
StreamingLeRobotDataset 可直接从 Hub 迭代数据,不需要下载本地副本,也不需要把数据加载到内存。HF Storage Bucket 的 hf://buckets/ 数据也可用同样方式读取,只需传入 repo_type="bucket"。
python
from lerobot.datasets import StreamingLeRobotDataset
repo_id = "yaak-ai/L2D-v3"
dataset = StreamingLeRobotDataset(repo_id) # streams directly from the Hubpython
dataset = StreamingLeRobotDataset("my-org/my-bucket", repo_type="bucket")bash
lerobot-train \
--dataset.repo_id=my-org/my-bucket \
--dataset.repo_type=bucket \
--dataset.streaming=true \
...6. 为训练加载添加图像 transforms
Image transforms 只在训练时应用,不在 recording 时应用;录制数据时保存 raw images。加载数据集时可通过 image_transforms 传入默认配置、自定义配置,或直接传入 torchvision.transforms.v2 transform。
python
from lerobot.datasets import LeRobotDataset
from lerobot.transforms import ImageTransforms, ImageTransformsConfig, ImageTransformConfig
## Option 1: Use default transform configuration (disabled by default)
transforms_config = ImageTransformsConfig(
enable=True, # Enable transforms
max_num_transforms=3, # Apply up to 3 transforms per frame
random_order=False, # Apply in standard order
)
transforms = ImageTransforms(transforms_config)
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=transforms
)
## Option 2: Create custom transform configuration
custom_transforms_config = ImageTransformsConfig(
enable=True,
max_num_transforms=2,
random_order=True,
tfs={
"brightness": ImageTransformConfig(
weight=1.0,
type="ColorJitter",
kwargs={"brightness": (0.7, 1.3)} # Adjust brightness range
),
"contrast": ImageTransformConfig(
weight=2.0, # Higher weight = more likely to be selected
type="ColorJitter",
kwargs={"contrast": (0.8, 1.2)}
),
"sharpness": ImageTransformConfig(
weight=0.5, # Lower weight = less likely to be selected
type="SharpnessJitter",
kwargs={"sharpness": (0.3, 2.0)}
),
}
)
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=ImageTransforms(custom_transforms_config)
)
## Option 3: Use pure torchvision transforms
from torchvision.transforms import v2
torchvision_transforms = v2.Compose([
v2.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
v2.GaussianBlur(kernel_size=3, sigma=(0.1, 2.0)),
])
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=torchvision_transforms
)7. 预览 transforms 效果
调参前可用 visualization script 预览增强效果。该命令会保存 example images,展示 each transform 对数据的影响,帮助调整参数。文档建议先保守设置、小范围开始,并确认 transforms 看起来合理。
bash
lerobot-imgtransform-viz \
--repo-id=your-username/your-dataset \
--output-dir=./transform_examples \
--n-examples=58. 将 v2.1 数据集转换为 v3.0
转换器会把 per-episode files 聚合为更大的 shards,并写入 episode offsets/metadata。文档中的转换先安装带 v3 支持的 pre-release build,再对 Hub 上已有 v2.1 数据集运行转换命令。
bash
## Pre-release build with v3 support:
pip install "https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip"
## Convert an existing v2.1 dataset hosted on the Hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 --repo-id=<HF_USER/DATASET_ID>验证是否跑通
加载时可执行示例中的 sample = dataset[100] 并 print(sample);使用 delta_timestamps 后,print(sample["observation.images.front_left"].shape) 应显示 [T, C, H, W],其中 T=3。流式读取时能创建 StreamingLeRobotDataset(repo_id);转换后应完成 parquet/mp4 聚合并更新 meta/episodes/*。
文档里点名的注意事项
- When creating or recording datasets, you must call
dataset.finalize()beforepush_to_hub(). - Without calling
finalize(), parquet files will be incomplete and the dataset won’t load properly. - Dataset v3.0 uses incremental parquet writing with buffered metadata for efficiency;
finalize()flushes buffered episode metadata, closes parquet writers, and ensures the dataset is valid for loading. - Transforms are applied during training time only, not during recording.
- ImageTransformsConfig is disabled by default:
enabledefault isFalse. - Strong augmentations can hurt performance if too aggressive; using too many transforms simultaneously can make training unstable.
相关 SDK 条目
来源
本页事实对应的公开页面,以原文为准。
- huggingface.co/docs/lerobot/lerobot-dataset-v3访问 2026-10-22