Kaloscope Artist Inference
Guess the artist, with one large asterisk
- image
- model
- tag_string
- json_output
Kaloscope Artist Inference answers the question every style-chaser eventually asks: whose style is this - and which Danbooru artist tag do I put in the prompt to get it? You feed it one image and a loaded Kaloscope model, and it hands back the artist names the classifier thinks are closest.
Be warned about the accuracy going in. When someone asked r/StableDiffusion how to identify an unknown art style, the reply that got upvoted was about this model family specifically:
"There is an Danbooru artist classifier that has existed for some time now called Kaloscope. There are some times where it actually can get styles from AI images right, but a lot of the time it can't tell."
That's the honest framing. On human art from Danbooru it's a real tool. On your own AI renders - which are often merges of several artists plus a LoRA - it frequently shrugs and lands on a base-style guess. That's not a bug to fix; it's the model telling you the image doesn't strongly resemble any single artist in its training set.
The mechanism
One image, one forward pass. The node takes the first image of the batch it's handed, converts the ComfyUI 0–1 float tensor back to a PIL image, and pushes it through the checkpoint's own preprocessing transform (the same resize and normalization used in training - that's why the transform lives in the model loader's bundle rather than here). Then it branches:
- Classifier present: logits → softmax → top-k. Anything below
thresholdis dropped, surviving entries get their names fromclass_mapping.csv(Class 17if you didn't download the CSV), and the result comes back as a list of class name plus probability. - No classifier: the node doesn't fake it. It extracts a feature vector instead, and
tag_stringcomes back empty.
Inputs and outputs
You set top_k (default 5, up to 100) and threshold (0–1, default 0). Threshold is the one worth understanding: at 0 you always get top_k names, which is misleading when the top guess is 12% likely. Bump it to something like 0.1–0.2 and weak guesses vanish, which is usually what you want when you're hunting a prompt tag. image and model are the wiring.
Two outputs. tag_string is comma-joined artist names - momoko, wlop, tinkle - which is exactly the shape a prompt wants, so you can feed it straight into a text concatenate or a CLIP text encode. json_output is a dictionary of name → probability, or, for headless checkpoints, a features payload with the vector and its dimension. If you want a number to reason about, read the JSON; if you want a prompt, read the tag string.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spawner1145/comfyui-kaloscope
cd comfyui-kaloscope
python -m pip install -r requirements.txt
Then put a checkpoint plus config.json (and ideally class_mapping.csv) in ComfyUI/models/kaloscope/<your-folder>/ - the loader has the details. The v1 and v2 Kaloscope models are on Hugging Face with ModelScope mirrors; v3 is unreleased.
Where it goes wrong
The most common surprise is an empty tag_string on a model you're sure is a classifier. Check the folder you loaded: if class_mapping.csv is missing you'll still get tags, just numbered ones; but if the checkpoint was saved without a head - which is normal for checkpoints trained purely for feature work - there is nothing to classify with, and the node silently switches to feature output. That's the model's answer, not a graph error.
Then the usual environment stuff: LSNet checkpoints use a Triton attention kernel, so on Windows you need triton-windows (it's in requirements.txt). And because this is classification, not generation, nothing here is deterministic-fixable with a seed - a different random crop would change the answer, and you don't get one. If two runs of the same image disagree, you've done something else wrong.
One practical note: results are only comparable within one model. Tag sets from Kaloscope v2 and a DINOv3 v3 checkpoint share no label space, so don't mix them across a comparison.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | KALOSCOPE_MODEL | — | |
| top_k | INT | 51–100 | — |
| threshold | FLOAT | 0.000–1 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| tag_string | STRING | — |
| json_output | STRING | — |