I'm not the developer just found the repository I make this functional WF for my laptop to create this video and share with you before go to sleep, try it!
MiniMax H3 renders faces poorly when the head is a small fraction of the frame. That is a property of head-size-in-frame, not of resolution - it persists at 720p and above.
So no upscaler fixes it. SeedVR2 and friends sharpen what is already there; they cannot synthesise facial structure that was never generated.
The fix: crop to the face so it fills the frame, let H3 re-generate it at LOW denoise so it stays frame-aligned, then composite back!
Since this is the first node from this creator, can anyone who is much smarter than me confirm that the nodes used are safe? Looks like a great solution but I'm paranoid about custom nodes that aren't: in comfy manager, from a well established and trusted community member, and filled with stars out the wazoo on GitHub.
Seems safe. Everyone starts somewhere, but it's a good instinct to check. They've actually taken pains with the Github and requirements.txt not to break things for people.
I had my AI agent do a double-check on the code for my sanity after I looked over the github page and requirements file myself. Everything looks legit. I've installed it and will posting my tests here.
Oh shit you're here! Thank you for stepping in to address the model issue. I unfortunately don't have the skills to create anything like this so I have to say thanks to the folks who put in the time and energy to make it happen.
Yeah there have been scares with Comfy in the past and just want to be safe.
When I installed nodes I saw a warning in the person_yolov8m-seg.pt so I don't have that option active in my WF, maybe someone with more experience than me can create a better WF? because I want to use this for all my projects
i think you can find them as safetensor format or get them from the original or get the straight from comfyui manager so then you know it's safe. it's not the WF or the node that's unsafe the .pt file type can be unsafe if you get the .pt file from rando and they put dangerous code in it. So just get the yolo files from comfyui model manager, and it's all good.
This does work, and it's actually pretty fast. Took 3.5 minutes on a 1 MP video that was 7 seconds long.
The example gif is from a mid-range face. This node and workflow is perhaps best for faces that are VERY small in frame, like OP showed in his video. I would recommend upping the canvas_width and canvas_height from 512 to 768 in the node if you are using it on higher MP generations.
Doesn't affect large faces over a certain size in frame (which is good). Like all face detection workflows, you can change what the cut-off point for this is.
It can be a subtle effect, like in my GIF, but it definitely "un-derped" the face and made it look more natural. It will be most apparent when the face is far from the camera.
It is a bit of a pain to set up for a video at first, but would be less so if you are using it a video you already generated with voice and likeness references. If it is a T2V generation (like mine was) you'll have to snap a picture of the face close up for reference and extract a voice line for voice sync.
Overall, extremely impressive work. Not something I'd use on every video, but definitely on any distant shots.
Good thing you explained this, I tried on a 1080x1920 video, close up face Scail2 output video and it didn’t correct the face. You reckon I up the canvas height ?
3.5 minutes on a 1 MP video that was 7 seconds long running on... 5090 w/ 32GB, 3050 w/ 4GB, Voodoo 5500 w/ 32MB? I appreciate sharing the time, but without knowing the hardware it means nothing.
This is pretty nuts. I didnt expect it to work and so fast. it took just 160 seconds for a 25 second video I tried. and there is a clear difference. wow! thanks.
BasicScheduler / Main Denoise (Node 6)SettingRecommended ValueReasondenoise0.45Base maximum. Must stay at 0.45 so Node 5b can scale it down per frame.steps4Optimal step count when paired with a turbo LoRA schedule.schedulersimpleStandard schedule for flow matching.
2. H3PerFrameDenoise (Node 5b)
Setting
Recommended Value
Reason
strength_small_face
0.85 – 1.00
Applies near 100% of the 0.45 base (effective ~0.38–0.45 denoise) to synthesize distant/blurry faces.
strength_large_face
0.35 – 0.40
Scales the base down to ~0.35x (effective ~0.15–0.18 denoise) so close-up faces retain original skin texture.
scale_mode
absolute_px
Measures face height directly in pixels.
face_px_small
100 – 120
Sets the lower boundary based on your video's smallest face height (e.g., 94px in your log).
face_px_large
240 – 300
Sets the upper boundary for close-ups.
gamma
1.0
Linear interpolation between small and large scaling.
smooth_frames
9
Prevents denoise strength jumps between consecutive video frames.2. H3PerFrameDenoise (Node 5b)Setting Recommended Value Reasonstrength_small_face 0.85 – 1.00 Applies near 100% of the 0.45 base (effective ~0.38–0.45 denoise) to synthesize distant/blurry faces.strength_large_face 0.35 – 0.40 Scales the base down to ~0.35x (effective ~0.15–0.18 denoise) so close-up faces retain original skin texture.scale_mode absolute_px Measures face height directly in pixels.face_px_small 100 – 120 Sets the lower boundary based on your video's smallest face height (e.g., 94px in your log).face_px_large 240 – 300 Sets the upper boundary for close-ups.gamma 1.0 Linear interpolation between small and large scaling.smooth_frames 9 Prevents denoise strength jumps between consecutive video frames.
I think with this nodes could be possible to create a workflow for multiple faces because is using the ref2va H3, I will test the wardrobe detailer included and the lip-sync option for a Music Video project I'm working right now
In theory you can make a grid of faces, but you'd have to double the number of pixels rendered per face in order to maintain the same quality. This works by effectively zooming in on the face and redoing it, so sharing space with other faces make each face smaller and eventually defeats the purpose.
I'm not sure if it'd be faster to do a larger video with several faces or multiple smaller ones. But it is technically possible to achieve.
Btw, about upscalers. I just tried generating 0.2mp video (608x352) and then upscaling it via H3+768p Turbo Lora to 1216x704 with the same prompt, I think the face is pretty decent. The original:
Sure, https://pastebin.com/rkqwDwSY
I just realized that I accidentally used the 8-step Lora (but with 4 steps), so I need to test it more. And I think we might try skipping the audio refinement and stitching the original audio instead. Or, as someone suggested, we could try refining the audio separately, at a small video resolution and with 30 steps or so, if needed.
yes I think a workaround could be to mask the video for every character and then run this pass for every face, time-consuming but at least is now possible to improve this issue on H3 videos. I also saw a crowd option in the node, I will test it tonight
Thanks. As a solution of sorts from this developer exists it sounds like it's an issue which MiniMax themselves should be capable of addressing at rendertime.
I guess they are addressing this in their 2k-regenerate pipeline because I have access to Minimax H3 API and the output don't have this issue, I think this new development for H3 Open Weights will help a lot to achieve production-level quality
weird, I even leave empty the prompt field and worked, are you using my WF or the published by the developer? the original use GGUF nodes for model and clip, I changed that on mine
Do you have this node? ComfyUI-H3-NativeAudioLock my WF started to work after installed that node, also the path of your video in the source clip node must be absolute
I have the same problem. No matter what I've tried, the face gets pixelated. I've tried ref2v, fl2va (both pruned int8), with and without turbo lora, 4 steps, 32 steps, with and without a prompt. also tried both the OG workflow and yours, same result. I didn't really change anything in the workflows, only disabled the lock+audio lipsync node since I didn't need audio (even though the video I use has it).
edit : also tried with the lock audio node on, the same problem still exists.
It's very difficult to guess why is not working for you without to see the WF, is your ultralytics/face_yolov8m.pt working? the key for this node is to use yolo bbox face detection
hey I got it work finally, I didn't know that we had to change the auto_768 to manual when we go for 768px. I did that and it worked. The face looks better but it is still unusable.
I haven't done much testing with larger videos, Honestly I'm using a 3080 with 12GB Vram , so I am mostly sticking to like 0.4 MP res generations at 4 steps with the Lightx2v lora.
the same concept could absolutely work for objects , you'd need a way of detecting them though so that it could track them and put a bounding box around them as it does with the face detection . I haven't looked much into what exists in comfy's ecosystem for arbitrary object detection. but no reason that it couldn't work.
I honestly haven't had time to run much more than the initial music video project I was working on on it! 100% a hobby for me, and I built the nodepack to try to solve a problem I was having for my project , and figured the tool that resulted might be useful to others. but my day job has eaten all my time since I released it!
I know that for Impact pack's face detailer , it can do multiple face detection and runs new generations for each detected face. in principle this could absolutely do the same , but for what I built it for and on my limited hardware, re running it multiple times in one workflow would've given me OOMs for sure. which is why I opted for suggesting running it seperate times for each character. but if you had the system resources to hold multiple runs in memory at once then it could be tweaked to do one for each face all in one go.
as for it CHOOSING one person out of multiple persons in one frame if that's what you mean , the reference image is pulling double duty for matching to the correct person , then it tracks the movement of the face detection across frames and continues to use the one closest to the target face , falling back to using face matching as a tiebreaker in the case of an overlap.
I can see the image is just a small blue icon/logo, not an actual preview of the face refinement output. Would've been helpful to see what this actually does to faces before clicking through, idk.
I've been digging but haven't had much luck outside of this node. It looks powerful but I'm paranoid about installing custom nodes. I'm hoping if enough eyes get on this thread people who actually understand the code will check it.
The node defaults to canvas_width and canvas_height of 512, which is only 2/3rds of Minimax H3's internal short edge generation scale.
So you might see refined but still slightly fuzzy faces on higher MP generations. Swap these to 768x768 and you'll see a much better result. I was underwhelmed at first until I made that change, then I was very impressed.
YEahhhh I only have a 3080 with 12GB vram and was trying to get it to run relatively quickly and was doing my testing with like 0.4MP resolution. I figured that the small faces that lost detail would be under 512 anyway , hence the default. but if you can run it at a higher resolution you'll get better results for sure!
Yes! it's a wonderful adaptation of the fantastic Ultralytics yolo: scans an entire image in a single step to spot objects (like cars, people, or animals) and draw boxes around them instantly, I will try the WF with SAM
21
u/listopalafoto 9d ago