๐ฎ Smart USDU DiffDiff + ControlNet
Tiled upscaling + per-pixel denoise + ControlNet, all cropping per tile
- image
- model
- conditionings
- negative
- vae
- upscale_model
- denoise_mask
- model_patch
- control_image
- control_mask
- IMAGE
The one USDU variant that finally looks like a proper upscaler pipeline. It takes the differential-diffusion tile upscaler and bolts on a ControlNet whose control image gets cropped per tile, so each tile's sampler sees the correct region of your canny/depth map instead of a wrong, full-canvas condition. If you've ever tried "Tiled Diffusion + ControlNet Tile" - the community's long-standing favorite recipe for photorealistic upscaling, per the upscaling knowledge base - this is that, packaged as one node: tiling, per-pixel denoise, and a spatial condition that keeps each tile faithful to the source.
That faithfulness is the whole reason to add ControlNet to an upscale. USDU alone can drift - each tile is an independent img2img pass, and without a condition, tiles start inventing their own textures. A canny edge map or depth pass says "the structure goes here," so the detail-filling happens along the source rather than replacing it. You can push denoise higher with a condition holding the structure.
The inputs that matter
control_image(optional IMAGE) - your condition (canny, depth, tile preprocessor output). It's upscaled and cropped per tile to match the main image's tiling. Disconnect it and ControlNet is off.model_patch(optionalMODEL_PATCH) - the ControlNet patch itself, from a loader likeModelPatchLoader. Both this andcontrol_imageare required for ControlNet to engage.control_strength(default 1.0) - standard ControlNet weight. Start at 1.0, drop to 0.6โ0.8 if the condition is fighting the detail pass.control_mask(optional MASK) - lets the condition apply only where you want it, separate from the diffdiff denoise mask.denoise_mask+multiplier- the differential-diffusion pair from the base node (white = more denoise, black = less; multiplier <1 = stronger).
Everything else is the USDU core: upscale_by, required upscale_model, conditionings list, mode_type, tile size/padding/blur, seam fix, tiled_decode. Output is a single IMAGE.
Installing it
One of 100+ nodes in ComfyUI-ArchAi3d-Qwen by Amir Ferdos (ArchAi3d). ComfyUI Manager โ search "ArchAi3d Qwen" โ install โ restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/amir84ferdos/ComfyUI-ArchAi3d-Qwen.git
cd ComfyUI-ArchAi3d-Qwen
pip install -r requirements.txt
Then restart. The node itself needs nothing beyond ComfyUI's torch/numpy/Pillow; the heavyweight deps in requirements.txt belong to other pack nodes. License: free personal/non-commercial, paid license for commercial work.
The traps
The per-tile cropping only helps if the control image and the main image are the same size and framing - a control image from a different crop silently misaligns and you get wrong-conditioned tiles. ControlNet here is per-tile, so it isn't a cheap add: every tile runs a controlnet pass, and a 4ร4 grid means 16 of them, plus seam-fix passes on top. If you're on limited VRAM, lower tile_width/tile_height rather than removing the condition. And remember the two-part enable: model_patch without control_image (or vice versa) quietly disables ControlNet and you're back to plain DiffDiff.
Inputs (31)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | โ | |
| model | MODEL | โ | |
| conditionings | CONDITIONING_LIST | โ | |
| negative | CONDITIONING | โ | |
| vae | VAE | โ | |
| upscale_by | FLOAT | 2.000.05โ4 | โ |
| 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 | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 0.200โ1 | โ |
| upscale_model | UPSCALE_MODEL | โ | |
| mode_type | COMBO | 3 options: Linear, Chess, None | |
| tile_width | INT | 51264โ8192 | โ |
| tile_height | INT | 51264โ8192 | โ |
| mask_blur | INT | 80โ64 | โ |
| tile_padding | INT | 320โ8192 | โ |
| seam_fix_mode | COMBO | 4 options: None, Band Pass, Half Tile, Half Tile + Intersections | |
| seam_fix_denoise | FLOAT | 1.000โ1 | โ |
| seam_fix_width | INT | 640โ8192 | โ |
| seam_fix_mask_blur | INT | 80โ64 | โ |
| seam_fix_padding | INT | 160โ8192 | โ |
| force_uniform_tiles | BOOLEAN | true | โ |
| tiled_decode | BOOLEAN | false | โ |
| denoise_maskopt | MASK | Optional mask for per-pixel denoise. White=more denoise, Black=less | |
| multiplieropt | FLOAT | 1.000-10โ10 | Controls effect strength. <1=stronger, >1=weaker |
| model_patchopt | MODEL_PATCH | ControlNet patch (from ModelPatchLoader) | |
| control_imageopt | IMAGE | Control image (e.g., Canny/Depth) - will be cropped per tile | |
| control_strengthopt | FLOAT | 1.00-10โ10 | ControlNet strength |
| control_maskopt | MASK | Optional mask for ControlNet (separate from denoise_mask) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | โ |