Psi0数据管线实战:遥操作原始数据转LeRobot格式+模态统计归一化全流程
【免费下载链接】Psi0[RSS'26] Welcome to Psi-Zero, a Humanoid VLA towards Universal Humanoid Intelligence.项目地址: https://gitcode.com/gh_mirrors/ps/Psi0
Ψ₀(Psi0)是一个面向人形机器人通用 loco-manipulation 的开源视觉-语言-动作(VLA)基础模型,它的训练质量很大程度取决于数据管线:如何把遥操作采集的原始数据转换为 LeRobot 格式,以及如何计算**模态统计(modality stats)**用于动作归一化。本文带你完整走一遍这条管线——从 G1 人形机器人遥操作原始数据出发,用 raw_to_lerobot.py 一键转换,再用 calc_modality_stats.py 生成训练所需的归一化参数,全程只需 3 条命令。
🤖 为什么要先把数据转成 LeRobot 格式?
Psi0 的训练、评测、部署全链路都建立在 LeRobot 数据集布局之上(Parquet 表格 + MP4 视频 + JSON 元信息)。而遥操作上位机采集出来的"原始数据"只是一堆松散的帧图片和 JSON 记录,模型无法直接读取。原始目录长这样:
g1_real_raw └── Hug_box_and_move ├── episode_0 │ ├── color/ │ │ ├── frame_000000.jpg │ │ └── ... │ └── data.json └── ...转换脚本 raw_to_lerobot.py 会把它重排成标准的 LeRobot 结构:
$task/ ├── data/chunk-000/episode_000000.parquet # 低维状态/动作/时间戳 ├── videos/chunk-000/egocentric/episode_000000.mp4 # 30fps 第一视角视频 └── meta/ # info.json、tasks.jsonl、episodes.jsonl 等其中每帧的动作向量由手部关节、手臂关节、躯干姿态与指令速度拼接而成(共 36 维),与后训练阶段使用的动作维度对齐;视频统一按 30 FPS、H.264 编码封装。
📦 数据准备:原始数据 + 任务描述
第 1 步:拿到原始遥操作数据。官方 9 个真实任务的数据都已开源在 Hugging Face 的USC-PSI-Lab/psi-data仓库(g1_real_raw/目录),下载后解压到约定的目录即可;也可以按 real/README.md 里的指南自己用 G1 遥操作采集。
第 2 步:注册任务的自然语言描述。在 task_description_dict.json 中补充任务名 -> 指令文本的映射,例如:
{ "Hug_box_and_move": "Hug box and move." }这个描述会写入数据集元信息,并作为语言指令参与训练,任务名必须在字典里有对应描述,否则转换脚本会直接报错退出(见 raw_to_lerobot.py 中的断言)。
⚙️ 核心流程一:原始数据 → LeRobot 格式
只需一条命令完成转换:
export task=Hug_box_and_move python scripts/data/raw_to_lerobot.py \ --data-root=$PWD/data/real_teleop_g1/g1_real_raw \ --work-dir=$PWD/data/real \ --repo-id=psi0-real-g1 \ --robot-type=g1 \ --task=$task这个脚本(核心类HE2LeRobotConverter,见 raw_to_lerobot.py)有几个对新手很友好的工程细节:
- 多进程并行:默认使用全部 CPU 核心逐 episode 并行转换,大任务集转换快数倍;
- 断点续传:已完成的 episode(parquet + 视频 + 统计均已落盘)会被自动跳过,中断后重跑即可;
- 逐 episode 统计:转换过程中同步累计每个 episode 的 action min/max/mean/std,写入
meta/episodes_stats.jsonl; - 元信息一次性生成:
meta/info.json、meta/tasks.jsonl、meta/episodes.jsonl在全部转换完成后统一写出。
📊 核心流程二:模态统计与归一化参数
Psi0 训练时要用统计量把states/action归一化到 [-1, 1](bounds 方式),所以转换后必须补一步统计计算:
python scripts/data/calc_modality_stats.py \ --work-dir=$PSI_HOME/data/real \ --task=$taskcalc_modality_stats.py 会读取数据集下所有data/*/*.parquet文件,对每一个数值列(模态)计算mean / std / min / max / q01 / q99六组参数(计算逻辑见 calc_modality_stats.py),结果写入meta/stats.json。
最后再复制一份 Ψ₀ 命名的统计文件:
cp $PSI_HOME/data/real/$task/meta/stats.json \ $PSI_HOME/data/real/$task/meta/stats_psi0.json这一步看似多余,却是训练配置的"约定入口"——微调脚本 finetune-real-psi0.sh 中明确指定了--data.transform.field.stat-path=meta/stats_psi0.json与action_norm_type=bounds(见 finetune-real-psi0.sh),缺了这个文件训练会直接失败。
准备好后,一条命令即可启动微调:scripts/train/psi0/finetune-real-psi0.sh $task。
🦾 另一条路:SONIC 全身数据转换
如果你的数据来自 SONIC 全身遥操作采集(本身就是 LeRobot 格式,但 schema 不同),则换用 raw_sonic_to_psi_lerobot.py:
export task=<dataset-name> python scripts/data/raw_sonic_to_psi_lerobot.py \ --data-root=third_party/GR00T-WholeBodyControl/outputs/$task \ --work-dir=$PSI_HOME/data/sonic/lerobot \ --repo-id=$task \ --robot-type=g1它负责把 SONIC 的 43 维状态重排为 Ψ₀ 的states[43] = 全身qpos(29) + 双手(14),并把动作重组为action[78] = motion_token(64) + hand(14)(见 Sonic2LeRobotConverter),随后同样执行calc_modality_stats.py与stats_psi0.json复制两步。
🧰 数据工具箱:辅助脚本速查
scripts/data/目录还内置了一批管线"修理工",遇到数据问题时按需取用:
| 脚本 | 用途 |
|---|---|
| patch_lerobot_meta.py | 清理 parquet schema 元数据(已知加载问题的官方修复) |
| split_lerobot_by_task.py | 按任务切分子数据集并重建元信息 |
| split_lerobot_train_val.py | 划分训练/验证集 |
| normalize_pack_resolution.py | 统一混合分辨率视频,避免训练/验证几何不一致 |
| reorder_state_columns.py | 对齐不同数据集间的关节列顺序 |
| refill_zeroed_state.py | 修复零值 state,使其归一化后恰好为 0 |
❓ 常见问题与实战建议
Q1:训练时报stack(): argument 'tensors' ... not Column?通常是环境里残留旧版 lerobot 栈。重新uv sync --group psi --active,并运行python -c "from psi.data.lerobot.compat import LEROBOT_LAYOUT; print(LEROBOT_LAYOUT)"验证(详见 README.md)。
Q2:转换中断了一半怎么办?重跑同一条raw_to_lerobot.py命令即可,脚本会自动跳过已完成 episode,只处理剩余部分。
Q3:为什么一定要生成 stats_psi0.json?归一化参数是"数据-训练"契约的一部分:不同数据集的关节取值范围不同,不做统计归一化,微调时的 loss 会被大尺度维度主导。记住"转换 → 统计 → 复制 stats_psi0.json"这三步固定套路即可。
✅ 小结
| 步骤 | 命令 | 产物 |
|---|---|---|
| 1. 注册任务描述 | 编辑 task_description_dict.json | 指令文本映射 |
| 2. 原始数据转 LeRobot | python scripts/data/raw_to_lerobot.py ... | parquet + mp4 + meta |
| 3. 计算模态统计 | python scripts/data/calc_modality_stats.py ... | meta/stats.json |
| 4. 生成 Ψ₀ 统计 | cp stats.json stats_psi0.json | 归一化契约 |
| 5. 启动微调 | scripts/train/psi0/finetune-real-psi0.sh $task | 训练运行目录 |
整条管线"命令少、可续传、并行快",即使只有一块消费级 GPU,也能顺利把自己的遥操作数据喂给 Ψ₀。
【免费下载链接】Psi0[RSS'26] Welcome to Psi-Zero, a Humanoid VLA towards Universal Humanoid Intelligence.项目地址: https://gitcode.com/gh_mirrors/ps/Psi0
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考