Skip to content

hetolin/PoseVLA

Repository files navigation

PoseVLA: Universal Pose Pretraining for Generalizable Vision-Language-Action Policies (RSS2026)

arXiv Project Page ModelScope Model

[πŸš€ Quick Start] [🌟 Pre-train] [πŸ€– Post-train (Robotwin)] [πŸ•Ή RoboTwin Eval] [πŸ› Troubleshooting]


News πŸš€πŸš€πŸš€

  • 2026/06: Initial release of PoseVLA: supports Omni3D / Omni6D / BOP / GraspClutter6D for 3D tasks and Agibot / InternData-A1 for robot actions.

πŸ† Main Results on RoboTwin (50 tasks, Average %)

Method Easy Hard
Ο€0 67.00 65.12
Ο€0.5 79.48 76.16
PaliGemma_expert 35.40 33.36
Pose-VLA (In Paper) 79.91 79.10
PoseVLA (In Repo) 89.40 88.60

πŸ“– Documents

PoseVLA is split into two training stages, each with its own document:

Stage Entry script Config Doc
Pre-train (joint VLM + Action on large-scale data) train_pretrain.py config/base.yaml docs/PRETRAIN.md
Robotwin data conversion (raw β†’ HDF5 + normalization) utils/process_data_all.py config/dataset/robotwin.yaml docs/ROBOTWIN_DATA.md
Post-train / Fine-tune (Robotwin and other downstream robots) train_posttrain.py config/base_posttrain.yaml docs/POSTTRAIN.md
RoboTwin simulation eval robotwin/PoseVLA/eval_policy.py robotwin/PoseVLA/deploy_policy.yml robotwin/PoseVLA/README.md

The project supports three orthogonal training modes that can be freely combined:

  • VLM training β€” learn 3D object detection via Next-Token Prediction (NTP) on Omni3D, Omni6D, BOP, GraspClutter6D, …
  • Action training β€” learn robot actions via Flow Matching on HDF5 / LeRobot-format data (Agibot, InternData-A1, Robotwin, …).
  • Co-Training β€” VLM and Action data are interleaved within the same optimization step.
πŸ“ Project Structure (click to expand)
PoseVLA/
β”œβ”€β”€ train_pretrain.py           # Pre-train entry (hydra + accelerate + deepspeed)
β”œβ”€β”€ train_posttrain.py          # Post-train / fine-tune entry (Robotwin etc.)
β”œβ”€β”€ eval_detection.py           # Evaluation / mAP entry (Omni3D and other 3D tasks)
β”‚
β”œβ”€β”€ posevla/                    # PoseVLA model implementation (Ο€0 / Ο€0.5 based)
β”‚   β”œβ”€β”€ configuration_posevla.py    # PoseVLAConfig
β”‚   β”œβ”€β”€ modeling_posevla.py         # PoseVLAPolicy (PaliGemma + Action Expert + Flow Matching)
β”‚   β”œβ”€β”€ paligemma_with_expert.py    # PaliGemma + Expert dual-stream architecture
β”‚   β”œβ”€β”€ patch_embed.py              # Vision patch embedding (SigLIP + prior fusion)
β”‚   β”œβ”€β”€ convert_jax_model_to_pytorch.py  # JAX β†’ PyTorch weight converter
β”‚   └── _lerobot_compat.py         # LeRobot compatibility layer
β”‚
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ factory.py              # Unified VLM / Action DataLoader factory
β”‚   β”œβ”€β”€ collators.py            # DataCollators (action / detection)
β”‚   β”œβ”€β”€ ds_raw/                 # Raw dataset readers
β”‚   β”‚   β”œβ”€β”€ agibot.py / interndata_a1.py / robotwin.py
β”‚   β”‚   β”œβ”€β”€ droid.py / rdt.py / umi.py / xtrainer.py
β”‚   β”‚   └── mix.py             # Multi-source mixed dataset reader
β”‚   └── ds_train/               # Training Datasets
β”‚       β”œβ”€β”€ detection/          # 3D detection datasets (VLM)
β”‚       β”‚   β”œβ”€β”€ dataset_bop.py / dataset_omni3d.py / dataset_omni6d.py
β”‚       β”‚   β”œβ”€β”€ dataset_clutter.py
β”‚       β”‚   └── graspclutter6dAPI.py
β”‚       └── robot/              # Robot action datasets (VLA)
β”‚           β”œβ”€β”€ dataset_hdf5_action.py   # HDF5 action dataset
β”‚           β”œβ”€β”€ dataset_lerobot.py       # LeRobot format dataset
β”‚           └── dataset_agibot.py        # Agibot dataset
β”‚
β”œβ”€β”€ utils/                      # Shared utilities
β”‚   β”œβ”€β”€ process_data_all.py     # Robotwin raw β†’ HDF5 conversion
β”‚   β”œβ”€β”€ mapping_token.py        # Text ↔ 3D scene encoding / decoding utilities
β”‚   β”œβ”€β”€ transform_utils.py      # SE(3) / pose math helpers
β”‚   β”œβ”€β”€ image_corrupt.py        # Image augmentation
β”‚   β”œβ”€β”€ vis.py                  # Visualization helpers
β”‚   └── logger.py               # WandB / training-state logging
β”‚
β”œβ”€β”€ config/                     # Hydra configs
β”‚   β”œβ”€β”€ base.yaml               # Pre-train main config
β”‚   β”œβ”€β”€ base_posttrain.yaml     # Post-train (Robotwin) main config
β”‚   β”œβ”€β”€ zero0.json / zero2.json / zero3_offload.json   # DeepSpeed configs
β”‚   β”œβ”€β”€ dataset/                # Action training dataset configs (hdf5, lerobot, robotwin)
β”‚   β”œβ”€β”€ dataset_bop/            # BOP series
β”‚   β”œβ”€β”€ dataset_clutter/        # GraspClutter6D
β”‚   β”œβ”€β”€ dataset_omni6d/         # Omni6D
β”‚   β”œβ”€β”€ dataset_omni3d/         # Omni3D (train/val/test)
β”‚   β”œβ”€β”€ dataset_lerobot/        # LeRobot grouped configs
β”‚   └── dataset_meta/           # Per-source sample lists (json)
β”‚
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ launch/                 # Training launch scripts
β”‚   β”‚   β”œβ”€β”€ pretrain.sh         # Multi-GPU launch for pre-training (train_pretrain.py)
β”‚   β”‚   └── posttrain.sh        # Multi-GPU launch for post-training (train_posttrain.py)
β”‚   β”œβ”€β”€ download/               # Dataset download / extract / yaml-gen scripts
β”‚   β”‚   β”œβ”€β”€ agibot.sh
β”‚   β”‚   β”œβ”€β”€ interndata_a1.sh
β”‚   β”‚   β”œβ”€β”€ interndata_a1_unzip.sh
β”‚   β”‚   └── interndata_a1_generate_yaml.py
β”‚   └── stats/                  # Dataset normalization stats
β”‚       β”œβ”€β”€ compute_dataset_stat_hdf5_abs_joint.py
β”‚       β”œβ”€β”€ compute_dataset_stat_hdf5_rel_ee.py
β”‚       β”œβ”€β”€ norm_robotwin.py    # Robotwin EEP / qpos normalization stats
β”‚       └── normalize.py
β”‚
β”œβ”€β”€ bin_stats/                  # Non-uniform tokenizer bin boundaries
β”‚   └── nonuniform_bins.pkl     # Pre-computed quantization bins for 3D tokenization
β”‚
β”œβ”€β”€ docs/                       # Stage-level documents
β”‚   β”œβ”€β”€ PRETRAIN.md             # Pre-train guide
β”‚   β”œβ”€β”€ POSTTRAIN.md            # Post-train / fine-tune guide (Robotwin)
β”‚   └── ROBOTWIN_DATA.md        # Robotwin raw β†’ HDF5 conversion guide
β”‚
β”œβ”€β”€ robotwin/PoseVLA/           # RoboTwin simulation deploy + eval
└── google/paligemma-3b-pt-224/ # Local PaliGemma tokenizer / config

πŸš€ Quick Start

1. Clone

git clone git@github.com:hetolin/PoseVLA.git
cd PoseVLA

2. Conda env (installation from scratch)

  • Python 3.10.12
  • PyTorch 2.7.0 + CUDA 12.6 (TF32 / bf16 works best on Ampere / Hopper GPUs)
conda create -n vla python==3.10.12
conda activate vla

# Install PyTorch first β€” it is intentionally NOT pinned in requirements.txt,
# because the correct wheel depends on your local CUDA version.
# CUDA 12.6:
pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 \
    --index-url https://download.pytorch.org/whl/cu126

# Install lerobot (pinned commit, compatible with PoseVLA)
# Fix: rename `pyav` -> `av` (package renamed on PyPI)
# Fix: remove `rerun-sdk` (requires numpy>=2, conflicts with imgaug)
git clone https://github.com/huggingface/lerobot.git third_party/lerobot \
  && cd third_party/lerobot \
  && git checkout 638d411cd3acf32c28d8c2120f3c41bda8bb15d4 \
  && sed -i 's/pyav/av/' pyproject.toml \
  && sed -i '/rerun-sdk/d' pyproject.toml \
  && pip install -e . \
  && cd ../..

# (Optional) Install bop_toolkit (used for BOP dataset, for 3D pretraining only)
git clone https://github.com/thodan/bop_toolkit.git third_party/bop_toolkit \
  && cd third_party/bop_toolkit \
  && pip install -e . \
  && cd ../..

# NOTE: keep the `lerobot` line commented out in requirements.txt β€” we install it manually.
pip install -r requirements.txt

3. Pretrained weights

Create a pretrain/ directory under the project root and place any of the following weights (pick what you need β€” multiple loading branches are available in train_pretrain.py):

pretrain/
β”œβ”€β”€ paligemma-3b-pt-224/   # Vanilla PaliGemma VLM
β”œβ”€β”€ lerobot_pi0/           # Ο€0
└── pi05_base/             # Ο€0.5

The tokenizer is already bundled under google/paligemma-3b-pt-224/; the config points to it via model.tokenizer_model_path.

4. Environment variables

Set the project parent directory before launching Hydra-based training scripts. At minimum:

export ROOT="/your/home"
export DEV_PATH="${ROOT}/robot_code"
export PYTHONPATH="$PYTHONPATH:${DEV_PATH}"
export HF_HOME=${ROOT}/.cache/huggingface
export HF_LEROBOT_HOME=${HF_HOME}/lerobot
export HYDRA_FULL_ERROR=1

W&B auto-login: the script writes /root/.netrc β€” replace API_KEY with your own.

5. Next step


TODO List

  • Release the training / co-training code for PoseVLA.
  • Release the 3D evaluation entry (eval_detection.py) with mAP / PR-curve aggregation.
  • Release support for both Ο€0 and Ο€0.5 Action Experts in a single codebase (switchable via training.pi05).
  • Release the Robotwin post-training entry (train_posttrain.py) and RoboTwin deployment scripts.
  • Release pretrained PoseVLA checkpoints.

πŸ™‹ FAQs

If you encounter any issues, feel free to open an issue on GitHub or reach out through discussions. Feedback and contributions are very welcome! πŸš€

Acknowledgement

PoseVLA is built with reference to the following projects: lerobot, Transformers, Google PaliGemma, Ο€0 / OpenPI, Omni3D, BOP Toolkit, and GraspClutter6D. Thanks for their awesome work.

About

Universal Pose Pretraining for Generalizable Vision-Language-Action Policies(RSS2026)

Topics

Resources

License

Stars

60 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors