Upscale Machine
Model upscaling without the waxy sheen
- image
- IMAGE
The anti-plastic upscaler
Most people's first AI upscale looks great for two seconds, and then they notice it: the plastic/waxy smoothness, the halos around edges, the over-sharpened everything. Upscale Machine is the pack's attempt to fix exactly that. It's a spandrel-powered model upscaler with two tricks most of its peers skip - frequency-split super-resolution and blue-noise injection - plus a chained-model mode that exists because one pass often isn't enough.
To be clear about what it is: this is a "more pixels" upscaler in the classic ESRGAN family, not a detail-restorer in the SeedVR2/SUPIR lineage. It enlarges and sharpens clean sources; it doesn't invent missing detail or repair damage. That's a feature for clean renders and a limitation for damaged ones.
How it works
It loads any model from your models/upscale_models folder (Real-ESRGAN, ESRGAN, HAT, SwinIR - the usual suspects) via the spandrel loader, then runs a tiled, architecture-aware upscale. "Architecture-aware" is doing real work: the pack keeps per-architecture profiles, so RRDBNet and SRVGGNet-class models run in FP16 with torch.compile enabled, while transformer-heavy models like HAT and DAT get conservative tile sizes and no FP16 (which produces NaNs on those). Tiles fall back to half size on out-of-memory, so it degrades gracefully on small cards.
Then the two tricks:
- Frequency split (on by default). The image is separated into low frequencies (colors, base shapes) and high frequencies (edges). The neural network only upscales the edges; the color pass is plain bicubic. That's the anti-plastic mechanism - the model never gets to invent smooth gradient garbage, because it isn't being asked to upscale the smooth parts. This is the classic frequency-domain trick from the upscaling literature, and it's what kills edge halos.
- Blue-noise injection (automatic when a chained model is used). After upscaling, a small amount of high-frequency blue noise - FFT-generated: white noise, high-pass scaled, normalized - is added back. That targets the "smoothness problem" of low-step distilled models like SDXL Turbo, which come out polished to a mirror finish. Real film grain has a blue-noise character; this re-adds the texture distillation removed.
The chained_model input is the other reason this node exists: chain two upscale models back-to-back in one pass - a sharpener then a smoother, say. It's "two-stage pipeline in one node," and it's what triggers the realism noise.
The inputs that matter
- upscale_model - pick from your
upscale_modelsfolder. The main one. - chained_model - optional second model; "None" for a single pass.
- rescale_factor - output is original × this (default 2, up to 16), rounded to align with UNet constraints (the code rounds to the nearest multiple of 8).
- frequency_split - default on. Turn it off once to see what it was doing for you; you'll probably turn it back on.
One output, IMAGE - wire it into a Save or Preview node.
Install & model setup
Standard pack install - ComfyUI Manager search "SATA UtilityNode", or:
cd ComfyUI/custom_nodes
git clone https://github.com/SatadalAI/SATA_UtilityNode
then restart. The heavy dependencies are spandrel for model loading and opencv-python for the resize path. No models ship with the pack - drop your .pth/.safetensors upscale models into ComfyUI/models/upscale_models before the dropdowns have anything in them.
Honest caveats
- The "original × factor" promise is exact after modulus rounding, so a 2x upscale on an odd-sized image can land a pixel or two off. Don't fight it; that's the UNet alignment working as intended.
- FP16 +
torch.compilegives a real speedup on RRDBNet-class models, but compilation only happens when Triton is importable - on Windows it silently falls back to eager mode. Slower, not broken; the code prints a notice and moves on. - For truly damaged sources, run a restoration pass first. This node is the "clean source" tool in the hierarchy - use it accordingly and it's one of the better ESRGAN wrappers in the ecosystem.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| upscale_model | COMBO | 0 options: | |
| chained_model | COMBO | None | 1 options: None |
| rescale_factor | FLOAT | 2.000.01–16 | — |
| frequency_split | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |