Spaces:
Runtime error
Runtime error
| # api/extract.py | |
| from fastapi import APIRouter, File, UploadFile, Form, HTTPException, Header | |
| from services.face_service import get_face_service | |
| import config | |
| import logging | |
| import numpy as np | |
| router = APIRouter() | |
| face_service = get_face_service() | |
| logger = logging.getLogger(__name__) | |
| async def extract_embedding( | |
| x_api_key: str = Header(...), | |
| files: list[UploadFile] = File(...) | |
| ): | |
| if x_api_key != config.Config.API_KEY: | |
| raise HTTPException(status_code=401, detail="Invalid API key") | |
| try: | |
| if len(files) == 0: | |
| raise HTTPException(status_code=400, detail="Please provide at least 1 image") | |
| if len(files) > 10: | |
| raise HTTPException(status_code=400, detail="Maximum 10 images allowed") | |
| embeddings = [] | |
| for file in files: | |
| contents = await file.read() | |
| if len(contents) == 0: | |
| continue | |
| face_data, error = face_service.extract_face(contents) | |
| if face_data: | |
| embeddings.append(face_data['embedding']) | |
| if len(embeddings) == 0: | |
| return { | |
| "success": False, | |
| "message": "No valid faces detected", | |
| "embedding": None, | |
| "quality": 0 | |
| } | |
| avg_embedding = np.mean(embeddings, axis=0) | |
| avg_embedding = avg_embedding / np.linalg.norm(avg_embedding) | |
| return { | |
| "success": True, | |
| "message": f"Embedding extracted from {len(embeddings)} faces", | |
| "embedding": avg_embedding.tolist(), | |
| "quality": 0.95, | |
| "faces_detected": len(embeddings) | |
| } | |
| except HTTPException: | |
| raise | |
| except Exception as e: | |
| logger.error(f"Extract embedding error: {e}") | |
| raise HTTPException(status_code=500, detail=f"Extract failed: {str(e)}") |