Nodes/ComfyUI-ArchAi3d-Qwen/๐ŸŽฎ Smart USDU DiffDiff + CN (No Upscale)
ComfyUI Node

๐ŸŽฎ Smart USDU DiffDiff + CN (No Upscale)

Per-tile ControlNet and diffdiff on an image you've already upscaled

By amir84ferdosยทCreated 11 months agoยทUpdated 5 months agoยท 70
๐ŸŽฎ Smart USDU DiffDiff + CN (No Upscale)
  • upscaled_image
  • model
  • conditionings
  • negative
  • vae
  • denoise_mask
  • model_patch
  • control_image
  • control_mask
  • IMAGE
โ—„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โ–บ

Same pipeline as the Smart USDU DiffDiff + ControlNet node, with the pixel upscale moved out. No upscale_by, no upscale_model - it expects a pre-upscaled upscaled_image and runs the tiled, per-pixel-denoise, per-tile-ControlNet pass on top of that. If you're already running the Smart Tile Solver V6.2 to plan the grid and produce the upscale, this is the variant to reach for.

It's the middle of the three-way split in this family, and it's honestly the sensible default: let the solver plan an efficient grid (95โ€“100% efficiency, per its own math) and upscale with lanczos, then run one diffusion pass over the tiles with a canny/depth condition holding the structure and a denoise mask deciding what actually gets rebuilt. Do the pixel job and the detail job in separate, well-typed steps instead of cramming both into one node.

The wiring

The ControlNet machinery is identical to the full variant: optional control_image (cropped per tile to match the main image's tiling), model_patch (from a ModelPatchLoader), control_strength, and a separate control_mask. Both the patch and the control image must be connected for ControlNet to engage. The diffdiff pair - denoise_mask (white = more denoise, black = less) and multiplier (<1 = stronger, >1 = weaker) - is there too.

The one thing to keep straight: tile_width/tile_height are now in output space. The solver's numbers are the solver's numbers - wire tile_width, tile_height, and tile_padding (the overlap) straight from its INT outputs and you're guaranteed the grid lines up with the upscaled image.

Installing it

Ships 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

Restart after. Only ComfyUI's own torch/numpy/Pillow are needed here - the big dependencies in requirements.txt serve other nodes in the pack. Free for personal use; commercial use requires the author's paid license.

Where people get burned

Feeding the un-upscaled source in is the top mistake - you get a 1.0-scale pass and think the node is broken. The control image must match the upscaled image's framing or per-tile cropping misaligns. And if you disconnect either model_patch or control_image, ControlNet silently switches off, leaving you with a diffdiff-only upscale that can drift harder than you expect at higher denoise - keep a canny map wired in when you want structure preserved.

CategoryArchAi3d/Upscaling/USDU

Inputs (29)

NameTypeDefaultDescription
upscaled_imageIMAGEโ€”
modelMODELโ€”
conditioningsCONDITIONING_LISTโ€”
negativeCONDITIONINGโ€”
vaeVAEโ€”
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โ€”
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โ€”