Xiaomi-Robotics-U0 走统一具身合成,先分清它接管哪一段数据流

文章导读
看到“统一具身合成模型”,先别把它当成能替掉整条具身数据管线的黑盒。通常这类方案接在“标注完成后的样本”与“训练可用样本”之间,负责合成、扩增和一部分格式对齐;采集设备、清洗规则、标注验收标准、训练侧配比仍归团队自己。接入前先把现有管线拆成五段,标清每段交给下一段的产物,再判断自己该从哪一段接进去,排期才不会被“统一”两个字带偏。
📋 目录
  1. 一 把手上的具身数据管线画成五段并标出交接产物
  2. 二 在自有数据目录里统计模态与标注字段覆盖率
  3. 三 写一个最小配置把单条样本串过全链路
  4. 四 把合成输出与原始采集做逐帧比对
  5. 五 列一份本团队暂不接入的部分与原因
A A

看到“统一具身合成模型”,先别把它当成能替掉整条具身数据管线的黑盒。通常这类方案接在“标注完成后的样本”与“训练可用样本”之间,负责合成、扩增和一部分格式对齐;采集设备、清洗规则、标注验收标准、训练侧配比仍归团队自己。接入前先把现有管线拆成五段,标清每段交给下一段的产物,再判断自己该从哪一段接进去,排期才不会被“统一”两个字带偏。

判断方向:Xiaomi-Robotics-U0 这类统一具身合成方案,通常落在“标注产物 → 训练样本”之间,替掉自建合成脚本和部分格式对齐,不替采集硬件、清洗规则、标注抽检和训练配方。适用场景是已有稳定标注产物、想扩样本多样性的团队;动作与画面强耦合的任务,要先用单条样本跑通并做逐帧比对,再决定放量。接口字段、支持的模态需以本地配置和运行日志确认,不要按宣传语直接排期。

把手上的具身数据管线画成五段并标出交接产物

先把“合成”从笼统环节里拆出来。下面五段不是标准答案,是让团队对照自己目录结构填写的骨架。填的时候重点不是分段名字,而是每段交给下一段的那个文件或目录——交接产物定义不清,接入时最容易出现“两边都以为对方做了”的空档。

段输入输出(交接产物)负责人已知最容易断的地方
采集机器人本体、相机、遥操作或示教设备按 episode 落盘的原始流:图像序列、关节状态、动作、时间戳数据采集/硬件多路时间戳不同源,帧与动作对不齐;掉帧没有记录
清洗原始 episode筛选后的 episode 清单和剔除原因表数据工程规则散在脚本里,未版本化;剔除原因没留档,回溯困难
标注清洗后 episode带任务描述、语言指令、分段或关键帧的标注文件标注/算法字段命名不统一;标注与视频版本对不上
合成标注文件 + 原始流合成样本及其索引、与源样本的关联关系算法合成后动作与画面关系漂移,且没有逐帧核对
训练原始样本 + 合成样本训练配置、数据配比、可复现的实验记录训练/平台合成样本占比无记录,训练结果无法归因

填完这张表,多数团队会发现 Xiaomi-Robotics-U0 要接的是第四段,同时要求第三段的产物格式与它对齐。需要结合自己的标注字段确认,不要默认它读得懂现有标注文件。

在自有数据目录里统计模态与标注字段覆盖率

先用只读统计判断现有数据够不够支撑合成,比直接跑模型更省时间。字段清单按下面几类列,具体键名以自家文件为准:图像或视频路径、相机内外参与视角名、关节状态、动作序列、时间戳、任务描述或语言指令、episode 标识。只读脚本只遍历和计数,不修改原文件。

Xiaomi-Robotics-U0 走统一具身合成,先分清它接管哪一段数据流
# 放在数据根目录执行,只读
python3 - <<'PY'
import json, os, collections
root = "."  # 替换为数据根目录
fields = ["<image_key>", "<state_key>", "<action_key>", "<ts_key>", "<instruction_key>"]
stat = collections.Counter(); total = 0
for dirpath, _, files in os.walk(root):
    for f in files:
        if not f.endswith((".json", ".jsonl")):
            continue
        p = os.path.join(dirpath, f)
        try:
            with open(p, "r", encoding="utf-8") as fh:
                obj = json.load(fh)
        except Exception as e:
            stat["parse_error"] += 1
            continue
        total += 1
        for k in fields:
            if k in obj:
                stat[k] += 1
print("samples", total)
for k in fields:
    print(k, stat[k])
print("parse_error", stat["parse_error"])
PY

结果怎么读:先看样本总数和解析失败数,解析失败多说明文件格式不统一,合成步骤大概率会在读入阶段报错;再看动作字段与图像字段的覆盖数是否接近,差得多说明部分样本只有画面没有动作,这类样本对动作合成价值有限;最后看语言指令字段,覆盖率低就先补标注,不要指望合成模型补语义。占位键名需要替换成自家真实键名后再跑。

写一个最小配置把单条样本串过全链路

不要等批量任务跑起来才发现接口不通。挑一条字段最全、时长最短的 episode,用一份最小配置从读入走到输出,验证各段的输入输出能对上。下面的字段名是通用骨架,标了占位的地方要按实际接口填写,不要照抄。

# minimal_pipeline.yaml —— 仅用于单条样本连通性验证
input:
  episode_dir: "<单条episode目录>"
  annotation: "<标注文件路径>"
  modality: ["image", "state", "action"]
preprocess:
  frame_key: "<图像字段名>"
  action_key: "<动作字段名>"
  timestamp_key: "<时间戳字段名>"
synthesis:
  provider: "xiaomi-robotics-u0"   # 以实际接入方式为准
  output_dir: "./out_single"
  max_samples: 1
train:
  dry_run: true
  data_root: "./out_single"

运行命令建议先在 dry-run 下走:python run_pipeline.py `--config` minimal_pipeline.yaml `--dry-run`。成功判据不是“没报错”,而是同时满足:输出目录里有 1 条合成样本;样本索引里能追到源 episode 路径;时间戳字段与源样本同一量纲;dry-run 的训练侧能读到这条样本并打印出字段名。任一条不满足,先改配置或改对齐逻辑,不要进入批量。

把合成输出与原始采集做逐帧比对

合成最容易出问题的地方是动作与画面关系被拉偏:画面换了,动作序列却还是原来的。逐帧比对不用追求精确指标,先做到能把异常样本挑出来人工看。下面脚本按帧对齐后计算差值,容差按任务先给保守值,跑完先只记录不拦截。

Xiaomi-Robotics-U0 走统一具身合成,先分清它接管哪一段数据流
python3 - <<'PY'
import json, os
# 容差先设保守值,跑一批后按异常分布调整
TOL_PIXEL = 0.08      # 归一化像素差参考值
TOL_ACTION = 0.05     # 动作向量差参考值
rec_path = "./out_single/compare_anomaly.jsonl"
for i, (src, syn) in enumerate(pairs):  # pairs 为逐帧源/合成配对
    d_pix = frame_diff(src["image"], syn["image"])
    d_act = action_diff(src["action"], syn["action"])
    if d_pix > TOL_PIXEL or d_act > TOL_ACTION:
        rec = {"episode": src["episode_id"], "frame": i,
               "pixel_diff": round(d_pix, 4), "action_diff": round(d_act, 4),
               "reason": "pixel" if d_pix > TOL_PIXEL else "action"}
        with open(rec_path, "a", encoding="utf-8") as fh:
            fh.write(json.dumps(rec, ensure_ascii=False) + "\n")
PY

异常记录用 JSONL,一条一行,字段至少包含源 episode、帧号、两类差值、判定原因,方便后续按 episode 聚合。判断边界:如果异常集中在动作变化剧烈的片段,先怀疑动作对齐或帧率换算,而不是直接判定合成质量差;如果异常随机分散,再考虑合成参数。容差没有通用值,需结合任务帧率和动作幅度确认。

列一份本团队暂不接入的部分与原因

划边界比列接入项更重要。统一合成模型通常不负责采集硬件同步、清洗规则制定、标注质量抽检、训练超参搜索和真机安全限幅,这些环节一旦被默认为“模型会管”,出问题时很难定位。下面模板按条填写,原因写具体现象,后续补做方式写清由谁在什么阶段补。

暂不接入项原因后续补做方式
多路传感器硬件时间同步属于采集侧问题,合成阶段无法还原真实时序采集端加统一时钟源,落盘时记录偏移量
清洗规则与剔除原因表规则依赖具体任务和现场,外部方案无法替团队定标准规则脚本入库并版本化,剔除原因写入清单
标注质量抽检合成会放大标注错误,抽检必须在本团队完成按 episode 抽样人工复核,抽检记录与标注文件绑定
训练数据配比与超参合成样本占比直接影响结果归因,不能交给外部默认值训练配置里显式记录原始与合成样本比例
真机安全限幅与急停策略属于部署侧约束,合成样本不承担安全责任部署前单独做限幅校验,不依赖合成输出

这张表填完后,再回头补第一张五段链路表。两处对不上,说明团队对“谁负责哪段产物”还没统一,先对齐再谈接入。