Upscaler (SEGS)
Upscale an image region by region, at full detail, then stitch it back
- image
- segs
- model
- clip
- vae
- positive
- negative
- upscale_model_opt
- upscaler_hook_opt
- scheduler_func_opt
- IMAGE
Most upscalers treat the whole image as one job. Upscaler (SEGS) treats it as a set of regions. You give it an image plus a SEGS - the detected areas - and it upscales and re-samples each region with a full generation pass, then composites the results into a larger final image. In practice this is the engine behind SEGS-based tiled upscaling: chop the image into tiles with Make Tile SEGS, feed them here, and every tile gets its own detailing pass at high resolution while your VRAM only ever holds one tile at a time.
It's a more involved node than a plain ESRGAN pass because it isn't a plain upscale - it's upscale plus a diffusion pass per region, which means it can add invented detail, not just pixels. Decide which of those you want before reaching for it.
How it works
For each region in the SEGS, it scales the crop up (optionally through an ESRGAN-style upscale_model_opt first, then a resampling method to hit the exact target), runs a KSampler pass on it at the settings you give, and pastes it back into the enlarged canvas. Because it's a real sampling pass, it needs the full model stack - model, CLIP, VAE, and both conditionings - wired in directly, not through a pipe.
The inputs and outputs that matter
image+segs- the source image and the regions to upscale. WithMake Tile SEGSupstream, the SEGS is a grid of tiles.model/clip/vae/positive/negative- the generation stack. The positive prompt here is usually something generic like "high detail, sharp" since it applies to every region.rescale_factor(default 2) - the multiplier. 2 doubles the output dimensions.denoise(default 0.5) - how much each region gets rewritten during the pass. Lower (0.2–0.35) keeps it faithful and just sharpens; higher invents detail and risks changing content. This is the dial that decides whether you're doing a clean upscale or a creative one.upscale_model_opt(optional, UPSCALE_MODEL) - plug in a 4x ESRGAN model to do the heavy lifting of adding pixels, so the diffusion pass only has to refine. Cheaper and often cleaner than making the sampler do all the enlarging.
The single output is the upscaled IMAGE.
How to install it
ComfyUI Manager: search ComfyUI Impact Pack, Install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Impact-Pack
cd ComfyUI-Impact-Pack
pip install -r requirements.txt
Run the pip in ComfyUI's Python environment, then restart. For the tiled-upscale use, you'll pair this with Make Tile SEGS (also in the pack) and, ideally, a 4x upscale model dropped into ComfyUI/models/upscale_models.
Common issues & troubleshooting
Faces changed identity in the upscale. Every generative pass can rewrite a face, and this is one. Keep the denoise low, and give recognisable faces their own dedicated detail pass rather than trusting a high-denoise region upscale. This is design, not a settings bug.
Visible seams between tiles. Raise feather and noise_mask_feather so adjacent regions blend, and make sure your tile SEGS overlap. Tiles that abut with no overlap and no feather will show grid lines.
It's slow / hungry. It runs a full sampling pass per region, so a fine tile grid means many passes. That's the trade for arbitrary output size on limited VRAM - fewer, bigger tiles are faster but need more memory each. If you only need more pixels on an already-sharp image and not invented detail, a plain ESRGAN upscale is faster and won't hallucinate.
Prefer an off-the-shelf detail upscaler for whole images. If you're not doing region- or tile-specific work, a dedicated model like SeedVR2 (Apache-2.0, and the community's standing answer for "add detail") is usually less fuss than assembling this node's full stack.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| segs | SEGS | — | |
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| rescale_factor | FLOAT | 2.000.01–100 | — |
| resampling_method | COMBO | 4 options: lanczos, nearest, bilinear, bicubic | |
| supersample | COMBO | 2 options: true, false | |
| rounding_modulus | INT | 88–1024 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.000–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 17 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +11 | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| denoise | FLOAT | 0.500.0001–1 | — |
| feather | INT | 50–100 | — |
| inpaint_model | BOOLEAN | false | — |
| noise_mask_feather | INT | 200–100 | — |
| upscale_model_optopt | UPSCALE_MODEL | — | |
| upscaler_hook_optopt | UPSCALER_HOOK | — | |
| scheduler_func_optopt | SCHEDULER_FUNC | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |