Nodes/comfyui-fvmtools/Person Detailer Power
ComfyUI Node

Person Detailer Power

Per-person LoRA detailing with the Power LoRA UI

By ping1979ping·Created 7 months ago·Updated a day ago· 2
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–128Feather 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_pixelsINT00–64Dilate 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_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 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_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—