Upscale Router
It measures noise and sharpness, and it does not know faces
- images
- recommended_tier
- content_class
- stats_json
- images
The interesting thing about this node is not what it does - it's that the author wrote down exactly how dumb it is. Upscale Router measures four image statistics on one frame and recommends a model tier. In the source, where a vendor would say "AI-powered content analysis," this one says: content_class comes "from four image statistics; there is no face, text or scene classifier."
That's the right way to ship a heuristic, and it tells you both how to use it and when to ignore it.
What it measures
Noise, sharpness, saturation, and a derived ai_likelihood. The source maths: sharpness is the standard deviation of an inner Laplacian normalised by mean luma, scaled and clamped; ai_likelihood is a weighted blend - 40% inverted noise, 35% saturation, 25% sharpness - described in the docstring as "a weighted blend of the other three, not a detector." So a clean, saturated, gently sharp image reads as AI-generated. Which, honestly, is a fair description of a lot of AI output, and equally of a well-shot photograph.
content_class is one of ai_generated, degraded, greyscale, high_detail or generic. prefer_speed overrides everything and always returns Tier 1 fast. sample_frame (default 0) picks which frame of a video batch to analyse - measure on a representative frame, not on a black leader.
Outputs: recommended_tier (a STRING whose values match the model_tier dropdowns elsewhere in the pack), content_class, stats_json with the raw numbers, and images - your input, unchanged. Nothing here touches pixels.
How to actually use it
The honest verdict: this is an advice node, not an autopilot. A STRING output doesn't become an enum widget on its own, so you read the recommendation off the report and set the tier - or use the router in Route-style inspection on a shot you're unsure about before committing to a slow tier.
Where it's genuinely useful is video, and it's the same reason a QC pass exists in any VFX pipeline: you have 400 frames and a vague sense that some of them are softer, noisier or more compressed than others. Point sample_frame at a few positions, watch content_class and stats_json change, and you learn something true about your clip - that the first minute is grainy, that the last third is smeared - instead of guessing from the one frame you happened to look at.
It's also a decent sanity check on your own assumptions. Everybody believes they can tell AI output from a photograph at a glance. ai_likelihood letting a clean photo through as ai_generated is a useful reminder that the statistics are about image structure, not provenance.
Install
- ComfyUI Manager → search Radiance → Install → restart → refresh the browser.
- Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Windows portable users: run the pip line with python_embeded\python.exe. This node downloads no weights and needs no model - it's statistics on a tensor. Radiance as a whole is a heavy install (OpenEXR, OpenImageIO, OpenColorIO, transformers, diffusers); if Manager installs an older build than the README's 3.5.0, hit Update or git pull in custom_nodes/radiance.
Gotchas
Analysis is on a single frame. Fast GAN upscaling done frame by frame flickers, and no amount of router advice fixes that - for video the temporal question matters more than the content one, and the pack's Upscale Video is where that's handled.
And don't ship on recommended_tier alone if a face is in frame. The node's own documentation says there's no face classifier, so the case the community cares about most - a recognisable person you don't want rewritten - is precisely the case it cannot see.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Image or frame batch to analyse; returned unchanged on the images output. | |
| prefer_speed | BOOLEAN | false | Always recommend Tier 1 fast regardless of content. |
| sample_frame | INT | 00–9999 | Index of frame to analyse (for video batches). |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| recommended_tier | STRING | — |
| content_class | STRING | — |
| stats_json | STRING | — |
| images | IMAGE | — |