機器人回合標註
在同一條時間軸上,用 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 獨特的貢獻在於:它是一個支援多標註者、以網頁方式部署、並帶有一致性統計的回合標註器。