Tile
The preprocessor behind faithful detail-adding upscales
- image
- IMAGE
This is the preprocessor that makes tiled upscaling actually look good. If you've ever run an image through Ultimate SD Upscale or Tiled Diffusion and watched each tile quietly drift into its own little hallucination - a patchwork of mismatched faces and textures - the Tile ControlNet is the fix, and this node is how you feed it. The idea behind Tile ControlNet is simple and clever: hand the model a softened copy of the source as a condition, so as it regenerates each tile at high resolution it refines the original instead of reinventing it. Structure stays put; detail gets added. That's the whole "add real detail while staying faithful" upscale in one condition.
It's one of the workhorse conditions of the SD 1.5 / SDXL era and still the backbone of "tile controlnet + tiled diffusion," which remains one of the most reliable realistic-upscaler recipes going.
How it works
The trick is the blur. Tile ControlNet works best when you give it a slightly soft version of the image - not the sharp original. Why? Because a tile ControlNet faithfully reproduces whatever you feed it, so if you hand it your compression artifacts and noise, it'll dutifully upscale those too. Blur the source first and you hide the junk while keeping the real structure, which frees the model to paint crisp new detail on top of a clean base.
That's what pyrUp_iters controls. It runs a Gaussian-pyramid blur - repeatedly downsampling and upsampling the image - and each iteration softens it further. More iterations, more blur, more creative freedom for the model. Fewer, and the condition stays close to the original pixels.
The inputs and output
image- your source, usually already roughly upscaled (e.g. by a simple 2x/4x resize or an ESRGAN model) before you refine it here.pyrUp_iters(default 3, range 1–10) - the blur/softening dial, as above. 3 is a sensible default. Push it higher when you want the model to add more of its own detail; drop it toward 1 to stay tightly faithful to the input.resolution(default 512) - processing size.
The single output is an IMAGE - the tile condition - which wires into a ControlNet Apply node with a tile model (control_v11f1e_sd15_tile on SD 1.5), inside a tiled-upscaling or img2img graph. Nothing happens until that tile ControlNet is loaded.
Installing it
ComfyUI Manager: search ComfyUI's ControlNet Auxiliary Preprocessors, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux
pip install -r requirements.txt
Then restart ComfyUI. The preprocessor itself needs no model download - the pyramid blur is pure image processing. The tile ControlNet is a separate file you grab for your base model.
Where people get burned
First, roles: this node makes the condition, the tile ControlNet model does the actual work, and they're separate downloads. Install the preprocessor without a tile ControlNet and you get nothing.
Second, Tile lives inside an upscaling pipeline, not on its own. You're pairing it with tiled diffusion (Ultimate SD Upscale, Tiled Diffusion) and a denoise high enough to actually add detail - too low and you just get a blurry bigger version, too high and tiles start diverging from the source. The tile condition is precisely what stops that divergence, so skipping it on a tiled upscale is the number-one cause of patchwork artifacts.
Third, pyrUp_iters is a real dial, not decoration: too much blur and the result drifts from your original, too little and the model faithfully sharpens your JPEG grain. Nudge it based on how clean your source is.
And a base-model heads-up: Tile got dropped from some of the newer union ControlNets (Shakker's Flux Union Pro 2.0 removed it), while Z-Image ships a dedicated Tile model trained all the way to 2048px. So before you go hunting for why nothing's sharpening, confirm the union or ControlNet you loaded actually has a tile mode. If you're doing realism specifically, also look at TTPlanet_TileGF_Preprocessor in this same pack - it's the guided-filter cousin tuned for photographic detail.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| pyrUp_itersopt | INT | 31–10 | — |
| resolutionopt | INT | 51264–16384 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |