StableMakeup_Sampler
The Node That Actually Puts the Makeup On
- id_image
- makeup_image
- model
- image
StableMakeup_Sampler is where the Stable-Makeup magic actually happens. You feed it two images - a face to decorate and a photo of the makeup look you want - and it returns a new image of the first face wearing the second's makeup. It's the only consumer of the MAKEUP_MODEL that StableMakeup_LoadModel produces, and the two nodes form a complete, self-contained mini-pipeline. No KSampler, no prompt, no seed. Just two pictures in, one out.
How it works
The sampler runs a four-step dance under the hood:
- Both images get upscaled to the
width/heightyou set. - A face detector (
mobilenetorresnet) finds the face in the identity image. - SPIGA, a facial-landmark model, maps that face and renders a landmark-conditioning image (a rough "pose map" of eyes, nose, mouth).
- The makeup detail encoder embeds the makeup reference through its CLIP image encoder - that embedding is the prompt - then the identity and pose ControlNets guide the UNet denoise so the result keeps your subject's face and structure while adopting the reference's makeup.
That's also why the default cfg is 1.6 instead of the 7 you're used to. There's no text prompt here; an image embedding is doing the steering, and image-prompt conditioning responds to much lower guidance. If you crank cfg toward 30 you'll probably get a mess.
The inputs you'll actually set
- id_image - the face that stays. makeup_image - the look that gets transferred. Both plain
IMAGEinputs, so any LoadImage / image-generating node works. - model - the
MAKEUP_MODELoutput ofStableMakeup_LoadModel. - facedetector -
mobilenet(usesmobilenet0.25_Final.pth) orresnet(usesresnet50.pth). ResNet is the more robust detector if faces are small or angled. - dataname - which SPIGA landmark model to use. Stick with
300wpublic: the README only documents downloadingspiga_300wpublic.pt. The other options (300wprivate,merlrav,wflw) expect their ownspiga_*.ptfiles inmodels/stable_makeupthat the README never tells you to fetch. - steps (default 30), width/height (default 512, 256–768, step 64). This is an SD 1.5 model; 512–640 is the happy zone.
Output
One image. Wire it to a PreviewImage or SaveImage like anything else.
Gotchas worth knowing before you get excited
- Silent black output. If SPIGA can't find a face (profile shots, tiny faces, heavy occlusion), the code substitutes a black image and keeps going. You get a black rectangle, not an error. Re-run with a clearer front-facing photo.
- No seed, no prompt. Variation means re-running. The trigger words you might have set on the loader side don't reach this node - there's no text in this pipeline.
- Set expectations on what "makeup" means here. A community user who tried it described it as basic makeup - eyeshadow, lips, nose, eyebrows, blush. Detailed hand-drawn face patterns don't transfer. If you need pattern-on-face work, people drift toward instruction-editing LoRAs on Flux Fill instead.
- Heavy. It inherits the full float32 SD 1.5 pipeline from the loader node, so this is not a fast or cheap sampler. First run is especially slow because the loader had to spin everything up.
- Install is the same as the loader: ComfyUI Manager ("Stable Makeup") or
git clone https://github.com/smthemex/ComfyUI_Stable_Makeupintocustom_nodes,pip install -r requirements.txt(justinsightface), and the model files intomodels/stable_makeup- the threepytorch_model*.bin, a face detector,spiga_300wpublic.pt, plus an SD 1.5 checkpoint andclip_l.safetensors.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| id_image | IMAGE | — | |
| makeup_image | IMAGE | — | |
| model | MAKEUP_MODEL | — | |
| facedetector | COMBO | 2 options: mobilenet, resnet | |
| dataname | COMBO | 4 options: 300wpublic, 300wprivate, merlrav, wflw | |
| cfg | FLOAT | 1.60–30 | — |
| steps | INT | 301–10000 | — |
| width | INT | 512256–768 | — |
| height | INT | 512256–768 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |