SeedVR2 Framing Downscale
Pick SeedVR2's Downscale From the Face, Not From Your Mood
- image
- downscale_factor
- face_fraction
downscale_factor is the setting that decides whether SeedVR2 makes your portrait look better or makes it look like someone else. Lower it and the model gets more to restore, so you get more skin texture - but it also shrinks the face SeedVR2 sees, and a face that's small in the frame comes out changed. That's the whole tension, and it's why the same setting is right for a close-up and wrong for a wide shot. This node sets it for you from the actual face size.
How it decides
It runs SAM 3 over your batch with the prompt face - boxes only, up to four faces per frame, detected four frames at a time - and takes the tallest box's height divided by the image height. That fraction is the framing:
| Face fraction | Shot | downscale_factor |
| --- | --- | --- |
| ≥ close_up_min_face (0.3) | close-up | close_up_factor (0.5) |
| ≥ medium_min_face (0.18) | medium | medium_factor (0.75) |
| below that | far | far_factor (1) - no downscale, the face is left alone |
| no face found | - | no_face_factor (1), with a log warning |
A batch gets one factor, taken from the tallest face across every frame, because SeedVR2 Resize takes one factor for the whole batch. If you're upscaling a mix of close-ups and wides in one go, the close-up wins and the wide shots get a stronger downscale than they'd like. Split the batch if that matters.
The intuition behind the defaults is worth internalising even if you never touch the widgets: a large face keeps its shape under aggressive downscaling and gains the most texture, a medium shot needs moderation, and a small face can't take any. Working through the arithmetic on a 1024-px-tall frame, the thresholds keep the face at roughly 138 px or more after the downscale - between the 70 px face that visibly changed and the 184 px one that held.
Inputs and outputs
image- the original image or batch, the same one you're feeding SeedVR2 Resize.sam3_model- a SAM 3 checkpoint undermodels/checkpoints. The default,sam3.1_multiplex_fp16.safetensors, is downloaded on first use.close_up_min_face,medium_min_face- the two thresholds (0.3 and 0.18).medium_min_facemust sit belowclose_up_min_face.close_up_factor,medium_factor,far_factor,no_face_factor- the four factors.detection_threshold- SAM 3's, default 0.5.- Outputs:
downscale_factor(wire it into SeedVR2 Resize or SeedVR2 Preprocess (Compact)), andface_fraction, which is the measured number - the one to look at when the factor surprises you.
The honest caveat
The two thresholds are estimates, not measurements. The tooltip says so in as many words: they were placed between observed cases (a 0.37 fraction held under its factor, a 0.14 one changed, and each bound sits between neighbours), but they haven't been calibrated against a proper sweep of SeedVR2 output. So treat the defaults as a sane starting point rather than gospel, and adjust the factors, which are the part people actually have opinions about.
Second caveat: the fraction is resolution-blind. The same fraction is twice the pixels at twice the image height, so a high-resolution far shot may tolerate a lower factor than a low-resolution one. If you're working at 4K and the node is being timid, that's why.
Install
Manager, search ComfyUI-BCNodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/0xBeycan/ComfyUI-BCNodes
pip install -r ComfyUI-BCNodes/requirements.txt
Restart and search BCNodes in the node library (BCNodes/seedvr2). Requirements are opencv-python, postfx and caption-audit - none of which this node needs. Delete a leftover ComfyUI-AutoBypass folder from the pack's old name.
The SAM 3 checkpoint is the thing to plan for: it goes in models/checkpoints and downloads on first run, so the first execution needs a connection. SAM 3 itself is Meta's promptable segmenter - the same family that replaced "train a detector for it" with "name the thing".
Where it bites
The no-face path silently gives you 1, which is the safe answer, but a detector that misses on a stylised or heavily-processed render will quietly push you to no downscale at all. Watch face_fraction: a hard 0 when there's obviously a face on screen means the detector looked past the style, not that the image has no face.
And this is one node in a chain that needs the rest of the pack's SeedVR2 pieces, plus ComfyUI's own SeedVR2 sampler and VAE. It's an input decision, not a complete pipeline.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The original image(s), the batch SeedVR2 Resize gets. One factor for the whole batch, from its tallest face (Resize takes one factor). | |
| sam3_model | COMBO | sam3.1_multiplex_fp16.safetensors | SAM 3 checkpoint under models/checkpoints; the default is downloaded when missing. |
| close_up_min_face | FLOAT | 0.300.01–1 | Face height / image height from which the shot is a close-up. Uncalibrated default (an estimate, not yet measured against SeedVR2 output). |
| close_up_factor | FLOAT | 0.500.01–1 | downscale_factor for a close-up: a large face keeps its shape at a strong downscale and gains the most skin texture. |
| medium_min_face | FLOAT | 0.180.01–1 | Face height / image height from which the shot is medium; below it, far. Must be below close_up_min_face. Uncalibrated default (an estimate, not yet measured against SeedVR2 output). |
| medium_factor | FLOAT | 0.750.01–1 | downscale_factor for a medium shot. |
| far_factor | FLOAT | 1.000.01–1 | downscale_factor for a far shot. 1 = no downscale, so SeedVR2 does not change a small face. |
| no_face_factor | FLOAT | 1.000.01–1 | downscale_factor when no face is found (logged). |
| detection_threshold | FLOAT | 0.500–1 | SAM 3 detection threshold for the face. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| downscale_factor | FLOAT | Wire to SeedVR2 Resize (or SeedVR2 Preprocess (Compact)) downscale_factor. |
| face_fraction | FLOAT | Height of the tallest face box / image height, over the whole batch; 0 when no face is found. |