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 | — |
| mask_expand_pixels | INT | 00–64 | — |
| 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 all unprocessed faces. OFF: only truly unmatched. |
| 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 | — |