Nodes/Forbidden Vision/Forbidden Vision 🎯 Fixer
ComfyUI Node

Forbidden Vision 🎯 Fixer

The one-node fix for ruined faces in ComfyUI

By luxdelux7·Created about a year ago·Updated about a month ago· 101
Forbidden Vision 🎯 Fixer
  • model
  • vae
  • positive
  • negative
  • image
  • latent
  • clip
  • final_image
  • processed_face
  • side_by_side_comparison
  • final_mask
steps10
cfg_scale3.0
samplereuler_ancestral
schedulersgm_uniform
denoise_strength0.40
seed0
face_selection0
detection_confidence0.75
manual_rotationNone
processing_resolution1024
enable_pre_upscaletrue
upscaler_modelFast 4x (Lanczos)
crop_padding1.6
face_positive_prompt
replace_positive_promptfalse
face_negative_prompt
replace_negative_promptfalse
exclusions
blend_softness8
mask_expansion2
sampling_mask_blur_size21
sampling_mask_blur_strength1.0
enable_color_correctiontrue
enable_segmentationtrue
enable_differential_diffusiontrue
enable_lightness_rescuetrue
enable_final_refinementtrue
offload_models_to_cputrue

The Fixer is the flagship of the Forbidden Vision pack, and it exists because a face that takes up 60×60 pixels of a 1024×1024 render is doomed. That tiny region has almost no latent budget, so it comes out melted no matter how good your checkpoint is. The fix has never been "generate better" - it's "give that region its own pass." ADetailer did this in A1111 with a checkbox; Impact Pack's FaceDetailer does it in ComfyUI with two dozen inputs you're expected to configure yourself. Forbidden Vision's Fixer is the "modern replacement" for both, and it's the closest ComfyUI has come to ADetailer's one-tap ergonomics.

How it works

Two custom models trained from scratch by the pack author do the heavy lifting: a YOLO11 detector finds faces, and a Unet++-style segmentation model traces each one as a mask that includes eyebrows, eyelashes, facial hair, even sunglasses - the details that make the inpaint look natural rather than a skin-colored oval slapped on. On import the pack downloads those from HuggingFace into ComfyUI/models/forbidden_vision automatically. The node then crops each detected face, upscales small ones, runs a fresh inpainting pass at processing_resolution (default 1024), and composites the result back with differential diffusion, color correction, and feathered blending so the patched region matches the original image's lighting and style.

The inputs that matter

You feed it the usual model, vae, positive, and negative conditioning, plus an image or latent. clip is optional - but it's required the moment you use the face prompt fields. The three you'll actually touch:

  • denoise_strength (default 0.4) - the whole personality of the pass. 0.2–0.4 gently tidies a face; 0.7–0.9 reshapes it entirely. At high denoise you'll usually want to change the prompts too, and the README suggests switching to the beta scheduler.
  • face_selection - 0 processes every face; 1 targets the first detected, 2 the second, and so on.
  • detection_confidence (default 0.75) - YOLO's threshold. Most strong detections land at 0.86–0.90; drop it only for extreme stylization or tiny faces.

face_positive_prompt / face_negative_prompt prepend tags to your main conditioning for the face pass only, and exclusions strips tags like "smile" or "glasses" from it. The per-face wildcard syntax is worth knowing: [SEP] assigns different prompts to each detected face, [SKIP] leaves one untouched, and [ASC]/[DSC]/[ASC-SIZE]/[DSC-SIZE] control ordering. It's inherited from Impact Pack, so if you've used that syntax before, it migrates cleanly.

The outputs are generous: final_image (the composite), processed_face, a side_by_side_comparison, and final_mask. Most people just want final_image wired to a Save node.

Install and the gotchas

Install via ComfyUI Manager (search "Forbidden Vision") or:

cd ComfyUI/custom_nodes
git clone https://github.com/luxdelux7/ComfyUI-Forbidden-Vision.git
cd ComfyUI-Forbidden-Vision
pip install -r requirements.txt

Then restart. The dependency list is heavier than most: ultralytics (which is AGPL - same licensing corner ADetailer and Impact Pack live in), timm, segmentation-models-pytorch, kornia, opencv-python-headless. First run downloads the models and can take a minute.

Where people get burned: if the segmentation model fails to load - typically timm missing or a dependency conflict - the node silently falls back to a plain oval mask based on the YOLO bounding box, and users report "why is my mask just an oval?" on the release thread. If you see that, check your install rather than your settings. Also know that the pack monkeypatches CLIPTextEncode to stash the original prompt text in conditioning, which is how exclusions can strip tags from a prompt you wrote in a plain text-encode node. It's a small hack, but it's worth knowing it's there.

Detection failures on heavy stylization or occlusion happen - the author is upfront about it and asks for reports via GitHub issues. And it's AGPL-3.0 licensed, so read that before you ship anything commercial around it.

CategoryForbidden Vision

Inputs (35)

NameTypeDefaultDescription
modelMODEL
vaeVAE
positiveCONDITIONING
negativeCONDITIONING
stepsINT101–100
cfg_scaleFLOAT3.00–30
samplerCOMBOeuler_ancestral44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOsgm_uniform9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoise_strengthFLOAT0.400–1
seedINT00–18446744073709550000
face_selectionINT00–200=All faces, 1=1st face, etc.
detection_confidenceFLOAT0.750.1–1Face detection confidence threshold.
manual_rotationCOMBONoneManually rotate face crop before processing
processing_resolutionINT1024512–2048The resolution for processing.
enable_pre_upscaleBOOLEANtrueEnable to upscale small faces with an AI model before processing.
upscaler_modelCOMBOFast 4x (Lanczos)The model used for pre-upscaling small faces.
crop_paddingFLOAT1.61–3Padding added to the face region before inpaint.
face_positive_promptSTRING
replace_positive_promptBOOLEANfalse
face_negative_promptSTRING
replace_negative_promptBOOLEANfalse
exclusionsSTRINGWords/tags to remove from the main prompt specifically for the face processing step.
blend_softnessINT80–200
mask_expansionINT20–100
sampling_mask_blur_sizeINT211–101
sampling_mask_blur_strengthFLOAT1.00.1–6
enable_color_correctionBOOLEANtrue
enable_segmentationBOOLEANtrueUse AI segmentation. If disabled, creates oval masks.
enable_differential_diffusionBOOLEANtrueBetter blending. At high noise, the mask allows structure changes; at low noise, it locks the background.
enable_lightness_rescueBOOLEANtrueIf the generated face is darker than original, brighten it.
enable_final_refinementBOOLEANtrueRuns a quick 0.05 denoise pass at the end. Cleans artifacts and improves skin texture with sensitive models and higher denoise. Highly recommended.
offload_models_to_cpuBOOLEANtrueMove face detection/segmentation/corrector models from VRAM to RAM after processing. Frees GPU memory for other nodes (e.g. checkpoint swaps in queued workflows). Disable if you're chaining many face passes and want to skip the small reload overhead.
imageoptIMAGEOptional image input. If latent is also provided, latent will be used.
latentoptLATENTOptional latent input. Will be decoded for processing.
clipoptCLIPOptional: Required only if using face prompts.

Outputs (4)

NameTypeDescription
final_imageIMAGE
processed_faceIMAGE
side_by_side_comparisonIMAGE
final_maskMASK