SCUNet Image Restoration
Real transformer denoising, but you have to fetch the weights yourself
- image
- restored_image
The pack's own documentation says SCUNet's weights auto-download. They don't - not in the current code, anyway. This node checks its local models/ folder for a matching .pth file, and if it doesn't find one, it prints a warning to the console and quietly proceeds with an untrained, randomly-initialized network. No crash, no obvious error in the node's own output - just a restoration pass that isn't actually restoring anything, running silently next to nodes that work fine. Know this going in, because it's the single biggest gap between what this node promises and what it does out of the box.
What SCUNet actually is, when it has real weights
SCUNet - Swin-Conv-UNet - comes out of a real 2022 ECCV paper from Kai Zhang's group (the same lineage behind DnCNN and, loosely, real-world super-resolution work like BSRGAN), and its whole pitch is blind denoising: instead of being tuned to one noise level, it's trained on synthesized real-world degradation and generalizes across noise types it wasn't explicitly told about. It combines Swin Transformer blocks (good at capturing long-range structure) with convolutional blocks (good at local detail) inside a UNet's encoder-decoder shape. That architecture is genuinely well-suited to messy, mixed-degradation restoration - old scans, compressed JPEGs, mild motion blur, all at once - which is exactly the case where a fixed-sigma denoiser like plain wavelet filtering falls short.
Inputs and outputs that matter
model_name- a dropdown populated from whatever.pthfiles it finds locally, falling back to a standard list of eight:scunet_color_15/25/50andscunet_gray_15/25/50(Gaussian-noise-level variants), plusscunet_color_real_psnrandscunet_color_real_gan(trained for real-world degradation, PSNR-optimized versus perceptually-tuned respectively). The tworeal_*variants are the ones the pack's docs specifically point to.tile_sizeandoverlap- tile-based processing for memory safety on large images; 256/16 is the sane default, droptile_sizetoward 64–128 if you're hitting out-of-memory errors.device_preference-auto,cpu, orcuda.
Output: restored_image only - no info string on this one, so you won't get an in-graph confirmation of whether real weights loaded; check the ComfyUI console log for that.
Installing it
Through ComfyUI Manager, search Eric's Image Processing Nodes. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Eric_Image_Processing_Nodes
cd Eric_Image_Processing_Nodes
pip install -r requirements.txt
Restart ComfyUI. Then get the weights yourself: download scunet_color_real_psnr.pth and/or scunet_color_real_gan.pth from the HuggingFace mirror or the original cszn/SCUNet repository, and drop them straight into Eric_Image_Processing_Nodes/models/. Restart ComfyUI once more so the model_name dropdown picks up the new file. There's no in-app download button - this is a manual step every time you want a model variant this pack hasn't shipped a working fetcher for.
Where people get burned
The core trap is exactly the silent-fallback behavior above: results that look barely-changed or oddly soft, with nothing in the UI telling you why. If SCUNet output looks suspiciously close to the input, check your console log on the run for "Warning: Model ... not found" - that's your answer, and no amount of retrying or adjusting tile_size will fix it, because the fix is a file, not a setting.
Second, once real weights are loaded: for genuinely mixed, heavy degradation (old photos with scratches, fading, and noise all at once), the 2026 community's go-to has moved to newer diffusion-based restorers rather than 2022-era transformer baselines like SCUNet - this node still earns its place for controlled denoising at a known noise level or as a comparison baseline, just don't expect it to match a modern generative restorer on a badly damaged source.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model_name | COMBO | scunet_color_15 | SCUNet model selection: • Color models: For color image denoising • Gray models: For grayscale image denoising • Real models: For real-world degradation (PSNR/GAN trained) • Numbers (15/25/50): Gaussian noise levels |
| device_preferenceopt | COMBO | auto | Processing device: • Auto: Automatic selection • CPU: Force CPU processing • CUDA: Force GPU processing |
| tile_sizeopt | INT | 25664–1024 | Processing tile size: • 64-128: Safe for low memory • 256: Balanced (recommended) • 512+: Faster but needs more memory |
| overlapopt | INT | 168–64 | Overlap between tiles to reduce seam artifacts |
| enable_tilingopt | BOOLEAN | true | Enable tile-based processing for memory safety |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| restored_image | IMAGE | — |