CineStack H3 Director FaceRefine
That Face at 864×480 Isn't Your Actor Anymore — FaceRefine Fixes It
- bd_grp_face_detect
- bd_grp_face_sample
- bd_grp_face_paste
- sigmas
- face_refine
Generate a five-second H3 clip at its default 864×480 and the wide shots look fine. Then someone walks toward camera and their face - maybe 90 pixels tall - turns into a soft, slightly wrong suggestion of a person. This isn't an H3 flaw; it's the oldest problem in the book. A face occupying 90 pixels has 90 pixels of latent budget, and no model spends it well.
The standard fix, since Impact Pack made it routine, is detect → crop → resample at proper resolution → paste back. CineStack H3 Director FaceRefine is that loop, but specialised for video and wired directly into the Director instead of assembled from SEGS plumbing you have to maintain.
How it works
Connect it to the Director's face_refine socket and the Director changes what it does after decoding. Instead of handing you the frames and stopping, it tracks a face across the final decoded frames - after Refine, if Refine is also connected - re-samples each crop at a real resolution, and pastes the result back into the frame.
Detection is a YOLO face model, so this is a box, not a mask, which is why the paste controls matter more here than they do in a still-image detailer. The node also leans on the pack's per-segment machinery: it runs inside the Director's pass, so per-segment seeds and caches still apply.
The mechanism is deliberately Impact-Pack-shaped, so if you've used FaceDetailer the vocabulary feels familiar - with one difference the author flags: don't use FaceDetailer's 0.25 denoise here. H3's template wants about 0.40.
The inputs you'll actually touch
detector is the weight: face_yolov8m.pt, dropped into models/ultralytics/bbox/. It's a dropdown with one entry until you add another file, which is the pack's way of telling you the weight isn't installed.
Then the crop: confidence (0.35 default - lower it to catch profile and small faces), crop_factor (crop side = face height × this; 2.0–3.0 is the useful band), canvas_mode with manual honouring canvas_width/canvas_height (768×768 default) or auto_capped_768 sizing itself off the largest crop with a 768 cap. select decides who you're fixing: largest_face, or centre_most when the subject isn't the closest one to camera. After locking on, it tracks by nearest box, which is what keeps the mask from jumping between two people mid-clip.
Sampling is its own little stack: denoise 0.4, steps 8, sampler euler, scheduler simple. Eight steps is a turbo-LoRA number, so if you're running the accelerated H3 setup that's already tuned for you.
Paste-back is where the seams live. paste_region should stay face_only (the tooltip is blunt: full_crop pastes the whole rectangle and tends to show the box), feather 24 is a sane starting blur for a rectangular mask, and colour_match plus blend at 1.0 handle the VAE round-trip colour shift that used to turn detailed faces grey.
Optionally, seed_mode picks inherit (use the Director's seed) or offset (seed + 1 + segment number), and a sigmas input overrides steps, scheduler and denoise wholesale.
Output
One output: face_refine, type MMX_DIR_FACE_REFINE, into the Director's face_refine socket. This node never samples on its own and has no IMAGE output - everything happens inside the Director's run, which is the point. Leave it unconnected and the Director behaves exactly as before.
Worth knowing: the Director's images output is the stitched result, and images_pre_face_refine is the video before the stitch - but only if you switch on the Director's "output pre-face-refine" toggle. Otherwise that port stays blocked, which is a deliberate memory saving rather than a bug. Turn it on for a comparison run, then turn it off.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/guomenghao/ComfyUI-CineStack-H3.git
python -m pip install -r ComfyUI-CineStack-H3/requirements.txt
ultralytics is in that requirements file, and the Director doesn't import it unless FaceRefine is actually connected. The weight is not pip-installable: grab face_yolov8m.pt and put it in ComfyUI/models/ultralytics/bbox/. Restart, and the node is under CineStack/H3 as "CineStack H3 Director FaceRefine".
Where people get burned
Empty detector dropdown. Means the file isn't in models/ultralytics/bbox/. The enum is built from what's on disk, so a missing weight shows up as the lone default label rather than a helpful error.
Visible square on the cheek. That's paste_region on full_crop, or feathering too tight for the crop. face_only with feather around 24 is the boring answer that works.
Three faces, one face at the end. Same trap as ADetailer's clone problem - every crop re-samples from the same seed, so a crowd converges. Fix it with seed_mode: offset, or don't run face refinement on a wide shot full of background people in the first place.
You paid for a pass and can't see the difference. If the face was already large and sharp, a crop-and-resample generally changes it without improving it. The honest rule from still-image detailing applies verbatim to video: this is a repair tool for small broken faces, not a quality slider you leave on. And per the README's own framing, whether a junction or a stitched face reads correctly is something you confirm by watching the clip, not by trusting a status panel.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| bd_grp_face_detect | BDGROUP | 脸部检测设置 | — |
| detector | COMBO | face_yolov8m.pt | 人脸检测权重,放到 models/ultralytics/bbox/(如 face_yolov8m.pt)。 |
| confidence | FLOAT | 0.350.05–0.95 | 检测阈值。更低更容易抓住侧脸和小脸。 |
| crop_factor | FLOAT | 2.51.2–8 | 裁剪边长 = 脸高 × 该倍数。2.0–3.0 常用。 |
| canvas_width | INT | 768128–1344 | H3 生成裁剪的宽度。manual 模式按此值。 |
| canvas_height | INT | 768128–1344 | H3 生成裁剪的高度。manual 模式按此值。 |
| canvas_mode | COMBO | manual | manual = 使用上面宽高。auto_capped_768 = 按最大裁剪自适应,上限 768。 |
| select | COMBO | largest_face | 锁定对象:最大脸,或最靠近画面中心的脸。锁定后按邻近框跟踪。 |
| bd_grp_face_sample | BDGROUP | 采样设置 | — |
| denoise | FLOAT | 0.400.02–1 | 裁剪再采的 denoise(BasicScheduler)。H3 不要用 FaceDetailer 的 0.25;模板约 0.40。接了 sigmas 则忽略此项。 |
| steps | INT | 81–50 | 脸修采样步数。配合 turbo LoRA 常用 8。接了 sigmas 则忽略。 |
| sampler | COMBO | euler | 脸修采样器。示例工作流常用 euler。 |
| scheduler | COMBO | simple | 脸修调度器。接了 sigmas 则忽略。 |
| seed_modeopt | COMBO | inherit | inherit = 用导演台 seed;offset = seed+1+段号。 |
| bd_grp_face_pasteopt | BDGROUP | 贴回设置 | — |
| paste_regionopt | COMBO | face_only | 只贴检测脸框(推荐)。full_crop 会贴整块裁剪,容易露方块。 |
| mask_dilationopt | INT | 160–256 | — |
| featheropt | INT | 240–256 | 贴回羽化半径,单位为成片像素。矩形遮罩建议约 24。 |
| colour_matchopt | FLOAT | 1.000–1 | — |
| blendopt | FLOAT | 1.000–1 | — |
| sigmasopt | SIGMAS | 可选。接线后覆盖步数 / 调度器 / denoise。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| face_refine | MMX_DIR_FACE_REFINE | — |