MiniMax H3 Face Pass
Re-draw the face big, paste it back small
- model
- positive
- negative
- vae
- audio_vae
- source
- reel
- reel
- pass
H3 draws faces badly in proportion to how small the head is in frame. And here's the kicker from the pack's own source: that's not a resolution problem. The smudge is there at 768 and above, which is why the two-pass refine can't fix it - upscaling re-resolves what was drawn, and what was drawn was a smudge. MiniMax H3 Face Pass is the node that actually fixes it, by doing something smarter: it re-draws the face at a canvas where it fills the frame, then composites it back.
It's the engine behind the "faces" pill on the Creator, and it's internal -
dev-only, written into the graph by render.emit when the piece asks for it.
If you've ever enabled a face fix on an H3 render and wondered what it was
actually doing, this is it.
How it works
The pipeline is: find the face (with a SAM3 checkpoint - the detector ships
with core, so nothing extra to install), crop it out of the decoded pass,
re-draw it at a canvas where it's large, then paste the repaired face box back
under a feathered mask. The denoise is scaled down per frame by how big the
head already is - a face that's already decent gets a lighter touch; a tiny
face gets the full repair. That's the faces.strengths logic the denoise
tooltip points at.
Three things ride through untouched, and they're what keep the pass from sabotaging everything else:
- The soundtrack. It isn't re-decoded or re-derived. The rewritten pass points at the same audio file. The audio half of the latent is still handed to the model - the mouth is drawn by attending to it - but it's masked out of the denoise, so what the model does with it is read it, not re-render it.
- The frames outside the face box. The crop is deliberately wider than the paste. The extra is context for the sampler; what's composited is just the face rectangle, dilated and blurred. A tight silhouette would put the seam on the face's own outline, where any drift shows. A looser rectangle puts it in hair and background, where it doesn't.
- Frames where the detector found nothing. They keep their pixels. The crop is interpolated across a blink so the window doesn't jump, but nothing is pasted from a frame where there was no face to repair.
It runs after the reel, not before it, for the same memory reason as everything else in this pack: no decoded pass is ever held across a node boundary. It reads the finished pass back through a memmap, holds only the small crops, and streams the repaired frames straight back out to a new spill. The repaired pass replaces the original on the reel, so a later seam inherits the fixed frames, not the smudged ones.
The inputs that matter
source- the pass to repair, as the reel node wrote it (MMC_PASS).detector- the SAM3 checkpoint that finds the face. A string, the checkpoint name; SAM3 ships with core.width/height- the crop canvas, default 512×512. This is where the face gets re-drawn, so the positive conditioning is built at the crop canvas too - references and prompt are encoded at the size the crop is drawn at.denoise- default 0.45, the ceiling. Scaled down per frame by how large the face already is. Low, on purpose: the answer has to stay frame-aligned with what's already there so it composites rather than replaces.model/positive/negative/vae/audio_vae- the sampler stack for the repair pass.reel- the running reel, so the repaired pass can replace the original.
Outputs: reel (with the repaired pass swapped in) and pass (the new one).
Where the idea came from
The README credits Carasibana's ComfyUI-H3-FaceRefine and zuanfilm's graph built on it for working out the approach - the constant-fraction crop, the denoise scaled by head size, the paste of the face box alone. This pack is an independent implementation of those findings, using core's SAM3 instead of their ultralytics/insightface stack. Credit where due, and it explains why "faces" on this pack doesn't need a separate detector install.
Installing
Ships with the pack, dev-only:
cd ComfyUI/custom_nodes
git clone https://github.com/roadmaus/ComfyUI-MiniMax-Creator
Restart ComfyUI, no pip install, standard H3 weights. You'll see it only inside an expanded workflow with the faces pill on - and now you know the trick: it fixes a small-face smudge by making the face big, not by making the frame sharper.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | Built at the crop canvas, so the references and the prompt are encoded at the size the crop is drawn at. | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| audio_vae | VAE | — | |
| source | MMC_PASS | The pass to repair, as the reel node wrote it. | |
| detector | STRING | The SAM3 checkpoint that finds the face. | |
| width | INT | 51232–8192 | — |
| height | INT | 51232–8192 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–200 | — |
| cfg | FLOAT | 1.000–30 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 0.450.01–0.99 | The ceiling. Scaled down per frame by how large the face already is — see faces.strengths. |
| reel | MMC_REEL | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| reel | MMC_REEL | — |
| pass | MMC_PASS | — |