Nodes/Temporal Face Detailer/Tracked Face Detail (SDXL)
ComfyUI Node

Tracked Face Detail (SDXL)

The half of the video face detailer you'll tune a hundred times

By nikythebikky·Created 2 months ago·Updated 2 months ago· 0
Tracked Face Detail (SDXL)
  • image
  • face_tracks
  • model
  • clip
  • vae
  • positive
  • negative
  • lora_stack
  • reference_image
  • image
  • face_masks
positive_textdetailed face, sharp eyes, high quality skin texture
negative_textblurry, deformed, low quality
guide_size768
max_size1024
seed0
steps20
cfg7.0
sampler_name
scheduler
denoise0.35
denoise_max0.00
noise_modefixed_per_track
detail_modeimg2img
mask_dilation8
feather15
temporal_strength1.00
flow_strength0.50
latent_blend0.00
flow_bidirectionaltrue
flow_backendfarneback
color_match0.50
chunk_size4
detail_every1
track_prompts
reference_strength0.35

Tracked Face Detail is the other half of the split path: it takes a FACE_TRACKS object plus the original frames and runs the actual SDXL sampling - every anti-flicker trick in the Temporal Face Detailer pack, applied to the tracked face crops. It's the exact same detailing engine as the all-in-one node, just without detection inside. You wire Face Detect + Track's face_tracks into this, and suddenly you can iterate on sampler settings without re-running tracking, because tracking only happened once.

How it fits in

The split workflow is: Load Video → Face Detect + Track → Tracked Face Detail → Video Combine. And yes, you feed the same original frames into Tracked Face Detail (image input) - the detailer needs the source pixels to crop and paste back against. Model/CLIP/VAE come from a normal SDXL checkpoint. The README calls this the "tunable" path, and it's right: tracking is the expensive, error-prone half to redo, so isolating it means you can burn as many sampler experiments as you like.

What it does to each track

For each track, the node builds a stabilized square crop (constant size, landmark-anchored center, temporally smoothed - the geometry was already computed during tracking), resamples it at guide_size (768 default, max_size 1024 caps it), VAE-encodes, and samples. The important part: with noise_mode: fixed_per_track (default), every frame in the track is sampled from the same seed and noise, so the sampler literally cannot diverge frame-to-frame. Then it optionally blends in latent space (latent_blend), decodes, color-matches each crop to its source, applies the flow-guided pixel blend (flow_strength), and feather-pastes only the face region back (mask_dilation / feather).

detail_mode is worth understanding: img2img (default) resamples the whole crop, with the mask only limiting paste-back; inpaint restricts sampling to the face mask in latent space. If you're seeing the background change around faces, that's img2img resampling the whole crop - inpaint is the tighter option.

Inputs that matter

Beyond image, face_tracks, and the checkpoint, the ones you'll actually live on:

  • denoise (0.35 default) - main quality-vs-consistency lever; 0.3–0.45 is the sweet spot. Add denoise_max for adaptive behavior: steady frames stay at the base, high-motion frames ramp toward the max.
  • noise_mode - keep fixed_per_track unless you're A/B testing against naive per-frame detailing.
  • flow_strength / latent_blend - the anti-flicker dials. Raise latent_blend (try 0.3–0.5) instead of cranking denoise when you want more detail.
  • reference_image + reference_strength - an optional identity anchor: a clean face photo the crops are nudged toward. Invaluable when a character slowly drifts off-identity over a long clip.
  • track_prompts - per-track positive prompt overrides, one per line like 0: photo of johndoe person, detailed face. Get the IDs from the debug overlay.
  • lora_stack - feed a TFD LoRA Stack here to apply face LoRAs only on the crops.
  • chunk_size - lower it (default 4) if you OOM; detail_every 2–4 is the keyframe speed mode for long clips.

Outputs

image goes to Video Combine (the finished frames), and face_masks (MASK) is optional - preview it via a Mask To Image node or save it to see exactly what got re-rendered. There's no debug_overlay or face_tracks out on this node; those come from the tracking side.

Where people get burned

The usual first mistake is forgetting the image wire - the node silently needs the original frames alongside the tracks, and a graph that "looks right" just produces an error until you connect it. OOM on long clips is the second: drop chunk_size. And if you're chasing detail and the face starts flickering again, the fix is almost never more denoise - it's latent_blend, or going back upstream to check that the tracking itself is stable.

CategoryTemporalFaceDetailer

Inputs (34)

NameTypeDefaultDescription
imageIMAGE
face_tracksFACE_TRACKS
modelMODEL
clipCLIP
vaeVAE
positive_textSTRINGdetailed face, sharp eyes, high quality skin texture
negative_textSTRINGblurry, deformed, low quality
guide_sizeINT768256–2048resolution faces are resampled at
max_sizeINT1024256–2048
seedINT00–18446744073709550000
stepsINT201–100
cfgFLOAT7.00–30
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
denoiseFLOAT0.350–1main quality/consistency lever: higher = more detail but more flicker (0.3-0.45 recommended)
denoise_maxFLOAT0.000–1adaptive denoise: when above 'denoise', steady frames keep the low base value while high-motion frames ramp toward this. 0 = off (single global denoise)
noise_modeCOMBOfixed_per_trackfixed_per_track reuses the same seed and noise on every frame of a track — the biggest identity-stability lever
detail_modeCOMBOimg2imginpaint restricts sampling to the face mask in latent space; img2img resamples the whole crop (mask still limits the paste-back)
mask_dilationINT80–128
featherINT150–128
temporal_strengthFLOAT1.000–1master anti-flicker strength; scales flow blend + color match
flow_strengthFLOAT0.500–1optical-flow-guided temporal blend of detailed crops (pixel space)
latent_blendFLOAT0.000–1flow-guided temporal blend in LATENT space before decode — smooths in the VAE's semantic space, letting you raise denoise with less flicker. Try 0.3-0.5 with denoise 0.25+; 0 = off
flow_bidirectionalBOOLEANtrue
flow_backendCOMBOfarnebackraft_small/raft_large (torchvision) give much cleaner flow on fast motion at some VRAM/time cost; auto-falls back to farneback on any failure
color_matchFLOAT0.500–1match each detailed crop's color to its source (stops brightness pulsing)
chunk_sizeINT41–64crops sampled per batch; lower if you hit OOM
detail_everyINT11–30keyframe mode: sample every Nth frame, flow-propagate the rest (speed on long clips)
positiveoptCONDITIONINGoverrides positive_text
negativeoptCONDITIONINGoverrides negative_text
lora_stackoptLORA_STACK
track_promptsoptSTRINGper-track positive prompt overrides, one per line: 'track_id: prompt' (see the debug overlay for IDs)
reference_imageoptIMAGEidentity anchor: a reference face image the detailed faces are biased toward (init-latent nudge + color anchoring). For strong identity conditioning also patch the MODEL with IPAdapter FaceID upstream — crops are sampled with whatever model you feed in, so it composes
reference_strengthoptFLOAT0.350–1how hard to pull toward reference_image (no effect unless it is connected)

Outputs (2)

NameTypeDescription
imageIMAGE
face_masksMASK