Nodes/ComfyUI-ArchAi3d-Qwen/๐ŸŽฎ Smart USDU DiffDiff + ControlNet
ComfyUI Node

๐ŸŽฎ Smart USDU DiffDiff + ControlNet

Tiled upscaling + per-pixel denoise + ControlNet, all cropping per tile

By amir84ferdosยทCreated 11 months agoยทUpdated 5 months agoยท 70
๐ŸŽฎ Smart USDU DiffDiff + ControlNet
  • image
  • model
  • conditionings
  • negative
  • vae
  • upscale_model
  • denoise_mask
  • model_patch
  • control_image
  • control_mask
  • IMAGE
โ—„upscale_by2.00โ–บ
โ—„seed0โ–บ
โ—„steps20โ–บ
โ—„cfg8.00โ–บ
โ—„sampler_nameโ–พโ–บ
โ—„schedulerโ–พโ–บ
โ—„denoise0.20โ–บ
โ—„mode_typeโ–พโ–บ
โ—„tile_width512โ–บ
โ—„tile_height512โ–บ
โ—„mask_blur8โ–บ
โ—„tile_padding32โ–บ
โ—„seam_fix_modeโ–พโ–บ
โ—„seam_fix_denoise1.00โ–บ
โ—„seam_fix_width64โ–บ
โ—„seam_fix_mask_blur8โ–บ
โ—„seam_fix_padding16โ–บ
โ—„force_uniform_tilestrueโ–บ
โ—„tiled_decodefalseโ–บ
โ—„multiplier1.000โ–บ
โ—„control_strength1.00โ–บ

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 (optional MODEL_PATCH) - the ControlNet patch itself, from a loader like ModelPatchLoader. Both this and control_image are 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.

CategoryArchAi3d/Upscaling/USDU

Inputs (31)

NameTypeDefaultDescription
imageIMAGEโ€”
modelMODELโ€”
conditioningsCONDITIONING_LISTโ€”
negativeCONDITIONINGโ€”
vaeVAEโ€”
upscale_byFLOAT2.000.05โ€“4โ€”
seedINT00โ€“18446744073709550000โ€”
stepsINT201โ€“10000โ€”
cfgFLOAT8.000โ€“100โ€”
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoiseFLOAT0.200โ€“1โ€”
upscale_modelUPSCALE_MODELโ€”
mode_typeCOMBO3 options: Linear, Chess, None
tile_widthINT51264โ€“8192โ€”
tile_heightINT51264โ€“8192โ€”
mask_blurINT80โ€“64โ€”
tile_paddingINT320โ€“8192โ€”
seam_fix_modeCOMBO4 options: None, Band Pass, Half Tile, Half Tile + Intersections
seam_fix_denoiseFLOAT1.000โ€“1โ€”
seam_fix_widthINT640โ€“8192โ€”
seam_fix_mask_blurINT80โ€“64โ€”
seam_fix_paddingINT160โ€“8192โ€”
force_uniform_tilesBOOLEANtrueโ€”
tiled_decodeBOOLEANfalseโ€”
denoise_maskoptMASKOptional mask for per-pixel denoise. White=more denoise, Black=less
multiplieroptFLOAT1.000-10โ€“10Controls effect strength. <1=stronger, >1=weaker
model_patchoptMODEL_PATCHControlNet patch (from ModelPatchLoader)
control_imageoptIMAGEControl image (e.g., Canny/Depth) - will be cropped per tile
control_strengthoptFLOAT1.00-10โ€“10ControlNet strength
control_maskoptMASKOptional mask for ControlNet (separate from denoise_mask)

Outputs (1)

NameTypeDescription
IMAGEIMAGEโ€”