训练前必做的数据归一化:OpenLET具身智能挑战赛stats.json统计量(min/max/q01-q99)详解与最佳实践
训练前必做的数据归一化:OpenLET具身智能挑战赛stats.json统计量(min/max/q01-q99)详解与最佳实践
如果你正在参加 OpenLET 具身智能挑战赛(Embodied-Data-Manipulation-Challenge),那么数据归一化是训练操作策略模型前绝不能跳过的一步。挑战赛的每个数据集都自带stats.json,预先为每个字段算好了min、max、mean、std和q01~q99分位数,用对它们能让模型收敛更快、打榜更稳。本文带你完整读懂这份统计量文件,并给出 4 种可直接上手的归一化方法与常见坑位清单。
一、为什么训练前必须做数据归一化?
挑战赛的遥操作数据来自kuavo-5w人形机器人,observation.state(本体状态)和action(动作)是不同物理含义的混合向量:关节角是弧度、末端位姿是米、夹爪是开合比例……每个维度的数值范围差异极大。
以task1_parts_pick的数据为例,打开 stats.json 可以看到action各维度的真实分布:
| 维度(含义) | min | max | 数值范围感受 |
|---|---|---|---|
zarm_r2_link(第 2 维) | -1.775 | -0.049 | 始终为负,约 -1.8 ~ -0.05 |
zarm_r3_link(第 3 维) | 0.092 | 1.484 | 始终为正,约 0.09 ~ 1.48 |
right_sg100_4(第 11 维) | -4.2e-05 | 0.0009 | 接近 0 的微小量级 |
vyaw(第 21 维) | 0 | 0 | 恒定为零 |
如果直接喂给神经网络,大尺度维度会主导梯度,小尺度维度的信号几乎被"淹没",训练要么收敛极慢、要么直接发散。归一化把所有维度拉到同一量级,是策略学习(无论是 BC 行为克隆还是 VLA 模型微调)的标准前置步骤。
二、stats.json 在哪里?数据集长什么样?
仓库中 3 个任务各自独立成目录,结构完全一致:
- 任务一 零件抓取:
sim/task1_parts_pick/ - 任务二 箱子搬运:
sim/task2_box_move/ - 任务三 循环上料:
sim/task3_loop_feed/
每个任务目录都是标准LeRobot v3.0数据集格式,关键文件如下:
| 文件 | 作用 |
|---|---|
| meta/info.json | 数据集元信息:机器人类型、总帧数、帧率、各字段的 dtype 与 shape |
| meta/stats.json | 每个字段的统计量(本文主角) |
| meta/tasks.parquet | 任务列表(本数据集均为单任务) |
| data/chunk-000/file-000.parquet | 帧级数值数据(state、action、时间戳等) |
| videos/observation.images.head_cam_h/ | 头部相机视频(480×640,10 fps,av1 编码) |
| videos/observation.images.wrist_cam_r/ | 右腕相机视频 |
从 info.json 还能确认:total_episodes: 500、total_frames: 237813、fps: 10,且splits.train: "0:500"——全部 500 条 episode 都划为训练集,因此用全量统计量做归一化不会造成数据泄漏,这一点后文最佳实践还会用到。
⚠️ 注意:每个任务下还有一层带日期的快照目录(如
sim/task1_parts_pick/20261015/meta/stats.json),其数据量与外层不同(200 episodes vs 500 episodes),字段维度也不同(state 36 维 vs 18 维)。请始终使用与你实际加载的数据目录配套的那份 stats.json,切勿混用。
三、stats.json 的 9 个统计字段逐项解读
stats.json是一个"字段名 → 统计量"的字典,覆盖图像、状态、动作和索引字段:
{ "observation.state": { "min": [...], "max": [...], ... }, "observation.images.head_cam_h": { ... }, "action": { ... }, "timestamp": { ... }, "episode_index": { ... }, ... }每个字段下都提供相同的 9 个统计量,含义如下:
| 字段 | 含义 | 归一化中的典型用途 |
|---|---|---|
min/max | 该字段全数据集的最小值 / 最大值 | Min-Max 归一化的上下界 |
mean | 均值 | 标准化(z-score)的减项 |
std | 标准差 | 标准化的除项 |
count | 实际参与该字段统计的样本数 | 数据质量体检(见下) |
q01/q99 | 1% / 99% 分位数 | 鲁棒归一化,替代易受离群点影响的 min/max |
q10/q50/q90 | 10% / 50%(中位数) / 90% 分位数 | 判断分布是否对称、偏斜程度 |
两点读法细节:
- 图像字段是逐通道统计。例如
observation.images.head_cam_h的mean是[[0.448], [0.448], [0.445]],对应 R/G/B 三个通道,说明像素值已经归一化到 0~1(min恒为 0.0、max恒为 1.0)。 count可能因字段而异。task1_parts_pick中action、observation.state的count是 237813(与总帧数一致),而图像字段的count是 50685。若你发现某字段count明显偏小,说明该字段统计时并非全部帧都参与了计算,用于归一化前建议先核对一下。
四、如何看懂 q01~q99 分位数?
分位数是分掉 1% 极端值后的"稳健版 min/max"。用task1_parts_pick的右腕相机红通道(observation.images.wrist_cam_r)举个例子:
min = 0.0 q01 = 0.0045 q50 = 0.343 q99 = 0.825 max = 1.0q50 = 0.343:一半的画面亮度低于 0.34,与mean = 0.341几乎相等 → 分布近似对称;q01 = 0.0045:只有 1% 的像素接近纯黑(暗部阴影);q99 = 0.825:最亮的 1% 像素约 0.82,而max = 1.0说明存在少量饱和白点。
如果max - q99很大(或q01 - min很大),说明分布有长尾/离群点,此时用 min/max 归一化会把 98% 的数据压缩进很窄的区间——这就是下一节推荐分位数归一化的原因。
对action字段,分位数还有一个额外价值:可以快速定位"恒定维度"。task1_parts_pick的action第 21 维vyaw的min、max、std全部为 0,意味着机器人从未用过该通道——归一化时这一维直接跳过即可,避免除零。
五、4 种可直接上手的归一化方法
针对挑战赛数据,按字段类型给出推荐配方:
1️⃣ 标准化 z-score(推荐用于action与observation.state)
x' = (x - mean) / std均值和标准差直接取stats.json中action/observation.state对应的mean、std数组,逐维计算即可。这是大多数 RL/BC 策略的标准选择。
⚠️
std接近 0 的维度(如上面的vyaw),建议用std + 1e-6或直接跳过该维度。
2️⃣ 鲁棒分位数归一化(推荐用于范围跨度大的动作维度)
用q01/q99代替min/max,再截断极端值:
x' = clip((x - q01) / (q99 - q01), 0, 1)这样 98% 的数据被均匀映射到 0~1,个别异常遥操作帧(急停、抖动)不会被放大成爆炸值。对task1_parts_pick中-1.77 ~ -0.049的zarm_r2_link这类偏态维度尤其有效。
3️⃣ 经典 Min-Max(简单场景可用)
x' = (x - min) / (max - min)仅当max - q99、q01 - min都很小时使用;否则优先方案 2️⃣。
4️⃣ 图像通道(observation.images.*)
像素已在 0~1 区间,两种处理均可:
- 直接用(很多视觉模型自带内部缩放,如 ImageNet 均值方差);
- 或用 stats.json 中的图像
mean/std(逐通道)做一次轻量标准化,缓解不同相机曝光差异。
六、5 个常见错误 + 最佳实践清单
- ❌拿全量数据算自己的统计量覆盖 stats.json——直接复用官方统计量,省算力且保证与榜单口径一致。
- ❌跨任务/跨目录复用统计量——
task2_box_move的 state 是 36 维、action 是 39 维(双臂),与task1_parts_pick的 18/21 维完全不同,形状都对不上,务必各用各的。 - ❌用 min/max 硬归一化长尾分布——先看
q01/q99与min/max的差距,差距大就换分位数方案。 - ❌训练与推理用不同的统计量——推理(打榜部署)时必须把训练时的
stats.json固化进推理管线,绝不能按当前输入重新计算,否则数值口径漂移、动作直接失控。 - ❌忽略
std = 0的恒定维度——先检查再除,加一个1e-6的 eps 或跳过该维。
✅一句话检查清单:确认数据目录对应的stats.json→ 按字段选方法(action/state 用 z-score 或 q01-q99,图像用均值方差)→ 处理 std≈0 维度 → 训练/推理共用同一份统计量。
七、小结
OpenLET 具身智能挑战赛的每个任务数据集都在 meta/stats.json 中提供了开箱即用的min/max/mean/std/q01~q99全套统计量,配合 meta/info.json 中的字段定义(dtype、shape、维度名),足以让你在 10 分钟内搭好一套正确且可复现的归一化流程。把这一步做扎实,你的策略模型才能在零件抓取、箱子搬运、循环上料这些真实工业任务上稳定收敛、冲击更高排名。🚀
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考