You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
10 KiB
10 KiB
Face Recognition Service - Sequence Diagrams
1. Face Registration Flow
sequenceDiagram
participant User
participant GradioUI as Gradio Interface
participant RegisterUC as RegisterFaceUseCase
participant UserRepo as MongoDBUserRepository
participant S3 as S3ObjectStorage
participant TaskPub as TaskPublisher
participant MQ as RabbitMQ
participant StatusRepo as TaskStatusRepository
participant Worker as FaceWorker
participant Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer
participant FaceRepo as MongoDBFaceRepository
participant VectorStore as ChromaDBVectorStore
participant MongoDB as MongoDB Database
participant ChromaDB as ChromaDB Vector DB
User->>GradioUI: Upload images + username
GradioUI->>RegisterUC: execute(username, images)
RegisterUC->>UserRepo: get_user_by_name(username)
UserRepo->>MongoDB: Query user by name
MongoDB-->>UserRepo: User data or null
UserRepo-->>RegisterUC: User entity or null
alt User doesn't exist
RegisterUC->>UserRepo: save(new_user)
UserRepo->>MongoDB: Insert new user
MongoDB-->>UserRepo: User ID
UserRepo-->>RegisterUC: User ID
end
loop For each image
RegisterUC->>S3: put_object(image)
S3-->>RegisterUC: s3_uri
RegisterUC->>TaskPub: publish_register_task(user_id, s3_uri)
TaskPub->>MQ: enqueue(task)
end
RegisterUC->>StatusRepo: wait/poll for task_ids status
StatusRepo-->>RegisterUC: Completed/Failed + results
alt All tasks completed
RegisterUC->>StatusRepo: get_mean_embedding(user_id) / or compute later
RegisterUC-->>GradioUI: Success message + stats
else Some tasks failed
RegisterUC-->>GradioUI: Partial success + failed items
end
GradioUI-->>User: Registration result (async aware)
%% Worker side
loop Worker Pool
MQ-->>Worker: task(user_id, s3_uri)
Worker->>S3: get_object(s3_uri)
Worker->>Detector: detect_faces(image)
Detector-->>Worker: faces
alt No faces or low quality
Worker->>StatusRepo: update(task_id, failed_reason)
else Face OK
Worker->>Detector: align_face(image, landmarks)
Detector-->>Worker: aligned_face
Worker->>Recognizer: extract_embedding(aligned_face)
Recognizer-->>Worker: embedding
Worker->>FaceRepo: save(face_entity)
FaceRepo->>MongoDB: insert face record
MongoDB-->>FaceRepo: ok
Worker->>VectorStore: add(face_id, embedding, metadata)
VectorStore->>ChromaDB: store vector
ChromaDB-->>VectorStore: ok
Worker->>StatusRepo: update(task_id, success, embedding_id)
end
end
2. Face Verification Flow
sequenceDiagram
participant User
participant GradioUI as Gradio Interface
participant VerifyUC as VerifyFaceUseCase
participant UserRepo as MongoDBUserRepository
participant S3 as S3ObjectStorage
participant TaskPub as TaskPublisher
participant MQ as RabbitMQ
participant StatusRepo as TaskStatusRepository
participant Worker as FaceWorker
participant Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer
participant FaceRepo as MongoDBFaceRepository
participant MongoDB as MongoDB Database
User->>GradioUI: Upload image + username
GradioUI->>VerifyUC: execute(username, image)
VerifyUC->>UserRepo: get_user_by_name(username)
UserRepo->>MongoDB: Query user by name
MongoDB-->>UserRepo: User data or null
UserRepo-->>VerifyUC: User entity or null
alt User not found
VerifyUC-->>GradioUI: VerificationResult(false, 0.0)
GradioUI-->>User: result
else User found
VerifyUC->>S3: put_object(image)
S3-->>VerifyUC: s3_uri
VerifyUC->>TaskPub: publish_verify_task(user_id, s3_uri)
TaskPub->>MQ: enqueue(task)
VerifyUC->>StatusRepo: wait/poll task_id
StatusRepo-->>VerifyUC: (is_verified, score)
VerifyUC-->>GradioUI: VerificationResult
GradioUI-->>User: result
end
%% Worker side
MQ-->>Worker: task(user_id, s3_uri)
Worker->>S3: get_object(s3_uri)
Worker->>Detector: detect_faces(image)
Detector-->>Worker: faces
alt No faces
Worker->>StatusRepo: update(task_id, false, 0.0)
else
Worker->>Detector: align_face(image, landmarks)
Detector-->>Worker: aligned
Worker->>Recognizer: extract_embedding(aligned)
Recognizer-->>Worker: query_embedding
Worker->>FaceRepo: get_by_user_id(user_id)
FaceRepo->>MongoDB: query faces
MongoDB-->>FaceRepo: records
FaceRepo-->>Worker: embeddings
Worker->>Recognizer: calculate_similarity(query_embedding, user_embeddings)
Recognizer-->>Worker: max_score
Worker->>StatusRepo: update(task_id, max_score>=threshold, max_score)
end
3. Face Identification Flow
sequenceDiagram
participant User
participant GradioUI as Gradio Interface
participant IdentifyUC as IdentifyFaceUseCase
participant S3 as S3ObjectStorage
participant TaskPub as TaskPublisher
participant MQ as RabbitMQ
participant StatusRepo as TaskStatusRepository
participant Worker as FaceWorker
participant Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer
participant VectorStore as ChromaDBVectorStore
participant ChromaDB as ChromaDB Vector DB
participant UserRepo as MongoDBUserRepository
participant MongoDB as MongoDB Database
User->>GradioUI: Upload image
GradioUI->>IdentifyUC: execute(image)
IdentifyUC->>S3: put_object(image)
S3-->>IdentifyUC: s3_uri
IdentifyUC->>TaskPub: publish_identify_task(s3_uri, top_k=10)
TaskPub->>MQ: enqueue(task)
IdentifyUC->>StatusRepo: wait/poll task_id
StatusRepo-->>IdentifyUC: (best_user_id, confidence, candidate_user_ids)
loop For each candidate_user_id
IdentifyUC->>UserRepo: get_by_id(user_id)
UserRepo->>MongoDB: query
MongoDB-->>UserRepo: user data
UserRepo-->>IdentifyUC: User entity
end
IdentifyUC-->>GradioUI: IdentificationResult
GradioUI-->>User: result
%% Worker
MQ-->>Worker: task(s3_uri)
Worker->>S3: get_object(s3_uri)
Worker->>Detector: detect_faces(image)
Detector-->>Worker: faces
alt No faces
Worker->>StatusRepo: update(task_id, null, 0.0, [])
else
Worker->>Detector: align_face(image, landmarks)
Detector-->>Worker: aligned
Worker->>Recognizer: extract_embedding(aligned)
Recognizer-->>Worker: query_embedding
Worker->>VectorStore: search_similar(query_embedding, top_k=10)
VectorStore->>ChromaDB: search
ChromaDB-->>VectorStore: results with metadata (face_id, user_id, score)
VectorStore-->>Worker: candidates
alt No scores above threshold
Worker->>StatusRepo: update(task_id, null, 0.0, [])
else
note over Worker: Group by user_id, choose best_user_id + confidence
Worker->>StatusRepo: update(task_id, best_user_id, confidence, candidate_user_ids)
end
end
4. System Initialization Flow
sequenceDiagram
participant Main as main.py (API)
participant Config as Settings
participant MongoDBRepo as MongoDBFaceRepository
participant MongoUserRepo as MongoDBUserRepository
participant ChromaDB as ChromaDBVectorStore
participant S3 as S3ObjectStorage
participant Rabbit as RabbitMQ
participant StatusRepo as TaskStatusRepository
participant Publisher as TaskPublisher
participant GradioApp as Gradio Interface
participant WorkerMain as worker_main.py (Workers)
participant WConfig as Settings
participant WDetector as RetinaFaceDetector
participant WRecognizer as SFaceRecognizer
participant WFaceService as FaceRecognitionService
participant WFaceRepo as MongoDBFaceRepository
participant WVector as ChromaDBVectorStore
participant WS3 as S3ObjectStorage
participant WRabbit as RabbitMQ
participant WStatusRepo as TaskStatusRepository
participant WPool as FaceWorkerPool
%% API init
Main->>Config: Load configuration
Config-->>Main: Settings object
Main->>MongoDBRepo: Initialize with Mongo URL
Main->>MongoUserRepo: Initialize with Mongo URL
Main->>ChromaDB: Initialize with host/port
Main->>S3: Initialize with bucket/creds
Main->>Rabbit: Connect/create queues
Main->>StatusRepo: Initialize (Redis/Mongo)
Main->>Publisher: Initialize with Rabbit
Main->>GradioApp: create_gradio_interface(use_cases, publisher, status_repo)
Main->>GradioApp: launch(server_name, port)
%% Worker init (can be on separate machines)
WorkerMain->>WConfig: Load configuration
WConfig-->>WorkerMain: Settings
WorkerMain->>WRabbit: Connect/subscribe queues
WorkerMain->>WStatusRepo: Initialize
WorkerMain->>WDetector: Initialize RetinaFace
note over WDetector: Load ONNX models, prepare ctx
WorkerMain->>WRecognizer: Initialize SFace
note over WRecognizer: Load/Download ONNX model
WorkerMain->>WFaceRepo: Initialize with Mongo URL
WorkerMain->>WVector: Initialize with Chroma host/port
WorkerMain->>WS3: Initialize with bucket/creds
WorkerMain->>WFaceService: Initialize with dependencies
WorkerMain->>WPool: Start consuming tasks
Flow Descriptions
Registration Flow
- User uploads multiple images with username
- System checks if user exists, creates if needed
- For each image: detects faces, validates quality, extracts embeddings
- Stores face metadata in MongoDB, embeddings in ChromaDB, images in filesystem
- Updates user with mean embedding for faster verification
Verification Flow (1:1)
- User provides image and username to verify against
- System detects face in query image and extracts embedding
- Retrieves all registered faces for the specified user
- Compares query embedding with user's registered face embeddings
- Returns verification result based on similarity threshold
Identification Flow (1:N)
- User provides image without specifying identity
- System detects face and extracts embedding
- Performs vector similarity search across all registered faces
- Groups results by user and calculates confidence scores
- Returns best match if confidence exceeds threshold
Initialization Flow
System startup involves initializing all dependencies in correct order, loading ML models, and starting the web interface.