LC VOSR2 Upscale π§©
VOSR 2.0 upscaling that sharpens your render instead of re-drawing its face
- image
- protect_mask
- image
- protected
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/4xin one pass (1.5x is roughly a third faster than 2x, 2x is the sweet spot);6x (3x + 2x)and8x (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.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| upscale_by | COMBO | 2x | Final 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. |
| seed | INT | 420β18446744073709550000 | VOSR2 is one step from noise: the seed only changes the finest grain. |
| color_alignment | COMBO | wavelet | Keeps the result's colours on the input's. wavelet = best match. |
| tile_size | INT | 512256β2048 | Pixel tiles for the upscale model. VOSR2 was trained at 512: keep it there. |
| vae_tile_size | INT | 512256β4096 | Pixel tiles for its VAE. Lower = less VRAM, a little slower. |
| protect_maskopt | MASK | Optional. LC Smart Detailer's mask (several combined with a max). Comes out at the new size as 'protected'. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |
| protected | MASK | β |