【Lerobot】加载本地数据LeRobotDataset数据、读取并解析parquet

官方例子:https://github.com/huggingface/lerobot/blob/main/examples/1_load_lerobot_dataset.py
https://github.com/NVIDIA/Isaac-GR00T/blob/main/getting_started/LeRobot_compatible_data_schema.md

使用SO100机械臂进行数据采集后,得到如下格式:

.
├─meta 
│ ├─episodes.jsonl
│ ├─modality.json # -> GR00T LeRobot specific
│ ├─info.json
│ └─tasks.jsonl
├─videos
│ └─chunk-000
│   └─observation.images.ego_view  # -> ego_view  是自定义摄像头的名字 
│     └─episode_000001.mp4
│     └─episode_000000.mp4
└─data
  └─chunk-000
    ├─episode_000001.parquet
    └─episode_000000.parquet

其中parquet的字段

字段列表: [‘action’, ‘observation.state’, ‘timestamp’, ‘frame_index’, ‘episode_index’, ‘index’, ‘task_index’]

一、读取本地LeRobotDataset

方法1: LeRobotDatasetMetadata读取数据采集总体信息

from pathlib import Path
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset, LeRobotDatasetMetadata
from datasets import load_dataset

dataset_root = Path("/home/zengxy/.cache/huggingface/lerobot/zeng/pen3")

# 1. 先加载本地元数据
meta = LeRobotDatasetMetadata(
    repo_id="zeng/pen3",
    root=dataset_root,
    force_cache_sync=False  # 重要!不要强制同步线上数据
)

# 查看元数据信息
print(meta)

# 2. 读取具体的Parquet文件(以第一个episode为例)
episode_index = 0
parquet_file = meta.get_data_file_path(episode_index)

print("Parquet 文件路径:", parquet_file)

# 使用datasets加载parquet文件,
hf_dataset = load_dataset("parquet", data_files=str(dataset_root / parquet_file), split="train")
#hf_dataset.set_format("torch")

# 检查数据字段
print("字段列表:", hf_dataset.column_names)

# 打印数据示例 , 时刻的参数
print(hf_dataset[0])

# 输出全部数据
for sample in hf_dataset:
    print(sample)

meta返回值

LeRobotDatasetMetadata({
    Repository ID: 'zeng/pen3',
    Total episodes: '10',
    Total frames: '2778',
    Features: '['action', 'observation.state', 'observation.images.laptop', 'timestamp', 'frame_index', 'episode_index', 'index', 'task_index']',
})',

具体某一时刻数值返回值


Parquet 文件路径: data/chunk-000/episode_000000.parquet
字段列表: ['action', 'observation.state', 'timestamp', 'frame_index', 'episode_index', 'index', 'task_index']
{
'action': tensor([ 25.1367, 148.3594, 146.5137,  62.9297, -17.1387,  19.4232]), 
'observation.state': tensor([ 20.5664, 153.3691, 149.8535,  64.0723, -17.4902,  19.5410]), 
'timestamp': tensor(0.), 'frame_index': tensor(0), 'episode_index': tensor(0), 'index': tensor(0), 'task_index': tensor(0)}

方法 2:只读取parquet

from datasets import load_dataset
from pathlib import Path

dataset_root = Path("/home/zengxy/.cache/huggingface/lerobot/zeng/pen3")
parquet_file = dataset_root / "data/chunk-000/episode_000000.parquet"

dataset = load_dataset("parquet", data_files=str(parquet_file), split="train")

# 打印所有字段(keys)
print(dataset.column_names)

# 输出全部数据
for sample in dataset:
    print(sample)

方法3: 使用 pyarrow 库(适合大文件,性能高)

pip install pyarrow

import pyarrow.parquet as pq
from pathlib import Path

parquet_file = Path("/home/zengxy/.cache/huggingface/lerobot/zeng/pen3/data/chunk-000/episode_000000.parquet")

table = pq.read_table(parquet_file)



# 转换成字典列表并输出
data = table.to_pylist()




for row in data:
    print(row)


print(data[0].keys())

### LeRobot 数据集及其代码功能解析 #### 功能概述 LeRobotDataset 的核心目标是提供一种结构化的数据表示方式,用于支持机器人的学习任务。它通过封装观察数据和动作数据来构建训练样本集合,从而帮助模型理解环境生成相应的控制策略[^1]。 该数据集不仅限于单一任务的学习,还特别强调多模态输入的支持以及跨场景的应用能力。例如,在具体任务中可以利用 ALOHA 子数据集完成高精度的双臂协作;而在更广泛的语境下,则可借助 LIBERO 部分提升系统的泛化性能。 #### 实现细节分析 以下是基于 Python 编程语言的一个简化版 `LeRobotDataset` 类定义示例: ```python import numpy as np class LeRobotDataset: def __init__(self, observations=None, actions=None): """ 初始化 LeRobot Dataset 对象 参数: observations (list or array): 观察序列. actions (list or array): 动作序列. """ self.observations = observations if isinstance(observations, list) else [] self.actions = actions if isinstance(actions, list) else [] def add_data(self, observation, action): """向数据集中添加新的观测与对应的动作""" self.observations.append(observation) self.actions.append(action) def get_batch(self, batch_size=32): """ 获取一批次的数据供神经网络训练使用 返回: tuple: 包含两个 NumPy 数组分别代表批量大小内的状态和行为. """ indices = np.random.choice(len(self), size=batch_size, replace=False) obs_batch = [self.observations[i] for i in indices] act_batch = [self.actions[i] for i in indices] return np.array(obs_batch), np.array(act_batch) def __len__(self): return len(self.observations) if __name__ == "__main__": dataset = LeRobotDataset() # 假设我们有如下简单的模拟数据 sample_observations = [[0.1, 0.2], [0.3, 0.4]] sample_actions = ["move_left", "move_right"] for o, a in zip(sample_observations, sample_actions): dataset.add_data(o, a) print(dataset.get_batch(batch_size=2)) ``` 上述代码片段展示了如何创建一个基本版本的 LeRobot 数据集类,演示了它的主要方法——初始化、增加新条目以及提取随机批次等功能。 #### 工作流程描述 当实例化了一个 `LeRobotDataset` 后,可以通过调用其成员函数逐步填充实际采集到的信息(即传感器读数作为 “observation”,执行器指令当作 “action”)。随后这些成对记录会被存储起来等待后续处理阶段到来时被抽取出来形成小型子集以便参与深度强化学习算法中的参数更新过程。 此外值得注意的是,虽然这里展示的例子较为基础,但在真实项目里往往还需要考虑更多因素诸如时间戳同步问题或者异常检测机制等等额外逻辑层面上的设计考量点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾小蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值