NAFNet Denoise (SIDD)
Rescuing grainy phone photos without a diffusion detour
- image
- IMAGE
NAFNet Denoise is the quick button of the pack: feed it a grainy photo, get a clean one back. No model loader, no sampling, no prompt. It's the tool you reach for when a low-light smartphone shot looks like it was rendered in sand, or an old digital camera file is crawling with ISO noise, and you want the same photo back - just without the grain. That last bit is the whole trick, and it's why diffusion-based "denoising" keeps disappointing people: run an image through a KSampler at low denoising strength and the model quietly re-imagines the scene, changing faces and clothes along the way. NAFNet doesn't re-imagine anything. It's a plain feed-forward restoration network that subtracts noise and leaves content alone.
The inputs, which are gloriously few
- image - any IMAGE tensor.
- model_variant -
width64(default) orwidth32. Quality vs. speed. width64 is the 443 MB checkpoint and the better result; width32 is 111 MB, roughly a quarter of the work, and perfectly fine for previews and quick passes. - tile_size (optional, default 0) - leave it at 0. Above roughly a megapixel the node tiles automatically so a big photo doesn't blow up VRAM.
Output: one IMAGE. Wire it to Save Image, or straight into an upscaler - cleaning before upscaling is the order that avoids baking grain into a bigger image, and it's cheaper to scrub a small file than a 4K one.
What it's actually good at (and the honest limits)
The model is trained on the SIDD dataset - real smartphone camera noise, collected by shooting and denoising actual scenes rather than synthesizing fake grain. That means it's genuinely good at sensor noise: the grainy low-light phone shot, the ISO 3200 digital camera file, the muddy high-gain video frame. That's also its boundary. It is not a general-purpose "make this look better" node. Film grain, heavy JPEG compression artifacts, and blur are different problems that need different tools (deblurring, in the pack's case, or a real restorer for compression damage). Point it at the wrong kind of damage and you'll get smearing or odd texture where the model confidently misreads what it's seeing.
That domain sensitivity isn't a flaw in this node specifically - it's NAFNet's core design, and the README hammers on it for a reason. Check your image has actual sensor noise before you blame the node for a bad result.
Under the hood
Pick a variant and the node loads the matching NAFNet-SIDD-*.pth from the pack's models/ folder - and caches it, so the first run of a session pays the load cost and subsequent runs are fast. Switch between width64 and width32 and it reloads. The architecture is MEGVII's "Simple Baselines" NAFNet: nonlinear-activation-free blocks that are cheap to run, which is the ECCV 2022 paper's whole selling point - state-of-the-art restoration without the usual activation overhead.
Install
Via ComfyUI Manager, search "NAFNet" (or "comfyui-nafnet"). Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/marduk191/ComfyUI-NAFNet.git
cd ComfyUI-NAFNet
pip install -r requirements.txt
Restart ComfyUI. Dependencies are torch, torchvision, numpy and gdown - nothing exotic, you already run torch.
The one install gotcha
The models (1.3 GB total) ship via Git LFS. If Git LFS isn't set up, the clone leaves ~130-byte pointer files in models/ and the node will fail with a model-not-found. Fix it with git lfs install && git lfs pull, or skip LFS entirely and run the fallback:
python download_models.py
That pulls the real weights from Google Drive. Do it once, and NAFNet Denoise just works.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model_variant | COMBO | width64 | 2 options: width64, width32 |
| tile_sizeopt | INT | 00–2048 | Tile size for processing. 0 = auto (tiles large images automatically) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |