Artem-Darius Weber 5 months ago
commit 426effcd8c

@ -3,35 +3,48 @@
```mermaid ```mermaid
graph TB graph TB
%% External Layer %% External Layer
User[👤 User] --> GradioUI[🖥️ Gradio Web Interface] EndUser[👤 User] --> GradioUI[🖥️ Gradio Web Interface]
%% Presentation Layer %% Presentation Layer
subgraph "Presentation Layer" subgraph "Presentation Layer"
GradioUI --> |Web Requests| GradioApp[gradio_app.py] GradioUI --> |HTTP/Web Requests| GradioApp[gradio_app.py]
end end
%% Application Layer %% Application Layer
subgraph "Application Layer" subgraph "Application Layer"
GradioApp --> RegisterUC[📝 RegisterFaceUseCase] GradioApp --> RegisterUC[📝 RegisterFaceUseCase]
GradioApp --> VerifyUC[🔍 VerifyFaceUseCase] GradioApp --> VerifyUC[🔍 VerifyFaceUseCase]
GradioApp --> IdentifyUC[🔎 IdentifyFaceUseCase] GradioApp --> IdentifyUC[🔎 IdentifyFaceUseCase]
%% Асинхронная публикация задач
RegisterUC --> TaskPublisher[📨 TaskPublisher]
VerifyUC --> TaskPublisher
IdentifyUC --> TaskPublisher
RegisterUC --> FaceService[⚙️ FaceRecognitionService] %% Хранилище статусов задач (поллинг/вебсокет)
VerifyUC --> FaceService GradioApp --> TaskStatusRepo[📊 TaskStatusRepository]
IdentifyUC --> FaceService end
%% Scalability / Async Layer
subgraph "Scalability Layer (Async, flipped-buffer)"
TaskPublisher --> RabbitMQ[(🐇 RabbitMQ)]
FaceWorkerPool[👷‍♂️ FaceWorker Pool - N instances] --> RabbitMQ
FaceWorkerPool --> TaskStatusRepo
end end
%% Domain Layer %% Domain Layer
subgraph "Domain Layer" subgraph "Domain Layer"
FaceService --> Face[👤 Face Entity] FaceService[⚙️ FaceRecognitionService] --> Face[👤 Face Entity]
FaceService --> User[👨‍💼 User Entity] FaceService --> User[👨‍💼 User Entity]
FaceService --> VResult[✅ VerificationResult] FaceService --> VResult[✅ VerificationResult]
FaceService --> IResult[🎯 IdentificationResult] FaceService --> IResult[🎯 IdentificationResult]
FaceRepo[📊 FaceRepository Interface] FaceRepo[📊 FaceRepository Interface]
VectorStore[🗂️ VectorStore Interface] VectorStore[🗂️ VectorStore Interface]
UserRepoIface[👨‍💼 UserRepository Interface]
ObjectStorageIface[📁 ObjectStorage Interface]
end end
%% Infrastructure Layer %% Infrastructure Layer
subgraph "Infrastructure Layer" subgraph "Infrastructure Layer"
%% ML Components %% ML Components
@ -42,9 +55,10 @@ graph TB
%% Storage Components %% Storage Components
subgraph "Storage Components" subgraph "Storage Components"
MongoDB[🗄️ MongoDBFaceRepository] MongoDBRepo[🗄️ MongoDBFaceRepository]
ChromaDB[🔗 ChromaDBVectorStore] MongoUserRepo[👨‍💼 MongoDBUserRepository]
FileSystem[📁 FileSystemStorage] ChromaDBStore[🔗 ChromaDBVectorStore]
S3Storage[🪣 S3ObjectStorage]
end end
%% Configuration & Logging %% Configuration & Logging
@ -53,60 +67,73 @@ graph TB
Logger[📋 Logging System] Logger[📋 Logging System]
end end
end end
%% External Systems %% External Systems
subgraph "External Systems" subgraph "External Systems"
MongoDBServer[(🗄️ MongoDB Database)] MongoDBServer[(🗄️ MongoDB Database)]
ChromaDBServer[(🔗 ChromaDB Vector DB)] ChromaDBServer[(🔗 ChromaDB Vector DB)]
FileStorage[(📁 File System)] S3Bucket[(🪣 S3 Bucket)]
ONNXModel[🧠 SFace ONNX Model] ONNXModel[🧠 SFace ONNX Model]
RedisOrMongo[(📊 Redis/Mongo for Task Status)]
end end
%% Service Dependencies %% Service Dependencies (исполняются внутри воркеров)
FaceWorkerPool --> FaceService
FaceService --> RetinaFace FaceService --> RetinaFace
FaceService --> SFaceRec FaceService --> SFaceRec
FaceService --> FaceRepo FaceService --> FaceRepo
FaceService --> VectorStore FaceService --> VectorStore
FaceService --> FileSystem FaceService --> ObjectStorageIface
%% Repository Implementations %% Repository Implementations
FaceRepo -.->|implements| MongoDB FaceRepo -.->|implements| MongoDBRepo
VectorStore -.->|implements| ChromaDB VectorStore -.->|implements| ChromaDBStore
UserRepoIface -.->|implements| MongoUserRepo
ObjectStorageIface -.->|implements| S3Storage
%% External Connections %% External Connections
MongoDB --> MongoDBServer MongoDBRepo --> MongoDBServer
ChromaDB --> ChromaDBServer MongoUserRepo --> MongoDBServer
FileSystem --> FileStorage ChromaDBStore --> ChromaDBServer
S3Storage --> S3Bucket
SFaceRec --> ONNXModel SFaceRec --> ONNXModel
TaskStatusRepo --> RedisOrMongo
%% Use Case Dependencies
RegisterUC --> UserRepo[👨‍💼 MongoDBUserRepository] %% Use Case Dependencies (чтение пользователей/статусов)
VerifyUC --> UserRepo RegisterUC --> MongoUserRepo
IdentifyUC --> UserRepo VerifyUC --> MongoUserRepo
UserRepo --> MongoDBServer IdentifyUC --> MongoUserRepo
%% Logging Dependencies %% Logging Dependencies
RetinaFace -.-> Logger RetinaFace -.-> Logger
SFaceRec -.-> Logger SFaceRec -.-> Logger
FaceService -.-> Logger FaceService -.-> Logger
FaceWorkerPool -.-> Logger
TaskPublisher -.-> Logger
%% Configuration Dependencies %% Configuration Dependencies
FaceService -.-> Config FaceService -.-> Config
MongoDB -.-> Config MongoDBRepo -.-> Config
ChromaDB -.-> Config MongoUserRepo -.-> Config
ChromaDBStore -.-> Config
S3Storage -.-> Config
RabbitMQ -.-> Config
TaskStatusRepo -.-> Config
%% Styling %% Styling
classDef presentation fill:#e1f5fe classDef presentation fill:#e1f5fe
classDef application fill:#f3e5f5 classDef application fill:#f3e5f5
classDef domain fill:#e8f5e8 classDef domain fill:#e8f5e8
classDef infrastructure fill:#fff3e0 classDef infrastructure fill:#fff3e0
classDef external fill:#ffebee classDef external fill:#ffebee
classDef scalability fill:#ede7f6
class GradioUI,GradioApp presentation class GradioUI,GradioApp presentation
class RegisterUC,VerifyUC,IdentifyUC,FaceService application class RegisterUC,VerifyUC,IdentifyUC,TaskPublisher,TaskStatusRepo application
class Face,User,VResult,IResult,FaceRepo,VectorStore domain class Face,User,VResult,IResult,FaceRepo,VectorStore,UserRepoIface,ObjectStorageIface,FaceService domain
class RetinaFace,SFaceRec,MongoDB,ChromaDB,FileSystem,Config,Logger,UserRepo infrastructure class RetinaFace,SFaceRec,MongoDBRepo,ChromaDBStore,S3Storage,Config,Logger,MongoUserRepo infrastructure
class MongoDBServer,ChromaDBServer,FileStorage,ONNXModel external class MongoDBServer,ChromaDBServer,S3Bucket,ONNXModel,RedisOrMongo external
class RabbitMQ,FaceWorkerPool scalability
``` ```
## Architecture Overview ## Architecture Overview

@ -8,18 +8,21 @@ sequenceDiagram
participant GradioUI as Gradio Interface participant GradioUI as Gradio Interface
participant RegisterUC as RegisterFaceUseCase participant RegisterUC as RegisterFaceUseCase
participant UserRepo as MongoDBUserRepository 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 Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer participant Recognizer as SFaceRecognizer
participant FaceRepo as MongoDBFaceRepository participant FaceRepo as MongoDBFaceRepository
participant VectorStore as ChromaDBVectorStore participant VectorStore as ChromaDBVectorStore
participant FileStorage as FileSystemStorage
participant MongoDB as MongoDB Database participant MongoDB as MongoDB Database
participant ChromaDB as ChromaDB Vector DB participant ChromaDB as ChromaDB Vector DB
User->>GradioUI: Upload images + username User->>GradioUI: Upload images + username
GradioUI->>RegisterUC: execute(username, images) GradioUI->>RegisterUC: execute(username, images)
RegisterUC->>UserRepo: get_user_by_name(username) RegisterUC->>UserRepo: get_user_by_name(username)
UserRepo->>MongoDB: Query user by name UserRepo->>MongoDB: Query user by name
MongoDB-->>UserRepo: User data or null MongoDB-->>UserRepo: User data or null
@ -31,60 +34,53 @@ sequenceDiagram
MongoDB-->>UserRepo: User ID MongoDB-->>UserRepo: User ID
UserRepo-->>RegisterUC: User ID UserRepo-->>RegisterUC: User ID
end end
loop For each image loop For each image
RegisterUC->>FaceService: register_face(user_id, image) RegisterUC->>S3: put_object(image)
S3-->>RegisterUC: s3_uri
FaceService->>Detector: detect_faces(image)
Detector-->>FaceService: List of detected faces RegisterUC->>TaskPub: publish_register_task(user_id, s3_uri)
TaskPub->>MQ: enqueue(task)
alt No faces detected end
FaceService-->>RegisterUC: null
else Face detected RegisterUC->>StatusRepo: wait/poll for task_ids status
FaceService->>Detector: calculate_quality_score(best_face) StatusRepo-->>RegisterUC: Completed/Failed + results
Detector-->>FaceService: Quality score
alt All tasks completed
alt Quality too low RegisterUC->>StatusRepo: get_mean_embedding(user_id) / or compute later
FaceService-->>RegisterUC: null RegisterUC-->>GradioUI: Success message + stats
else Quality acceptable else Some tasks failed
FaceService->>Detector: align_face(image, landmarks) RegisterUC-->>GradioUI: Partial success + failed items
Detector-->>FaceService: Aligned face image end
GradioUI-->>User: Registration result (async aware)
FaceService->>Recognizer: extract_embedding(aligned_face)
Recognizer-->>FaceService: Face embedding %% Worker side
loop Worker Pool
FaceService->>FileStorage: save_image(aligned_face, user_id) MQ-->>Worker: task(user_id, s3_uri)
FileStorage-->>FaceService: Image path Worker->>S3: get_object(s3_uri)
Worker->>Detector: detect_faces(image)
FaceService->>FaceRepo: save(face_entity) Detector-->>Worker: faces
FaceRepo->>MongoDB: Insert face record
MongoDB-->>FaceRepo: Success alt No faces or low quality
FaceRepo-->>FaceService: Success Worker->>StatusRepo: update(task_id, failed_reason)
else Face OK
FaceService->>VectorStore: add(face_id, embedding, metadata) Worker->>Detector: align_face(image, landmarks)
VectorStore->>ChromaDB: Store embedding vector Detector-->>Worker: aligned_face
ChromaDB-->>VectorStore: Success
VectorStore-->>FaceService: Success Worker->>Recognizer: extract_embedding(aligned_face)
Recognizer-->>Worker: embedding
FaceService-->>RegisterUC: Face ID
end 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
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 ## 2. Face Verification Flow
@ -95,7 +91,11 @@ sequenceDiagram
participant GradioUI as Gradio Interface participant GradioUI as Gradio Interface
participant VerifyUC as VerifyFaceUseCase participant VerifyUC as VerifyFaceUseCase
participant UserRepo as MongoDBUserRepository 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 Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer participant Recognizer as SFaceRecognizer
participant FaceRepo as MongoDBFaceRepository participant FaceRepo as MongoDBFaceRepository
@ -103,50 +103,53 @@ sequenceDiagram
User->>GradioUI: Upload image + username User->>GradioUI: Upload image + username
GradioUI->>VerifyUC: execute(username, image) GradioUI->>VerifyUC: execute(username, image)
VerifyUC->>UserRepo: get_user_by_name(username) VerifyUC->>UserRepo: get_user_by_name(username)
UserRepo->>MongoDB: Query user by name UserRepo->>MongoDB: Query user by name
MongoDB-->>UserRepo: User data or null MongoDB-->>UserRepo: User data or null
UserRepo-->>VerifyUC: User entity or null UserRepo-->>VerifyUC: User entity or null
alt User not found alt User not found
VerifyUC-->>GradioUI: VerificationResult(false, 0.0) VerifyUC-->>GradioUI: VerificationResult(false, 0.0)
GradioUI-->>User: result
else User found else User found
VerifyUC->>FaceService: verify_face(user_id, image) VerifyUC->>S3: put_object(image)
S3-->>VerifyUC: s3_uri
FaceService->>Detector: detect_faces(image)
Detector-->>FaceService: List of detected faces VerifyUC->>TaskPub: publish_verify_task(user_id, s3_uri)
TaskPub->>MQ: enqueue(task)
alt No faces detected VerifyUC->>StatusRepo: wait/poll task_id
FaceService-->>VerifyUC: (false, 0.0) StatusRepo-->>VerifyUC: (is_verified, score)
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-->>GradioUI: VerificationResult 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 end
GradioUI-->>User: Verification result
``` ```
## 3. Face Identification Flow ## 3. Face Identification Flow
@ -156,109 +159,124 @@ sequenceDiagram
participant User participant User
participant GradioUI as Gradio Interface participant GradioUI as Gradio Interface
participant IdentifyUC as IdentifyFaceUseCase participant IdentifyUC as IdentifyFaceUseCase
participant UserRepo as MongoDBUserRepository participant S3 as S3ObjectStorage
participant FaceService as FaceRecognitionService participant TaskPub as TaskPublisher
participant MQ as RabbitMQ
participant StatusRepo as TaskStatusRepository
participant Worker as FaceWorker
participant Detector as RetinaFaceDetector participant Detector as RetinaFaceDetector
participant Recognizer as SFaceRecognizer participant Recognizer as SFaceRecognizer
participant VectorStore as ChromaDBVectorStore participant VectorStore as ChromaDBVectorStore
participant ChromaDB as ChromaDB Vector DB participant ChromaDB as ChromaDB Vector DB
participant UserRepo as MongoDBUserRepository
participant MongoDB as MongoDB Database participant MongoDB as MongoDB Database
User->>GradioUI: Upload image User->>GradioUI: Upload image
GradioUI->>IdentifyUC: execute(image) GradioUI->>IdentifyUC: execute(image)
IdentifyUC->>FaceService: identify_face(image) IdentifyUC->>S3: put_object(image)
S3-->>IdentifyUC: s3_uri
FaceService->>Detector: detect_faces(image)
Detector-->>FaceService: List of detected faces IdentifyUC->>TaskPub: publish_identify_task(s3_uri, top_k=10)
TaskPub->>MQ: enqueue(task)
alt No faces detected
FaceService-->>IdentifyUC: (null, 0.0, []) IdentifyUC->>StatusRepo: wait/poll task_id
else Face detected StatusRepo-->>IdentifyUC: (best_user_id, confidence, candidate_user_ids)
FaceService->>Detector: align_face(image, landmarks)
Detector-->>FaceService: Aligned face image loop For each candidate_user_id
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->>UserRepo: get_by_id(user_id) IdentifyUC->>UserRepo: get_by_id(user_id)
UserRepo->>MongoDB: Query user by ID UserRepo->>MongoDB: query
MongoDB-->>UserRepo: User data MongoDB-->>UserRepo: user data
UserRepo-->>IdentifyUC: User entity UserRepo-->>IdentifyUC: User entity
end 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 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 ## 4. System Initialization Flow
```mermaid ```mermaid
sequenceDiagram sequenceDiagram
participant Main as main.py participant Main as main.py (API)
participant Config as Settings participant Config as Settings
participant MongoDB as MongoDBFaceRepository participant MongoDBRepo as MongoDBFaceRepository
participant MongoUserRepo as MongoDBUserRepository
participant ChromaDB as ChromaDBVectorStore participant ChromaDB as ChromaDBVectorStore
participant FileStorage as FileSystemStorage participant S3 as S3ObjectStorage
participant Detector as RetinaFaceDetector participant Rabbit as RabbitMQ
participant Recognizer as SFaceRecognizer participant StatusRepo as TaskStatusRepository
participant FaceService as FaceRecognitionService participant Publisher as TaskPublisher
participant UseCases as Use Cases
participant GradioApp as Gradio Interface 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 Main->>Config: Load configuration
Config-->>Main: Settings object Config-->>Main: Settings object
Main->>MongoDB: Initialize with MongoDB URL Main->>MongoDBRepo: Initialize with Mongo URL
MongoDB-->>Main: Repository instance Main->>MongoUserRepo: Initialize with Mongo URL
Main->>ChromaDB: Initialize with host/port
Main->>ChromaDB: Initialize with Chroma host/port Main->>S3: Initialize with bucket/creds
ChromaDB-->>Main: Vector store instance Main->>Rabbit: Connect/create queues
Main->>StatusRepo: Initialize (Redis/Mongo)
Main->>FileStorage: Initialize with upload directory Main->>Publisher: Initialize with Rabbit
FileStorage-->>Main: File storage instance Main->>GradioApp: create_gradio_interface(use_cases, publisher, status_repo)
Main->>GradioApp: launch(server_name, port)
Main->>Detector: Initialize RetinaFace
note over Detector: Load ONNX models, prepare ctx %% Worker init (can be on separate machines)
Detector-->>Main: Detector instance WorkerMain->>WConfig: Load configuration
WConfig-->>WorkerMain: Settings
Main->>Recognizer: Initialize SFace
note over Recognizer: Download/load SFace ONNX model WorkerMain->>WRabbit: Connect/subscribe queues
Recognizer-->>Main: Recognizer instance WorkerMain->>WStatusRepo: Initialize
WorkerMain->>WDetector: Initialize RetinaFace
Main->>FaceService: Initialize with dependencies note over WDetector: Load ONNX models, prepare ctx
FaceService-->>Main: Service instance WorkerMain->>WRecognizer: Initialize SFace
note over WRecognizer: Load/Download ONNX model
Main->>UseCases: Initialize use cases with service WorkerMain->>WFaceRepo: Initialize with Mongo URL
UseCases-->>Main: Use case instances WorkerMain->>WVector: Initialize with Chroma host/port
WorkerMain->>WS3: Initialize with bucket/creds
Main->>GradioApp: create_gradio_interface(use_cases) WorkerMain->>WFaceService: Initialize with dependencies
GradioApp-->>Main: Gradio app instance WorkerMain->>WPool: Start consuming tasks
Main->>GradioApp: launch(server_name, server_port)
note over GradioApp: Start web server on port 7860
GradioApp-->>Main: Server running
``` ```
## Flow Descriptions ## Flow Descriptions

Loading…
Cancel
Save