尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Rerun 内置 LeRobot 数据集导入器:零代码可视化多模态机器人数据

Rerun 内置 LeRobot 数据集导入器:零代码可视化多模态机器人数据 Rerun 内置 LeRobot 数据集导入器零代码可视化多模态机器人数据【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun导读LeRobot 是 Hugging Face 推出的开源机器人数据格式广泛用于具身智能与多模态机器人数据集如 SmolVLA 所用的数据集。Rerun 在re_importer中内置了 LeRobot 数据集导入器用户只需把 Viewer 指向一个 LeRobot 数据集目录即可像打开普通录制文件一样浏览其中的多路相机图像、深度图、视频流、标量状态与语言标注。本文以 examples/python/lerobot_loader/README.md 为主体结合仓库内 re_lerobot 与 re_importer 的源码实现带你从下载一个数据集、一行命令打开到理解底层加载链路与格式支持边界掌握在 Rerun 中使用 LeRobot 数据的完整方法。快速上手把 LeRobot 数据集目录当作一个录制文件Rerun 对 LeRobot 数据集的加载体验与其他录制格式.rrd、.mcap对齐你不需要写任何 Python 或 Rust 代码Viewer 会识别目录结构并自动切换导入器。获取一个示例数据集README 中给出的示例来自 SmolVLA 博客中使用的数据集satvikahuja/mixer_on_off_new_1托管在 Hugging Face Hub 上。由于数据集文件由 Git LFS 管理需要先确保 LFS 可用git lfs install # If not already installed git clone https://huggingface.co/datasets/satvikahuja/mixer_on_off_new_1说明仓库源码 importer_lerobot.rs 的文档注释中还提到了另一个常用示例数据集lerobot/pusht_image同样可以直接用于体验本功能。两种打开方式方式一在 Rerun Viewer 中点击打开文件选择刚才克隆下来的目录即可加载。方式二直接从终端把目录路径作为参数传给rerun命令rerun mixer_on_off_new_1命令行参数的形式与加载其他录制文件完全一致区别仅在于传入的是一个目录而不是文件。这正是 README 中强调的像加载一个 rerun 文件一样的体验。SDK 能力对齐目录即录制README 的 SDK support 一节指出由于该导入器是内置的其他 SDK 功能如播放、查询、导出、时间轴导航等对 LeRobot 数据集同样生效只是把文件路径换成了目录路径。从实现看导入器会把每个 episode 包装为一个独立的 recordingstore因此你可以在 Viewer 的录制切换器中逐个回放 episode。底层机制导入器如何识别一个 LeRobot 数据集目录级路由DirectoryImporter 的委托逻辑Rerun 的目录导入由 DirectoryImporter 负责。它先判断路径是否为目录然后检查是否为 LeRobot 数据集如果是就返回Incompatible并交由专门的LeRobotDatasetImporter处理从而避免把 LeRobot 目录当作普通文件目录逐个递归导入// LeRobot datasets are loaded by LeRobotDatasetImporter. #[cfg(feature lerobot)] if crate::is_lerobot_dataset(dirpath) { return Err(crate::ImporterError::Incompatible(dirpath.clone())); }从 lib.rs 可以看出LeRobotDatasetImporter与RrdImporter、DirectoryImporter、McapImporter、ParquetImporter等并列注册在内置导入器列表中BUILTIN_IMPORTERS且仅在启用lerobotfeature 且非 wasm 目标时编译。版本识别v1 / v2 / v3lib.rs 中的LeRobotDatasetVersion::find_version负责判定数据集格式版本规则非常直观基于目录结构而非文件内容版本判定条件说明v1存在非空的meta_data/与data/子目录旧格式元数据目录名为meta_data导入器已明确不支持v2存在非空的meta/与data/子目录元数据目录为metav3在 v2 基础上额外要求meta/episodes/目录存在每集元数据存放在meta/episodes/下is_lerobot_dataset只要命中上述任一版本即返回 true。当find_version识别到 v1 时importer_lerobot.rs 会直接打印LeRobot v1.x dataset format is unsupported.并跳过加载v2/v3 才真正进入load_dataset流程。支持的目录结构与元数据格式v2 数据集布局datasetv2.rs 中给出了标准的 v2 目录结构. ├── README.md ├── data │ └── chunk-000 │ ├── episode_000000.parquet │ ├── episode_000001.parquet │ ├── … ├── meta │ ├── episodes.jsonl │ ├── info.json │ ├── stats.json │ └── tasks.jsonl └── videos └── chunk-000 └── observation.image ├── episode_000000.mp4 ├── episode_000001.mp4 ├── …各目录/文件职责data/以 Parquet 格式存储每集数据按 chunk 分目录meta/info.json数据集全局元数据机器人类型、总集数、总帧数、总任务数、总视频数、每 chunk 集数、fps、feature 定义、data_path/video_path路径模板等meta/episodes.jsonl逐行存储每集元数据episode_index、关联任务列表、帧数meta/tasks.jsonl任务定义meta/stats.jsonfeature 汇总统计videos/可选目录按与data/相同的 chunk 组织存放视频观察数据。路径模板中的{episode_chunk:03d}与{episode_index:06d}会被替换为实际数值用于定位episode_000000.parquet或episode_000000.mp4这类文件。v3 数据集布局datasetv3.rs 描述了 v3 的结构差异——每集元数据改为 Parquet 文件、任务与子任务也以 Parquet 存储. ├── README.md ├── data/ │ └── chunk-000/ │ ├── episode_000000.parquet │ ├── episode_000001.parquet │ └── … ├── meta/ │ ├── episodes/ │ │ └── chunk-000/ │ │ ├── file-000.parquet │ │ ├── file-001.parquet │ │ └── … │ ├── tasks.parquet │ ├── stats.json │ └── info.json └── videos/ └── chunk-000/ └── observation.image/ ├── episode_000000.mp4 ├── episode_000001.mp4 └── …v3 的关键差异meta/episodes/中的每集元数据文件同时记录了该集主数据文件的位置data/chunk_index、data/file_index以及每个视频/图像 feature 各自独立的文件位置列名形如videos/{feature_name}/chunk_index、videos/{feature_name}/file_index以及from_timestamp/to_timestamp这意味着多个 episode 可以高效共享同一个视频文件任务定义从 JSONL 换成tasks.parquet任务名列兼容task与旧版__index_level_0__两种命名见TASK_COLUMN_NAMES可选的subtasks.parquet用于子任务subtask标注存在时才加载。数据模型Feature、DType 与时间线Feature 与 DTypemeta/info.json中的features映射定义了每个数据通道的类型与形状。在 lib.rs 中Feature由三部分组成dtype数据类型支持Video、Image、Bool、Float32、Float64、Int16、Int64、String、Languageshape数据维度例如[3, 224, 224]表示 3 通道RGB、224×224 的图像names可选的维度名元数据支持多种 JSON 表示见下。channel_dim()方法用于推断通道数优先查找名为channels的维度找不到则取 shape 的最后一维。加载时按通道数分流1 通道 → 深度图DepthImage3 通道 → 普通图像EncodedImage其他通道数会被warn_once告警并跳过。names的四种合法 JSON 形态见 lib.rs 的NamesVisitor及其单元测试img_state_delta // 单字符串 [x, y, z] // 扁平字符串数组 [[kLeftShoulderPitch, kLeftShoulderRoll]] // 嵌套字符串数组 {motors: [motor_0, motor_1]} // 单键对象值可为数组或 null如果names存在导入器会为标量 feature 额外生成一个静态名称 chunkSeriesLines名称方便 Viewer 中的曲线图直接显示各关节/轴的名字。时间线推导common.rs 中的derive_timeline决定每个 episode 使用哪条时间线若数据中存在frame_index列 → 使用序列时间线frame_index否则若存在timestamp列 → 使用持续时间时间线timestamp秒转换为纳秒两者皆无则报错。与此同时LEROBOT_DATASET_IGNORED_COLUMNS定义了不会被可视化的元数据列episode_index、index、frame_index、timestamp——它们只服务于分集与时间线而不是实体数据。各类 feature 的映射规则结合build_plan分别在 datasetv2.rs 与 datasetv3.rs 中各 dtype 的落地方式如下dtype处理方式Videov2整段视频作为静态AssetVideo资产并尝试读取帧时间戳生成VideoFrameReferencev3按该集的from_timestamp~to_timestamp区间切出VideoStreamcodec samples采样点均匀映射到帧时间线Image按channel_dim分流1 通道 →DepthImage3 通道 →EncodedImage其他通道数告警跳过Float32/Float64标量 feature转为Scalars曲线数据形状为列表/定长列表时先抽取元素再转 f64Int64且键为task_index渲染为task文本实体TextDocument把tasks.jsonl/tasks.parquet中的任务描述按帧写入Int64且键为subtask_index仅 v3渲染为subtask文本实体Languagev3 支持language_persistent持久化、带时间戳、广播到匹配帧与language_events事件、仅落在发射帧按style/role/camera分段生成实体路径tool_calls渲染到…/tool_calls子实体v2 不支持并直接报错有对应回归测试test_v2_language_dtype_is_rejectedInt16/Int64/Bool/String其余场景尚未实现warn_once告警并跳过性能与缓存设计v3 的流式加载优化对于动辄数 GB 的机器人数据导入器在 v3 上做了明显的性能优化见 datasetv3.rsEpisode 数据缓存episode_data_cache打开数据集时按文件→episode分组把同一 Parquet 文件一次性读入并拼接concat_batches再通过build_episode_row_index单遍扫描episode_index列构建行区间索引按需切片出每个 episode 的RecordBatch。多个 episode 共用文件时只读一次磁盘。视频引用计数缓存VideoBlobCache视频 blob 懒加载fs::read一次后缓存为Arc[u8]并用remaining_refs统计每个视频文件仍被多少个 episode 引用某集加载完成或失败后调用release_episode_videos递减引用计数归零即从缓存中淘汰从而在流式加载多集时控制内存峰值。有序遍历episode 元数据用有序 map 存储iter_episode_indices保证按索引升序返回——导入器会为每个 episode 广播一个 recording有序遍历保证 Viewer 中 episode 顺序稳定对应测试episode_indices_iterate_in_ascending_order。加载流程本身是异步的importer_lerobot.rs 会在专用 IO 线程上执行load_and_stream_versioned逐集生成SetStoreInfo与数据 chunk 并通过 crossbeam channel 发回避免阻塞 rayond 线程池。使用约束与注意事项v1 数据集不支持仅 v2含 v2.1与 v3 可加载v1 会被明确拒绝。lerobotfeature 开关LeRobot 导入器以 Cargo feature 形式编译#[cfg(feature lerobot)]且不适用于 wasm 目标桌面版/服务端构建默认启用。图像通道数限制仅 1 通道深度与 3 通道RGB图像会被渲染其余通道数告警跳过。部分 dtype 尚未落地Int16/Int64/Bool/String非task_index/subtask_index场景与 v2 的Language目前不会可视化加载时会有warn_once提示。SDK 语义对齐由于每个 episode 映射为一个独立 recordingSDK 中针对录制文件的查询、导出与回放能力均可直接用于 LeRobot 目录无需额外适配。延伸阅读示例文档examples/python/lerobot_loader/README.md核心 crate 说明crates/data_flow/re_lerobot/README.md数据集解析与 chunk 生成lib.rs、common.rs各版本格式实现datasetv2.rs、datasetv3.rs导入器注册与目录路由importer_lerobot.rs、importer_directory.rs、lib.rs【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表