K2 Regional Face Detail
The pass that keeps character identities alive in full-body shots
- image
- model
- clip
- vae
- plan
- image
- face_mask
- report
K2 Regional Face Detail is the node that keeps multi-character LoRA routing honest. In a full-body composition, each face covers only a handful of latent tokens - Krea 2's image tokens are 16×16 output pixels, so a face in a full-body frame is a rounding error. Even with perfect regional routing, the identity gets lost because there simply aren't enough tokens to carry it. This node fixes that the old-school way: it detects faces, assigns each one to the subject region its box sits in, and re-samples a padded crop at full resolution using only that region's LoRAs, then composites it back with a feathered mask.
It's the face-refinement stage of the K2 Lab suite in comfyui-FVMtools, and it's the difference between "two characters, kind of" and "two recognizable characters." For character-consistency work this is the node you'll actually reach for every run.
The inputs that matter
image- the decoded render to inspect and refine.model- the base Krea model, not the K2 Compose output. The tooltip is explicit: regional gating makes no sense on an isolated crop, so connect the original model.clip,vae,plan- the encoder, the VAE, and the plan from K2 Compose (which supplies regions, priorities, prompts, and LoRA assignments).denoise- low values keep facial structure, higher values let the LoRA reshape the face. Start around 0.35.crop_size- working resolution per face crop (default 512).padding- expands the detected face box before cropping, so you get hair and context (default 2).featherandblend- the crop's soft border (as a fraction of crop size) and opacity.blend0 keeps the original.lora_scale- an extra multiplier on the region LoRAs during the crop pass. This is the "turn the character's identity up for the face" knob.detector-yolo(any Ultralytics face model, recommended) ornanodet_onnx(theface_det.onnxused by K2Lab). Both are typically already in an install - no extra dependency.detector_modelpicks the Ultralytics file;thresholdrejects background faces.cfg,sampler_name,scheduler- guidance and schedule for each crop pass. 1.0 CFG for Turbo, euler/simple.
Optional: detector_path (explicit path to face_det.onnx; empty uses FantasyPortrait auto-discovery) and require_region_lora (only refine regions that actually have a regional LoRA assigned).
Outputs: image (refined), face_mask, and a report of what was detected and refined. Each face gets a deterministic seed offset so different faces don't share identical noise.
The gotcha
Connecting the Compose-patched model here is the classic mistake - it renders crops that look wrong and you'll blame the LoRA. Use the original model. Everything else is tuning: if identity still washes out, raise lora_scale or denoise, don't chase it with the base pass.
Install
Same as the whole pack:
cd ComfyUI/custom_nodes
git clone https://github.com/ping1979ping/comfyui-FVMtools
Restart ComfyUI, find it under FVM Tools/K2. No extra Python dependencies, and the face detector is whatever your workflow already has.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Decoded image to inspect and refine. | |
| model | MODEL | Base Krea model. Connect the ORIGINAL model, not the K2 Compose output — regional gating makes no sense on an isolated crop. | |
| clip | CLIP | Krea/Qwen CLIP for the crop prompt. | |
| vae | VAE | VAE used to encode and decode each crop. | |
| plan | K2_PLAN | Plan from K2 Compose — supplies regions, priorities, prompts and LoRA assignments. | |
| seed | INT | 00–18446744073709550000 | Base seed; each face gets a deterministic offset so different faces do not share identical noise. |
| steps | INT | 81–200 | Denoising steps per face crop. |
| denoise | FLOAT | 0.350–1 | Low values keep facial structure, higher values let the LoRA reshape the face. |
| crop_size | INT | 512256–2048 | Working resolution per face crop. |
| padding | FLOAT | 2.01–4 | Expands the detected face box before cropping; more padding includes hair and context. |
| feather | FLOAT | 0.120–0.5 | Soft border of the crop mask as a fraction of the crop size. |
| blend | FLOAT | 1.000–1 | Opacity of the refined crop. 0 keeps the original. |
| lora_scale | FLOAT | 1.000–4 | Extra multiplier on the region LoRAs during the crop pass. |
| detector | COMBO | yolo | yolo: any Ultralytics face model (recommended). nanodet_onnx: the face_det.onnx used by K2Lab. |
| detector_model | COMBO | Ultralytics face model. Ignored when detector is nanodet_onnx. | |
| threshold | FLOAT | 0.400.05–0.95 | Minimum detection confidence. Raise it to reject background faces. |
| cfg | FLOAT | 1.00–100 | Guidance for the crop pass; 1.0 for Turbo. |
| sampler_name | COMBO | euler | Sampler for every crop pass. |
| scheduler | COMBO | simple | Sigma schedule for every crop pass. |
| detector_pathopt | STRING | Explicit path to face_det.onnx. Empty uses the FantasyPortrait auto-discovery path. | |
| require_region_loraopt | BOOLEAN | false | On: only refine regions that actually have a regional LoRA assigned. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| face_mask | MASK | — |
| report | STRING | — |