feat: add face detection, recognition, and clustering

- Create face_embeddings table with pgvector Vector(128) + HNSW index
- Implement extract_faces task (YuNet detection + SFace recognition)
- Implement recluster_faces task (DBSCAN clustering → Tag(kind=face_cluster))
- Clusters are named "Person N" and get representative_photo_id
- cluster_id FK → tags.id, SET NULL on delete for merge/rename support

Migration 0005 creates the face_embeddings table.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 09:13:41 +02:00
parent 1ebc4bfe73
commit ad007e4cd4
4 changed files with 178 additions and 2 deletions

View File

@@ -7,6 +7,7 @@ from app.models.tags import Tag, PhotoTag
from app.models.heaps import Heap, HeapPhoto
from app.models.embeddings import Embedding
from app.models.ocr_text import OCRText
from app.models.face_embedding import FaceEmbedding
__all__ = [
'Photo',
@@ -18,4 +19,5 @@ __all__ = [
'HeapPhoto',
'Embedding',
'OCRText',
'FaceEmbedding',
]