Nodes/DINO Upscale/DINO Upscale
ComfyUI Node

DINO Upscale

DINO Upscale is mostly a clean latent upscaler (the DINO part is still cooking)

By timlawrenz·Created 11 months ago·Updated 9 months ago· 2
DINO Upscale
  • image
  • model
  • vae
  • clip
  • upscaled_image
scale_factor2.0
denoise0.25
tile_size1024
sampler_nameeuler
schedulernormal
steps20
dino_enabledtrue
dino_strength0.50
seed0
prompthigh quality, detailed, sharp

Here's the honest pitch before the marketing: DINO Upscale is a tiled, diffusion-based upscaler that's supposed to use DINOv2 semantic embeddings to keep object identity while it adds detail. In the shipped code, the DINO features get extracted and then... sit there. The actual quality work is done by a plain img2img pass through ComfyUI's native sampler, done tile by tile. That's not a reason to skip it - the diffusion part is genuinely solid, and it's model-agnostic in a way most tiled upscalers aren't. Just know what you're getting.

What it actually does

You feed it an image, it Lanczos-upscales it to your target size, then re-samples it through whatever diffusion model you've loaded at a low denoise, in tiles so you don't blow up your VRAM. That's the same family as Ultimate SD Upscale from Impact Pack and ControlNet Tile - the standard "generate small, then upscale with re-generation" move from the KB's upscaling playbook, minus any control-net dependency.

The twist is DINOv2. When dino_enabled is on, it downloads facebook/dinov2-base (~350 MB from HuggingFace, first use only) and extracts patch-level embeddings of your image to condition the process. Here's the catch I found reading the source: in src/comfyui_sampler.py the parameter is literally documented as dino_features: Optional DINO features (not yet used), and the pack's own README lists "full cross-attention integration" as WIP. So dino_strength is currently more placebo than control - the preservation you get comes from running at low denoise, not from DINO. If you flip dino_enabled off, don't expect the output to collapse.

The inputs that matter

  • model and vae - required, from a Load Checkpoint node. v2.0 dropped the internal model, and if you forget to wire these the node raises a clear error: "External MODEL and VAE are required!"
  • scale_factor - 1.0–4.0, default 2.0. The output is roughly this much bigger.
  • denoise - the real dial. 0.1–0.25 keeps things close to the original (product shots, portraits); 0.4+ lets the model invent detail, which is where things like faces drift if you push far.
  • tile_size - 512–2048, default 1024. Match your model: 512 for SD 1.5, 1024 for SDXL and FLUX. Bigger tiles = more coherence, more VRAM.
  • sampler_name / scheduler - populated live from ComfyUI, so custom samplers you've installed through packs like RES4LYF show up in the dropdown without an update. euler / normal at 20 steps is fine to start.

Everything else (steps, seed, clip, prompt) behaves like the standard KSampler controls you already know. Output is a single upscaled_image - wire it straight into Save Image or a preview.

How the tiles work

If the output fits in one tile, one pass. Otherwise it splits the image into overlapping tiles (64 px overlap), runs each through the sampler at scale_factor 1.0 with a per-tile seed offset, then stitches with gradient-mask blending so seams don't show. Two quirks worth knowing: it only processes the first image of a batch (batch_index=0), and DINO features are extracted once from the whole image, not per tile - a TODO in the code.

Install

ComfyUI Manager, search "DINO Upscale" (the pack is timlawrenz/miniature-lamp). Or manually:

cd ComfyUI/custom_nodes/
git clone https://github.com/timlawrenz/miniature-lamp.git
cd miniature-lamp
pip install -r requirements.txt

Restart ComfyUI; the node lives under Add Node → image → upscaling → DINO Upscale. Dependencies are light - torch, torchvision, numpy, pillow, transformers, opencv - no FLUX or diffusers packages to babysit.

Troubleshooting

Out of memory is the common one: drop tile_size to 512 and lower denoise before blaming your model. If output looks "different," you pushed denoise too high for what you wanted - 0.25 is the sweet spot for general use. And if the node errors instantly, nine times out of ten you forgot the Load Checkpoint connection.

Where does it sit in your stack? If you already run UltimateSDUpscale plus ControlNet Tile, this is largely redundant today - but it's the rare tiled upscaler that works cleanly with FLUX and future models without fork-specific hacks. Watch the repo: if cross-attention DINO lands, it stops being a curiosity and becomes genuinely different. Until then, treat it as a friendly, model-agnostic latent upscaler with an experimental accessory bolted on.

Categoryimage/upscaling

Inputs (14)

NameTypeDefaultDescription
imageIMAGE
scale_factorFLOAT2.01–4
denoiseFLOAT0.250–1
tile_sizeINT1024512–2048
sampler_nameCOMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOnormal9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
stepsINT201–100
dino_enabledBOOLEANtrue
dino_strengthFLOAT0.500–1
seedINT00–18446744073709550000
modeloptMODEL
vaeoptVAE
clipoptCLIP
promptoptSTRINGhigh quality, detailed, sharp

Outputs (1)

NameTypeDescription
upscaled_imageIMAGE