ComfyUI Node

Upscale Machine

Model upscaling without the waxy sheen

By SatadalAI·Created about a year ago·Updated 11 days ago· 3
Upscale Machine
  • image
  • IMAGE
upscale_model
chained_modelNone
rescale_factor2.00
frequency_splittrue

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_models folder. 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.compile gives 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.
CategorySATA_UtilityNode

Inputs (5)

NameTypeDefaultDescription
imageIMAGE
upscale_modelCOMBO0 options:
chained_modelCOMBONone1 options: None
rescale_factorFLOAT2.000.01–16
frequency_splitBOOLEANtrue

Outputs (1)

NameTypeDescription
IMAGEIMAGE