Cluster faces into people, and calibrate what a similarity means

FR-CULL-9 forbids thresholding a bare cosine anywhere in the subsystem,
so calibrate fits P(same person) per library and reports whether the fit
is trustworthy. Two details carry most of the weight.

The fit runs against a 200-bin histogram rather than a pair list: a
25,000-face library has ~3e8 pairs and no gradient descent is running
over that. And a fresh library has no valid calibration, because the
positives have to come from user confirmations or burst siblings --
bootstrapping them from high cosine would fit the calibration to the
belief it was supposed to test.

Clustering defends against the over-merging FR-CULL-10 warns about with
constraints rather than a better threshold: two faces in one photograph
never merge, and two groups confirmed as different people never merge.
Average link rather than single link, so one strong edge cannot weld two
families together.

Calibration is defined once, in dr-face, and dr-catalog re-exports it.
Two implementations of one probability model is exactly how a number
comes to mean the wrong thing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-26 20:10:33 +02:00
co-authored by Claude Opus 5
parent aac3136407
commit 00e78dc2ac
9 changed files with 929 additions and 52 deletions
+4
View File
@@ -31,6 +31,8 @@
//! likely to be subtly wrong.
pub mod align;
pub mod calibrate;
pub mod cluster;
pub mod embedding;
#[cfg(feature = "inference")]
pub mod detect;
@@ -38,6 +40,8 @@ pub mod detect;
pub mod embed;
pub use align::{warp, Aligned112, Similarity, ALIGNED_EDGE, ARCFACE_TEMPLATE};
pub use calibrate::{Calibration, Pairs, ReliabilityBand};
pub use cluster::{cluster, split, Candidate, Cluster, DEFAULT_MERGE_PROBABILITY};
pub use embedding::{Embedding, ModelId, EMBEDDING_DIM};
#[cfg(feature = "inference")]
pub use detect::{DetectOptions, Detection, Detector};