Leffa Pose Transfer
Keep the person, steal the pose
- pipe
- person
- target_pose
- image
- densepose
Pose transfer is the sibling of virtual try-on, and it's the one people sleep on. Leffa Pose Transfer takes a photo of a person and a second image showing a pose, then redraws the person in that pose - same face, same outfit, same identity, new stance. Where Leffa's try-on node swaps clothing, this one moves the body. If you've ever wanted a character sheet with the same figure in three different stances, or considered doing frame-by-frame animation from a pose track, this is the node.
How it works
The mechanism is the mirror image of the try-on path. From the LeffaLoader's pose_transfer task - which, worth noting, runs on an SDXL inpainting stack rather than the SD 1.5 one the try-on tasks use - the node takes your two images and assigns them asymmetric roles:
personis the reference: the appearance to preserve. It's what the diffusion model's reference encoder keys on.target_poseis the source: its DensePose body-surface map is extracted, and that map becomes the spatial conditioning that dictates where the body goes.
Because there's no garment to mask out, the agnostic mask is simply all-white - the entire frame is the repainting region - and the SDXL inpainting model redraws the person, guided by the target's DensePose, wearing the reference person's identity. It's the same "condition on DensePose, keep the reference" trick as try-on, just pointed at a whole body instead of a clothing region. The code comments even call it out: source pose, reference appearance.
Inputs
The required set is a trimmed-down version of the try-on node:
pipe- theLEFFA_PIPEfrom a Leffa Loader set topose_transfer. Feed it a try-on pipe and you get a ValueError, not a picture.person- the person whose appearance you're keeping.target_pose- the image whose pose you're borrowing.steps(30),cfg(2.5),seed(42) - the usual dials, and the defaults are fine places to start.
Optionally, ref_acceleration (default off) computes the reference image's features once at the midpoint timestep instead of at every step - noticeably faster, marginally less faithful to the person's details. And restore_size (default on) scales the output back to your source resolution after the internal 768×1024 pass.
Outputs
Two: image - the reposed result, wire it to SaveImage - and densepose, the body-surface map that was extracted from your target_pose. That second output is genuinely useful: if the reposed figure's limbs look wrong, glance at the densepose to see whether the model even read the target pose correctly, or whether your target photo was too small or badly cropped to yield a clean map.
The setup (it's shared with the pack)
Same install as the other Leffa nodes: ComfyUI Manager (search "ComfyUI-Leffa") or clone into ComfyUI/custom_nodes and restart. The one heavy step is the shared ~34 GB weight download into ComfyUI/models/Leffa:
hf download franciszzj/Leffa --local-dir ComfyUI/models/Leffa
Because the whole pack shares that one repo, installing for try-on already gives you pose transfer - no extra fetch. A graph looks like: LoadImage(person) + LoadImage(target_pose) → LeffaLoader (task = pose_transfer) → LeffaPoseTransfer → SaveImage.
Where people get burned
The quality of your target pose image is the whole ballgame. The node has to extract DensePose from it, so a clean full-body shot with the person not cropped at the joints gives you a map worth conditioning on; a tiny thumbnail or a pose with foreshortened limbs gives you a person whose arms do weird things. People do use Leffa frame-by-frame for pose-driven animation, but each frame is a fresh diffusion run at this resolution, so budget time accordingly - and remember that switching the loader between tasks evicts and reloads the diffusion model, so alternating try-on and pose transfer in one session pays a reload tax each time.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | LEFFA_PIPE | — | |
| person | IMAGE | — | |
| target_pose | IMAGE | — | |
| steps | INT | 301–100 | — |
| cfg | FLOAT | 2.50.1–50 | — |
| seed | INT | 420–2147483647 | — |
| ref_accelerationopt | BOOLEAN | false | — |
| restore_sizeopt | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| densepose | IMAGE | — |