← 知识库 · 登录

更新于 2026-09-04

真机回流数据标注

真机回流轨迹如何做人标、半自动和全自动标注,以及和 VLA / WAM 训练怎么接。

真机回流数据里,动作、状态、多相机画面已经有了,不要再标一遍。 标注的真正工作是给这些轨迹补上「这段在干什么、成没成、切在哪、对着哪个物体」。业界现在基本按三档做:人标金标、半自动扩量、全自动铺底再抽检。

先定标什么#

按投入产出排优先级。回流一批数据,通常只需要做到 L2;要训 \(\pi_{0.5}\) 式高层策略或 grounding,再加 L3;L4 是可选项。

层级标什么训练里干什么建议方式
L0 质量成功 / 失败、失败类型、idle 段、丢弃原因过滤脏数据,几乎立刻涨成功率规则全自动 + 人抽检
L1 任务句episode 级指令,可加 8–10 条改写VLA 的 task 条件采集时写好;没有就 VLM 生成 + 人审
L2 子任务[start, end] + 原子指令(how, not what)长程任务、分层策略半自动为主
L3 空间中间表示目标物体框、夹爪框、接触帧、放置区\(\pi_{0.5}\) 先预测 bbox 再预测子任务SAM2 半自动
L4 交互 / 认知口头纠正、VQA、memory、plan可打断、可问答的 VLA全自动生成,人只审金标集

Physical Intelligence 在 \(\pi_{0.5}\) 里对长程数据是人手标子任务 + 相关 bbox;Hugging Face 现在把同类东西做成了 LeRobot 标注管线;InternRobotics 的 RoboInter 则是「人切段 + SAM2 跟物体」的半自动套件。

回流数据建议写成两列,和 LeRobot 对齐,后面换模型不用重标:

  • language_persistent:整段都成立的状态(当前子任务、plan、memory)
  • language_events:只落在某一帧上的事件(夹爪闭合、口头纠正、VQA)

一批真机数据的总流程#

原始回流 episode
    │
    ├─ 1. 机器闸门(全自动,不经过人)
    │     同步检查 → 去 idle → 过短 / 过长丢掉
    │     夹爪 / 速度突变 → 候选切点
    │
    ├─ 2. 成功判定(半自动)
    │     规则 / VLM 预打标签 → 人只审不确定的
    │
    ├─ 3. 语言(半自动 / 全自动)
    │     VLM:先描述画面,再切子任务
    │     人改边界和措辞(金标 + 抽检)
    │
    ├─ 4. 空间(半自动,按需)
    │     人点一下目标物体 → SAM2 跟踪整段
    │     接触帧 / 放置区由规则从动作导出
    │
    └─ 5. 金标冻结 + 抽检
          5–10% 人复核,不一致的回写规则 / prompt

不要一上来全员手标每一帧。先标 50–100 条金标,把词表、切分粒度、成功定义钉死,再放大。

L0:质量标注#

回流数据最脏的不是语言,是「人在想下一句、夹爪空合、失败还接着录」。

全自动:机器闸门怎么界定#

阈值跟控制频率挂钩。下面默认 15 Hz(DROID);20 Hz 把「帧数」乘 20/15,50 Hz 乘 50/15。先在 100 条回流上画直方图,再用百分位微调,不要直接抄死数字。

同步检查(整段丢弃或截断)#

查的是「这一帧的图、状态、动作是不是同一时刻」,不是任务成不成。任一条件不满足就打 sync_fail,默认整段丢掉:

检查通过条件(起步值)不通过时
长度一致各相机帧数、stateaction 条数相差 ≤ 1丢弃
时间戳单调t[i+1] - t[i] > 0,无回跳丢弃
帧间隔中位 dt 在标称周期 ±20% 内;单帧 dt > 3 个周期算掉帧掉帧超过 5% 丢弃,否则从掉帧处截断
数值合法无 NaN / Inf;关节、夹爪在限位内丢弃
维数与该本体 schema 一致丢弃
多路时钟腕部 / 第三人称 / 关节状态最大偏移 < 1 个控制周期超过则该相机不用,或整段丢

去 idle(切掉静止,保留有效段)#

定义来自 Physical Intelligence 的 DROID idle filter,不要用「看起来没动」:

  1. 单帧是否 idle。 相邻两步关节速度差的绝对值,所有关节都 < 1e-3,则后一帧为 idle。若有纯夹爪动作,把夹爪开合变化也并进「非 idle」,否则拧瓶盖会被误删。
  2. 连续 idle 段。 连续 idle ≥ 7 帧(约 0.5 s) 整段删掉。短于 7 帧的停顿保留——那是接触、对准,不是人在发呆。7 这个数对应他们 chunk 策略每次真正执行的前 8 步:训练里不能出现「接下来一整块都是零动作」。
  3. 有效段够不够长。 删完 idle 后,剩下的连续运动段必须 ≥ 16 帧(约 1 s),更短的整段丢掉。
  4. 段尾再裁一截。 每个保留段再丢掉最后 10 帧。段尾动作 chunk 里后半截往往已经是停住,不裁的话模型仍会学到「快结束就输出静止」。

一条 episode 删完可能裂成多段:开头对准、中间思考、结尾松手都会被切掉,中间几段运动分别保留。全部被切光 → 整条丢弃。

若不用关节速度、只用末端位姿:把「速度差 < 1e-3 rad/s」换成末端线速度低于任务噪声,例如桌面操作 < 5 mm/s 且角速度很小,连续仍按 0.5 s / 1 s / 一段 chunk 这三档时间来,不要死盯 7/16/10 帧。

过短 / 过长(idle 切完之后再量)#

量的是切完 idle 后剩下的时长,不是原始录像墙钟时间。过短直接丢;过长不要丢,进「待拆分」。

短技能桌面(抓放、插拔)长程(收拾桌面、开关柜)
过短 → 丢弃< 2 s(或不够 1 个 action chunk + 1 帧观测)< 10 s
正常约 3–40 s约 1–8 min
过长 → 待拆分> 90 s> 10–15 min

过短通常是误触开始、对了一下就停、或 idle 切完什么都不剩。过长通常是一次录像里塞了多次尝试、中途聊天、或整段家务还没按失败点切开。

不要用绝对分钟一刀切全库。更稳的做法:

  1. 画出切完 idle 后的时长直方图。
  2. 过短max(2 s, 第 5 百分位),且不得短于 1 个训练 chunk。
  3. 过长取第 95 百分位,或「明显是多任务粘在一起」的拐点。
  4. 过长段按失败点、夹爪开合、或人按的 episode 边界拆开,拆完再走一遍闸门。

半自动:成功 / 失败#

不要只靠「操作员按了成功键」。回流里常见:人按了成功但物体没放到位。

  • 规则:任务结束时目标物体是否进入放置区(若有检测)、夹爪是否按预期开合
  • VLM:抽最后 4–8 帧 + 任务句,问「任务是否完成」
  • 人只看:规则和 VLM 不一致的,以及随机 5%

失败用小词表,不要自由文本:grasp_fail / drop / collision / timeout / wrong_object / human_abort。失败段可以留作负样本或世界模型数据,但默认不要进 VLA 正样本。

L1–L2:语言标注#

这是回流数据最该补的一层。短技能(「抓杯子放到盘子」)有 episode 级 task 就够;长程(收拾桌面、开关柜门多步)必须有子任务时间轴。

人标(金标,不是全量)#

工具:时间轴打点即可。每人看第三人称 + 腕部,在切点打标。约束必须事先写死,否则三个人标出来对不齐:

  • 粒度: 一条子任务对应一次「接触状态变化」。LeRobot 的定义:物体被拿起 / 被放下 / 到达新位置 / 盖子开合 / 容器内容物变化,才开新段。
  • 写法: \(\pi_{0.7}\) / LeRobot 强调 how, not what。写 pick up the blue cup from the left of the sink,不要写 do the next step 或复述整句任务。
  • 覆盖: 每一帧有且仅有一条当前子任务,中间不能有空洞。
  • 最短时长: 建议 ≥ 1.5 秒,避免把接近、对准拆成十几段。
  • 词表: 物体名、方位词、技能动词先冻结一份。同物多名会把策略训散。

人标只覆盖:金标集、难例、以及后面抽检打回的。

半自动(主路径)#

边界尽量用动作信号切,文案用 VLM 写,人只改错的。

切边界(规则,比纯 VLM 稳):

  • 夹爪开 ↔ 合
  • 末端速度由高变低后保持(接触 / 放置)
  • 基座开始 / 停止移动(移动操作)
  • 力 / 电流超过阈值(若有)

仿真或状态可观测的任务,还可以像 LIBERO 那样用「环境状态跳变」切子任务。真机没有物体位姿时,夹爪 + 速度是最稳的先验。

写文案(VLM): 不要让模型对着任务句直接幻想子任务。LeRobot 现在的标准是两步:

  1. Describe: 只叙述选定相机里实际看到的事,禁止猜任务
  2. Segment: 把叙述再喂回去,切成连续原子子任务

可选第三步 seeded-relabel: 边界锁死,只改措辞。生产上建议:金标和难例开,全量先关以省成本。

实现上可以直接用 0:先把回流转成 LeRobot,再跑 plan 模块。它用带时间戳的 contact sheet(默认 2 fps 抽帧拼宫格),比逐帧喂视频便宜得多。

人在半自动里做什么:改切点、改物体名和左右、删「模型编出来但画面没有」的步骤。

全自动#

适合已经有金标、prompt 和词表都冻过的大规模回流。

每条 episode
  → contact sheet(第三人称,时间戳烧在角上)
  → VLM describe → segment
  → 与夹爪 / 速度候选切点做对齐(差 >0.5s 则偏向动作切点)
  → 任务改写 8–10 条(task_aug)
  → 校验:时间戳必须落在真实帧上;子任务铺满全 episode

LeRobot 默认还会生成 planmemoryinterjection + sayvqa。这些对「可打断 VLA」有用,对第一版操作策略不是必须。

全自动的硬限制:VLM 看不见力、容易编物体、长 episode 会窗切后对不齐。必须带校验器,并固定抽检比例(例如每天新回流的 5%)。

L3:空间标注#

\(\pi_{0.5}\) 会在预测子任务前先预测当前画面里的相关 bbox。RoboInter 把这一层做成了完整中间表示。回流数据若要做 grounding / 可纠正策略,再上这一层。

标签全自动半自动人标
目标物体 mask / 框开集检测容易错物体人点 1 下 + SAM2 跟踪整段只修跟丢
夹爪框 / 2D trace有外参就正向投影;没有就检测 + 点跟踪投影失败的再点几乎不需要
接触帧夹爪闭合沿 + 力峰值人确认闭合瞬间金标
放置区子任务结束时物体位置人点放置面少标
抓取 6D接触帧的 EEF 位姿直接当 grasp

RoboInter-Tool 的流程可以直接抄:人按 15 个原语切段(pick / place / push / twist…)→ ChatGPT 给语言草稿 → 人点被操作物体 → SAM2 异步跟踪 → 人回看跟丢段。接触帧、affordance 框、放置提案都可以从这几个稀疏标签后处理推导,不要逐帧手画。见 RoboInter

真机常见坑:相机没标好,3D→2D 投影会漂。腕部相机往往比第三人称好标接触;第三人称更好标「放哪」。两路都要跟的话,以腕部定接触、第三人称定物体身份。

L4:口头纠正与 VQA#

如果采集时操作员戴了麦,或后面有人远程接管:

  • 人标: 把语音转写对齐到时间戳,标成 interjection(否定 / 场景纠正 / 约束 / 偏好)
  • 半自动: ASR → VLM 分类成上面四类 → 人对齐不准的几句
  • 全自动: 没有真实语音时,LeRobot 会合成 interjection。这只能当数据增强,不能当真实人机交互分布

VQA 同理:全自动生成 bbox / count / spatial 问答,用来保 VLM 能力、做可操纵策略;不要替代 L0–L2。

三种模式怎么配#

半自动全自动
何时用冻结规范、难例、抽检主产量规范已稳、每天新回流
质量最高,贵够训 VLA语言能用,切点要靠动作约束
速度约 3–8 分钟 / 条(含子任务)约 30–90 秒人审 / 条接近 0 人时
典型工具时间轴 UI、CVAT、自研播放器SAM2 + 夹爪切点 + VLM 草稿;RoboInter-Tool0
风险标注员不一致人偷懒直接过幻觉物体、切点漂

一套务实配比(几千到几万条回流):

  • 100 条 双人独立人标,算一致率(切点 IoU、物体名、成功判定)
  • 其余全部 半自动:动作切点 + VLM 文案 + SAM2 框(若需要 L3)
  • 每天新增 走全自动,固定 5% 进人审队列
  • 人审打回超过阈值(例如切点改动率 >20%)就停自动、改 prompt / 规则,不要继续脏标

标注规范#

  1. 成功定义可操作:例如「物体静止在目标容器内,夹爪已张开,持续 ≥0.5s」。
  2. 子任务动词封闭:approach / pick / place / open / close / pour / wipe / wait,不够再加,禁止同义堆砌。
  3. 物体用场景里的稳定名字,不用「那个东西」。
  4. 时间戳必须来自 parquet / 原始帧,禁止浮点重算(LeRobot validator 也是这么卡的)。
  5. 多相机:语言可以只 grounded 在一个主相机(第三人称);框要标明 camera 键。
  6. 失败、idle、人伸手入画,单独字段,不要写进子任务句子里。

和训练怎么接#

标完不要另存一套 JSON 就结束,写回轨迹旁边:

  • 过滤:successidle_maskdiscard_reason
  • 语言:task + 每帧当前 subtask(或 language_persistent
  • 空间:bbox / gripper_trace 作为 events 或单独 feature
  • 训练配方:低层策略只吃 task 或当前 subtask;高层再吃 plan;grounding 才吃 bbox

相关笔记#

  • π0.5: a Vision-Language-Action Model with Open-World Generalization
  • RoboInter: Interactive Annotation for Robot Manipulation