Local face clustering to accelerate person tagging #128
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Decision
The audit rejected face work as an explicit spec non-goal. The user has since approved face
clustering — with a specific, experience-driven requirement about cluster hygiene, below.
Clustering here means grouping visually similar faces without identifying anyone. No names are
inferred, no identities are matched against a database. A human still assigns every name. This is a
tagging accelerator, not a recognition system.
Why
Manual person tagging (#110) is the highest-value evidence source available, but tagging thousands
of photos one at a time is the bottleneck that would stop it being used. Clustering turns "tag
every photo individually" into "confirm this group of 40 faces is Uncle Pete."
The hard requirement: cluster hygiene
Direct from the user, based on using tools that got this wrong:
This is the make-or-break feature, not a nice-to-have. Clustering is always imperfect —
especially on scanned prints, where faces are small, grainy, off-angle, and half a century apart in
age for the same person. A cluster that cannot be easily corrected is worse than no cluster,
because the reviewer either propagates a wrong tag to dozens of photos or abandons the tool.
Required operations, all available before a name is committed and after:
Design the cluster review grid so removal is the primary interaction, not buried in a context
menu. Assume roughly one in ten faces is misgrouped and make that cheap to fix.
The covenant still holds
photo_persontags a manual tag would, with the sameattribution — no separate "auto-tagged" tier.
Privacy and architecture
and embeddings must never be sent to a cloud model.
(#117), and document what they are.
without touching photos or tags.
reconsidering that non-goal if it can run entirely locally. Do not design clustering in a way that
makes that a rewrite, but do not build it now either.
Technical sketch
InsightFace, or dlib/face_recognition. Choose for offline operation and CPU viability, and record
the decision.
Prefer conservative clustering — many small pure clusters beat few large mixed ones, because
merging is cheap and unpicking is expensive.
by a person, that decision is sticky across re-runs.
Spec amendment required
docs/circa-spec.mdlists "facial recognition or person identification" as a non-goal. Amend it tostate that local face clustering is in scope as a manual-tagging accelerator, that no automated
identification occurs, and that all processing is local. Note the open question about local
recognition rather than leaving the document contradicting the code.
Done when
References
docs/circa-spec.md(non-goals section)Depends on: #110 (person registry), #2 (worker runtime). Feeds: #110's apparent-age dating.
Spec amendment done in
66d5e77— the "Done when" item for it can be considered closed.docs/circa-spec.md§2 now distinguishes face clustering (in scope) from face recognition (out ofscope), and records:
available before and after naming, because clustering on scanned prints is unavoidably imperfect
the note that clustering should not be architected in a way that makes it a rewrite
The genealogy non-goal was also annotated as possibly reconsidered much later, per the same
conversation, so that thought is not lost.