LC VOSR2 Upscale (pipe) 🧩
The one-wire upscale at the end of the detailer pipe
- pipe
- image
- pipe
- image
- protected
LC VOSR2 Upscale (pipe) is the same VOSR 2.0 upscale as the plain node, with one difference that matters a lot in practice: instead of you wiring an image in and taking an image out, it reads the picture out of the LC pipe, upscales it, and puts the result back in the pipe. That makes it a single wire appended to the detailer chain - render → LC Smart Detailer (pipe) → LC VOSR2 Upscale (pipe) - rather than a node you have to re-wire every time you touch something upstream.
What the pipe gets you
LC's LC_PIPE is a dict of settings that the pack's nodes pass down a chain, and the detailer's pipe version leaves two extra things in it beyond the image.
The first is the region the detailers redrew - every detailer's mask merged into one. The pipe version takes that, resizes it to the new picture size, and hands it out as protected. Wire that into protect_mask on LC Skin Upscale or LC Skin Texture and those nodes won't add skin detail on top of work your detailer already did. On the plain version you do the same thing by hand, wiring LC Smart Detailer's mask into protect_mask.
The second is what SAM 3 found, so a later detailer doesn't search for the same word twice. That one gets dropped here on purpose: SAM finds are per-pixel of the small picture, and this node just changed the picture's size.
Every entry in the pipe is stamped with an identity tag for the image it was made for - shape plus a pixel checksum - and readers verify the tag before using it. If the picture changed in between, the protect mask is skipped and the console says so. The pipe is copied rather than edited in place, so branches and cached runs don't leak state into each other.
Inputs and outputs
pipe- the LC pipe. The picture comes from itsimageslot, i.e. whatever the detailers left there.image(optional) - wins over the pipe when wired. Use it when something outside the pipe changed the picture in between (a node without a pipe pass, a model swap). Note the consequence: a wired, different image won't match the protect mask's tag, so the mask is dropped too.upscale_by,seed,color_alignment,tile_size,vae_tile_size- identical to the plain node.upscale_bygives you1.5x–4xin one pass and6x (3x + 2x)/8x (4x + 2x)in two, because a single 6x/8x pass smears skin into patches.tile_size512 is what VOSR 2.0 was trained at;vae_tile_sizelower is less VRAM and a little slower;seedonly changes the finest grain, since this model is one step from noise.
Three outputs: pipe (the upscaled picture, with the detailers' areas resized to it), image (the same picture, plain IMAGE), and protected. There's no preview on the node - it isn't an output node - so terminate elsewhere with a Preview or Save Image.
Install
Same pack, same install: ComfyUI Manager → ComfyUI LC MaskMaker Nodes, or
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_MaskMaker_nodes
Restart, and let install.py add transformers, huggingface_hub or timm if your environment is missing them. First run pulls about 6.5 GB of VOSR 2.0 weights into models/vosr2/VOSR2. If that download fails, the error message lists each file with its link and destination, and on a blocked network:
export HF_ENDPOINT=https://hf-mirror.com
before launching ComfyUI. If you already have the ComfyUI-VOSR2 pack, the same files are reused.
Where people get burned
- Nothing to upscale. No pipe, or a pipe with no image, and the node raises rather than guessing.
- "The image changed since the protect mask was made: it is not used." Not an error you can fix by re-running - something in between resized, cropped or re-rendered the picture, so the mask no longer lines up and the node deliberately declines to use it. Keep the protect mask's node adjacent to the detailers.
- A pipe from nowhere else won't help. This node is a pass-through on LC's own pipe; feed it from LC Smart Detailer (pipe), not from an arbitrary dict.
- Expect the long tail of an obscure model. VOSR barely exists in community discussion yet, so you'll be working from the README and the tooltips rather than a decade of forum answers.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | LC_PIPE | LC pipe: the picture comes from its 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. |
| imageopt | IMAGE | Optional. Empty = the pipe's image. Wire one when a node without a pipe changed the picture in between. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| pipe | LC_PIPE | The pipe with the upscaled picture, and the detailers' areas resized to it. |
| image | IMAGE | The upscaled picture. |
| protected | MASK | The faces and hands the detailers redrew, at the new size. Wire it into LC Skin Texture / LC Skin Upscale protect_mask so they do not add skin detail on top of the detailers' work. |