Nodes/ComfyUI-MiniMax-Creator/MiniMax H3 Face Pass
ComfyUI Node

MiniMax H3 Face Pass

Re-draw the face big, paste it back small

By roadmaus·Created 17 days ago·Updated about 18 hours ago· 58
MiniMax H3 Face Pass
  • model
  • positive
  • negative
  • vae
  • audio_vae
  • source
  • reel
  • reel
  • pass
detector
width512
height512
seed0
steps20
cfg1.00
sampler_name
scheduler
denoise0.45

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.

CategoryMiniMax/internal

Inputs (16)

NameTypeDefaultDescription
modelMODEL
positiveCONDITIONINGBuilt at the crop canvas, so the references and the prompt are encoded at the size the crop is drawn at.
negativeCONDITIONING
vaeVAE
audio_vaeVAE
sourceMMC_PASSThe pass to repair, as the reel node wrote it.
detectorSTRINGThe SAM3 checkpoint that finds the face.
widthINT51232–8192
heightINT51232–8192
seedINT00–18446744073709550000
stepsINT201–200
cfgFLOAT1.000–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.450.01–0.99The ceiling. Scaled down per frame by how large the face already is — see faces.strengths.
reelMMC_REEL

Outputs (2)

NameTypeDescription
reelMMC_REEL
passMMC_PASS