| --- |
| library_name: pytorch |
| tags: |
| - arxiv:2608.15984 |
| - motion-captioning |
| - motion-language |
| - human-motion |
| - 2d-pose |
| pipeline_tag: other |
| license: mit |
| --- |
| |
| # 2D Motion Interface β inference bundle (MotionGPT) |
|
|
| [Paper (arXiv:2608.15984)](https://arxiv.org/abs/2608.15984) Β· [Code](https://github.com/irajisamurai/2D-Motion-Interface) Β· [HCMIW @ ECCV 2026](https://hcmiw.github.io/hcmiw-eccv2026/) (Oral Presentation) |
|
|
| Inference-only weights for **A Plug-and-Play 2D Motion Interface for Real-World Motion |
| Language Models**, in the MotionGPT configuration. This repo backs the demo Space; it is |
| not a general-purpose checkpoint. |
|
|
| The interface captions human motion from **2D keypoints only** β no 3D pose estimation |
| anywhere in the pipeline. The pretrained motion-language model is frozen; only the 2D |
| encoder (9.6M params) and the real-video adapter `A_real` (0.3M params) are trained. |
|
|
| ## Contents |
|
|
| | File | Size | | |
| |---|---|---| |
| | `lm.safetensors` | 993.3 MB | flan-t5-base + 515 motion tokens. The three tied embedding copies present in the training checkpoint are dropped; `lm_head` is untied and kept. | |
| | `vqvae.safetensors` | 39.4 MB | 2D encoder + quantizer. The decoder is dropped β only `encode` is ever called. | |
| | `adapter.safetensors` | 0.3 MB | `A_real`, the real-video adapter (residual, hidden 512, 81-dim). | |
| | `flan-t5-base/` | 2.4 MB | Config + tokenizer only. No pretrained weights: `lm.safetensors` supplies all of them. | |
| | `stats.npz` | 3 KB | Feature mean/std for the 68-dim and 81-dim layouts. | |
| | `model_config.yaml` | 1 KB | VQ-VAE hyperparameters, adapter type, `unit_length`, `max_motion_length`. | |
|
|
| Everything is **fp32**. Dropping the evaluator weights, the duplicated embeddings and the |
| VQ-VAE decoder takes the 1.53 GB training checkpoint down to 1.03 GB with no numerical |
| change, so fp16 is unnecessary β and flan-T5 is known to be unstable in fp16 anyway. |
|
|
| ## Pipeline |
|
|
| ``` |
| COCO-17 keypoints + confidence |
| -> COCO-13 (drop eyes/ears) |
| -> 81-dim features (with confidence) --A_real--> zero-pad to 263 |
| -> VQ-VAE.encode -> MotionGPT (m2t) -> caption |
| ``` |
|
|
| Features are mid-hip centred and scale-normalised, so raw pixel coordinates work at any |
| resolution. Input is expected at 20 fps. |
|
|
| ## Usage |
|
|
| ```python |
| from huggingface_hub import snapshot_download |
| from captioner import MotionCaptioner # from the demo Space |
| |
| bundle = snapshot_download("KanameYOkoYAMA/2d-motion-interface") |
| cap = MotionCaptioner(bundle, device="cpu") |
| print(cap.caption_json("clip.json")["caption"]) |
| ``` |
|
|
| Decoding is greedy and the full clip is used from frame 0, so captions are reproducible. |
| A caption takes ~1 s on CPU. |
|
|
| ## Reproducibility |
|
|
| Captions were verified byte-for-byte against the evaluation script on the four demo clips |
| (8/8 exact, adapter and adapter-less paths). Across all 132 real-world clips the match rate |
| is 256/264; the 8 differences are GPU-vs-CPU floating-point noise flipping a greedy argmax, |
| not a difference in weights. |
|
|
| Verified with `torch==2.9.0`, `transformers==4.57.1`. Bumping transformers can change greedy |
| decoding β re-run the parity check after any upgrade. |
|
|
| ## Licence and provenance |
|
|
| MIT, following the licences of the upstream work this builds on: |
|
|
| - [**MotionGPT**](https://github.com/OpenMotionLab/MotionGPT) (MIT) β `lm.safetensors` and the |
| VQ-VAE quantizer derive from its pretrained checkpoint. |
| - [**HumanML3D**](https://github.com/EricGuo5513/HumanML3D) (MIT) β `stats.npz` holds mean/std |
| vectors computed over its features. |
| - [**flan-t5-base**](https://huggingface.co/google/flan-t5-base) (Apache-2.0) β the language |
| model architecture and tokenizer. |
|
|
| HumanML3D is itself derived from **AMASS**, whose distribution policy does not permit |
| redistributing the motion data. **No AMASS or HumanML3D motion data is included here** β this |
| repo contains trained weights and a few hundred aggregate mean/std floats, nothing from which |
| motion sequences could be recovered. |
|
|
| MotionGPT's README notes that its dependencies (SMPL, SMPL-X, PyTorch3D) and the datasets it |
| uses each carry their own licences, which apply to downstream use of these weights as well. |
|
|