具身智能数据流水线实战(二)数据集交付前必须过的八道检查
“开物元启” 具身大模型平台 技术支持
上一篇讲了数据集格式选型格式对了,数据就能用了吗?
不能。格式只保证机器读得进去,读进去的东西是不是垃圾,格式管不了。
这篇讲交付前的最后一道闸——八个质量维度。这套东西不是我拍脑袋编的,是数据工程领域通用的质量框架,只是具身智能场景下每一维的含义都要重新解释一遍。
一、先讲一个真实的翻车
一个课题组做抓取任务的模仿学习。训练集验证集按 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]
这个坑属于八个维度里的唯一性(数据泄漏检测)。它不会报错,不会让训练崩,只会让你在两周后才发现全白干。

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 因为需要人工或采集阶段规划,做成警告而非阻断,但必须在报告里显式列出,让接收方知道这个数据集的短板在哪。
交付一个"知道自己哪里不行"的数据集,远好过交付一个"看起来什么都好"的数据集。
五、工程化实现长什么样
上面这套,我们在「开物元启」平台里落成了数据交付环节的一个固定动作:选中数据集 → 开始分析 → 八个维度各自出分与等级,并给出质量总评分和改进建议,评估结果进历史记录可回溯。
设计上有两点是刻意的:
- 八维并列展示,不合并成单一分数就完事。单一分数会掩盖短板——总分 85 分,可能是八维都 85,也可能是七维满分、唯一性 0 分,后者是灾难。所以总分之外,每一维单独出分与等级。
- 评估结果和数据集绑定,进历史记录。数据集改了要重新评,评过的结果留痕,交付时一起给出去。
配合前面几个环节,整条链是:采集 → 清洗 → 标注 → 质检 → 六格式导出。质检卡在导出前面,这个顺序不能反。
写在最后
数据质量这件事,难点从来不在技术,在愿不愿意在交付前主动找自己的问题。
八个维度里,有五个是纯脚本就能查的。真正拦住大家的不是不会写脚本,是"先交付了再说,出问题再改"。
而具身智能的数据出了问题,往往要等到真机测试才暴露——那时候已经过去两个月了。
下一篇写《具身智能数据清洗:82 条算子怎么排,顺序错了全白干》,讲质检之前的清洗环节。有兴趣的可以关注。
在做具身智能数据这一块的,欢迎评论区聊你踩过的坑;做高校实验室方案的,可以私信我。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)