βΎοΈπβ¨ Aesthetic Scoring
A number for 'does this look good?'
- image
- NUMBER
- FLOAT
- STRING
Aesthetic scoring is the ML equivalent of asking a critic to rate your renders: a model looks at an image and outputs a number representing how "aesthetically pleasing" it finds it. ESS Aesthetic Scoring is the Endless pack's take - pick a scorer model, feed it an image, and get the score out as a NUMBER, a FLOAT, and a STRING (so you can use it in whichever type your downstream node wants). It's the kind of node you reach for when you're grinding out dozens of variations and want an objective-ish signal to rank them, or when you're building an auto-curation pipeline.
The model files ship with the pack - the repo includes chadscorer.pth (the default) plus several sac+logos-style weights - so there's no separate download step, which is rarer than it should be. The author's history with scoring is honest: an earlier aesthetic scorer was yanked in 2023 because "CLIP won't load for some people," and the README's "nodes that don't work (yet)" list still mentions aesthetic scoring alongside NIMA and BRISQUE approaches. So this is the released version of a long-gestating feature, and the "yet" in the author's own list is worth remembering.
Inputs and outputs
model_name- an enum dropdown of the available scorer weights, defaultchadscorer.pth. The other shipped files (thesac_public_*andsac+logos+avaweights) are alternative scorer checkpoints.image- an IMAGE tensor, straight off a VAE Decode.
Outputs: NUMBER, FLOAT, and STRING - the same score in three types so it plugs into anything, from a math chain to a text display node.
How it works
Mechanically it's a CLIP-based aesthetic model (the OpenAI CLIP ViT-B/32 lineage that the README credits). The image is embedded, the scorer weighs the embedding against what it learned "aesthetically pleasing" looks like, and you get a score. Don't read too much into the absolute value - it's a relative signal. A 6.5 vs a 7.0 between two variants is a useful ranking; "7.0 is good, 5.0 is bad" is a vibes-based interpretation. Batch your variations, score them, sort.
Where people get burned
The scored range depends heavily on which checkpoint you picked - chadscorer and the sac models don't share a calibration, so don't compare across model switches. And remember the pack's own history here: scoring was the feature that broke for some users when the CLIP dependency didn't load. If the node errors on load, check that the pack's image-analysis requirements (clip from the OpenAI repo) actually installed - that's the one part of Endless with a real pip dependency.
Installing it
Part of Endless πβ¨ Nodes by tusharbhutt:
cd ComfyUI/custom_nodes
git clone https://github.com/tusharbhutt/Endless-Nodes
# restart ComfyUI
Or ComfyUI Manager β search "Endless". Unlike the rest of the pack, this node leans on the OpenAI CLIP package - if it fails to load, install the image-analysis requirements (torch, torchvision, Pillow, numpy, ftfy, regex, tqdm, and clip from the OpenAI repo) into your ComfyUI Python environment.
Gotchas
Don't cross-compare scores across scorer checkpoints, treat the number as a relative ranking rather than an absolute truth, and keep in mind this is a hobby pack's resurrected feature - the author's own README flags the scoring work as historically flaky. For serious ranking, it's fine; for gospel, it isn't.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | chadscorer.pth | 0 options: |
| image | IMAGE | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| NUMBER | NUMBER | β |
| FLOAT | FLOAT | β |
| STRING | STRING | β |