Nodes/CRT-Nodes/Ultralytics Enhancer (CRT)
ComfyUI Node

Ultralytics Enhancer (CRT)

Ultralytics Enhancer (CRT)

By PGCRT·Created 2 years ago·Updated a day ago· 132
Ultralytics Enhancer (CRT)
  • image
  • model
  • positive
  • negative
  • vae
  • enhanced_image
  • enhanced_face
  • cropped_face_before
  • enhanced_face_alpha
  • base_face_alpha
face_segm_model
segm_threshold0.50
grow_crop0
sampler_namelcm
schedulersimple
cfg1.0
steps2
denoise1.00
seed1
edit_model_flux2kleinfalse
upscale_megapixel1.5
resize_back_to_originalfalse
multi_face_resolution_strategyoptimal
pre_crop_factor1.00
post_mask_expand10
post_mask_blur12.0
post_mask_taper_borders8
stage1_sigma_factor1.010
stage2_sigma_factor0.990
stage1_sigma_start0.100
stage2_sigma_end1.000
details_amount_stage10.05
details_amount_stage20.10
enable_noise_injectionenable
injection_point0.50
injection_strength0.05
normalize_injected_noiseenable
enhancement_mix1.00
color_match_strength1.00

Ultralytics Enhancer (CRT) is a one-node face detailer: detect every face with a YOLO segmentation model, crop each one, upscale the crop, run a fresh low-step sampling pass on it, and composite the result back with a feathered mask and color matching. If you've used Impact Pack's FaceDetailer or A1111's ADetailer, you know the pattern - this is the CRT take on it, wrapped into a single node with the detect-crop-refine loop hidden inside.

It exists because of the same structural problem the KB documents for detailing: a face occupying 80×80 pixels of a 1024² render gets 80×80 worth of model attention, so it comes out soft or mangled no matter how good your checkpoint is. The fix is always to give that region its own pass at proper resolution. What distinguishes this node is how opinionated it is about that pass. Defaults are tuned for low-step distilled models - sampler_name lcm, cfg 1.0, steps 2 - which is the FLUX-era workflow: a two-step refine with the model's own distill schedule, not a heavy SD1.5-style ten-step re-render.

Mechanically it's a pipeline you can almost read off the input list. First it runs your segmentation model over the image (face_segm_model from models/ultralytics/segm, segm_threshold for confidence). Each detection becomes a crop, tightened by pre_crop_factor, expanded by grow_crop, and upscaled to upscale_megapixel (default 1.5 MP) so the sampling pass has real pixel budget. The refine itself is a two-stage schedule (stage1_sigma_start/stage2_sigma_end, details_amount_stage1/2) with optional noise injection mid-schedule (enable_noise_injection, injection_point, injection_strength) - the "injection" in the class name. Then the enhanced face is blended back with enhancement_mix (0.0 = keep original, 1.0 = full enhancement) and color_match_strength, with post_mask_expand, post_mask_blur and post_mask_taper_borders controlling how the patched region feathers into the original so there's no hard clipping line.

Inputs a beginner actually sets: image, model (your checkpoint), positive (keep it short - a face prompt), face_segm_model (pick the YOLO segm file you've dropped in), segm_threshold, upscale_megapixel, enhancement_mix, and color_match_strength. resize_back_to_original is worth knowing: on by default it puts the refined crop back at the original size; turn it off and the whole input gets upscaled so the refined crops keep extra detail - with multi_face_resolution_strategy deciding the global scale for multi-face shots. edit_model_flux2klein switches on per-crop reference-latent conditioning if you're using an edit model. Optional negative and vae plug in if your setup uses them.

Outputs: enhanced_image (the composited result - the one you actually use), plus enhanced_face, cropped_face_before, and the two alpha layers (enhanced_face_alpha, base_face_alpha) if you want to build your own composite instead of trusting the default.

Install is the pack's, with one extra step: the detection path needs a YOLO segmentation .pt model sitting in models/ultralytics/segm (the folder CRT registers at startup) - the node's dropdown is empty until you put one there, and the bbox-format models/ultralytics/bbox folder is used by related nodes. That brings the dependency you should actually care about: ultralytics. Beyond it being in the pack's requirements, the KB flags the December 2024 Ultralytics supply-chain compromise that reached ComfyUI via Impact Pack. Pin ultralytics to a post-incident version and install through trusted channels, not random wheels.

Troubleshooting, grounded in the code: if you see "No detections found" in the console, either the model path is wrong, the folder's empty, or segm_threshold is too strict - drop it toward 0.3. Defaults assume a distilled/flow-matching model at cfg 1; if you're running a standard SDXL checkpoint, raise steps and cfg or the faces will look unfinished. And if the patch is visible, bump post_mask_blur and post_mask_taper_borders before you touch enhancement_mix.

CategoryCRT/Sampling

Inputs (34)

NameTypeDefaultDescription
imageIMAGE
face_segm_modelCOMBO0 options:
segm_thresholdFLOAT0.500–1
grow_cropINT00–512Expands each detected crop region by this many pixels before enhancement
modelMODEL
positiveCONDITIONING
sampler_nameCOMBOlcm44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOsimple9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
cfgFLOAT1.00–100Classifier Free Guidance scale. Higher values follow the prompt more closely.
stepsINT21–100
denoiseFLOAT1.000–1Amount of denoising to apply. 1.0 = full denoising (txt2img), 0.5-0.8 typical for img2img.
seedINT10–18446744073709550000
edit_model_flux2kleinBOOLEANfalseEnable per-crop reference latent conditioning for edit models like flux2klein
upscale_megapixelFLOAT1.50.1–16Target megapixels used to upscale each crop before enhancement
resize_back_to_originalBOOLEANfalseIf disabled, the whole input is upscaled so refined crops can keep higher detail
multi_face_resolution_strategyCOMBOoptimalUsed only when resize_back_to_original is False to decide global upscale for multi-face inputs
pre_crop_factorFLOAT1.000.1–1Tightens each SEGS crop around its center before enhancement. Lower is tighter.
post_mask_expandINT10-64–64
post_mask_blurFLOAT12.00–64
post_mask_taper_bordersINT80–128Fades the mask edges to black to prevent hard clipping lines
stage1_sigma_factorFLOAT1.0100–100
stage2_sigma_factorFLOAT0.9900–100
stage1_sigma_startFLOAT0.1000–1
stage2_sigma_endFLOAT1.0000–1
details_amount_stage1FLOAT0.05-5–5
details_amount_stage2FLOAT0.10-5–5
enable_noise_injectionCOMBOenableEnable noise injection during sampling
injection_pointFLOAT0.500–1Percentage of steps after which to inject noise
injection_strengthFLOAT0.05-20–20Strength of injected noise
normalize_injected_noiseCOMBOenableNormalize injected noise to match latent statistics
enhancement_mixFLOAT1.000–1Mix between original (0.0) and enhanced (1.0) face. 0.5 = 50/50 blend
color_match_strengthFLOAT1.000–2Strength of color matching between original and enhanced face. 0.0 = disabled, 1.0 = full matching
negativeoptCONDITIONING
vaeoptVAE

Outputs (5)

NameTypeDescription
enhanced_imageIMAGE
enhanced_faceIMAGE
cropped_face_beforeIMAGE
enhanced_face_alphaIMAGE
base_face_alphaIMAGE