训练前必做的数据归一化:OpenLET具身智能挑战赛stats.json统计量(min/max/q01-q99)详解与最佳实践

发布时间:2026/10/29 10:57:05
训练前必做的数据归一化: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各维度的真实分布:

维度(含义)minmax数值范围感受
zarm_r2_link(第 2 维)-1.775-0.049始终为负,约 -1.8 ~ -0.05
zarm_r3_link(第 3 维)0.0921.484始终为正,约 0.09 ~ 1.48
right_sg100_4(第 11 维)-4.2e-050.0009接近 0 的微小量级
vyaw(第 21 维)00恒定为零

如果直接喂给神经网络,大尺度维度会主导梯度,小尺度维度的信号几乎被"淹没",训练要么收敛极慢、要么直接发散。归一化把所有维度拉到同一量级,是策略学习(无论是 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/q991% / 99% 分位数鲁棒归一化,替代易受离群点影响的 min/max
q10/q50/q9010% / 50%(中位数) / 90% 分位数判断分布是否对称、偏斜程度

两点读法细节:

  1. 图像字段是逐通道统计。例如observation.images.head_cam_h的mean是[[0.448], [0.448], [0.445]],对应 R/G/B 三个通道,说明像素值已经归一化到 0~1(min恒为 0.0、max恒为 1.0)。
  2. 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.0
  • q50 = 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),仅供参考