Nodes/Frog Node Pack/🐸 Detailer
ComfyUI Node

🐸 Detailer

Face, hands, and body detailer that knows when to leave a face alone

By RabbitThatIsPinkΒ·Created 3 months agoΒ·Updated 24 days agoΒ· 1
🐸 Detailer
  • image
  • basic_pipe
  • model
  • clip
  • vae
  • positive
  • negative
  • face_mask
  • face_mask_2
  • face_mask_3
  • hands_mask
  • body_mask
  • image
  • debug
β—„seed0β–Ί
β—„steps12β–Ί
β—„cfg2.0β–Ί
β—„sampler_nameer_sdeβ–Ί
β—„schedulerbeta57β–Ί
β—„upscale_to512β–Ί
β—„padding32β–Ί
β—„feather8β–Ί
β—„max_upscale_ratio4.0β–Ί
β—„min_region_px48β–Ί
β—„resize_modebicubicβ–Ί
β—„antialiastrueβ–Ί
β—„face_enabledtrueβ–Ί
β—„face_denoise0.35β–Ί
β—„auto_eye_colortrueβ–Ί
β—„hands_enabledtrueβ–Ί
β—„hands_denoise0.40β–Ί
β—„body_enabledfalseβ–Ί
β—„body_denoise0.30β–Ί
β—„face_promptdetailed face, detailed eyes, symmetrical eyes, sharp iris, clean linework, high qualityβ–Ί
β—„hands_promptdetailed hands, five fingers, correct finger anatomy, clean fingernails, no extra fingersβ–Ί
β—„body_promptdetailed clothing, fabric texture, clean linework, high qualityβ–Ί

Frog Detailer is the pack's answer to the ruined-face problem - the fix-the-small-broken-parts pass every anime workflow eventually needs. If you know ADetailer from A1111 or FaceDetailer from Impact Pack, you know the loop: crop the bad region, upscale it, re-render it at a resolution the model can actually resolve, paste it back. This node is that loop, rebuilt around masks, and tuned for Anima. The README tags it WIP, so treat it as the powerful-but-not-quite-finished tool it is.

The key difference from a stock FaceDetailer is that this thing is mask-first and multi-region. Instead of a built-in YOLO detector deciding what a face is, you hand it masks - a face_mask, an optional second and third character's face_mask_2/face_mask_3, a hands_mask, and a body_mask - and it runs an isolated pass per region. That isolation is deliberate and it's the smart part: each character's face is processed as its own pass with its own sampled eye color, so two characters' eye colors don't bleed into each other. The masks come from the pack's own 🐸 Florence2+SAM Masker, which is exactly what that node's outputs are built to feed.

The inputs that matter

There are a lot of inputs, but the ones that matter most are the guards against over-processing, because that's where detailers wreck images:

  • max_upscale_ratio - the hard cap on how much a crop can be enlarged. The tooltip gives the worked example: a 48Γ—48 face at 4Γ— becomes 192Γ—192 (safe), but uncapped it'd become 10.7Γ— at upscale_to=512 and the model would generate a new face from scratch. Lower is safer. This is the single most important knob.
  • min_region_px - skip any region whose shorter side is below this many pixels. Prevents near-invisible faces from being over-processed into monsters. Set 0 to disable.
  • face_denoise / hands_denoise / body_denoise - how much of the region gets regenerated. Defaults are 0.35/0.4/0.3, and the Anima defaults elsewhere in the node (12 steps, CFG 2, er_sde + beta57) are tuned accordingly.
  • auto_eye_color - samples the dominant eye color from each face mask and prepends it to the face conditioning. Leave it on; it's what stops eye-color drift.
  • face_prompt / hands_prompt / body_prompt - the extra positive text for each pass, with sane defaults like "detailed face, detailed eyes, symmetrical eyes…". Note the tooltip says don't add eye color to face_prompt - that's auto-handled.

The basic_pipe input overrides the individual model/clip/vae/positive/negative inputs when connected, and the clip is required for region prompts to work.

What comes out

image - the detailed result - and debug, a string logging what each pass did. The debug output is your friend here; if a pass got skipped, it's why.

Installing it

Pack install:

cd ComfyUI/custom_nodes
git clone https://github.com/RabbitThatIsPink/FrogNodePack

or ComfyUI Manager β†’ "Frog Node Pack". No extra dependencies - but remember the masks come from elsewhere, so if you're not feeding this node masks from FloSAM or another source, it has nothing to do.

Where people trip

The #1 mistake is wiring no masks and expecting detection. This node doesn't detect anything - no mask input, no pass. Feed it garbage masks and it'll happily re-render garbage regions. The second trap is cranking upscale_to or leaving max_upscale_ratio high: on genuinely small faces you get the "new face from scratch" look, which is how detailers earn their reputation as identity destroyers. Start conservative - upscale_to 512, ratio 4, denoise near 0.35 - and raise from there. And because it's WIP, back up your workflow JSON before the pack updates.

Category🐸 Node Pack

Inputs (34)

NameTypeDefaultDescription
imageIMAGEβ€”
seedINT00–18446744073709550000β€”
stepsINT121–150ANIMA: 8–15 steps is sufficient. Higher has diminishing returns.
cfgFLOAT2.00–30ANIMA: 1.5–3.0 with er_sde. Higher CFG risks over-saturation.
sampler_nameCOMBOer_sde44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBObeta5710 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +4
upscale_toCOMBO5124 options: 512, 768, 1024, 1536
paddingINT320–256Extra pixels around the mask bounding box.
featherINT80–128ANIMA: 5–10 is sufficient. 16+ can blur seams too much.
max_upscale_ratioFLOAT4.01–16Hard cap on how many times a crop can be enlarged. A 48Γ—48 face at 4Γ— β†’ 192Γ—192 (safe). Without a cap, a 48Γ—48 face at upscale_to=512 β†’ 10.7Γ— β€” the model generates a new face from near-scratch. Lower = safer faces. Higher = allows more detail on genuinely small regions.
min_region_pxINT480–512If the shorter side of a region's bounding box is below this many pixels, skip that pass entirely and leave the image unchanged. Prevents near-invisible faces from being over-processed. Set to 0 to disable.
resize_modeCOMBObicubicInterpolation used when scaling the crop up before sampling and back down after decoding. bicubic β€” sharpest, recommended. bilinear β€” softer, faster. area β€” best for pure downscaling (averages pixels). nearest β€” no smoothing, pixelated.
antialiasBOOLEANtrueApply antialiasing when resizing (bicubic / bilinear only). Reduces ringing and aliasing on sharp edges. Has no effect with area or nearest modes.
face_enabledBOOLEANtrueβ€”
face_denoiseFLOAT0.350–1β€”
auto_eye_colorBOOLEANtrueBefore each face pass, sample the dominant eye colour from the source image and prepend it to the face conditioning. Prevents left/right eye colour drift and stops two characters' eye colours from bleeding into each other when separate masks are used. Each face mask is sampled independently.
hands_enabledBOOLEANtrueβ€”
hands_denoiseFLOAT0.400–1β€”
body_enabledBOOLEANfalseβ€”
body_denoiseFLOAT0.300–1β€”
basic_pipeoptBASIC_PIPEOverrides model/clip/vae/positive/negative when connected.
modeloptMODELβ€”
clipoptCLIPRequired for region prompts to work. Extracted automatically from basic_pipe if connected.
vaeoptVAEβ€”
positiveoptCONDITIONINGβ€”
negativeoptCONDITIONINGβ€”
face_maskoptMASKβ€”
face_mask_2optMASKSecond character's face mask. Processed as a separate isolated pass β€” no shared crop context with face_mask. Eye colour sampled independently.
face_mask_3optMASKThird character's face mask. Same isolation as face_mask_2.
hands_maskoptMASKβ€”
body_maskoptMASKβ€”
face_promptoptSTRINGdetailed face, detailed eyes, symmetrical eyes, sharp iris, clean linework, high qualityExtra positive text appended to the conditioning for the face pass only. Eye colour is prepended automatically when auto_eye_color is on β€” don't add it here.
hands_promptoptSTRINGdetailed hands, five fingers, correct finger anatomy, clean fingernails, no extra fingersExtra positive text for the hands pass.
body_promptoptSTRINGdetailed clothing, fabric texture, clean linework, high qualityExtra positive text for the body/clothing pass.

Outputs (2)

NameTypeDescription
imageIMAGEβ€”
debugSTRINGβ€”