Nodes/Comfyui-SynthidBypass/Synthid-Bypass-Facedetailer
ComfyUI Node

Synthid-Bypass-Facedetailer

Face detailing where denoise scales with the face — and the model is yours to pick

By timothy692·Created 3 months ago·Updated 3 months ago· 0
Synthid-Bypass-Facedetailer
  • 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
◄guide_size512►
◄guide_size_fortrue►
◄max_size1024►
◄seed0►
◄steps8►
◄cfg1.00►
◄sampler_name▾►
◄scheduler▾►
◄denoise0.10►
◄noise_masktrue►
◄force_inpainttrue►
◄refiner_ratio0.20►
◄batch_size1►
◄cycle1►
◄inpaint_modelfalse►
◄noise_mask_feather20►
◄adaptive_denoisefalse►
◄adaptive_modelargest_face►
◄adaptive_ratio0.1000►
◄adaptive_denoise_min0.05►
◄adaptive_denoise_max0.35►

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 into SEGSPaste to composite back onto the image.
  • denoise_report - a STRING, 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_images and denoise_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.
CategorySynthidBypass

Inputs (33)

NameTypeDefaultDescription
imageIMAGE—
segsSEGS—
modelMODEL—
clipCLIP—
vaeVAE—
positiveCONDITIONING—
negativeCONDITIONING—
guide_sizeFLOAT51264–16384—
guide_size_forBOOLEANtrue—
max_sizeFLOAT102464–16384—
seedINT00–18446744073709550000—
stepsINT81–10000—
cfgFLOAT1.000–100—
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO1 options: normal
denoiseFLOAT0.100.0001–1—
noise_maskBOOLEANtrue—
force_inpaintBOOLEANtrue—
refiner_ratioFLOAT0.200–1—
batch_sizeINT11–100—
cycleINT11–10—
refiner_model_optoptMODEL—
refiner_clip_optoptCLIP—
refiner_positive_optoptCONDITIONING—
refiner_negative_optoptCONDITIONING—
inpaint_modeloptBOOLEANfalse—
noise_mask_featheroptINT200–100—
adaptive_denoiseoptBOOLEANfalse—
adaptive_modeoptCOMBOlargest_face2 options: largest_face, per_face
adaptive_ratiooptFLOAT0.10000.0001–1—
adaptive_denoise_minoptFLOAT0.050.0001–1—
adaptive_denoise_maxoptFLOAT0.350.0001–1—
scheduler_func_optoptSCHEDULER_FUNC—

Outputs (4)

NameTypeDescription
segsSEGS—
cnet_imagesIMAGE—
denoise_valuesFLOAT—
denoise_reportSTRING—