Rbaerk's picture
Release TiTok motion encoder code and checkpoint
71dfe4d verified
|
Raw
History Blame Contribute Delete
3.93 kB
---
language:
- en
license: apache-2.0
tags:
- im-animation
- titok
- motion-encoder
- image-feature-extraction
- arxiv:2602.07498
---
# IM-Animation
[Paper](https://arxiv.org/abs/2602.07498) 路 [Project page](https://rabberk.github.io/IM-Animation/) 路 [Motion encoder weights](https://huggingface.co/Rbaerk/IM-Animation-Motion-Encoder)
**IM-Animation: An Implicit Motion Representation for Identity-decoupled Character Animation**
This release contains the final locally retained **TiTok-based motion encoder** implementation and an exported checkpoint. It provides frame-level motion tokens; it does not include the full animation generator or retargeting network. Code and project videos are available in the linked GitHub repository.
## Installation
```bash
git clone https://github.com/rabberk/IM-Animation.git
cd IM-Animation
pip install -r requirements.txt
```
The encoder was verified with PyTorch 2.7.1 on CPU using the exported BF16 weights.
## Download weights
```python
from huggingface_hub import hf_hub_download
hf_hub_download(
repo_id="Rbaerk/IM-Animation-Motion-Encoder",
filename="motion_encoder_latest.safetensors",
local_dir=".",
)
```
The weight file is 607,017,208 bytes (approximately 579 MiB). Its SHA256 and provenance are in [`checkpoint_info.json`](checkpoint_info.json).
## Encode frames
Run from the repository directory:
```python
import torch
from motion_encoder import MotionEncoder
model = MotionEncoder.from_pretrained(device="cpu") # or device="cuda"
frames = torch.rand(1, 3, 256, 256).to(
device=next(model.parameters()).device,
dtype=next(model.parameters()).dtype,
)
with torch.inference_mode():
tokens, metrics = model.encode(frames)
print(tokens.shape) # [1, 12, 1, 32]
```
`frames` must be RGB, normalized to `[0, 1]`, with shape `[N, 3, 256, 256]`.
The training preprocessing pads portrait frames horizontally to a square and resizes them to 256脳256 with bilinear interpolation (`align_corners=False`). The original `HW_encoder_2` preprocessing class is included in `encoder_blocks.py`.
Each frame produces 32 tokens of 12 dimensions. The training integration flattens them into 384 dimensions per frame before retargeting. The encoder processes frames independently; temporal retargeting is outside this release.
## Architecture
- TiTokEncoder: 24 Transformer layers, hidden width 1024, 16 attention heads.
- Patch size 16; 32 learned latent tokens.
- 12-dimensional output projection and a 4096-entry vector-quantization codebook.
- Original `is_legacy=True` token reshape is retained for checkpoint compatibility.
Implementation: `motion_encoder.py` assembles the modules; `encoder_blocks.py` contains the original encoder and preprocessing; `quantizer.py` contains the original VQ implementation.
## Checkpoint provenance and verification
The selected checkpoint is `train_dit_5C_v6_part5/step-12200.safetensors`, dated 2025-11-28 UTC by file modification time. It is the newest checkpoint in the inspected local runs, rather than a claim of best quality or a verified paper-final checkpoint.
Training saved only trainable parameters. The selected checkpoint supplies 300 encoder/latent-token tensors. The frozen VQ codebook is restored from `train_motion_only_full_3C_20joint/step-3700.safetensors`, following the available training initialization code. This yields a complete 301-tensor encoding module. The historical run's frozen state has not been independently verified.
Validation checked tensor byte hashes against their source checkpoints, strict state-dict loading, and exact single-frame output agreement with the available original TiTok implementation. Full video-generation quality was not evaluated in this export.
## Acknowledgments and license
This encoder builds on [TiTok / 1d-tokenizer](https://github.com/bytedance/1d-tokenizer). Source attribution is preserved. See [LICENSE](LICENSE) and [NOTICE](NOTICE).