CS VFX Beauty
A skin-beauty pass that estimates skin tone for you, no mask required
- image
- mask
- IMAGE
- MASK
Most "beauty" nodes in this ecosystem are either a single blur filter with a slider or a fiddly chain of keying nodes that assume you've already got a perfect skin mask. CS VFX Beauty is the CineStyle pack's video-grade skin-cleanup node, and it's a torch port of the 19-pass Matchbox CROK Beauty shader - the kind of multi-pass pipeline Nuke artists know. Feed it your video frames, and it builds a skin matte, smooths blemishes while protecting edges, softens shine, and lets you nudge saturation and hue at the end. No mask? No problem: when colour is auto, it loads a BiSeNet face-parsing model, estimates the clip's skin tone for you, and keys on that.
How it works
The pipeline keys on skin color in HSV using the weights vector (default 6.0, 0.0, 3.0) to build a soft matte. Then a sequence of passes runs in order: matte softening (blur_m), edge-preserving blur (sigma, threshold), dark-spot repair (r_spots_blend), highlight repair (r_h_blend), optional detail restoration (strength, blur_h), shine reduction (blur_s, o_amount), and final skin-tone saturation/hue grading. If you connect a MASK, it's used as the beauty region and the color-estimation area directly - no external matte switch to flip, the node just uses it. Outputs are an RGB image and the final skin matte, so you can reuse that mask elsewhere.
The inputs that matter
image- your frames asIMAGE, single image or batch.mask- optionalMASK. Connect it if you have a good skin region; otherwise BiSeNet does a rough internal estimate (preview only, not an output).proxy_video- optionalVIDEO, used only by the VFX Preview UI for fast scrubbing. Rendering always usesimage.colour-auto(default) estimates the target skin tone from the clip; type a#RRGGBBto bypass estimation entirely.weights- the HSV keying weights string. The VFX Preview splits it into separate Hue/Saturation/Value sliders and writes the result back.
The rest of the sliders map to CROK Beauty's passes - names like sigma / Amount, threshold / Preserve Edges, r_spots_blend / Dark Spots. Defaults are reasonable; adjust in the preview, not blind.
Outputs
IMAGE- the RGB result, no alpha, ready to feed downstream image or video nodes.MASK- the skin matte actually used, 0–1, so you can composite or inspect it.
Installing it
Same pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/chflame163/ComfyUI_CineStyle.git
or ComfyUI Manager → ComfyUI_CineStyle, then restart. The one extra download is the BiSeNet weight, parsing_bisenet.pth, which the node fetches automatically (from FaceXLib's official release or a HuggingFace mirror) on first auto-color run, or you can drop it manually at ComfyUI/models/facexlib/parsing_bisenet.pth. If your environment blocks the auto-download, that's the file to grab by hand.
Where people get burned
- First run downloads weights. The auto skin-tone path needs
parsing_bisenet.pth; if it can't download, you'll get an error telling you exactly where to place the file. It's ~100 MB, not a model marathon. - The preview lies until it doesn't. For inputs generated at runtime, run the workflow once to build the preview cache before opening VFX Preview - the README says this explicitly.
colour=autoneeds skin on screen. If the clip is a landscape with a tiny face, auto-estimation can key the wrong tone. That's exactly when you hardcode a#RRGGBB.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Original foreground image. | |
| colour | STRING | auto | Use auto for clip skin-colour estimation, or enter a #RRGGBB value to bypass automatic estimation. |
| weights | STRING | 6.0, 0.0, 3.0 | HSV keying weights vec3. |
| blur_m | FLOAT | 10.000–100 | — |
| sigma | FLOAT | 10.000–100 | — |
| threshold | FLOAT | 15.000–100 | — |
| r_spots_blend | FLOAT | 0.8000–1 | — |
| r_h_blend | FLOAT | 0.5000–1 | — |
| strength | FLOAT | 0.000–10 | — |
| blur_h | FLOAT | 0.000–50 | — |
| blur_s | FLOAT | 30.000–100 | — |
| o_amount | FLOAT | 0.2000–1 | — |
| sat_amount | FLOAT | 100.00–300 | — |
| hue_amount | FLOAT | 0.00-360–360 | — |
| wait_for_input_cache | BOOLEAN | false | Interrupt execution when this node is reached after caching its input. |
| maskopt | MASK | Optional skin mask. When connected, it is used automatically for the beauty region and colour estimation. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |