好的!现在我明白了。让我对比一下你的数据集格式和标准 LeRobot 格式的区别:

📊 格式对比

你的数据集格式(基于 v2.0)

dataset_merged_2026-03-12_20-31-38/
├── data/
│   └── chunk-000/
│       ├── episode_000000.parquet  ← 每个 episode 一个文件
│       ├── episode_000001.parquet
│       └── ...
├── images/                          ← 存储原始图像(非视频)
│   ├── observation_images_head/
│   │   ├── episode_000000/
│   │   ├── episode_000001/
│   │   └── ...
│   ├── observation_images_left_wrist/
│   ├── observation_images_right_wrist/
│   └── observation_images_chest/
└── meta/
    ├── info.json                   ← 包含 "codebase_version": "v2.0"
    ├── episodes.jsonl              ← 所有 episodes 在一个 JSONL 文件
    ├── tasks.jsonl
    └── skills/

标准 LeRobot v3.0 格式

dataset/
├── data/
│   ├── file-0000.parquet           ← 多个 episodes 打包在一个文件
│   ├── file-0001.parquet
│   └── ...
├── videos/                          ← 存储编码的 MP4 视频
│   ├── front_camera/
│   │   ├── file-0000.mp4           ← 多个 episodes 的视频连接在一起
│   │   ├── file-0001.mp4
│   │   └── ...
│   ├── wrist_camera/
│   └── ...
└── meta/
    ├── info.json                   ← 包含更多元数据(路径模板等)
    ├── episodes/                   ← episodes 元数据存储为 Parquet
    │   ├── chunk-0000.parquet      ← 包含偏移量信息
    │   └── ...
    ├── tasks.jsonl
    └── stats.json                  ← 特征统计(用于归一化)

🔍 主要区别

特性 你的格式 (v2.0) LeRobot v3.0
文件组织 每个 episode 一个文件 多个 episodes 打包在一个文件
图像存储 images/ 文件夹,原始图像 videos/ 文件夹,MP4 编码视频
Episode 元数据 episodes.jsonl (JSONL 格式) meta/episodes/*.parquet (Parquet 分块)
可扩展性 数千 episodes 数百万 episodes
文件系统压力 高(大量小文件) 低(少量大文件)
流式加载 不支持 支持 StreamingLeRobotDataset
偏移量信息 无需(一个文件一个 episode) 必需(记录每个 episode 在文件中的位置)

📝 具体差异

1. Episode 索引方式

你的格式:

  • 通过文件名直接找到 episode: episode_000042.parquet

v3.0 格式:

  • 通过元数据查找: meta/episodes/chunk-0000.parquet 包含:
    {
      "episode_index": 42,
      "data_offset": 15000,     // 在 file-0003.parquet 的第 15000 行
      "video_offset": 450000,   // 在 file-0003.mp4 的第 450000 帧
      "length": 300
    }
    

2. 图像存储

你的格式:

images/observation_images_head/episode_000042/
├── frame_000000.jpg
├── frame_000001.jpg
└── ...
  • 优点:可以直接访问任意帧
  • 缺点:文件数量巨大,I/O 密集

v3.0 格式:

videos/head_camera/file-0003.mp4  # 包含多个 episodes
  • 优点:文件少,压缩率高,流式友好
  • 缺点:需要视频解码器

3. info.json 内容

你的 info.json:

{
  "codebase_version": "v2.0",
  "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4"
}

v3.0 info.json:

{
  "codebase_version": "v3.0",
  "data_path": "data/file-{data_file:04d}.parquet",
  "video_path": "videos/{camera_name}/file-{video_file:04d}.mp4",
  "features": {...},
  "stats": {...}  // 更多统计信息
}

🎯 兼容性分析

✅ 你的格式可以工作,因为:

  1. 结构完整:包含了所有必需的组件(data, images/videos, meta)
  2. LeRobotDatasetManager 兼容:代码可以加载 v2.0 格式
  3. 功能完备:支持训练和数据访问

⚠️ 但存在限制:

  1. 无法流式加载:必须下载整个数据集
  2. 可扩展性差:episode 数量增加时性能下降
  3. 文件系统压力大:数千个小文件影响性能

💡 建议

如果你计划:

  • 继续使用当前格式 - 如果数据集较小(< 1000 episodes)
  • 迁移到 v3.0 - 如果需要大规模数据集或 Hub 流式加载

迁移命令(如果需要):

python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 \
  --local-dir=/home/nvidia/Project/data/dataset_merged_2026-03-12_20-31-38 \
  --output-dir=/path/to/output/v3_dataset

你的数据集目前使用的是 v2.0 格式,完全可以正常使用!只是在大规模场景下,v3.0 会更高效。

Logo

更多推荐