HelloMeme Image Pipeline
HelloMeme Image Pipeline — where a portrait learns to move
- hm_image_pipeline
- ref_head_pose
- ref_expression
- drive_head_pose
- drive_expression
- IMAGE
- LATENT
This is the payoff node of the HelloMeme image workflow: it takes a reference portrait plus a driving head pose and expression, and returns a new image where the reference face performs the driving performance. Feed it a neutral headshot as the reference and an expression clip as the drive, and you get the headshot pulled into that expression. The pack ships a style-transfer workflow variant too, where the same machinery re-renders a face in a chosen style while keeping its motion. Either way, everything before this node - toolkits, landmarks, pose, expression, the loaded pipeline - exists to feed it.
The honest caveat, from the community reaction when the pack launched: HelloMeme is SD 1.5 under the hood, and the output has that SD character. It tracks expressions and pose accurately - that was always its selling point versus the faster, lighter LivePortrait - but "photoreal" here is "photoreal as far as an SD 1.5 checkpoint can get." Pick your base checkpoint accordingly.
How it works
The pipeline builds control heatmaps from the drive head pose (rotations and translations rendered at 512px), combines them with the drive expression parameters, and runs an img2img pass - strength=1.0, so the reference image is essentially the target, redrawn to satisfy the pose and expression conditioning. The reference pose and expression are fed in as reference conditioning so identity and the original look stay intact. Your text prompt rides along on top of the pack's baked-in default prompt (which it appends your text to, or uses whole if you leave it empty).
The inputs that matter
Most of the work is done upstream; this node is mostly sampling dials:
hm_image_pipeline- the pipeline fromLoad HelloMemeImage Pipeline.ref_head_pose/ref_expression- fromGetHeadPoseandGetExpressionrun on the reference image.drive_head_pose/drive_expression- the same nodes run on the driving source.trans_ratio(default0, range0–1) - how much of the driving head's positional translation carries over. At0the head stays anchored near the reference position (only rotation/expression transfer); crank toward1and the whole head follows the drive's movement. Leave it low unless you specifically want the head to travel.steps(default 25),seed,guidance_scale(default 2.0) - standard sampling dials; HelloMeme's baked-in conditioning does most of the work, so a low guidance scale is normal here, not a mistake.prompt/negative_prompt- leavepromptempty to use the pack default, or add your own (it gets appended).gpu_id- which GPU samples, default0;-1= CPU, which you don't want for this.
Outputs: IMAGE (the generated image) and LATENT (the raw latents, if you want to chain an upscaler or a second pass without re-encoding).
Installing it
Ships in the HelloMeme pack - ComfyUI Manager (hellomeme-api) or:
cd ComfyUI/custom_nodes
git clone https://github.com/HelloVision/ComfyUI_HelloMeme
# restart ComfyUI
Heavy diffusers-stack dependencies install with the pack; models download automatically on first run.
Common issues
- Too much morphing / body movement. This was the top complaint in early user reports, and usually it's the driving source or the crop, not this node. Clean front-on drive, reference cropped so the face fills the frame - the README hammers this exact point.
- Head drifts away from the reference. Lower
trans_ratio. That's literally the dial for it. - Empty prompt, weird output. Empty means "use the pack default," which is a competent portrait prompt. If you type your own, it's appended to the default - don't paste in a full prompt and expect it to be used verbatim.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| hm_image_pipeline | HMIMAGEPIPELINE | — | |
| ref_head_pose | HEAD_POSE | — | |
| ref_expression | EXPRESSION | — | |
| drive_head_pose | HEAD_POSE | — | |
| drive_expression | EXPRESSION | — | |
| trans_ratio | FLOAT | 0.00–1 | — |
| prompt | STRING | — | |
| negative_prompt | STRING | — | |
| steps | INT | 251–10000 | The number of steps used in the denoising process. |
| seed | INT | 00–18446744073709550000 | The random seed used for creating the noise. |
| guidance_scale | FLOAT | 2.00–100 | — |
| gpu_id | INT | 0-1–16 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| LATENT | LATENT | — |