Nodes/ComfyUI LC MaskMaker Nodes/LC VOSR2 Upscale 🧩
ComfyUI Node

LC VOSR2 Upscale 🧩

VOSR 2.0 upscaling that sharpens your render instead of re-drawing its face

By lonecatone23Β·Created about a month agoΒ·Updated a day agoΒ· 18
LC VOSR2 Upscale 🧩
  • image
  • protect_mask
  • image
  • protected
β—„upscale_by2xβ–Ί
β—„seed42β–Ί
β—„color_alignmentwaveletβ–Ί
β—„tile_size512β–Ί
β—„vae_tile_size512β–Ί

Most "make it bigger" nodes are a second diffusion pass wearing a hat: they re-denoise your picture, which is fine until the pass lands on a face and decides to repaint it. LC VOSR2 Upscale goes the other way. It runs a dedicated super-resolution model - VOSR 2.0 - one step, no sampler you configure, no prompt. It adds fine grain, fabric weave and eyelashes; it does not restyle anything. Run it after your detailers and their work survives the trip.

That ordering is the point of the node: the detailer's repaired faces should still be the faces it made after the upscale (docs/knowledge/masking-detection-detailing.md).

How it works

VOSR 2.0 is a one-step 1.4B DiT (Rongyuan Wu et al., Apache-2.0). The pack vendors its inference code from ComfyUI-VOSR2, so you don't need that pack installed.

The pipeline is short and mechanical: bicubic pre-scale to the target, pad, encode with a Qwen-Image 2D VAE, run one DiT step from noise conditioned on DINOv2-L features of your input, decode, colour-align, crop. Tiles of tile_size pixels are processed with overlap and blended. Because it's one step from noise rather than a denoise of your image, the seed only changes the finest grain - that's why the tooltip says so, and it's not a joke.

Colour alignment is the wavelet option: the source's low frequencies (the broad colour and lighting, via a Gaussian blur) get combined with the result's high frequencies (the new detail). Result keeps your colours and gains the texture. adain is the blunter statistical match, none is none.

Two of the three pieces are indentured to each other: the DiT runs in that specific Qwen VAE's latent space and is conditioned on that specific DINOv2-L, so the bundle under models/vosr2/VOSR2 is indivisible. No model dropdown pretending otherwise.

Times on an author-run RTX 5090 from a ~1.4 MP render: 1.5x in 2.8 s using 4.7 GB, 2x in 4.4 s using 4.8 GB, 4x in 16 s using 5.7 GB. Output sizes are exact regardless of your card; times are not. About 5 GB covers 1.5x–3x.

Inputs and outputs

  • image - the picture. Feed a video as one batch; each item gets the same noise, so the grain stays put instead of boiling frame to frame.
  • upscale_by - 1.5x / 2x / 3x / 4x in one pass (1.5x is roughly a third faster than 2x, 2x is the sweet spot); 6x (3x + 2x) and 8x (4x + 2x) run two passes on purpose. One big pass breaks skin into patches.
  • tile_size - leave it at 512. That's what the model was trained at.
  • vae_tile_size - lower this for VRAM; it costs a little speed.
  • color_alignment - wavelet, and you can usually leave it there.
  • protect_mask (optional) - wire the detailer's mask in and it comes back out at the new size, which is what the skin nodes want so they don't add pore detail on top of detail already fixed.

Outputs are image and protected. There's no preview on the node, so wire a Preview or Save Image. The protected mask is always emitted - if nothing is wired in, it's an empty mask, which is the honest value.

Install

ComfyUI Manager β†’ ComfyUI LC MaskMaker Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_MaskMaker_nodes

Restart. The pack's install.py adds transformers, huggingface_hub and timm only if they're absent; it never upgrades torch or anything else you already have.

First run downloads about 6.5 GB into models/vosr2/VOSR2 from huggingface.co/CSWRY/VOSR, and that takes a few minutes. If you're offline or huggingface.co is blocked, the node's error lists every file with its link and the exact folder each one goes in - and where HF is blocked at the network level:

export HF_ENDPOINT=https://hf-mirror.com

before you start ComfyUI. If you already run the ComfyUI-VOSR2 pack, it uses the same files.

Where people get burned

You are early. As of this writing the reddit corpus has essentially zero threads about VOSR - I measured it and got a literal zero - so there's no crowd of people who've already hit your problem. Documentation is the README and the node tooltips.

It sharpens, it doesn't restore. This isn't SeedVR2, which the KB treats as the incumbent top rung for adding detail and which can rebuild a damaged source from scratch (docs/knowledge/upscaling.md). VOSR 2.0 won't invent a face out of a 30-pixel smear. Its virtue is the opposite one: nothing it does can wreck a face, because nothing it does is your checkpoint's idea of a face.

Big single passes. If you're stretching past 4x, use the two-pass options rather than pushing one pass - the skin-patch artefact is the reason they exist.

Batching behaviour is a feature, not a bug. The same noise per item keeps video stable - at the cost of identical grain on two near-identical stills.

CategoryLC MaskMaker/upscale

Inputs (7)

NameTypeDefaultDescription
imageIMAGEβ€”
upscale_byCOMBO2xFinal size. 1.5x to 4x are one pass (1.5x is about a third faster than 2x). 6x and 8x run two passes (3x + 2x, 4x + 2x): one big pass breaks the skin up into patches.
seedINT420–18446744073709550000VOSR2 is one step from noise: the seed only changes the finest grain.
color_alignmentCOMBOwaveletKeeps the result's colours on the input's. wavelet = best match.
tile_sizeINT512256–2048Pixel tiles for the upscale model. VOSR2 was trained at 512: keep it there.
vae_tile_sizeINT512256–4096Pixel tiles for its VAE. Lower = less VRAM, a little slower.
protect_maskoptMASKOptional. LC Smart Detailer's mask (several combined with a max). Comes out at the new size as 'protected'.

Outputs (2)

NameTypeDescription
imageIMAGEβ€”
protectedMASKβ€”