|
|
|
|
@ -8,18 +8,21 @@ sequenceDiagram
|
|
|
|
|
participant GradioUI as Gradio Interface
|
|
|
|
|
participant RegisterUC as RegisterFaceUseCase
|
|
|
|
|
participant UserRepo as MongoDBUserRepository
|
|
|
|
|
participant FaceService as FaceRecognitionService
|
|
|
|
|
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 FileStorage as FileSystemStorage
|
|
|
|
|
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
|
|
|
|
|
@ -31,60 +34,53 @@ sequenceDiagram
|
|
|
|
|
MongoDB-->>UserRepo: User ID
|
|
|
|
|
UserRepo-->>RegisterUC: User ID
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loop For each image
|
|
|
|
|
RegisterUC->>FaceService: register_face(user_id, image)
|
|
|
|
|
|
|
|
|
|
FaceService->>Detector: detect_faces(image)
|
|
|
|
|
Detector-->>FaceService: List of detected faces
|
|
|
|
|
|
|
|
|
|
alt No faces detected
|
|
|
|
|
FaceService-->>RegisterUC: null
|
|
|
|
|
else Face detected
|
|
|
|
|
FaceService->>Detector: calculate_quality_score(best_face)
|
|
|
|
|
Detector-->>FaceService: Quality score
|
|
|
|
|
|
|
|
|
|
alt Quality too low
|
|
|
|
|
FaceService-->>RegisterUC: null
|
|
|
|
|
else Quality acceptable
|
|
|
|
|
FaceService->>Detector: align_face(image, landmarks)
|
|
|
|
|
Detector-->>FaceService: Aligned face image
|
|
|
|
|
|
|
|
|
|
FaceService->>Recognizer: extract_embedding(aligned_face)
|
|
|
|
|
Recognizer-->>FaceService: Face embedding
|
|
|
|
|
|
|
|
|
|
FaceService->>FileStorage: save_image(aligned_face, user_id)
|
|
|
|
|
FileStorage-->>FaceService: Image path
|
|
|
|
|
|
|
|
|
|
FaceService->>FaceRepo: save(face_entity)
|
|
|
|
|
FaceRepo->>MongoDB: Insert face record
|
|
|
|
|
MongoDB-->>FaceRepo: Success
|
|
|
|
|
FaceRepo-->>FaceService: Success
|
|
|
|
|
|
|
|
|
|
FaceService->>VectorStore: add(face_id, embedding, metadata)
|
|
|
|
|
VectorStore->>ChromaDB: Store embedding vector
|
|
|
|
|
ChromaDB-->>VectorStore: Success
|
|
|
|
|
VectorStore-->>FaceService: Success
|
|
|
|
|
|
|
|
|
|
FaceService-->>RegisterUC: Face ID
|
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
RegisterUC->>FaceService: update_user_mean_embedding(user_id)
|
|
|
|
|
FaceService->>FaceRepo: get_by_user_id(user_id)
|
|
|
|
|
FaceRepo->>MongoDB: Query faces by user_id
|
|
|
|
|
MongoDB-->>FaceRepo: Face records
|
|
|
|
|
FaceRepo-->>FaceService: Face entities
|
|
|
|
|
FaceService-->>RegisterUC: Mean embedding
|
|
|
|
|
|
|
|
|
|
RegisterUC->>UserRepo: update_user(user)
|
|
|
|
|
UserRepo->>MongoDB: Update user record
|
|
|
|
|
MongoDB-->>UserRepo: Success
|
|
|
|
|
UserRepo-->>RegisterUC: Success
|
|
|
|
|
|
|
|
|
|
RegisterUC-->>GradioUI: Success message
|
|
|
|
|
GradioUI-->>User: Registration result
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 2. Face Verification Flow
|
|
|
|
|
@ -95,7 +91,11 @@ sequenceDiagram
|
|
|
|
|
participant GradioUI as Gradio Interface
|
|
|
|
|
participant VerifyUC as VerifyFaceUseCase
|
|
|
|
|
participant UserRepo as MongoDBUserRepository
|
|
|
|
|
participant FaceService as FaceRecognitionService
|
|
|
|
|
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
|
|
|
|
|
@ -103,50 +103,53 @@ sequenceDiagram
|
|
|
|
|
|
|
|
|
|
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->>FaceService: verify_face(user_id, image)
|
|
|
|
|
|
|
|
|
|
FaceService->>Detector: detect_faces(image)
|
|
|
|
|
Detector-->>FaceService: List of detected faces
|
|
|
|
|
|
|
|
|
|
alt No faces detected
|
|
|
|
|
FaceService-->>VerifyUC: (false, 0.0)
|
|
|
|
|
else Face detected
|
|
|
|
|
FaceService->>Detector: align_face(image, landmarks)
|
|
|
|
|
Detector-->>FaceService: Aligned face image
|
|
|
|
|
|
|
|
|
|
FaceService->>Recognizer: extract_embedding(aligned_face)
|
|
|
|
|
Recognizer-->>FaceService: Query embedding
|
|
|
|
|
|
|
|
|
|
FaceService->>FaceRepo: get_by_user_id(user_id)
|
|
|
|
|
FaceRepo->>MongoDB: Query registered faces
|
|
|
|
|
MongoDB-->>FaceRepo: Face records
|
|
|
|
|
FaceRepo-->>FaceService: User's face entities
|
|
|
|
|
|
|
|
|
|
alt No registered faces
|
|
|
|
|
FaceService-->>VerifyUC: (false, 0.0)
|
|
|
|
|
else Compare with registered faces
|
|
|
|
|
loop For each registered face
|
|
|
|
|
FaceService->>Recognizer: calculate_similarity(query_embedding, face_embedding)
|
|
|
|
|
Recognizer-->>FaceService: Similarity score
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
FaceService-->>VerifyUC: (is_verified, max_similarity)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
GradioUI-->>User: Verification result
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3. Face Identification Flow
|
|
|
|
|
@ -156,109 +159,124 @@ sequenceDiagram
|
|
|
|
|
participant User
|
|
|
|
|
participant GradioUI as Gradio Interface
|
|
|
|
|
participant IdentifyUC as IdentifyFaceUseCase
|
|
|
|
|
participant UserRepo as MongoDBUserRepository
|
|
|
|
|
participant FaceService as FaceRecognitionService
|
|
|
|
|
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->>FaceService: identify_face(image)
|
|
|
|
|
|
|
|
|
|
FaceService->>Detector: detect_faces(image)
|
|
|
|
|
Detector-->>FaceService: List of detected faces
|
|
|
|
|
|
|
|
|
|
alt No faces detected
|
|
|
|
|
FaceService-->>IdentifyUC: (null, 0.0, [])
|
|
|
|
|
else Face detected
|
|
|
|
|
FaceService->>Detector: align_face(image, landmarks)
|
|
|
|
|
Detector-->>FaceService: Aligned face image
|
|
|
|
|
|
|
|
|
|
FaceService->>Recognizer: extract_embedding(aligned_face)
|
|
|
|
|
Recognizer-->>FaceService: Query embedding
|
|
|
|
|
|
|
|
|
|
FaceService->>VectorStore: search_similar(query_embedding, top_k=10)
|
|
|
|
|
VectorStore->>ChromaDB: Vector similarity search
|
|
|
|
|
ChromaDB-->>VectorStore: Similar face vectors
|
|
|
|
|
VectorStore-->>FaceService: Similar faces with metadata
|
|
|
|
|
|
|
|
|
|
alt No similar faces above threshold
|
|
|
|
|
FaceService-->>IdentifyUC: (null, 0.0, [])
|
|
|
|
|
else Similar faces found
|
|
|
|
|
note over FaceService: Group by user_id and calculate best scores
|
|
|
|
|
FaceService-->>IdentifyUC: (best_user_id, confidence, candidates)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
loop For each candidate user_id
|
|
|
|
|
|
|
|
|
|
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 user by ID
|
|
|
|
|
MongoDB-->>UserRepo: User data
|
|
|
|
|
UserRepo->>MongoDB: query
|
|
|
|
|
MongoDB-->>UserRepo: user data
|
|
|
|
|
UserRepo-->>IdentifyUC: User entity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
alt User identified
|
|
|
|
|
IdentifyUC->>UserRepo: get_by_id(best_user_id)
|
|
|
|
|
UserRepo->>MongoDB: Query identified user
|
|
|
|
|
MongoDB-->>UserRepo: User data
|
|
|
|
|
UserRepo-->>IdentifyUC: User entity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IdentifyUC-->>GradioUI: IdentificationResult
|
|
|
|
|
GradioUI-->>User: Identification result
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant Main as main.py
|
|
|
|
|
participant Main as main.py (API)
|
|
|
|
|
participant Config as Settings
|
|
|
|
|
participant MongoDB as MongoDBFaceRepository
|
|
|
|
|
participant MongoDBRepo as MongoDBFaceRepository
|
|
|
|
|
participant MongoUserRepo as MongoDBUserRepository
|
|
|
|
|
participant ChromaDB as ChromaDBVectorStore
|
|
|
|
|
participant FileStorage as FileSystemStorage
|
|
|
|
|
participant Detector as RetinaFaceDetector
|
|
|
|
|
participant Recognizer as SFaceRecognizer
|
|
|
|
|
participant FaceService as FaceRecognitionService
|
|
|
|
|
participant UseCases as Use Cases
|
|
|
|
|
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->>MongoDB: Initialize with MongoDB URL
|
|
|
|
|
MongoDB-->>Main: Repository instance
|
|
|
|
|
|
|
|
|
|
Main->>ChromaDB: Initialize with Chroma host/port
|
|
|
|
|
ChromaDB-->>Main: Vector store instance
|
|
|
|
|
|
|
|
|
|
Main->>FileStorage: Initialize with upload directory
|
|
|
|
|
FileStorage-->>Main: File storage instance
|
|
|
|
|
|
|
|
|
|
Main->>Detector: Initialize RetinaFace
|
|
|
|
|
note over Detector: Load ONNX models, prepare ctx
|
|
|
|
|
Detector-->>Main: Detector instance
|
|
|
|
|
|
|
|
|
|
Main->>Recognizer: Initialize SFace
|
|
|
|
|
note over Recognizer: Download/load SFace ONNX model
|
|
|
|
|
Recognizer-->>Main: Recognizer instance
|
|
|
|
|
|
|
|
|
|
Main->>FaceService: Initialize with dependencies
|
|
|
|
|
FaceService-->>Main: Service instance
|
|
|
|
|
|
|
|
|
|
Main->>UseCases: Initialize use cases with service
|
|
|
|
|
UseCases-->>Main: Use case instances
|
|
|
|
|
|
|
|
|
|
Main->>GradioApp: create_gradio_interface(use_cases)
|
|
|
|
|
GradioApp-->>Main: Gradio app instance
|
|
|
|
|
|
|
|
|
|
Main->>GradioApp: launch(server_name, server_port)
|
|
|
|
|
note over GradioApp: Start web server on port 7860
|
|
|
|
|
GradioApp-->>Main: Server running
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|