机器人回合标注
在同一条时间轴上,用 N 路同步视频流与 M 条时序数据轨道来标注机器人演示。支持阶段切分、结果判定、稠密奖励,以及 LeRobot、RLDS 与 HDF5 导入。
一次机器人演示,是若干路同步的相机视频流加上若干条数值时序,全部按帧索引;而关于它值得问的每一个问题都与时间有关。 抓取何时开始、何时失败、每一时刻进展如何。因此界面就是一条时间轴:视频流在上,机械臂自身的信号作为轨道在下,所有标注图层共用同一条时间轴。
annotation_schemes:
- annotation_type: episode_annotation
name: episode_review
description: "Mark the phases, judge the outcome, and draw the progress."
source_field: episode
layers: [phases, outcome, reward]
phases:
- {name: reach, color: "#4ECDC4", key_value: "1"}
- {name: grasp, color: "#FFD93D", key_value: "2"}
- {name: transport, color: "#6C8AE4", key_value: "3"}
outcomes: [success, partial, failure]
failure_causes: [missed grasp, object slipped, collision]
reward_range: [0.0, 1.0]
series_shown: [gripper, wrist_force]可运行示例:examples/embodied/lerobot-episode/。
各图层回答不同的问题
| 图层 | 问题 |
|---|---|
phases | 机器人在做什么,何时做的? |
outcome | 成功了吗?若没有,原因是什么? |
reward | 每一时刻距离完成还有多远? |
它们消耗的标注时间差别极大。阶段标注是每个回合几秒;一条稠密的奖励曲线则是几分钟。多数项目只启用其中一部分,而不是三者全开。
三种结果,而非两种
success、partial、failure。在真实机器人数据中,"部分成功"是出现频率最高的结果,把它强行压成二元,恰恰摧毁了这份数据集之所以值得标注的那个信号。
指令重标注会一并采集:一个在原定任务上失败的回合,往往是另一项任务的成功演示,而说清楚它实际展示了什么,就把一段本要丢弃的录像变成了可用的数据。
要看轨道,而不只是看视频
轨道降采样是保留极值的,因此一次只持续一帧的力峰值不会在被绘制到 300 像素宽的轨道时被平均掉。
这不是显示上的小讲究。一次失败的抓取,通常在夹爪与腕部力的曲线上会比在画面上早若干帧显现,这正是这些轨道摆在视频旁边、而不是藏在某个标签页后面的原因。
导入与导出
通过 pyarrow 导入 LeRobot v2,通过 h5py 导入 HDF5(RoboMimic 与 ALOHA),通过 tensorflow_datasets 导入 RLDS/TFDS,并支持 ROS bag。导出 LeRobot v2 以及一份逐帧的 JSONL 附属文件,因此一份只读的公开数据集无需被改写就能携带你的标注。
一致性
三种度量,因为这些图层是三类不同的答案:
- 阶段边界——时间 IoU
- 结果标签——Krippendorff's α
- 奖励曲线——ICC 加 Pearson
每一项都会同时给出覆盖率,因为在时间轴 5% 的范围上算出的相关系数,对其余 95% 什么也没说。
Potato 的位置
ATLAS(维也纳工业大学)是一款专注于长时程动作切分的桌面工具,原生支持 ROS bag 与 RLDS,就单标注者的边界精度而言,它是专门为此打造的。它已发表的结论——在视频旁并列显示本体感知时序,可降低边界误差,优于纯视觉工具——正是 Potato 之所以渲染这些轨道的原因。Rerun 与 Foxglove 则是最好的机器人可视化工具。
Potato 独特的贡献在于:它是一个支持多标注者、以网页方式部署、并带有一致性统计的回合标注器。