Person Detailer Power
Per-person LoRA detailing with the Power LoRA UI
- images
- person_data
- model
- clip
- vae
- positive_base
- negative
- dd_options
- inpaint_options
- images
- refined
- refined_references
- refined_generic
PersonDetailer is the pack's per-person LoRA inpainting engine: five reference slots plus a generic catch-all, each with its own LoRA, prompt, and mask type, each inpainted sequentially into the result of the previous pass. PersonDetailerPower is the same engine wearing a different UI - rgthree-style compact LoRA widgets (toggle + dropdown + strength arrows) instead of chunky checkbox + combo + slider rows. If you've used rgthree's Power Lora Loader, you know the feel: right-click a LoRA widget for Show Info, Toggle, Move, Remove.
Why Power over the plain version? It's purely UI. The backend is literally a subclass of PersonDetailer, sharing the same code. But for a five-slot-plus-generic layout, the compact widgets keep the node readable in a workflow, and the right-click LoRA info (trigger words) comes along for free. On a busy face-detail branch, that's a real quality-of-life win.
How it works
It needs person_data from Person Selector Multi - that's the node that did the matching and mask generation. For each enabled reference slot it crops the masked region, applies that slot's LoRA and prompt at the inpaint crop resolution, samples, and stitches the result back into the image, slot by slot. Defaults are tuned for a light touch: 4 steps, denoise 0.52, target crop 800×1200 - you're refining, not regenerating.
Performance is where this pack flexes. LoRA files are cached in a module-level LRU (6 slots), and every unique (LoRA, prompt) combination is pre-computed once per batch - five people sharing one LoRA trigger a single load and a single conditioning encode, not five. Detail Daemon (sigma-curve manipulation for detail-preserving inpainting) is on by default at 0.2 strength. And Z-Image Turbo / Lumina2 models get automatic LoRA QKV conversion - no user action, just a console log.
The inputs that matter
images,person_data,model,clip,vae- the standard stack.ref_prompt_1throughref_prompt_5- the per-slot positive prompts, alongside each slot's LoRA widget.gen_prompt+generic_catch_unprocessed- the generic slot for unmatched faces.steps/denoise- your two main dials for how aggressive the detail pass is.
Outputs
images (the final detailed images), refined (all inpaint crops), refined_references, refined_generic.
Install
Face tools bring real dependencies:
cd ComfyUI/custom_nodes
git clone https://github.com/ping1979ping/comfyui-FVMtools
pip install insightface>=0.7.3 onnxruntime-gpu>=1.17.0 opencv-python>=4.8.0 numpy>=1.24.0
buffalo_l auto-downloads on first use; parsing_bisenet.pth (53MB) is a manual download into models/gfpgan/. Body masks need SAM/SAM3 via a loader.
Common issues
Black 64×64 placeholder outputs mean a slot produced nothing - check your references actually matched in the selector upstream. Faces changed too much → drop denoise toward 0.4 or raise mask_blend_pixels. And if a face looks identical across slots, the LoRA isn't applying: check the widget is toggled on with a real file and non-zero strength. The empty-placeholder behavior is by design, not a crash - empty outputs return that black square so the graph keeps flowing.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Input image batch [B, H, W, C] | |
| person_data | PERSON_DATA | Person data from Person Selector Multi node | |
| model | MODEL | Base model (LoRAs are applied as temporary clones per slot) | |
| clip | CLIP | CLIP model for prompt encoding | |
| vae | VAE | VAE for encode/decode in the inpaint pipeline | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 41–100 | — |
| denoise | FLOAT | 0.520–1 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| detail_daemon_enabled | BOOLEAN | true | — |
| detail_amount | FLOAT | 0.20-5–5 | — |
| dd_smooth | BOOLEAN | true | — |
| mask_blend_pixels | INT | 320–128 | Feather radius at the mask edge, measured in SAMPLING pixels (relative to target_width/target_height, the one fixed frame in the pipeline). The same radius is converted back to image pixels for the blend, so both ramps cover the same strip of the picture. The console prints the conversion, e.g. '32px @ 800px sampling = 15px in the image (crop 380px)'. Which side of the edge the ramp lies on is set by feather_direction in Inpaint Options. On 'both' (the default) the ramp eats into the mask as much as out of it - raise this only as far as the thinnest part of your mask tolerates. |
| mask_expand_pixels | INT | 00–64 | Dilate the mask by this many IMAGE pixels before anything else happens - before the crop region is computed, before feathering. Grows the mask outward in every direction, so on a hair or accessory mask it also grows toward the face. Unaffected by feather_direction. Leave at 0 unless the segmentation is clipping the subject. |
| target_width | INT | 80064–4096 | — |
| target_height | INT | 120064–4096 | — |
| ref_prompt_1 | STRING | Positive prompt for reference 1 | |
| ref_prompt_2 | STRING | Positive prompt for reference 2 | |
| ref_prompt_3 | STRING | Positive prompt for reference 3 | |
| ref_prompt_4 | STRING | Positive prompt for reference 4 | |
| ref_prompt_5 | STRING | Positive prompt for reference 5 | |
| generic_catch_unprocessed | BOOLEAN | true | ON: detail everything the active slots leave unprocessed - unmatched faces, faces of disabled slots, and with generic mask_type 'aux' also aux hits assigned to a reference whose slot does not use 'aux' (e.g. a phone in the hand of a person whose slot only details the head). OFF: only truly unmatched faces / unassigned aux hits. |
| gen_prompt | STRING | Positive prompt for generic/unmatched faces | |
| positive_baseopt | CONDITIONING | Base positive conditioning fallback | |
| negativeopt | CONDITIONING | Negative conditioning | |
| dd_optionsopt | DD_OPTIONS | Detail Daemon parameters | |
| inpaint_optionsopt | INPAINT_OPTIONS | Advanced inpaint settings |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| refined | IMAGE | — |
| refined_references | IMAGE | — |
| refined_generic | IMAGE | — |