Animate image with UniAnimate
The 12GB node that makes your photo dance
- reference_image
- ref_pose
- pose_sequence
- video
- empty_mask
This is the node the whole pack is named for. Animate image with UniAnimate takes a still photo of a person, a DWPose skeleton sequence from some driving video, and runs a diffusion loop that makes the photo move the way the skeleton moves. It's not a video model in the Wan or Sora sense - it's human image animation, the "make my character do this dance" trick - and it needs about 12GB of VRAM to breathe.
Before you go further: "UniAnimate" these days usually means UniAnimate-DiT, the Wan2.1-based rewrite that Alibaba shipped in 2025. This pack is the older, SD 1.5-based UniAnimate (the original unianimate.github.io project). Same family, different model, different results. If you came here expecting DiT quality, recalibrate - this is the compact, old-school version, and it's still worth a spin for character consistency.
How it works
Mechanically it's a conditioned DDIM diffusion pass. The node needs three ingredients, all of which come from the Align & Generate poses for UniAnimate node (Gen_align_pose):
reference_image- your photo of the personref_pose- the single pose extracted from that photopose_sequence- the per-frame DWPose batch from the driving video
The model then uses an OpenCLIP embedder for identity/texture, the SD 2.1 VAE (v2-1_512-ema-pruned.ckpt), and a temporal UNet (unianimate_16f_32f_non_ema_223000.pth) to generate frames that keep your person's face and clothes while tracking the skeleton. The pose conditions carry the motion; the reference image carries the identity.
The inputs that matter
Most settings can be ignored, but three deserve your attention:
max_frames(default 32) - your VRAM lever. The README says the node eats ~12GB at 32 frames; drop to 24, 16, or 8 to fit smaller cards. Nothing else changes, you just get less video.frame_interval(default 1) - frames to skip in the driving sequence. 2 = every other frame, which trades smoothness for length and speed.useFirstFrame(default false) - flips the reference to the first frame of the pose sequence. The author's trick: generate 32 frames, feed the last frame back in with this on, and chain animations into longer videos.
seed, steps (10–50, default 30), and resolution_x (512 or 768 - the height is set for you) are self-explanatory. At [512, 768] and 32 frames expect roughly seven minutes per generation.
Outputs
video- the generated frames as an IMAGE batch. Pipe it to a video save/preview node.empty_mask- a zero-filled mask matching the output resolution, one per frame. It's a template; if you composite the video onto a background or pass it to a mask-aware tool, this is the placeholder.
Install and gotchas
Manager: search "UniAnimate Nodes for ComfyUI". Or git clone https://github.com/Isi-dev/ComfyUI-UniAnimate-W into custom_nodes/, then restart. You then need the ~14GB of checkpoints in checkpoints/ - python modeldownloader.py pulls them via ModelScope, or grab them manually from the pack's HuggingFace mirror. This node runs on the UniAnimate checkpoint, the SD 2.1 VAE, the OpenCLIP bin, and the two DWPose ONNX files.
Three things burn people: low VRAM (cut max_frames), a pose Gen_align_pose couldn't produce (the cannot convert float infinity to integer error is upstream of this node - check your driving video), and the silent assumption that the reference photo and the driving person face the same direction. The model animates the person; it won't re-aim their gaze for free.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 110–16384 | — |
| steps | INT | 3010–50 | — |
| useFirstFrame | BOOLEAN | false | — |
| reference_image | IMAGE | — | |
| ref_pose | IMAGE | — | |
| pose_sequence | IMAGE | — | |
| frame_interval | INT | 11–8 | — |
| max_frames | INT | 321–1024 | — |
| resolution_x | INT | 512512–768 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | IMAGE | — |
| empty_mask | MASK | — |