Grey-Resolve - Degraded-Media Entity Resolution, Evaluated Honestly
An entity-resolution pipeline over degraded, uncurated media: detect a face, quality-gate it, embed it, retrieve near-duplicates, then try to break near-ties with lightweight context (time, coarse geo, source, text entities) - or honestly decline to resolve. The project is the evaluation: per-condition ROC/FMR/FNMR sweeps, a quality gate that measurably helps, and a central hypothesis (context resolves face near-ties) that was tested at scale and is not supported. Live Resolution Console on GitHub Pages; synthetic and public research data only, with candidate-ranking semantics throughout. Adapted from the vector-search coursework in Creating AI-Enabled Systems, a course in my JHU program.
Face matching looks solved on clean, well-lit images and quietly falls apart on the open-source media that real mission contexts supply: blurred, downsampled, off-angle, uncurated. A single accuracy percentage hides this, and a pipeline that always returns a top match will return a confident wrong one when several identities genuinely look alike. The harder question is whether contextual metadata can resolve those near-ties at all - and how you would know if it cannot.
Detect (SCRFD), quality-gate (FIQA-lite), embed (ArcFace, 512-d), and retrieve through a FAISS HNSW index with a SQLite metadata sidecar, then fuse context. Evaluation replaces accuracy percentages with EER, FMR and FNMR per degradation type (blur, downsampling, brightness, rotation), produced from one command, with detection failures counted per condition rather than hidden. The ambiguity regime is defined by measurement - the top-1/top-2 face-score gap - and four methods are compared on it: face-only, raw fusion, gap-gated selective fusion, and an evidence-only top-2 tiebreak, each swept across context-noise rates. Outputs are candidate rankings, never identifications, and the repo and UI carry no face imagery. Model weights are downloaded at runtime and never committed or baked into images; FastAPI and Docker Compose (API plus Qdrant) wrap the real pipeline.
The headline finding is structural: ranking quality is not operating-point calibration. EER stays near zero while FMR at FNMR=1% explodes to 0.873 under severe downsampling, so thresholds must be calibrated per condition. The quality gate lowers FNMR at a fixed threshold in nearly every condition (0.028 to 0.020 on clean probes) and rejects almost everything where quality is genuinely bad. The fusion claim did not hold: a small-run positive (n=4) did not replicate at scale (n=18) and reversed sign, with raw fusion cutting tight-gap hit@1 from 0.500 to 0.167. The mechanism was diagnosed (extreme-value noise from 59 competing context scores) and the guarded top-2 tiebreak was shown to be safe (overall exactly face-only, within +0.009/-0.019 across noise) but neutral. HNSW search p95 is at most 1.6 ms at 50k vectors against about 29 ms brute force on CPU. 241 deterministic tests, none needing model weights. Still unproven: results come from LFW-derived research data and synthetic scenarios, the FIQA gate is a heuristic rather than a measured assessor, runs use a single gallery draw, and nothing here transfers to real-world operational accuracy.