Views
No views yet

best.pt — model weights (fine-tuned from SmilingWolf/wd-swinv2-tagger-v3)best_thresholds.json — label list, per-label thresholds, calibration score, and decoder settingslabels.json / label_norms.json — the 32,617-label vocabulary (identical raw and normalized label lists)args.json — training and calibration configuration used to produce this checkpointconfig.json — Hugging Face transformers-style model configexample.py — inference script that tags a folder of imagesrequirements.txt — Python dependencies for example.pyargs.json and config.json:SmilingWolf/wd-swinv2-tagger-v3 (via timm)asl_gamma_pos=0.0, asl_gamma_neg=4.0, asl_clip=0.05)official_ontology_loss = [0.02, 0.04, 0.06]best_thresholds.json is the source of truth for how this checkpoint was picked and how tags get decided at inference time. It holds one aggregate score plus per-label thresholds, not a micro-F1/macro-F1/precision@k/recall@k breakdown — so what follows is what's actually verifiable from the bundle, not a full benchmark report.val_decoder_score = 0.2571. That score is a decoder-level objective: predictions get decoded per-image using the per-label thresholds, capped at 128 tags/image, then expanded through the label ontology's implication graph before scoring. It isn't micro-F1 or macro-F1, so don't quote it as one.support_shrunk_per_label_f1_plus_topk_then_implication_closure) picks each label's threshold by grid search — 37 steps from 0.05 to 0.95 — to maximize that label's own F1, then shrinks the result back toward the 0.35 default based on how much support the label has (shrinkage_strength=64, min_positives_for_per_label=3), so rare labels don't end up with an overconfident, narrow threshold. At decode time, predictions are capped at 128 tags/image and then closed over the ontology (predicting a child tag implies its parents).| Stat | Value |
|---|---|
| Min | 0.241 |
| p5 | 0.341 |
| p25 / median / p75 | 0.350 (= default) |
| p95 | 0.436 |
| Max | 0.769 |
| Mean | 0.361 |
| Std dev | 0.041 |
example.py (or loading best.pt directly) against a labeled validation set and computing them yourself, using the per-label thresholds here as the decision boundaries.smilingfox, a Python package that wraps this repository with a proper API and CLI:pipx install smilingfoxsmilingfox tag ./photos --stdout1from smilingfox import Tagger
2
3tagger = Tagger.from_pretrained() # downloads and caches this repo
4tagger.predict("photo.jpg").tagsTagger.from_pretrained() downloads and caches this exact repo by default, so no extra configuration is needed. See the smilingfox repository for the full API and CLI reference, including batching, custom confidence floors, and local bundle overrides.example.py works standalone against the files checked in here.pip install -r requirements.txtpython example.py /path/to/imagespython example.py /path/to/images --hf-model-id nollafox/smilingfoxmax(calibrated_tag_threshold, --required-confidence).1{
2 "tags": ["tag_a", "tag_b"]
3}