“开物元启” 具身大模型平台 技术支持
上一篇讲了数据集格式选型格式对了,数据就能用了吗?
不能。格式只保证机器读得进去,读进去的东西是不是垃圾,格式管不了。
这篇讲交付前的最后一道闸——八个质量维度。这套东西不是我拍脑袋编的,是数据工程领域通用的质量框架,只是具身智能场景下每一维的含义都要重新解释一遍。

一、先讲一个真实的翻车

一个课题组做抓取任务的模仿学习。训练集验证集按 9:1 随机切分,训练完验证集成功率很漂亮,换到真机上,成功率掉到接近随机。

排查了两周,最后发现问题在切分方式上。

他们的数据是 episode 级采集、frame 级切分——一条 30 秒的抓取轨迹有 900 帧,随机切分之后,第 450 帧进了训练集,第 451 帧进了验证集。这两帧相差 33 毫秒,画面上几乎一模一样。

模型不需要学会抓取,只需要记住"见过的画面配什么动作",验证集就能刷高分。

# ✗ 错误:frame 级随机切分,同一条 episode 被劈成两半
all_frames = load_all_frames(dataset)
train, val = random_split(all_frames, [0.9, 0.1])

# √ 正确:episode 级切分,一条轨迹整体只能属于一边
episode_ids = list(dataset.episode_ids)
random.shuffle(episode_ids)
split = int(len(episode_ids) * 0.9)
train_eps, val_eps = episode_ids[:split], episode_ids[split:]
train = [f for f in all_frames if f.episode_id in train_eps]
val   = [f for f in all_frames if f.episode_id in val_eps]

这个坑属于八个维度里的唯一性(数据泄漏检测)。它不会报错,不会让训练崩,只会让你在两周后才发现全白干。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/202307在这里插入图片描述
24024159.png?origin_url=%E9%85%8D%E5%9B%BE%2F%E5%9B%BE7_%E6%95%B0%E6%8D%AE%E6%B3%84%E6%BC%8F%E7%A4%BA%E6%84%8F.png&pos_id=img-S5QxoLVF-1785669933192)

质量维度存在的意义就是这个:把"不会报错但会致命"的问题,变成交付前能查出来的检查项。

二、八个维度,逐个拆

先给全景,再逐个讲。
请添加图片描述

# 维度 一句话 具身智能场景下最常见的失效
1 完整性 该有的东西都在吗 某几路相机中途掉线,帧数对不齐
2 准确性 标注本身对不对 检测框偏移、分割边界糊、关键点错位
3 一致性 不同人标的是同一套标准吗 同一个物体,A 标"cup",B 标"mug"
4 规范性 格式、坐标、类别合法吗 归一化坐标出现负数或大于 1
5 唯一性 有重复和泄漏吗 相邻帧劈进训练/验证集(上面那个坑)
6 代表性 覆盖了该覆盖的情况吗 全在同一张桌子、同一个光照下采的
7 均衡性 分布歪得厉害吗 90% 的 episode 是抓同一个物体
8 可用性 文件真的读得出来吗 标注文件指向的图片路径已失效

1. 完整性 —— 缺失样本 / 标注 / 元数据

查什么:每条 episode 的各路数据是否等长;该有标注的帧是否都有标注;元数据字段(时间戳、机器人本体、任务描述)是否齐全。

具身智能特有的坑:多传感器采集时,某一路中途掉线不会中断整个采集流程。你拿到的 episode 看起来正常,实际上第 300 帧之后腕部相机就没有数据了。

lens = {k: len(v) for k, v in episode.items() if k.startswith("observation")}
assert len(set(lens.values())) == 1, f"各路数据长度不一致: {lens}"

不查的后果:训练时 dataloader 按最短的那路对齐,你以为用了 900 帧,实际只用了 300 帧,而且完全不知道。

2. 准确性 —— 标注类别 / 检测框 / 分割边界

查什么:标注对不对。这是八个维度里唯一没法完全自动化的一个。

能自动查的部分:检测框面积异常(小于 4 像素或占满全图)、分割 mask 空洞、关键点跳变超过物理可能范围。

必须人工抽检的部分:类别标错、边界画糊。

具身智能特有的坑:轨迹类标注的准确性没法靠肉眼看。关节角标注错 2 度,人眼在图上看不出来,但模型学到的是错的动力学。这类只能靠物理约束检查——关节角超限、速度超过额定值、力矩突变。

3. 一致性 —— 标注规范统一性

查什么:同一个概念,所有人是不是用同一个标签;同一类物体,边界画法是不是同一套约定。

怎么查:统计类别名的编辑距离,把 cup / Cup / mug / 杯子 这种揪出来;统计同类别检测框的长宽比分布,方差异常大说明画法不统一。

具身智能特有的坑:语言指令的一致性。同一个任务,有人写 “pick up the red cube”,有人写 “grab red block”。VLA 模型学的是语言到动作的映射,指令表述不统一等于人为制造噪声。

建议:任务指令用受控词表,别让标注员自由发挥。

4. 规范性 —— 格式 / 坐标 / 类别合法性

查什么:这一维是纯机械检查,最容易自动化,也最应该做成 CI。

  • 归一化坐标必须在 [0, 1]
  • 类别 ID 必须在类别表里
  • 时间戳必须单调递增
  • 图像尺寸必须与元数据声明一致
  • 数值不能出现 NaN / Inf
assert (boxes >= 0).all() and (boxes <= 1).all(), "归一化坐标越界"
assert np.all(np.diff(timestamps) > 0), "时间戳非单调"
assert not np.isnan(actions).any(), "动作序列含 NaN"

不查的后果:这类问题会在训练中途炸,损失突然变 NaN,然后你从头排查三天。

5. 唯一性 —— 重复图像 / 数据泄漏

开头那个翻车就在这一维。分两件事:

重复检测:感知哈希(pHash)算一遍,汉明距离小于阈值的判为重复。注意具身智能数据里相邻帧天然相似,要按 episode 分组之后再查跨 episode 的重复,否则全是误报。

泄漏检测:确认 train / val / test 的 episode ID 集合完全不相交。

assert not (set(train_eps) & set(val_eps)), "训练集与验证集存在 episode 重叠"

再进一步:同一个场景布置下采的多条 episode,也应该整体划到同一边。同一张桌子、同一组物体摆放,换个抓取顺序采了 10 条,这 10 条之间的相似度远高于跨场景,劈开一样是泄漏。

这一维是具身智能数据集最容易死、也最难发现的地方。

6. 代表性 —— 类别 / 场景覆盖度

查什么:数据覆盖的情况,和模型上线后要面对的情况,重合度有多高。

维度包括:光照条件、背景复杂度、物体材质与颜色、抓取姿态、机器人起始位姿、干扰物存在与否。

怎么查:把这些条件做成元数据字段,交付前统计覆盖矩阵,看有没有整行整列是空的。

具身智能特有的坑:实验室采数据,永远是同一间屋子、同一盏灯、同一张桌子。模型在实验室成功率很高,换个房间就崩——这不是模型不行,是数据没有代表性。

建议:采集阶段就把"变化因子清单"定下来,按矩阵采,而不是采完再统计。

7. 均衡性 —— 类别 / 场景 / 来源分布

查什么:分布有没有严重倾斜。

代表性问"有没有覆盖到",均衡性问"覆盖的比例合不合理"。一个数据集可以覆盖了 10 种物体(代表性合格),但其中 9 成的 episode 都在抓同一个(均衡性不合格)。

怎么查:算各类别的 episode 数分布,看最大类与最小类的比值;算基尼系数或熵。

具身智能特有的坑动作分布的均衡性比类别分布更重要,也更少人查。如果 95% 的时间步动作接近零(机械臂在等待或缓慢移动),模型会学到"输出接近零总是安全的",然后在真机上一动不动。

# 动作幅度分布检查:接近零的时间步占比不应过高
near_zero = (np.abs(actions).max(axis=1) < 1e-3).mean()
print(f"近零动作占比: {near_zero:.1%}")   # 超过 60% 就要警惕

8. 可用性 —— 文件读取 / 路径 / 对应关系

查什么:最朴素也最容易被跳过的一维——文件真的能打开吗

  • 标注文件里引用的图像路径,文件是否存在
  • 图像是否能正常解码(不是零字节、不是损坏的 JPEG)
  • 视频文件的帧数是否与元数据一致
  • 压缩包能否正常解压

怎么查:交付前完整遍历一遍,实际打开每个文件。慢,但必须做。

不查的后果:客户拿到数据集,跑第一个 epoch 就报文件不存在。这是最伤信任的一类问题,因为它显得你根本没验过。

三、八个维度不是平权的

实际做的时候没那么多时间八个都做透。按具身智能场景的杀伤力排个序:

优先级 维度 理由
P0 唯一性、可用性 前者让你的所有指标失去意义,后者让客户第一分钟就用不了
P1 完整性、规范性 全自动可查,成本极低,不查纯属浪费
P2 均衡性、代表性 决定模型能不能出实验室,但需要采集阶段就规划
P3 准确性、一致性 重要,但依赖人工,只能抽检

如果只有一天时间:先把 P0 和 P1 做成脚本跑一遍。这四维全自动,一天足够,能拦掉大部分致命问题。

四、把它变成门禁,而不是报告

最后一点,也是最关键的一点:质量评估不能是"交付后写一份报告",必须是"不过就不让交付"

报告的问题在于,所有人都知道有问题,但所有人都觉得"这次先这样,下次改"。然后就没有下次了。

正确的做法是做成门禁

数据集打包
  → 自动跑 P0/P1 四维检查
    → 任一项不通过 → 阻断,不生成交付包
    → 全部通过 → 生成交付包 + 附带质量报告

P2/P3 因为需要人工或采集阶段规划,做成警告而非阻断,但必须在报告里显式列出,让接收方知道这个数据集的短板在哪。

交付一个"知道自己哪里不行"的数据集,远好过交付一个"看起来什么都好"的数据集。

五、工程化实现长什么样

上面这套,我们在「开物元启」平台里落成了数据交付环节的一个固定动作:选中数据集 → 开始分析 → 八个维度各自出分与等级,并给出质量总评分和改进建议,评估结果进历史记录可回溯。

设计上有两点是刻意的:

  1. 八维并列展示,不合并成单一分数就完事。单一分数会掩盖短板——总分 85 分,可能是八维都 85,也可能是七维满分、唯一性 0 分,后者是灾难。所以总分之外,每一维单独出分与等级。
  2. 评估结果和数据集绑定,进历史记录。数据集改了要重新评,评过的结果留痕,交付时一起给出去。

配合前面几个环节,整条链是:采集 → 清洗 → 标注 → 质检 → 六格式导出。质检卡在导出前面,这个顺序不能反。

写在最后

数据质量这件事,难点从来不在技术,在愿不愿意在交付前主动找自己的问题

八个维度里,有五个是纯脚本就能查的。真正拦住大家的不是不会写脚本,是"先交付了再说,出问题再改"。

而具身智能的数据出了问题,往往要等到真机测试才暴露——那时候已经过去两个月了。


下一篇写《具身智能数据清洗:82 条算子怎么排,顺序错了全白干》,讲质检之前的清洗环节。有兴趣的可以关注。

在做具身智能数据这一块的,欢迎评论区聊你踩过的坑;做高校实验室方案的,可以私信我。



Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐