Nodes/comfyui-fvmtools/Person Detailer Power
ComfyUI Node

Person Detailer Power

Per-person LoRA detailing with the Power LoRA UI

By ping1979ping·Created 5 months ago·Updated about a month ago· 0
Person Detailer Power
  • images
  • person_data
  • model
  • clip
  • vae
  • positive_base
  • negative
  • dd_options
  • inpaint_options
  • images
  • refined
  • refined_references
  • refined_generic
seed0
steps4
denoise0.52
sampler_name
scheduler
detail_daemon_enabledtrue
detail_amount0.20
dd_smoothtrue
mask_blend_pixels32
mask_expand_pixels0
target_width800
target_height1200
ref_prompt_1
ref_prompt_2
ref_prompt_3
ref_prompt_4
ref_prompt_5
generic_catch_unprocessedtrue
gen_prompt

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_1 through ref_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.

CategoryFVM Tools/Face

Inputs (28)

NameTypeDefaultDescription
imagesIMAGEInput image batch [B, H, W, C]
person_dataPERSON_DATAPerson data from Person Selector Multi node
modelMODELBase model (LoRAs are applied as temporary clones per slot)
clipCLIPCLIP model for prompt encoding
vaeVAEVAE for encode/decode in the inpaint pipeline
seedINT00–18446744073709550000
stepsINT41–100
denoiseFLOAT0.520–1
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
detail_daemon_enabledBOOLEANtrue
detail_amountFLOAT0.20-5–5
dd_smoothBOOLEANtrue
mask_blend_pixelsINT320–128
mask_expand_pixelsINT00–64
target_widthINT80064–4096
target_heightINT120064–4096
ref_prompt_1STRINGPositive prompt for reference 1
ref_prompt_2STRINGPositive prompt for reference 2
ref_prompt_3STRINGPositive prompt for reference 3
ref_prompt_4STRINGPositive prompt for reference 4
ref_prompt_5STRINGPositive prompt for reference 5
generic_catch_unprocessedBOOLEANtrueON: detail all unprocessed faces. OFF: only truly unmatched.
gen_promptSTRINGPositive prompt for generic/unmatched faces
positive_baseoptCONDITIONINGBase positive conditioning fallback
negativeoptCONDITIONINGNegative conditioning
dd_optionsoptDD_OPTIONSDetail Daemon parameters
inpaint_optionsoptINPAINT_OPTIONSAdvanced inpaint settings

Outputs (4)

NameTypeDescription
imagesIMAGE
refinedIMAGE
refined_referencesIMAGE
refined_genericIMAGE