Iris Upscale
49 tiles, 47 seconds, and why the 4x is a restoration pass and not a redraw
- upscaler
- image
- IMAGE
This is the payoff node. It takes any image - Iris output, a phone photo, an old render - and does a 4x upscale plus restoration in one pass. Bicubic makes things bigger; this makes them better, and the author's own comparison shot is exactly the argument you'd expect: soft bicubic on the left, reconstructed detail on the right.
The distinction matters more than it sounds. This is a diffusion model, but it isn't being used to redraw your image. The upscaler is fine-tuned for restoration at a fixed noise level, so each tile gets a single forward pass rather than a denoising loop. Deterministic, no seed, no prompt, no CFG - one pass per tile and you're done. That's why it's fast enough to be practical and why it doesn't invent a new face the way a tiled img2img upscale will.
How the tiling works
The mechanism is worth knowing because it explains both the quality and the seam-free result. The image is bicubic-upscaled to the target size first - the model's job is to fix those soft pixels, not to invent resolution from nothing - and then walked in 1024 px tiles with 50% overlap. Each tile gets its restoration pass, and overlapping tiles are blended with a Gaussian window rather than a hard cut, which is what stops the grid seams you'd otherwise get at every tile boundary. The model needs the long dimension padded to a multiple of its patch size, which the node handles.
After the blend, an optional wavelet color fix re-injects the original image's colour statistics, because a restoration pass tends to drift saturation slightly. It's on by default and it's the reason the output looks like a sharper version of your image rather than a slightly differently graded one.
The cost is honest arithmetic. A 1024→4096 upscale is 49 tiles at roughly 47 seconds on the author's 16 GB card.
Inputs and output
upscaler - from Load Iris Upscaler. Required.
image - any IMAGE. Batch works; the node walks frames one at a time.
scale - default 4, range 1 to 4 in 0.5 steps. It was trained for 4x. Lower values still run, but you're asking a restoration model trained at 4x to do a big enlargement - fine for a 2x touch-up, not where it shines.
limit_input_size - this is the field to understand. On by default, it shrinks the input first so its short side is at most 512 px and its long side at most 1024 px, meaning at 4x the output is at most 2048x4096 and the run is at most 21 tiles. That's the guard rail that stops a 4K source from turning into a 16K output over a hundred tiles and an hour of your life. Turn it off and you keep the input size, with time growing with the output area - the node's own wording.
color_fix - the wavelet step above. Default on. Turn it off if you want to see what the model alone produces; you'll usually turn it back on.
Output is a single IMAGE at the requested scale. Into Save Image, or back into anything else. A common graph is text-to-image → this node, which is exactly what the shipped Text-to-Image workflows do: they end with a 4x upscale group that's bypassed by default. Select the group, press Ctrl+B, and you get the 1024→4096 pipeline.
Install
Search Iris-3B in ComfyUI-Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/bani4kaskashka/Iris-3B-Comfy-Nodes
pip install -r requirements.txt
The upscaler checkpoint is 12 GB and downloads on first use if you don't have it. If you want the shipped graph, open Iris-3B Upscale 4x from Templates or drag the example JSON in.
Where it goes wrong
"images in the batch upscaled to different sizes". With limit_input_size on, the shrink factor is computed per frame. Feed a batch of differently-shaped images and the outputs won't match, so the node bails rather than stacking ragged tensors. Resize your inputs to a common size first.
It's taking forever. Check limit_input_size. Off means your 3000x2000 photo goes in undiminished, and the tile count scales with the output area - the tooltip literally warns that time grows with it. Either turn it back on or pre-shrink.
Colours shifted. Flip color_fix on if it's off - or, if it's already on and you still see drift, note that the fix is a wavelet blend, not a null op; a small shift on extreme inputs is possible, and the fix exists to reduce a bigger one.
It looks soft, not sharper. You probably ran it on an image that was already upscaled once. This is a 4x restoration model, not a chainable detail hallucinator - stack it and you stack the softness. One pass at the size you want.
Where I'd reach for this versus a generic upscaler: for photographs, old renders and anything with real texture, this. For anime line art, a dedicated ESRGAN-family model is smaller, faster and often sharper. Iris's edge here is that it restores rather than merely enlarges, and it doesn't need a prompt or a ControlNet tile to stay faithful to the source.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| upscaler | IRIS_UPSCALER | — | |
| image | IMAGE | — | |
| scale | FLOAT | 4.01–4 | trained for 4x. Lower values restore at a smaller size |
| limit_input_size | BOOLEAN | true | shrink the input first so its short side is at most 512 px and its long side at most 1024 px (at 4x: at most 2048x4096, 21 tiles). Off keeps the input size, and the time grows with the output area |
| color_fix | BOOLEAN | true | keep the input's colors (wavelet color fix) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |