Upscale Image
Three model tiers, one dropdown, and no more upscaler shopping
- images
- upscale_model
- image_a
- image_b
- info
- data1
- data2
"Which upscaler should I use?" is three questions wearing one coat: do you need more pixels, more detail, or more pixels that weren't invented? Upscale Image answers all three from a single node by putting the whole ladder behind one model_tier dropdown - a fast GAN rung, a quality transformer rung, and a diffusion rung that will cheerfully hallucinate.
The tiers
tier1_fast (Real-ESRGAN - GAN, ms/frame) is the classic 4x GAN upscale: no invented content, milliseconds per frame, the correct answer when your source is clean and you just want it bigger. tier2_quality covers HAT-L (a transformer with state-of-the-art PSNR) and SwinIR-L. tier3_creative is SD x4 or SeedVR2 - diffusion passes that invent detail. auto picks for you based on content analysis.
Because the tooltips name the rungs rather than hiding them, you can treat this as the same decision tree the community has argued about for years, with the shopping trip removed. The one honest caveat from the wider ecosystem applies: a generative rung rewrites faces, so a portrait still wants a face pass afterwards.
How the non-obvious parts work
hdr_mode is where this pack earns its keep compared to a generic upscaler node. auto preserves the range when the input exceeds 1.0 and clamps otherwise; preserve Reinhard-tonemaps before the super-resolution pass and re-expands afterwards, so highlights above 1.0 survive; clamp is the legacy 0–1 LDR path. If you're upscaling a scene-linear plate from the pack's HDR side, preserve is the difference between keeping your speculars and flattening them.
color_encoding (passthrough, linear<->sRGB, linear<->LogC3) addresses the real reason generative upscalers look bad on linear input: the network was trained on display-referred images. Encode to sRGB or LogC3 before the pass and decode after, and the model sees the domain it expects.
scale is 2×, 4× or 8× (tile cascade) - the 8× option runs the 4× model twice with the second pass area-downsampled by half, which is a clever way to get a big number without a model that was never trained for it, at roughly four times the cost.
mode is the taste dial: precise is Real-ESRGAN fidelity-first, balanced adds light sharpening, creative reaches for diffusion and needs the VRAM. tile_size (512) and overlap (128) are your OOM controls - drop the tile size first. And if you already own a favourite upscale model, connect it to upscale_model: it replaces the built-in tiers, and model_tier and creative mode are ignored from then on.
operation: Route runs the analysis and passes the image straight through - useful when you want the content class and stats without spending GPU time.
Outputs are image_a, image_b, info, data1 and data2. Read info; it says which tier and path actually ran, which is how you find out that your Tier 2 request quietly fell back to Real-ESRGAN.
Install
Manager → search Radiance → Install → restart → refresh the browser. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Windows portable users: python_embeded\python.exe. Real-ESRGAN and SwinIR-L weights download on first use, SHA-pinned. RADIANCE_ALLOW_DOWNLOADS=0 or RADIANCE_UPSCALE_OFFLINE=1 disables that.
The three traps
HAT-L has no automatic download. It's published only on Google Drive, so there's no pinned URL - install it by hand from the HAT page. Until you do, Tier 2 runs SwinIR-L at 4x and Real-ESRGAN at 2x, and says so in the log.
SeedVR2 needs company. The Tier 3 SeedVR2 path needs the separate ComfyUI-SeedVR2_VideoUpscaler node pack, which fetches its own weights; without it, Tier 3 falls back to the SD x4 upscaler. SeedVR2 is the option the wider community rates highest for detail on a clean image, so this is worth installing properly rather than tripping over.
The confidence map is geometric, not epistemic. The pack's confidence output is 1.0 at tile centres falling toward tile edges - it locates seam blending. It does not measure hallucination, and the known-issues list says no backend reports that. Don't read "high confidence" as "this detail is real."
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| operation | COMBO | Upscale | Upscale: run super-resolution. Route: pass images through and output the recommended tier, content class and stats (no upscale). |
| images | IMAGE | Input image batch. | |
| scaleopt | COMBO | 4× | Output scale. 8× runs the 4× model twice, the second pass area-downsampled by half. |
| hdr_modeopt | COMBO | auto | Scene-linear / HDR handling. auto: preserve range when input exceeds 1.0, else clamp. preserve: Reinhard tonemap before SR and re-expand after (keeps highlights >1.0). clamp: legacy [0,1] (LDR). |
| color_encodingopt | COMBO | passthrough | Encode scene-linear -> display (sRGB/LogC3) before SR and decode after, so the LDR-trained network sees the domain it expects. passthrough: feed pixels unchanged. |
| modeopt | COMBO | precise | precise: Real-ESRGAN fidelity-first. creative: diffusion detail hallucination (requires VRAM). balanced: GAN upscale + light sharpening. |
| tile_sizeopt | INT | 512128–1024 | Tile size in input pixels. Reduce if OOM. |
| overlapopt | INT | 12832–256 | Overlap between tiles in input pixels, blended to hide seams. |
| sharpness_boostopt | FLOAT | 0.000–1 | Unsharp mask strength applied after upscale. |
| denoise_preopt | FLOAT | 0.000–1 | Gaussian pre-denoise strength. |
| upscale_modelopt | UPSCALE_MODEL | Optional ComfyUI UPSCALE_MODEL; its native scale should match scale. When connected it replaces the built-in tiers (model_tier and creative mode are ignored). | |
| model_tieropt | COMBO | auto | Model tier. 'auto' selects based on content analysis. |
| diffusion_stepsopt | INT | 201–50 | Inference steps for Tier 3 diffusion (creative mode or a tier3 model_tier). More steps are slower; SeedVR2 is one-step. |
| diffusion_noise_levelopt | INT | 200–350 | SD x4 upscaler only: noise added to the low-res input. Higher lets the model invent more detail and drift further from the source. |
| guidance_scaleopt | FLOAT | 7.51–20 | SD x4 upscaler only: classifier-free guidance toward enhancement_prompt. Higher follows the prompt more strongly. |
| enhancement_promptopt | STRING | Text prompt for creative mode diffusion steering. | |
| prefer_speedopt | BOOLEAN | false | Always recommend Tier 1 fast regardless of content. |
| sample_frameopt | INT | 00–9999 | Index of frame to analyse (for Route operation). |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| image_a | IMAGE | — |
| image_b | IMAGE | — |
| info | STRING | — |
| data1 | STRING | — |
| data2 | STRING | — |