πΈ Detailer
Face, hands, and body detailer that knows when to leave a face alone
- image
- basic_pipe
- model
- clip
- vae
- positive
- negative
- face_mask
- face_mask_2
- face_mask_3
- hands_mask
- body_mask
- image
- debug
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.
Inputs (34)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| seed | INT | 00β18446744073709550000 | β |
| steps | INT | 121β150 | ANIMA: 8β15 steps is sufficient. Higher has diminishing returns. |
| cfg | FLOAT | 2.00β30 | ANIMA: 1.5β3.0 with er_sde. Higher CFG risks over-saturation. |
| sampler_name | COMBO | er_sde | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | beta57 | 10 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +4 |
| upscale_to | COMBO | 512 | 4 options: 512, 768, 1024, 1536 |
| padding | INT | 320β256 | Extra pixels around the mask bounding box. |
| feather | INT | 80β128 | ANIMA: 5β10 is sufficient. 16+ can blur seams too much. |
| max_upscale_ratio | FLOAT | 4.01β16 | Hard 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_px | INT | 480β512 | If 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_mode | COMBO | bicubic | Interpolation 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. |
| antialias | BOOLEAN | true | Apply antialiasing when resizing (bicubic / bilinear only). Reduces ringing and aliasing on sharp edges. Has no effect with area or nearest modes. |
| face_enabled | BOOLEAN | true | β |
| face_denoise | FLOAT | 0.350β1 | β |
| auto_eye_color | BOOLEAN | true | Before 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_enabled | BOOLEAN | true | β |
| hands_denoise | FLOAT | 0.400β1 | β |
| body_enabled | BOOLEAN | false | β |
| body_denoise | FLOAT | 0.300β1 | β |
| basic_pipeopt | BASIC_PIPE | Overrides model/clip/vae/positive/negative when connected. | |
| modelopt | MODEL | β | |
| clipopt | CLIP | Required for region prompts to work. Extracted automatically from basic_pipe if connected. | |
| vaeopt | VAE | β | |
| positiveopt | CONDITIONING | β | |
| negativeopt | CONDITIONING | β | |
| face_maskopt | MASK | β | |
| face_mask_2opt | MASK | Second character's face mask. Processed as a separate isolated pass β no shared crop context with face_mask. Eye colour sampled independently. | |
| face_mask_3opt | MASK | Third character's face mask. Same isolation as face_mask_2. | |
| hands_maskopt | MASK | β | |
| body_maskopt | MASK | β | |
| face_promptopt | STRING | detailed face, detailed eyes, symmetrical eyes, sharp iris, clean linework, high quality | Extra 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_promptopt | STRING | detailed hands, five fingers, correct finger anatomy, clean fingernails, no extra fingers | Extra positive text for the hands pass. |
| body_promptopt | STRING | detailed clothing, fabric texture, clean linework, high quality | Extra positive text for the body/clothing pass. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |
| debug | STRING | β |