How scoring works
argus-curator 0.15.2.dev2+g97021d6 @ 97021d6PyPI (opens in new tab)Source (opens in new tab)Changelog (opens in new tab)
Imported from docs/scoring.md on argus-curator's dev branch at that commit. Fixes go upstream, not here.
Every scanned image goes through these steps. The first four run at scan time;
selection runs at export (or on a dry run with POST /scan/{scan_id}/select).
- Hard filters — min short side, max aspect ratio, blur (Laplacian-edge variance floor, measured with the long side at 1024px so the threshold does not depend on the file's resolution).
- Composite score — target-aware weighted blend of sharpness / resolution / artifact, plus a small composition bonus that depends on
target_category(e.g. identity rewards a single centred face; setting rewards wide framing; concept rewards clean, high-resolution images and ignores faces). - Face-count fit — with
[faces], identity targets penalise 0 or 2+ faces; other categories are progressively more tolerant. - Near-duplicate dedup — pHash clustering keeps the highest-scoring representative and reports the rest (never silently dropped).
- Selection (at export) — score threshold + optional diversity cap (
max_keep/diversity_weight) + optional face-cluster filter. Every excluded image carries akeep_reason.
A hard reject (step 1) is never kept or exported, whatever its score, and gets no face, age, scene or garment reading. The prefilter and crops add their own rejects on top of these.
Score weights
The composite score's weights are ScanConfig fields, on the scan request's
config:
The hard-filter floors are min_short_side (512, which is also the lowest it
can be set), max_aspect_ratio (3.0) and blur_threshold (100.0); near-duplicate
grouping uses cluster_distance (pHash Hamming distance, 10; -1 turns grouping
off).