+ Reuses the SigLIP embeddings already stored on your images (no re-embed, no
+ GPU). For each concept it trains a logistic-regression head
+ on your positives + negatives and compares it to the old single
+ centroid, with cross-validated AP/F1 and a learning curve.
+ Runs as a background task; the result is saved and reloads here.
+
+
+
+
+ Ran {{ formatTime(report.generated_at) }} ·
+ {{ report.concepts.length }} concept(s) ·
+ neg ratio {{ report.params.neg_ratio }}, {{ report.params.cv_folds }}-fold CV
+
+
+
+
+ {{ c.name }}
+ — skipped: {{ c.skipped }}
+
+ {{ c.n_pos }} pos · {{ c.n_neg }} neg ({{ c.n_rejected }} rejected)
+
+
+
+
+
+
+ | AP | F1 | Prec | Rec |
+
+
+
+ | Head |
+ {{ c.head.ap }} |
+ {{ c.head.f1 }} |
+ {{ c.head.precision }} |
+ {{ c.head.recall }} |
+
+
+ | Centroid |
+ {{ c.centroid.ap }} |
+ {{ c.centroid.f1 }} |
+ {{ c.centroid.precision }} |
+ {{ c.centroid.recall }} |
+
+
+
+
+ Δ AP {{ apDelta(c) >= 0 ? '+' : '' }}{{ apDelta(c).toFixed(3) }}
+ (head − centroid)
+
+
+
+ Learning curve (AP @ N positives):
+
+ {{ p.n_pos }}→{{ p.ap }}
+
+
+
+
+
+
Head would suggest (untagged, high score)
+
+
![]()
+
+
+
+
Head doubts these (your positives, low score)
+
+
![]()
+
+
+
+
+
+
+