SeedVR2 Tile Stitcher
Putting the tiles back together without the patchwork
- upscaled_tiles
- tile_metadata
- image
If you've ever tried to tile-upscale with seed nodes and ended up with a grid of visible seams, you know the hard part was never the splitting - it's the stitching. SeedVR2TileStitcher is the back half of BacoHubo's SeedVR2 Tiler pack, and it exists to make that part boring. It takes the batch of upscaled tiles that came out of the SeedVR2 node, plus the tile_metadata the splitter handed you, and reassembles one seamless image.
What it does
Each tile from the splitter overlaps its neighbors by overlap_percent, which means the stitcher has to decide whose pixels win in the overlap zones. The answer is feathered alpha blending: every tile gets a weight mask that fades to zero toward its edges, the overlapping tiles are summed against a weight buffer, and the result is divided out. Hard cut at 0, smooth linear feather at 1.0 - that feather_blend setting lives on the splitter, by the way, and rides along inside the metadata, so you don't see it here.
Two details are worth knowing because they're why this node doesn't bite you like other tiling setups. First, the stitcher detects the actual upscale factor at runtime from the tile dimensions SeedVR2 actually produced, not the one you asked for - so if SeedVR2 decided to return a slightly different resolution than your hint, the whole thing still aligns instead of throwing a size mismatch. Second, it crops the edge-replication padding the splitter added before it ever reaches the blending math, and in the single-tile case it returns SeedVR2's output pixel-perfect, untouched.
Inputs and output
Only two inputs, and both are required:
upscaled_tiles- the IMAGE batch after SeedVR2. Not the splitter's tiles; the upscaled ones. This is the most common wiring mistake, so double-check what's actually connected.tile_metadata- straight from the splitter's middle output. Don't hand-build it, don't reroute it.
Output is a single image - the final stitched result. That's the whole node. Two in, one out, no knobs to fiddle.
Wiring it
Load Image → SeedVR2TileSplitter → tiles ──────────→ SeedVR2 → upscaled tiles ──┐
→ tile_metadata ───→ SeedVR2TileStitcher ←──────┘
→ resolution ──────→ SeedVR2 (resolution input)
The author's own framing: the splitter/stitcher pair isn't a full workflow, just the tiling and stitching part. Whatever preprocessing you like - a downscale to ~0.35MP on soft sources, a little noise, a little blur - stays separate in stock ComfyUI nodes.
Install
ComfyUI Manager, search SeedVR2 Tiler, or:
cd ComfyUI/custom_nodes
git clone https://github.com/BacoHubo/ComfyUI_SeedVR2_Tiler
No extra dependencies and no model downloads - this pack adds nothing to PyTorch. But it's useless without the numz SeedVR2 node and SeedVR2's weights, which you should run at FP16 anyway (FP8 adds tiling grids, GGUF damages skin - the community learned this the expensive way).
Troubleshooting
- "Expected N upscaled tiles but received M" - you changed the batch between split and stitch, or you connected the splitter's raw tiles instead of SeedVR2's output. Batch order has to survive the trip untouched.
- Visible grid lines - your
overlap_percentis too low for that image, or you're on a quant that adds its own grids. Try 15–20% overlap, then check FP16. - Blurry output - if your pack predates v1.2.0, the old canvas-resize approach degraded pixels before SeedVR2 even saw them. Update and the splitter uses edge-replication padding instead; original values survive.
- A tiny color/contrast shift - other tiler implementations roundtrip through PIL and drift. This one stays in torch tensors end to end, so if you do see a shift, it's SeedVR2's own contrast lift doing its thing, not the stitcher.
For a genuinely huge target, don't crank one pass - feed the stitched output back through the splitter. Multi-pass upscaling is the intended path, and each pass gets cheaper relative to what a single giant pass would OOM on.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| upscaled_tiles | IMAGE | — | |
| tile_metadata | TILE_METADATA | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |