Nodes/ComfyUI-PolyhedronLoRAStack/⬡ Polyhedron Fast Upscale
ComfyUI Node

⬡ Polyhedron Fast Upscale

The no-diffusion upscaler that keeps its mask in step

By PolyhedronAI·Created 3 months ago·Updated a day ago· 2
⬡ Polyhedron Fast Upscale
  • image
  • video
  • upscale_model
  • mask
  • image
  • video
  • width
  • height
  • mask
size_modefactor
upscale_by2.00
width1024
height1024
resize_methodbicubic
devicegpu
divisible_by16
per_batch32
mute_staging_logstrue
keep_proportionstretch
crop_positioncenter
pad_color0, 0, 0

There are three different jobs people call "upscaling", and the community's standing advice is to decide which one you have before you pick a tool. Fast Upscale is unambiguously the first job: more pixels, no new detail. Optional ESRGAN model in front, then a resize, then done. No diffusion refine, which is exactly why a 65-frame clip goes through it in seconds instead of minutes. It's the sibling of this pack's Power Upscale - if Power is the hi-res-fix-plus-tiles heavy lifter, Fast is the everyday path you reach for when you want size and clean edges, not invented texture.

The thing that sets it apart from a plain ImageScale is that it handles IMAGE, VIDEO and MASK together, and the mask follows the image instead of drifting out of register. That "mask follows image" bit is the one that most often goes wrong when you upscale an image and its mask with separate nodes - the mask comes back scaled by a slightly different rule and your inpainting target silently shifts. Here one geometry applies to both, crop and pad included, and a padded border is 0 because it was never part of the source.

The inputs that matter

  • size_mode - factor scales both sides by upscale_by (the Power Upscale way); exact hits a width × height, where a zero side keeps the aspect ratio.
  • resize_method - the usual filters, plus two specials. lanczos (cpu) is a PIL path and only runs on CPU; ask it for a GPU device and it fails loudly instead of quietly ignoring you. nvidia_rtx_vsr is NVIDIA's Maxine VideoSuperRes, which needs the nvvfx library and an RTX card - when it's missing, the node says so plainly.
  • divisible_by - snaps the result down to the divisor your samplers expect downstream. The Wan-friendly default is 16.
  • per_batch - frames per sub-batch for the ESRGAN + resize step, so a long clip doesn't have to live in VRAM all at once. 0 means whole batch, which is how you find out what OOM stands for.
  • keep_proportion - what to do when the aspect ratios don't match: stretch (distort), crop (cover the target, cut the overhang), or pad (fit inside, fill with pad_color).

Outputs are image, video, width, height, and mask. Note the video input/output: a wired VIDEO carries its audio and frame rate through into the VIDEO output, so this slots straight into a Wan frame pipeline without extra plumbing.

Installing it

It's part of the Polyhedron Suite pack - Manager search "Polyhedron Suite", or clone:

cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI

The nodes themselves have no hard dependencies. Video handling leans on PyAV (which recent ComfyUI builds ship) and OpenCV for thumbnails; if you're missing video features you can install them explicitly with pip install "polyhedron-lora-stack[media]".

Where people get burned

The most common trap is expecting Fast Upscale to add detail it was never designed to add - if your source is genuinely soft, ESRGAN + a resize will give you bigger soft. That's the "more detail" job, and it belongs to a diffusion refine or a model like SeedVR2. Also remember per_batch: a 129-frame clip through a 4× ESRGAN model in one batch is a multi-gigabyte tensor on a good day, and the OOM guard exists precisely because people kept hitting that.

CategoryPolyhedron/Upscaling

Inputs (16)

NameTypeDefaultDescription
size_modeCOMBOfactorfactor: scale both sides by upscale_by (the Power Upscale way). exact: hit width x height (the Resize-v2 way; a zero side keeps the aspect).
upscale_byFLOAT2.000.05–8factor mode: scale for both sides.
widthINT10240–8192exact mode: target width (0 = derive from height).
heightINT10240–8192exact mode: target height (0 = derive from width).
resize_methodCOMBObicubicbicubic/bilinear/area/nearest run on gpu OR cpu. lanczos is PIL = cpu-only. nvidia_rtx_vsr = Maxine VideoSuperRes (needs nvvfx + RTX; target snaps to /8).
deviceCOMBOgpuWhere the torch resize runs. lanczos refuses gpu (fail loud); nvidia_rtx_vsr always runs on the GPU regardless.
divisible_byINT161–64Snap the target DOWN to a multiple (Wan-friendly default 16).
per_batchINT320–512Frames per sub-batch for ESRGAN + resize (VRAM guard). 0 = whole batch. nvidia_rtx_vsr is per-frame by SDK design.
mute_staging_logsBOOLEANtrueSilence ComfyUI's model staging INFO lines while this node runs (restored byte-exactly after).
keep_proportionCOMBOstretchWhat to do when the aspect ratios differ. stretch = distort to the target (the stretch behaviour). crop = cover the target and cut the overhang. pad = fit inside and fill the rest with pad_color.
crop_positionCOMBOcenterWhere the image sits - used for BOTH the crop cut and the pad placement.
pad_colorSTRING0, 0, 0Fill colour for pad, as R, G, B (0-255). Unparseable = black (fail soft).
imageoptIMAGEFrame input [N,H,W,C]. Wire EXACTLY one of image/video.
videooptVIDEONative VIDEO input; audio + frame rate ride through into the VIDEO output. Wire EXACTLY one of image/video.
upscale_modeloptUPSCALE_MODELOptional ESRGAN pass BEFORE the resize (core spandrel path, sub-batched).
maskoptMASKOptional mask - resized with the SAME geometry (crop/pad included). A padded border is 0: it was never part of the source.

Outputs (5)

NameTypeDescription
imageIMAGE
videoVIDEO
widthINT
heightINT
maskMASK