PixAI Tagger v0.9
The WD-style tagger that also tells you the franchise
- image
- general_tags
- character_tags
- ip_tags
Every tagger will name the character in an image. This one also tells you what they're from. That's PixAI Tagger's party trick: it detects a character, then looks it up in a mapping file and emits the franchise - so a random anime screenshot gives you hatsune miku and vocaloid without you knowing either. If you're reverse-engineering prompts off a booru or pre-tagging LoRA training images, the IP output is a genuinely useful shortcut nobody else in this pack has.
It's PixAI Labs' own v0.9 model (Apache-2.0), a 13k-tag vocabulary that slots into the WD14 family rather than competing with the heavyweights. The code builds the encoder from SmilingWolf's wd-eva02-large-tagger-v3 via timm and bolts PixAI's trained head on top - so this is effectively a WD14-lineage backbone with a tuned vocab. Community reports call it roughly 1.3x faster than a regular tagger, which tracks: the eva02-large encoder at 448x448 is a known workhorse. For Pony/Illustrious/NoobAI workflows the output format is exactly right - comma-separated Danbooru-style tags ready to drop into a prompt.
How it works
The two-threshold design is the real quirk. PixAI doesn't use one cutoff, it uses two:
general_threshold(default 0.35) - low on purpose, so it grabs a fat list of general tags (poses, clothing, backgrounds).character_threshold(default 0.85) - high on purpose, so only confident character detections get through.
That asymmetry is the feature. General tags are cheap, so it errs toward more of them; character tags are load-bearing (they name the person), so it errs toward precision. Leave general_threshold alone and only nudge character_threshold down if it keeps missing characters you can plainly see.
Mechanically: it takes the first image in the batch, composites any alpha onto white, and runs inference. The model loads once and is cached by weights file, so subsequent runs are fast. The three outputs - general_tags, character_tags, ip_tags - come back as comma-separated strings with underscores replaced by spaces and parens escaped (\\() so they don't break your prompt-weighting syntax. Wire them into a string concat and then a CLIP Text Encode.
The model install is the whole battle
This is where people get burned, because the README doesn't mention the tagger at all. The node scans ComfyUI/custom_nodes/ComfyUI_e621_booru_toolkit/models/<folder>/ for three files: a weights file (.pth/.pt/.safetensors/.sft), a tags_*.json, and a char_ip_map*.json. The Hugging Face repo pixai-labs/pixai-tagger-v0.9 ships exactly those - model_v0.9.pth, tags_v0.9_13k.json, char_ip_map.json - but it's gated. Log in and click "Agree and access" on the model page, then:
cd ComfyUI/custom_nodes/ComfyUI_e621_booru_toolkit/models
mkdir pixai-tagger-v0.9
# download the three files from https://huggingface.co/pixai-labs/pixai-tagger-v0.9 into that folder
Two more gotchas. First, the pack imports timm at module load, and timm is not in its requirements.txt - if it's missing, the whole pack fails to import and none of its nodes load. pip install timm fixes it (torchvision, numpy and safetensors are typically already in a ComfyUI env). Second, the encoder weights aren't bundled - timm downloads them from HF on first inference into its own cache, so the first run takes a while.
If the model dropdown reads "No valid models found", the folder layout is wrong: the files must sit in a subfolder with the tags_ and char_ip_map filename prefixes intact. If a run returns three empty strings, check the ComfyUI console log - the handler failed to load, usually a renamed file.
It's the odd node out in a pack that's otherwise about fetching booru posts, but it's the one that does something the WD taggers you already have don't. Worth the setup if you tag enough anime images to care.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | 1 options: No valid models found | |
| image | IMAGE | — | |
| general_threshold | FLOAT | 0.350–1 | — |
| character_threshold | FLOAT | 0.850–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| general_tags | STRING | — |
| character_tags | STRING | — |
| ip_tags | STRING | — |