H3 LongTake FaceRefine (small faces)
The face is 60 pixels across in the wide shot. H3 LongTake FaceRefine goes back for it
- model
- clip
- vae
- face_image
- last_clip
- project_dir
- report
What it's for
You rendered a 15-second take with H3 LongTake. The close-ups are great. Then the camera pulls back for the last four seconds, the face is 60 pixels tall, and your character becomes a stranger with a smudge where the eyes should be. That's the failure mode every chaining workflow hits: fewer face pixels to condition on, and the model fills the gap with its own idea of a person.
In image land the answer is a detailer pass - don't re-render the picture, find the face, regenerate just that crop, paste it back. H3 LongTake FaceRefine is that, clip by clip, on a project you already rendered. It sits after the Refine - Render (or Image to Video) → Refine → FaceRefine → Stitch - reading a project's chunks and writing a new folder (<project>/fr) that the Stitch assembles with the original audio. Nothing is regenerated from scratch, and the first pass's motion and framing are untouched.
How it actually works
Worth knowing up front: this node doesn't reimplement face refinement. It drives the nodes of Carasibana's ComfyUI-H3-FaceRefine pack from inside - H3FaceTrackCrop, H3InjectVideoLatent, H3PerFrameDenoise, H3FaceStitch. If that pack is missing the node raises with the URL, and a front-end check pops a dialog with the link the moment you drop the node in. Two packs to install, but you get FaceRefine behaving the way its own author tuned it rather than a fork.
Per clip: YOLO tracks and crops the face, the crop is regenerated with H3 img2img with your face close-up injected as <Picture 1>, and the result is pasted back through a feathered ellipse. The author handles the 17k+5 frame grid for you: the clip is padded with repeats of its last frame and trimmed again afterwards, which is what stops the tail of a chunk coming back as coloured noise.
The part that makes it usable is the skipping. The node measures the median face height per clip and simply copies clips whose face is taller than max_face_px (150 by default) without touching them. Above that size FaceRefine enlarges the face 1.0–1.4x for no gain, and at 1 MP the author had it take ComfyUI down. Clips where no face is detected get copied too, whatever you set.
The inputs that matter
face_image- a close-up of the face, not the whole photo. This is the identity source.denoise- 0.25 to 0.35. With H3's sigma shift 12, 0.25 is already σ 0.80, i.e. it rewrites the face; above 0.35 the head starts drifting against the body.max_face_px- the skip threshold. Set it to 0 and every clip with a detected face gets refined.description- hair and outfit in words, so the pass doesn't change the person it's fixing.project_name/project_dir- point it at the rendered project, either by name or by wiringproject_dirfrom the Render/Image to Video/Refine.mode-continueskips clips already infr;restartwipes them. Interrupt and queue again and you lose nothing.
The optional knobs are the author's tuned defaults and want leaving alone: large_face_multiplier (fraction of the denoise applied to large faces), smooth_window (box smoothing - lower it if the camera moves), crop_factor, feather, chunk_crf. One is worth knowing: seam_blend_frames fades the refined clip back to the original over its first and last 8 frames, so the face doesn't pop where a copied clip meets a refined one.
Outputs: last_clip (IMAGE, handy as a preview), project_dir (wire this to the Stitch), and report - which clips were refined with their face size, which were copied, which were already done. Read it; that's how you learn your threshold did nothing.
One catch worth repeating: feed the node the ref2va with a Turbo LoRA even if you made the project with the fl2va, because the face goes in as <Picture 1> and only the reference model takes it. The 8-step v1.0 Turbo is the author's pick here.
Install
ComfyUI Manager → search H3 LongTake → Install, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/mark9009/ComfyUI-H3-LongTake
Then restart ComfyUI. You also need Carasibana's FaceRefine pack (the node tells you if it's missing) and a YOLO face detector - face_yolov8m.pt in models/ultralytics. The pack itself has no Python dependencies; the H3 model set is the one in the README's model table. Because this is a second pass over chunks that already exist, it's cheap: on a 15 s take with a wide closing shot at 0.55 MP, face identity in the wide shot went from 0.25–0.33 to 0.63–0.67, face steady on the head (slip under 1.5 % of the side), flicker up 2 %, about 3.5 minutes.
Where people get burned
"No plan.json in <dir>: render the project first." This node only ever works on a finished project. It reads the plan the Render wrote; there's nothing to refine before that exists.
Pushing denoise too high. 0.4+ looks tempting when the face is still soft - it's how you get a head that no longer sits on the body. If 0.25–0.35 isn't enough, more resolution going into the first pass is the fix, not more denoise here.
Forgetting the Stitch. The refined clips live in <project>/fr, and the Stitch has to be told: connect this node's project_dir to it, or set project_name = name/fr. Ctrl+M mutes/unmutes the Stitch, and it brings the original audio back.
Last thing, and it isn't a bug: this is a face pass, not a beauty pass. A soft frame at 0.5 MP is the Refine's job.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | H3 ref2va with the Turbo (8-step v1.0 recommended): the ref2va is needed because the face goes in as <Picture 1>, even if the project was made with the fl2va. | |
| clip | CLIP | — | |
| vae | VAE | — | |
| face_image | IMAGE | A close-up of the face, not the whole photo. | |
| project_name | STRING | longtake | An already rendered project. The result goes to <project>/fr (in the Stitch: project_name = 'name/fr'). |
| description | STRING | The subject's look (hair, outfit): helps not to change person. | |
| denoise | FLOAT | 0.250.05–1 | 0.25-0.35. With H3's shift 12, 0.25 already rewrites the face; above it the head drifts against the body. |
| steps | INT | 41–50 | — |
| seed | INT | 00–18446744073709550000 | — |
| max_face_px | INT | 1500–2000 | Clips whose median face is taller than this (px) are copied without FaceRefine. 0 = refine every clip. |
| mode | COMBO | continue | continue: skips the clips already done. |
| project_diropt | STRING | Connect project_dir from the Render/I2V/Refine. | |
| large_face_multiplieropt | FLOAT | 0.350–1 | Fraction of the denoise on large faces (the author's default). |
| smooth_windowopt | INT | 111–201 | Box smoothing: lower if the camera moves. |
| crop_factoropt | FLOAT | 2.51.5–4 | — |
| featheropt | INT | 240–128 | — |
| chunk_crfopt | INT | 100–30 | — |
| seam_blend_framesopt | INT | 80–48 | At the inner joins the refined clip fades to the original over these frames, so the face does not pop when going from a copied (or separately refined) clip to a refined one. 0 = off. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| last_clip | IMAGE | — |
| project_dir | STRING | — |
| report | STRING | — |