Synthid-Bypass-Facedetailer
Face detailing where denoise scales with the face — and the model is yours to pick
- image
- segs
- model
- clip
- vae
- positive
- negative
- refiner_model_opt
- refiner_clip_opt
- refiner_positive_opt
- refiner_negative_opt
- scheduler_func_opt
- segs
- cnet_images
- denoise_values
- denoise_report
Ignore the pack name for a second. This node is a face detailer, and a good one. It ships inside the Synthid-Bypass workflow (the one that re-noses an image through a diffusion pass to scramble Google's SynthID watermark), but the node itself is just the Impact Pack SEGS detail loop with two genuinely useful twists bolted on: it takes the model directly instead of hiding it behind a BASIC_PIPE, and it scales denoise to how much of the frame each face actually occupies. If you ever wanted FaceDetailer's behavior with your own checkpoint wired in and a denoise that stops being a guess, this is the version.
What it actually does
The loop is the same four steps every detailer runs, and you've seen them before: a detector hands you SEGS, the node crops each face, upscales the crop to guide_size, runs a fresh masked sampling pass, and you paste the result back with Impact Pack's SEGSPaste. Where this differs from stock SEGSDetailer is the "ModelSwap" part - instead of a BASIC_PIPE, you wire model, clip, vae, positive, and negative straight in from a checkpoint loader and CLIPTextEncode. That means you can re-render faces with a different checkpoint than the one that made the base image - a face-focused model, a lora you loaded separately, whatever. For the bypass workflow that's load-bearing: the detail pass re-renders the face region with whatever sampling the workflow already has in hand.
The part people actually talk about: adaptive denoise
The base denoise (default 0.1) is what every segment gets if you leave the optional adaptive_denoise toggle off. Turn it on and each face gets its own value:
applied_denoise = clamp(base_denoise * (face_ratio / adaptive_ratio), adaptive_denoise_min, adaptive_denoise_max)
adaptive_ratio (default 0.1) is the face-area share of the frame that maps to your base denoise; faces bigger than that scale denoise up, smaller faces scale it down, and the min/max clamps (defaults 0.05 and 0.35) keep it sane. Then adaptive_mode decides how it's applied: largest_face computes one value from the biggest face and applies it to every segment - good for a single portrait or a group where you want uniform treatment - while per_face gives each detected face its own. The intuition is simple: a face that fills half the frame and a face that's 90 pixels of a 1024 image should not be re-rendered at the same strength. One will be over-processed, the other barely touched.
The outputs you'll actually use
segs- the refined segments; wire intoSEGSPasteto composite back onto the image.denoise_report- aSTRING, one line per segment, logging the bbox, both ratios, and exactly what denoise was applied. Paste it into a text viewer; it's the fastest way to see what the adaptive math decided.cnet_imagesanddenoise_values- ControlNet previews and per-segment denoise values, mostly for debugging or wiring into a display node.
The rest of the sampler inputs (steps default 8, cfg 1.0, sampler_name, scheduler, seed) behave exactly like a normal KSampler, and the optional refiner_* set lets you run a second pass.
Installing it
ComfyUI Manager's "Install Missing Custom Nodes" won't find this one - the README is explicit that it's a bundled pack from the workflow repo. Install manually:
cd ComfyUI/custom_nodes
git clone https://github.com/timothy692/Comfyui-SynthidBypass
then restart ComfyUI. (Or copy the folder into ComfyUI/custom_nodes/Comfyui-SynthidBypass; cloning the full Synthid-Bypass repo into custom_nodes/ also works because the repo root ships a compatibility loader.) It has no Python dependencies of its own, but it imports Impact Pack modules at load, so ComfyUI-Impact-Pack must be installed and enabled or the node throws on load. RES4LYF is optional - it's only needed if you want the exact sampler/scheduler pair the v2 workflow used.
Troubleshooting
- Node not in your list after restart: the pack didn't load. Check for nested folders like
Comfyui-SynthidBypass/Comfyui-SynthidBypass/. - It errors on load: Impact Pack is missing or disabled.
- It refuses to run on an image batch - it raises if you feed more than one image at a time. One frame at a time.
- A report line says
skipped=empty_mask: the detector returned a segment with no mask pixels, and the node skipped it rather than breaking.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| segs | SEGS | — | |
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| guide_size | FLOAT | 51264–16384 | — |
| guide_size_for | BOOLEAN | true | — |
| max_size | FLOAT | 102464–16384 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 81–10000 | — |
| cfg | FLOAT | 1.000–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 1 options: normal | |
| denoise | FLOAT | 0.100.0001–1 | — |
| noise_mask | BOOLEAN | true | — |
| force_inpaint | BOOLEAN | true | — |
| refiner_ratio | FLOAT | 0.200–1 | — |
| batch_size | INT | 11–100 | — |
| cycle | INT | 11–10 | — |
| refiner_model_optopt | MODEL | — | |
| refiner_clip_optopt | CLIP | — | |
| refiner_positive_optopt | CONDITIONING | — | |
| refiner_negative_optopt | CONDITIONING | — | |
| inpaint_modelopt | BOOLEAN | false | — |
| noise_mask_featheropt | INT | 200–100 | — |
| adaptive_denoiseopt | BOOLEAN | false | — |
| adaptive_modeopt | COMBO | largest_face | 2 options: largest_face, per_face |
| adaptive_ratioopt | FLOAT | 0.10000.0001–1 | — |
| adaptive_denoise_minopt | FLOAT | 0.050.0001–1 | — |
| adaptive_denoise_maxopt | FLOAT | 0.350.0001–1 | — |
| scheduler_func_optopt | SCHEDULER_FUNC | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| segs | SEGS | — |
| cnet_images | IMAGE | — |
| denoise_values | FLOAT | — |
| denoise_report | STRING | — |