Novelty Score (CLIP)
How Different Is This Image From Your References? CLIP Knows.
- image
- reference_images
- novelty_score
Novelty Score (CLIP) answers a question the Complexity scorer can't: how different is this image from a set of reference images? You feed it an image plus one or more reference images, and it returns a 0β10 novelty score - the higher the number, the more unlike your references it is. It's the pack's one genuine use of machine learning, and the mechanism is actually kind of elegant.
How it works
The node encodes your image with OpenAI's CLIP (the ViT-B/32 vision model), encodes each reference image the same way, then computes the cosine similarity between your image's embedding and each reference embedding. Averaging those similarities gives a "how much like your references is this" number; subtracting from 1 and scaling by 10 flips it into novelty. So a score of 8 means your image is far from the references in CLIP's semantic space; a score of 2 means it's basically a re-tread.
CLIP embeddings capture semantic content - subject, style, composition, mood - not raw pixels, which is exactly why this is more meaningful than a pixel-difference metric. Two images of the same red car from different angles will score as close; a portrait and a mountain landscape will score as far. It's "novelty" as CLIP perceives it, which is a reasonable proxy and worth knowing the limits of.
Inputs and outputs
- image (IMAGE) - the image you're scoring.
- reference_images (IMAGE) - one or more references. The node can take a batch, and the README's advice is right: comparing against a range of references is more fun (and more stable) than a single one. If you wire nothing here, you get a flat 0.0 - the source has an empty-reference fallback, so an unwired node silently returns zero rather than erroring.
- novelty_score (FLOAT) - 0β10, higher = more novel.
The install gotcha (this one is real)
This is the one node in the pack with an actual extra dependency. The image_analysis subfolder carries its own requirements.txt that pulls in OpenAI's clip package, installed straight from the git repo (clip @ git+https://github.com/openai/CLIP.git), plus ftfy, regex, and friends. ComfyUI Manager may or may not install subfolder requirements reliably - this is exactly the kind of thing that silently half-installs. If the node errors on load with an import error, you almost certainly need to do it manually:
cd ComfyUI/custom_nodes/Endless-Nodes
pip install -r image_analysis/requirements.txt
And note there's no root-level requirements.txt in the current repo, so Manager has nothing to pick up at the pack level. On top of that, first real run downloads the CLIP ViT-B/32 weights into ~/.cache/clip (~150 MB), so don't panic if the first score takes a while. The changelog also reveals the author historically struggled to get CLIP loading reliably for everyone ("killed the scorers until I figure out why CLIP won't load for some people") - expect the occasional finicky install.
Installing the pack
ComfyUI Manager (search Endless Nodes) or:
cd ComfyUI/custom_nodes
git clone https://github.com/tusharbhutt/Endless-Nodes
Restart, find it under Endless πβ¨ β Image Scoring. Then handle the CLIP dependency above before expecting it to work. Single-author hobby pack, GPL v3 - and this node is the one where the hobbyist-ness shows, so budget some setup time.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| reference_images | IMAGE | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| novelty_score | FLOAT | β |