toobusy Hires Upscale
The hires-fix prep node that lands on a clean 2x every time
- image
- vae
- upscale_model
- image
- latent
- width
- height
Hires fix has a choreography problem: upscale the image, resample it back down to a sane working size, and re-encode it to a latent so you can run a second pass. That's four nodes every time - upscale model loader, upscale-with-model, image scale, VAE encode - and the fiddly bit is the math in the middle. toobusy Hires Upscale folds all four into one node and, thanks to a smart scale_by default, makes the math land on a clean 2x without you doing division.
How it works
It runs the standard chain internally: UpscaleModelLoader → ImageUpscaleWithModel → ImageScaleBy → VAEEncode. The scale_by field is the key to understanding it. A 4x upscale model (like the default 4x_foolhardy_Remacri.pth) makes your image four times bigger - which is usually way past what you want to re-sample. scale_by resamples after the model upscale, so a 4x model at scale_by = 0.50 lands on exactly 2x, and 1.0 keeps the raw model output. The tooltip says it plainly: "A 4x model at 0.50 lands on a clean 2x."
The downscale_method defaults to lanczos, which is the right call for resampling - it's the non-generative, can't-invent-detail workhorse. That's the correct division of labor here: the ESRGAN model adds pixels, lanczos resizes, and the VAE encode hands you a latent for the second diffusion pass.
The inputs that matter
imageandvae- the obvious two; the VAE comes from your generation model's loader.upscale_model_name- an ESRGAN-family model from yourmodels/upscale_models/. The default Remacri is a solid general-purpose pick;4x-UltraSharpis the other community standard. Connect anupscale_model(UPSCALE_MODEL) input to skip the dropdown entirely.scale_by- the dial that matters. 0.5 with a 4x model = 2x final. If you want a 3x-ish target, think in terms of final size and work backwards.downscale_method- lanczos unless you have a reason.
Outputs and where they go
latent- the VAE-encoded result, into your second-pass sampler (or thelatent_overrideinput of a fold node like Z-Image Turbo for a closed loop).image- the resized pixels, handy if you want the intermediate.width/height- the actual resized dimensions, so downstream nodes know what they're dealing with.
Install and gotchas
Standard pack install (Manager "toobusy", or git clone + restart). The upscale model is the only external file - it comes from an ESRGAN-family repo, not the pack. The README's recommended combo is exactly the loop this node exists for: Z-Image Turbo → Hires Upscale → Z-Image Turbo (latent_override).
The one thing people get wrong: this node resamples and re-encodes, it doesn't add detail. If your first-pass image is soft and you were hoping the hires pass would invent texture, the ESRGAN model adds some, but the real fix for "soft" is generating at a higher native size, not upscaling. Use this node for the classic two-pass flow where the second pass does the quality work - it's prep, and it's good at it.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| vae | VAE | — | |
| upscale_model_name | COMBO | ESRGAN/4x_foolhardy_Remacri.pth | ESRGAN-family upscale model. Skipped when the upscale_model override is connected. |
| downscale_method | COMBO | lanczos | 5 options: nearest-exact, bilinear, area, bicubic, lanczos |
| scale_by | FLOAT | 0.500.05–8 | Resample factor applied AFTER the model upscale. A 4x model at 0.50 lands on a clean 2x. 1.0 keeps the raw model output. |
| upscale_modelopt | UPSCALE_MODEL | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| latent | LATENT | — |
| width | INT | — |
| height | INT | — |