Nodes/ComfyUI LC123 Nodes/LC Skin Master ✨ (BETA)
ComfyUI Node

LC Skin Master ✨ (BETA)

Fixing AI skin without another diffusion pass

By lonecatone23·Created 3 months ago·Updated about 14 hours ago· 48
LC Skin Master ✨ (BETA)
  • image
  • mask
  • image
  • skin_mask
◄presetNatural►
◄strength1.00►
◄clean0.30►
◄pores1.00►
◄add_pores0.00►
◄pore_size1.00►
◄even_skin0.30►
◄wrinkles-0.10►
◄even_colour0.20►
◄pigmentation0.00►
◄eye_detail0.50►
◄warmth-0.20►
◄brightness0.05►
◄rosy0.03►
◄saturation-0.05►
◄shadow_lift0.10►
◄seed0►
◄delicate_skintrue►
◄skin_match1.00►

The tell nobody's model can shake

Too-smooth skin is the oldest complaint in this hobby and still the first thing people say about a brand-new architecture. You can swap the sampler, stack a skin LoRA, rerun the whole render - or grade the skin you already have. LC Skin Master ✨ (BETA) does the last one: find the skin, run the whole retouch chain on it, hand the image back. No second sampling pass, no VAE round trip to shift your colours.

That last point matters. A detailer pass - FaceDetailer, ADetailer, whatever - re-diffuses the face, so it can reshuffle the eyes and drift the colour in the region it touched. Skin Master is post-processing: it can't invent a better iris, and it can't wreck the one you had. Two different jobs, constantly mixed up.

How it works

One skin map, built first and reused by every step. The node detects faces, parses each crop into labels (skin, brows, eyes, lips, cloth, hair, hat…), pulls a person matte, then learns what not skin looks like from the cloth and hair around the face - which is how a skin-coloured parka stays out. Skin finding runs downsized to 1024px on the long side; the retouch runs at full resolution on your GPU.

Then each band gets touched exactly once, in order: fine band for grit, pores and added pore relief; mid band for blotches and lines; character work (sun-positioned freckles, deepened creases, brows and lashes); tone and colour last, in Lab, on finished skin. Everything is sized to the face width rather than the picture, so pores stay pore-sized at 4K. The retouch maths and skin finding come from sd-living-skin, the pore relief from the SkinDetailer lineage - both MIT.

The inputs that actually matter

image in, image and skin_mask out. The mask is white where skin was found, and you want to look at it before you trust anything else - the README's own first tip is exactly that.

preset is how you start. Natural, Clean Even Tone, Soft Beauty, Editorial Detail, Real Skin Restore, Mature Skin, Weathered, Body Skin, Sun-Kissed. Real Skin Restore is the one for plastic AI skin; Weathered and Mature Skin are the two that don't try to make everyone 25. Touch any slider and it flips to Custom.

strength is a global wet/dry mix, and it stays yours even when a preset is selected - so pick Real Skin Restore and dial strength to 0.6 rather than hand-tuning eight sliders.

Of the rest: clean takes out speckle and colour noise without eating freckles, pores (0–2, 1 = untouched) crisps or eases the skin's own texture, add_pores fakes relief onto skin that has none, even_skin and even_colour even blotches and redness, wrinkles softens creases below 0 and deepens what's already there above 0, eye_detail needs a face, and warmth / brightness / rosy / saturation / shadow_lift are the grade at the end. Keep pores at 1 or above with pigmentation, or you get crisp freckles on softened skin, which reads as painted on. seed only changes the added pores and freckles.

Optional: mask overrides where (wire a person mask for body skin - unwired, faces are found and body skin only partly), delicate_skin treats lips gently, skin_match above 1 finds more skin and more skin-coloured cloth.

Install

ComfyUI Manager → search ComfyUI_LC123_nodes → install → restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git

Check that __init__.py sits directly inside ComfyUI_LC123_nodes/, then restart and hard-refresh the browser (Ctrl+F5).

The pack ships no requirements.txt - it runs on torch and numpy that ComfyUI already has. But skin finding wants facexlib, and nothing installs it for you:

python -m pip install facexlib

First run downloads about 80 MB of models into ComfyUI/models/facexlib.

Where people get burned

Check the console. If you see [LC Skin Master] face detection unavailable or person matte unavailable, facexlib isn't installed. The node still runs - it falls back to a colour-based guess - but with no faces found you lose eye_detail, the sun map that places freckles, and the face-width sizing on pores. It looks like a mediocre version of the node rather than a broken one, which is the sneaky part.

Clothing leaking into the mask? Lower skin_match first, then wire a proper person mask. [LC Skin Master] Natural: 1 face(s), skin 18% of the picture in the console tells you what it thinks it found.

Don't ask it to fix anatomy. Wrong eyes, mangled hands, a face that isn't a face - that's a detailer or an inpaint, per the usual detect-mask-rediffuse loop. Skin Master is the finishing pass, not the repair pass.

Slot it in the right place

After your upscale, before Depth FX, bloom and grain - and before LC Sharpen Pro, not after. Wire skin_mask into Sharpen Pro's skin_mask so its skin protection covers all the skin instead of guessing from colour.

And since this is a BETA node from a one-person pack with no community footprint to speak of: save the workflow the moment you like the result. Slider defaults shifting in a point release is exactly the kind of thing these packs do.

CategoryLC123/image

Inputs (21)

NameTypeDefaultDescription
imageIMAGE—
presetCOMBONaturalNatural: grit out, blemishes evened, a touch cooler, pores and character kept. Clean Even Tone, Soft Beauty, Editorial Detail (close-ups), Real Skin Restore (plastic skin), Mature Skin (age kept), Weathered (lines deepened), Body Skin, Sun-Kissed (freckles). Moving a slider switches to Custom.
strengthFLOAT1.000–10 = original, 1 = everything below at full.
cleanFLOAT0.300–1Grit out: pixel speckle and colour noise on the skin. Pores and freckles stay.
poresFLOAT1.000–2The skin's own fine texture: 1 = as it is, higher = crisper, lower = softer. Keep at 1 or more with pigmentation.
add_poresFLOAT0.000–1Real pore relief from a skin photo, on skin that has none (plastic AI skin). Skin that already has detail gets less.
pore_sizeFLOAT1.000.5–2Size of the added pores and freckles. 1 = sized to the face.
even_skinFLOAT0.300–1Spots, blotches and uneven patches evened. The pores and the face's shape are kept.
wrinklesFLOAT-0.10-1–1Below 0 softens creases and lines. Above 0 deepens the lines already there into real creases.
even_colourFLOAT0.200–1Redness and colour patches pulled towards the skin's own colour.
pigmentationFLOAT0.000–1Freckles where the sun lands (nose, cheekbones, forehead), grown from the ones already there and in their colour.
eye_detailFLOAT0.500–2Brows and lashes: crisper and deeper. Needs a face.
warmthFLOAT-0.20-1–1Below 0 cooler (calms orange AI skin), above 0 warmer.
brightnessFLOAT0.05-0.5–1Lighter or darker skin. Highlights are eased off.
rosyFLOAT0.03-0.5–0.5Pinker or less pink.
saturationFLOAT-0.05-0.5–0.5More or less colour in the skin.
shadow_liftFLOAT0.100–1Opens up dark skin in shadow.
seedINT00–4294967295Changes the added pores and freckles.
maskoptMASKSkin to work on (white). For body skin wire LC Person Mask (face + body). Unwired: faces are found for you, body skin only partly (facexlib, about 80 MB downloaded into models/facexlib on the first run).
delicate_skinoptBOOLEANtrueLips and other delicate skin are found and treated lightly, their colour kept.
skin_matchoptFLOAT1.000.5–2Higher finds more skin (and more skin-coloured cloth).

Outputs (2)

NameTypeDescription
imageIMAGE—
skin_maskMASK—