File size: 4,853 Bytes
d5e804f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | ---
library_name: hftrainer
pipeline_tag: other
tags:
- motion-generation
- text-to-motion
- human-human-interaction
- intergen
- interhuman
license: other
---
<!-- This model card is synchronized from docs/model_zoo/intergen.md by tools/sync_model_zoo_cards.py. -->
# InterGen — Diffusion-based Multi-human Motion Generation
Two-person text-to-motion baseline integrated into the hftrainer Model Zoo. The
reproduction is **self-contained and independent of external source trees**:
InterGen's inference runtime lives in
`hftrainer.models.motion.intergen.network`, and the checkpoint plus
normalization stats live in `checkpoints/intergen/hftrainer_interhuman`.
| | |
|---|---|
| **Task** | Two-person Text-to-Motion |
| **Bundle** | `InterGenBundle` |
| **Processed HF artifact** | [`ZeyuLing/hftrainer-intergen-interhuman`](https://huggingface.co/ZeyuLing/hftrainer-intergen-interhuman) |
| **Local artifact** | `checkpoints/intergen/hftrainer_interhuman` |
| **Motion representation** | **InterHuman native-262** per person, 30 fps |
| **Text encoder** | CLIP ViT-L/14@336px (frozen) |
| **Paper** | *InterGen: Diffusion-based Multi-human Motion Generation under Complex Interactions*, CVPR 2024 — [arXiv:2304.05684](https://arxiv.org/abs/2304.05684) |
| **Original code** | https://github.com/tr3e/intergen |
## Weights
| Artifact | Location | Contents | Status |
|---|---|---|---|
| InterGen InterHuman | `checkpoints/intergen/hftrainer_interhuman` / [`ZeyuLing/hftrainer-intergen-interhuman`](https://huggingface.co/ZeyuLing/hftrainer-intergen-interhuman) | `intergen.ckpt`, `global_mean.npy`, `global_std.npy`, `intergen_config.json`, generated `README.md` | hftrainer inference artifact |
Load from Hugging Face:
```python
from hftrainer.models.motion.intergen import InterGenBundle
bundle = InterGenBundle.from_pretrained(
"ZeyuLing/hftrainer-intergen-interhuman",
device="cuda",
)
motion = bundle.generate(
["two people shake hands and then walk apart"],
motion_len=120,
seed=1234,
) # (1, 120, 2, 262), denormalized InterHuman native-262
```
Use the local artifact in the same way:
```python
from hftrainer.models.motion.intergen import InterGenBundle
bundle = InterGenBundle.from_pretrained(
"checkpoints/intergen/hftrainer_interhuman",
device="cuda",
)
motion = bundle.generate(
["one person walks toward another person"],
motion_len=210,
seed=123,
) # (B, T, 2, 262), denormalized InterHuman native-262
```
The runtime never imports `third_party/intergen`, `ref_repo`, `_vendor`, or a
copied upstream package path. `InterGenBundle` loads the native hftrainer
network modules and the artifact stats directly.
The Hub checkpoint is an inference-only hftrainer artifact: `intergen.ckpt`
contains the model `state_dict` and lightweight metadata, while optimizer,
callback, scheduler, and PyTorch-Lightning loop states are removed.
## Motion Representation
InterGen uses the **InterHuman native-262** feature per person:
| Slice | Dim | Meaning |
|---|---:|---|
| joint positions | 66 | 22 joints x xyz |
| joint velocities | 66 | 22 joints x xyz velocity |
| local rotations | 126 | 21 joints x 6D rotation |
| foot contacts | 4 | binary contact labels |
`InterGenBundle.generate` returns `(B, T, 2, 262)` after de-normalization with
the packaged InterGen training stats. Use
`hftrainer.motion.representation.interhuman262` for SMPL-X / joints conversion
when needed.
For visualization, the model-zoo web viewer fits the 262 joint-position block
to a body-only SMPL mesh. That mesh bridge is a viewer convenience; the
canonical model output and evaluator input remain native InterHuman-262.
## Evaluation
The official InterGen evaluation path is InterCLIP over native InterHuman-262
packs. In hftrainer this is:
```bash
python3 tools/eval_interclip_2p_native262.py \
--gt outputs/evaluation/interhuman_gt_native262.npz \
--pred InterGen=outputs/evaluation/intergen_native262.npz \
--out-json outputs/evaluation/intergen_interclip262_metrics.json
```
Input packs are `.npz` files with `m1`, `m2`, `lens`, and `texts` arrays:
```python
np.savez(path, m1=m1, m2=m2, lens=lens, texts=texts)
```
## Verification
Parity with the original source tree was checked on a short deterministic
sample:
| Check | Result |
|---|---:|
| checkpoint load missing / unexpected | 0 / 0 |
| source vs hftrainer output max abs diff | 0.0 |
| source vs hftrainer output mean abs diff | 0.0 |
| artifact reload smoke | `Bundle.from_pretrained(...)` + one text prompt |
The parity run used the same checkpoint, prompt, seed, and the default
`ddim50` sampling strategy on a short sequence. The current viewer smoke was
also checked on `"two people shake hands and then walk apart"` with
`motion_len=120`, `seed=1234`; the generated InterHuman-262 output was fitted
to SMPL for inspection.
|