Pre-Process SeedVR2 Input
The unglamorous node that makes SeedVR2 work
- resized_images
- images
SeedVR2 is the current king of "add detail that was never there" upscaling - the one-step diffusion restorer from ByteDance that took over from SUPIR and got so good the community called it "illegal." This node is not that. This is the paperwork: it takes the image you've already resized and pads it into the exact shape SeedVR2's VAE insists on before anything else in the pipeline will run. No model, no sampler, no settings to tune - one input, one output, and if you skip it, you'll either hit a shape error or feed the VAE garbage. Boring is its whole job.
The name is a half-lie: it doesn't resize anything. The "resized" part is a requirement on you. SeedVR2 refines detail; it doesn't do the initial resize. The intended pipeline is: upscale your image to the target resolution first (the Comfy Org handbook even recommends downscaling soft sources to ~0.35 megapixels before that, so the model has detail to rebuild), then pass that result into this node, then VAE encode → SeedVR2 conditioning → sample → decode → Post-Process SeedVR2 Output. This node is the first link in that chain, and the post node is designed to be its mirror image.
What it actually does
Mechanically it's four boring operations, all grounded in the source:
- Drops the alpha channel - anything past 3 channels gets sliced off. Transparency is re-applied later by the post node, from the original resized image.
- Clamps values to [0, 1] - cheap insurance so nothing out-of-range reaches the VAE.
- Zero-pads height and width up to multiples of 16. That's the VAE's spatial requirement; feed it non-multiple dims and it fails.
- For multi-frame input (video), pads the frame count to 4n+1 (1, 5, 9, 13…) by repeating the last frame. SeedVR2's VAE downsamples temporally by 4, so the model needs a 4n+1 sequence to get a clean n+1 latent frames. A single image is already 1, so it sails through.
Output comes back as a B, T, H, W, C tensor, ready for VAE Encode.
The one input, the one output
resized_images- the image (or video frame batch) you already upscaled. That's it. No strength, no method, no toggles.images(out) - the padded image, wired straight intoVAE Encode.
Worth saying once, loudly: the black bars in your preview are the padding, not a bug. The post node crops them off at the end and aligns the result back to your original. Don't "fix" them, don't judge your output from a mid-pipeline preview.
Getting it
It ships with ComfyUI core - landed in July 2026 (PR #14424), so update if your build predates that. The node itself loads no model files; the two things the pipeline needs go in the usual spots: a SeedVR2 checkpoint (e.g. seedvr2_3b_fp16.safetensors) in models/diffusion_models/, and seedvr2_ema_vae_fp16.safetensors in models/vae/.
Where people get burned
- Running the post node without the pre node's provenance. If you route around the pre node and feed raw input to VAE encode, the alpha that the post node tries to restore won't be there, and non-multiple dims will error. Keep the pair together.
- Expecting it to resize. Feed it the untouched low-res source and you get a padded low-res image. The upscale step happens before this node.
- Judging SeedVR2 on a bad quant. This node doesn't care, but the model does: GGUF damages skin texture and FP8 adds tiling grids - run FP16 if it fits. And remember SeedVR2 lifts contrast, and it can turn close-up skin into "human to lizard." Do a separate face pass if the face is the subject.
- Forgetting the alpha drop on transparent assets. If your source has transparency and you skip the post node, you've lost the alpha for good.
This node is invisible when it works, which is the entire point. Set it, wire it, stop thinking about it, and let SeedVR2 do the part that's actually impressive.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| resized_images | IMAGE | The resized image to process. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The padded image for VAE encoding. |