исправлена работа gradio app зависания, установлен AdminVector для доступа к ChromaDB, исправлена ошибка размера векторов из-за которой лицо не регестрировалось в vector db

master
Artem-Darius Weber 4 months ago
parent ed5eecbd38
commit 3443832888

@ -17,7 +17,7 @@ services:
- face_recognition_net
chromadb:
image: chromadb/chroma:latest
image: chromadb/chroma:0.4.15
container_name: face_recognition_chroma
restart: always
ports:
@ -38,7 +38,7 @@ services:
container_name: face_recognition_app
restart: always
ports:
- "7860:7860"
- "8080:8080"
volumes:
- ./data:/app/data
- ./models:/app/models
@ -62,9 +62,51 @@ services:
count: 1
capabilities: [gpu]
postgres:
image: postgres:15
container_name: vectoradmin_postgres
restart: unless-stopped
environment:
POSTGRES_USER: vectoradmin
POSTGRES_PASSWORD: "your-db-password"
POSTGRES_DB: vdbms
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- face_recognition_net
vector-admin:
image: mintplexlabs/vectoradmin:latest
container_name: vectoradmin_ui
restart: unless-stopped
ports:
- "3001:3001"
depends_on:
- postgres
- chromadb
environment:
# Порт, на котором слушает UI
SERVER_PORT: 3001
# Секреты для JWT и Inngest
JWT_SECRET: "your-jwt-secret"
INNGEST_EVENT_KEY: "background_workers"
INNGEST_SIGNING_KEY: "your-inngest-signing-key"
INNGEST_LANDING_PAGE: "true"
# База данных для метаданных VectorAdmin
DATABASE_CONNECTION_STRING: "postgresql://vectoradmin:your-db-password@postgres:5432/vdbms"
# Подключение к ChromaDB (основное хранилище векторов)
VECTORS_PROVIDER_URL: "http://chromadb:8000"
VECTORS_PROVIDER_TYPE: "chroma"
# Автоматическая настройка администратора
SYS_EMAIL: "admin@vectoradmin.com"
SYS_PASSWORD: "admin123"
networks:
- face_recognition_net
volumes:
mongo_data:
chroma_data:
pgdata:
networks:
face_recognition_net:

@ -1,4 +1,9 @@
from pathlib import Path
import warnings
# Suppress numpy deprecation warnings from InsightFace
warnings.filterwarnings("ignore", message=".*rcond parameter will change.*")
warnings.filterwarnings("ignore", category=FutureWarning, module="insightface")
import gradio as gr
import numpy as np
from typing import Optional, Tuple, List
@ -50,6 +55,19 @@ async def initialize_app():
identify_use_case=identify_use_case
)
async def main():
app = await initialize_app()
app.launch(
server_name="0.0.0.0",
server_port=8080,
share=False,
debug=True,
# enable_queue=False,
show_error=True,
quiet=False,
prevent_thread_lock=False,
max_threads=40
)
if __name__ == "__main__":
app = asyncio.run(initialize_app())
app.launch(server_name="0.0.0.0", server_port=7860)
asyncio.run(main())

@ -11,7 +11,7 @@ class Settings(BaseSettings):
QUALITY_THRESHOLD: float = 0.7
VERIFICATION_THRESHOLD: float = 0.8
IDENTIFICATION_THRESHOLD: float = 0.75
IDENTIFICATION_THRESHOLD: float = 0.65
MAX_FACES_PER_USER: int = 10

@ -11,7 +11,24 @@ class RetinaFaceDetector:
def __init__(self):
detector_logger.info("Initializing RetinaFace detector")
try:
self.app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
# Import onnxruntime to check available providers
import onnxruntime as ort
# Check available providers and configure accordingly
available_providers = ort.get_available_providers()
providers = []
if 'CUDAExecutionProvider' in available_providers:
providers.append('CUDAExecutionProvider')
detector_logger.info("CUDA provider available for face detection")
elif 'CPUExecutionProvider' in available_providers:
providers.append('CPUExecutionProvider')
detector_logger.info("Using CPU provider for face detection")
else:
providers = available_providers
detector_logger.warning(f"Using available providers: {available_providers}")
self.app = FaceAnalysis(providers=providers)
self.app.prepare(ctx_id=0, det_size=(640, 640))
detector_logger.info("RetinaFace detector initialized successfully",
providers=self.app.models.keys() if hasattr(self.app, 'models') else "unknown")

@ -13,9 +13,24 @@ class SFaceRecognizer:
recognizer_logger.info("Initializing SFace recognizer")
try:
self.model_path = self._download_model()
# Check available providers and configure accordingly
available_providers = ort.get_available_providers()
providers = []
if 'CUDAExecutionProvider' in available_providers:
providers.append('CUDAExecutionProvider')
recognizer_logger.info("CUDA provider available for inference")
elif 'CPUExecutionProvider' in available_providers:
providers.append('CPUExecutionProvider')
recognizer_logger.info("Using CPU provider for inference")
else:
providers = available_providers
recognizer_logger.warning(f"Using available providers: {available_providers}")
self.session = ort.InferenceSession(
self.model_path,
providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
providers=providers
)
self.input_name = self.session.get_inputs()[0].name
self.output_name = self.session.get_outputs()[0].name

@ -23,12 +23,17 @@ class ChromaDBVectorStore(VectorStore):
max_retries = 30
for i in range(max_retries):
try:
response = requests.get(f"http://{host}:{port}/api/v1/heartbeat")
if response.status_code == 200:
# Try v2 API first, then fallback to basic connection test
try:
response = requests.get(f"http://{host}:{port}/api/v1/version")
except:
response = requests.get(f"http://{host}:{port}")
if response.status_code in [200, 404]: # 404 is OK, means server is responding
vector_store_logger.info("ChromaDB is ready!")
break
except Exception as e:
vector_store_logger.debug(f"ChromaDB heartbeat check failed (attempt {i+1})", error=e)
vector_store_logger.debug(f"ChromaDB connection check failed (attempt {i+1})", error=e)
pass
if i == max_retries - 1:
vector_store_logger.warning("ChromaDB not responding, attempting to connect anyway...")
@ -41,7 +46,10 @@ class ChromaDBVectorStore(VectorStore):
try:
vector_store_logger.debug("Trying direct ChromaDB connection...")
self.client = chromadb.HttpClient(host=host, port=port)
self.collection = self.client.get_or_create_collection(name="face_embeddings")
self.collection = self.client.get_or_create_collection(
name="face_embeddings",
metadata={"hnsw:space": "cosine"}
)
vector_store_logger.info("Direct ChromaDB connection successful!")
connection_successful = True
except Exception as e:
@ -53,7 +61,10 @@ class ChromaDBVectorStore(VectorStore):
vector_store_logger.debug("Trying ChromaDB connection with settings...")
settings = chromadb.config.Settings(allow_reset=True)
self.client = chromadb.HttpClient(host=host, port=port, settings=settings)
self.collection = self.client.get_or_create_collection(name="face_embeddings")
self.collection = self.client.get_or_create_collection(
name="face_embeddings",
metadata={"hnsw:space": "cosine"}
)
vector_store_logger.info("ChromaDB connection with settings successful!")
connection_successful = True
except Exception as e:
@ -65,7 +76,10 @@ class ChromaDBVectorStore(VectorStore):
vector_store_logger.debug("Trying persistent client fallback...")
import tempfile
self.client = chromadb.PersistentClient(path=tempfile.mkdtemp())
self.collection = self.client.get_or_create_collection(name="face_embeddings")
self.collection = self.client.get_or_create_collection(
name="face_embeddings",
metadata={"hnsw:space": "cosine"}
)
vector_store_logger.warning("Using persistent client fallback!")
connection_successful = True
except Exception as e:
@ -146,6 +160,8 @@ class ChromaDBVectorStore(VectorStore):
face_id = results['ids'][0][i]
distance = results['distances'][0][i]
metadata = results['metadatas'][0][i]
# For cosine distance, similarity = 1 - distance
# Cosine distance ranges from 0 (identical) to 2 (opposite)
similarity = 1 - distance
similar_faces.append((face_id, similarity, metadata))

Loading…
Cancel
Save