具身智能数据流水线实战(三)具身智能数据清洗:82 条算子怎么排,顺序错了全白干

发布时间:2026/8/3 4:31:52
具身智能数据流水线实战(三)具身智能数据清洗:82 条算子怎么排,顺序错了全白干 前两篇讲了格式选型和八维质检这篇往回退一步讲流水线中段最脏的活清洗。先说结论清洗的难点不在于会不会用高斯滤波在于算子的执行顺序。同样一组算子排列不同结果可以从数据变干净变成数据被毁掉且看不出来。一、先讲一个能把整个数据集毁掉的操作图像数据增强几乎所有人第一个想到的都是水平翻转。免费的两倍数据量CV 领域用了十几年没人怀疑。在具身智能场景这个操作会静默地毁掉你的数据集。原因很简单具身智能的样本不是图像是图像 → 动作的配对。你把腕部相机的画面水平翻转物体从画面右侧移到了左侧。但配对的动作标签还写着末端向右移动 3 厘米。模型学到的是看到物体在左边就往右边动。# ✗ 灾难只翻图像不翻动作imagecv2.flip(image,1)# action 原封不动 —— 现在这条样本在教模型做反方向的运动# √ 正确图像与动作必须同步镜像imagecv2.flip(image,1)action[0]-action[0]# 末端 x 方向位移取反action[4]-action[4]# 绕 y 轴旋转取反# 而且相机外参、抓取点坐标、所有带方向的量全都要一起处理更麻烦的是双臂机器人做水平翻转左右臂的动作要整体互换。做不到这一点就别对具身智能数据做水平翻转。这个坑的本质CV 领域的算子经验不能原样搬到具身智能。因为标签的性质变了——从与几何无关的类别变成了与几何强耦合的动作。二、清洗算子有多少种按模态拆开看先建立全景。具身智能是多模态数据每种模态的清洗算子完全不同。基础类7 条—— 与模态无关所有数据都要过算子干什么数据去重删除完全重复的记录缺失值处理填充或丢弃缺失字段异常值检测识别超出合理范围的数值数据归一化缩放到统一区间Z-Score 标准化按均值方差标准化数据排序按时间戳或指定字段排序数据类型转换统一 dtype避免精度问题图像类13 条去噪三件套高斯去噪 / 中值滤波 / 双边滤波——分别对付高斯噪声、椒盐噪声、需要保边的场景。亮度与色彩亮度调整 / 对比度调整 / 直方图均衡化 / 伽马校正 / 白平衡 / 色彩空间转换。结构与尺寸双三次插值缩放 / 锐化 / 边缘增强 / 格式转换。具身智能场景最常用的是白平衡和伽马校正——实验室灯光和真实场景的色温差异是模型从实验室出不去的常见原因之一。音频类6 条音频降噪 / 重采样 / 分割 / 裁剪 / 音量标准化 / 音源分离。语音指令类数据主要用降噪和音量标准化多说话人场景需要音源分离。点云类10 条算子什么时候用下采样 / 均匀下采样点数太多训练吃不消离群点移除深度相机的飞点体素过滤规整化点密度统计滤波 / 半径滤波两种不同思路的离群点判据RANSAC 离群点检测拟合平面桌面后剔除偏离点法向量估计抓取姿态规划要用分割分离前景物体与背景配准多视角点云拼接轨迹类10 条这是具身智能最特殊的一类CV 领域完全没有对应物平滑 / 插值 / 重采样 / 移动平均 / Savitzky-Golay 滤波 / 分割 / 坐标转换 / 时间对齐 / 时间戳同步 / 速度过滤。其中时间对齐和时间戳同步是整条流水线里最容易被忽略、后果最严重的两个。多传感器采样率不同相机 30Hz、编码器 1000Hz、力传感器 500Hz不对齐就谈不上任何后续处理。Savitzky-Golay 滤波值得单独提一句它在平滑的同时能保住导数信息对需要从位置轨迹反推速度、加速度的场景比移动平均好用得多。增强算子另外一套清洗是去掉不该有的增强是造出更多的。两者性质完全不同必须分开管理。图像增强12 条水平翻转 / 垂直翻转 / 旋转 / 平移 / 随机裁剪缩放 / 颜色抖动 / 噪声注入 / 模糊 / 锐化 / Cutout / Mixup / CutMix音频增强9 条音频噪声 / 高斯噪声 / 音调偏移 / 速度变化 / 时间偏移 / 时间遮蔽 / 频率遮蔽 / SpecAugment / 脉冲噪声点云增强6 条随机翻转 / 随机旋转 / 全局缩放 / 随机丢弃 / Cutout / 均匀下采样注意图像增强里的翻转、旋转、平移点云增强里的翻转、旋转全部属于第一节讲的几何变换在具身智能场景下都必须同步处理动作标签。颜色抖动、噪声注入、模糊这类不改变几何的增强才是可以无脑用的。至于视频和轨迹的增强目前主流做法还是走自定义扩展——这两类的增强语义高度依赖具体任务很难有通用算子。好的做法是把算子体系设计成插件化的按统一接口规范注册自己的实现而不是等平台内置。三、六条编排铁律有了算子清单真正的工程问题来了按什么顺序执行。铁律 1去重和时间对齐必须在最前面所有后续算子的正确性都建立在数据条目是唯一的、时间轴是对齐的这个前提上。顺序错了会怎样先做了插值再做去重——插值出来的点被当成真实数据保留下来去重反而删掉了原始点。铁律 2归一化和标准化必须在最后面归一化的参数min/max 或 mean/std是从数据统计出来的。如果归一化之后又做了滤波、缩放、裁剪统计量就失效了。而且归一化的参数必须只从训练集统计然后应用到验证集和测试集。用全量数据统计归一化参数本身就是一种数据泄漏。# √ 正确统计量只来自训练集statscompute_stats(train_set)train_setnormalize(train_set,stats)val_setnormalize(val_set,stats)# 用训练集的统计量test_setnormalize(test_set,stats)铁律 3清洗和增强不能混在一条流水线里跑清洗作用于全量数据增强只能作用于训练集。如果你在同一条流水线里先清洗再增强然后才切分数据集那么增强出来的样本会同时出现在训练集和验证集里——这是最隐蔽的一种数据泄漏。正确的顺序全量数据 → 清洗 → 质检 → 切分episode 级→ 只对训练集做增强铁律 4滤波在缩放之前先缩放再去噪噪声会被插值算法抹开变成低频的、更难去除的伪影。先去噪再缩放结果干净得多。点云同理先离群点移除再下采样。反过来做离群点会被保留下来并且权重变大。铁律 5几何变换类算子必须成组执行图像的旋转、翻转、平移点云的旋转、翻转、缩放——这些算子改变的是空间关系。只要用了其中任何一个配套的动作标签、相机外参、抓取点坐标都必须同步变换。工程上的做法是把它们封装成一个不可拆分的复合算子输入输出都是「观测 动作」的配对而不是单独的图像。铁律 6每一步都要能回溯清洗是有损操作。一旦发现某个算子的参数配错了你需要能回到上一步重来而不是从原始数据重跑整条链。这要求原始数据、清洗数据、增强数据必须分开存放并保留血缘关系而不是原地覆盖。四、一个可用的默认顺序把六条铁律落成一个具体的执行顺序多模态场景下可以这样排① 时间戳同步 · 时间对齐 ← 多传感器必做最前 ② 数据去重 ← 在任何生成性算子之前 ③ 缺失值处理 · 异常值检测 ← 决定丢弃还是填充 ④ 各模态专用清洗 图像去噪 → 白平衡/伽马 → 缩放 点云离群点移除 → 体素/下采样 → 法向量估计 轨迹速度过滤 → Savitzky-Golay 平滑 → 重采样 ⑤ 数据类型转换 · 排序 ─────────── 质检门禁 ─────────── ⑥ episode 级切分 ─────────── 分界线 ─────────── ⑦ 仅训练集非几何类增强颜色抖动 / 噪声 / 模糊 ⑧ 仅训练集几何类增强必须同步变换动作标签 ⑨ 归一化 / 标准化统计量只来自训练集这个顺序不是唯一正确的但它满足全部六条铁律。你的场景如果要调整先确认调整之后哪条铁律被打破了以及能不能接受。五、工程化实现长什么样上面这套顺序如果靠每个人写脚本各自实现结果一定是每个人的顺序都不一样而且没人说得清自己那版为什么这么排。我们在「开物元启」平台里的做法是把它变成可视化编排算子按模态分类列出勾选需要的配置各自的参数比如增强算子的执行概率然后拖拽调整执行顺序——顺序是显式的、可见的、可复用的而不是埋在某个人的脚本里。三个设计上的考虑清洗算子和增强算子分两栏从界面上就强制区分这两类东西的性质避免铁律 3 被违反。算子体系插件化内置算子按com.algorithm.plugin.impl.{basic|image|audio|pointcloud|trajectory}.*Processor的规范组织自定义算子按同一接口注册。视频、轨迹这类增强语义高度任务相关的模态走自定义扩展比硬塞通用算子更实际。数据分层不覆盖原始数据 / 清洗数据 / 增强数据分开存每一份都能往回追溯来源对应铁律 6。清洗完的数据直接进下一环节的质检就是上一篇讲的八个维度过了才允许导出。写在最后清洗这件事最大的认知偏差是以为它是个技术问题。技术上每个算子都有成熟实现调 API 就行。真正难的是知道什么时候用哪个、按什么顺序用、以及哪些算子在具身智能场景下根本不能用。这些东西不写下来就只存在于做过的那个人脑子里。人一走团队从零开始踩一遍。下一篇写《12 个模型 × 6 种模态具身智能的标注该让 AI 做到哪一步》。在做具身智能数据这一块的欢迎评论区聊做高校实验室方案的可以私信我。