ViBES-T2M / README.md
JuzeZhang's picture
Upload README.md with huggingface_hub
1a25101 verified
|
Raw
History Blame Contribute Delete
3.47 kB
---
license: other
license_name: research-only
tags:
- text-to-motion
- motion-generation
- humanml3d
- mixture-of-experts
language: en
---
# ViBES-T2M (Qwen-MoME): frozen-LLM text-to-motion at specialist-SOTA quality
Text-to-motion model in the ViBES AR-MoME (mixture-of-modality-experts) architecture: a **fully
frozen Qwen3-1.7B** text backbone plus a narrow trainable motion expert (~0.27B). The text LLM is
untouched β€” a visibility rule (text attends only to text; motion attends causally to text+motion)
makes freezing exact, so the base model's language ability is fully preserved.
## Results (HumanML3D test, Guo et al. protocol, 20 replications)
| Model | Params (trainable) | Frozen text LLM | R@1 | R@3 | FID |
|---|---|---|---|---|---|
| T2M-GPT | full | no | 0.492 | 0.679 | 0.141 |
| MoMask | full | no | 0.521 | 0.807 | 0.045 |
| **ViBES-T2M (this)** | **0.27B** | **yes** | **0.489** | **0.769** | **0.265** |
R@1 on par with T2M-GPT while keeping the entire conversational LLM intact.
## Demos
GT | ViBES-T2M (frozen 1.7B) | ViBES-9B:
*"a man walks forward, then squats to pick something up with both hands, stands back up, and resumes walking"*
![demo1](assets/demo_008463.gif)
*"the man runs backwards"*
![demo2](assets/demo_009613.gif)
## Files
- `vibes_t2m_qwen_mome_1p7b.pt` β€” motion-expert weights (`mot_state`), training config, metrics.
The frozen base is downloaded from `Qwen/Qwen3-1.7B` at load time.
- `modeling_qwen_mome.py` β€” self-contained model definition (needs `transformers` with Qwen3).
## Motion tokenizer
MotionGPT's public HumanML3D VQ-VAE (`motiongpt_s3_h3d.tar`, 512 codes, 4x temporal downsample,
263-D HumanML3D features). Motion vocab = 514 (512 codes + BOS/EOS). Decode generated codes with
that VQ-VAE + the Comp_v6_KLD01 mean/std.
## Usage
```python
import torch
from modeling_qwen_mome import QwenMoMEForT2M
ck = torch.load("vibes_t2m_qwen_mome_1p7b.pt", map_location="cpu", weights_only=False)
model = QwenMoMEForT2M("Qwen/Qwen3-1.7B", d_mot=512, ffn_mot=4096, mot_vocab=514)
model.load_state_dict(ck["mot_state"], strict=False) # base.* comes from the HF download
model = model.cuda().eval()
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-1.7B")
text = "Give me a gesture that corresponds to a person walks forward then squats down"
ids = torch.tensor([tok(text, add_special_tokens=False)["input_ids"]]).cuda()
codes = model.generate_motion(ids, max_new=60, greedy=False,
temperature=0.7, top_p=0.9, cfg_scale=2.5)
# codes: MotionGPT-512 VQ indices -> decode with motiongpt_s3_h3d.tar to 263-D motion
```
Recommended decoding: sampling `temperature=0.7, top_p=0.9` with classifier-free guidance
`cfg_scale` 2.5–3 (the model was trained with 10% caption dropout).
## Training recipe (for reproduction)
Frozen Qwen3-1.7B; per-layer motion expert (q/k/v/o + q/k-norm + RMSNorms + SwiGLU 512β†’4096),
own 514-token embedding and untied head; plain-arange positions; motion-only shifted CE;
bs 16, lr 2e-4 cosine, wd 0.05, clip 1.0, caption-dropout 0.1; peak at ~10k steps
(select checkpoints by generation quality on the official val split, not teacher-forced loss).
Plain PyTorch bf16 (no DeepSpeed).
## License
Research use only. The frozen backbone follows the Qwen3 license; the motion tokenizer follows
MotionGPT's license; HumanML3D data terms apply.
Part of the ViBES project (speech-language-behavior modeling).