Spaces:
Sleeping
Sleeping
File size: 2,047 Bytes
13c1ff0 d56dfe8 13c1ff0 d56dfe8 13c1ff0 d56dfe8 13c1ff0 d56dfe8 13c1ff0 d56dfe8 13c1ff0 d56dfe8 13c1ff0 d64d2a2 d56dfe8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from PIL import Image
from ultralytics import YOLO
import io
import base64
import torch
app = FastAPI()
# Carica il modello all'avvio (singleton per efficienza)
model = YOLO("YoloV8-FaceDetection.pt") # Sostituisci con "yolov8n-face.pt" se disponibile
# Modello Pydantic per validare l'input Base64
class ImageRequest(BaseModel):
image_base64: str
def preprocess_image(image: Image.Image, size=(320, 320)):
"""Ridimensiona l'immagine per velocizzare l'inferenza"""
img = image.convert("RGB")
img = img.resize(size, Image.LANCZOS) # 320x320 è veloce su CPU
return img
@app.post("/detect_single_face")
async def detect_single_face(request: ImageRequest):
try:
# Decodifica la stringa Base64
image_data = base64.b64decode(request.image_base64)
image = Image.open(io.BytesIO(image_data))
image = preprocess_image(image)
# Esegui l'inferenza con YOLOv8
results = model(image)
# Conta i volti (classe "person" per yolov8n, o "face" se usi modello specifico)
boxes = results[0].boxes
face_count = 0
for box in boxes:
# Se usi yolov8n, filtra per classe "person" (class_id 0 in COCO)
# Se usi yolov8n-face, conta direttamente tutte le detection
if int(box.cls) == 0: # "person" in yolov8n
face_count += 1
# Logica di risposta
if face_count == 1:
return {"has_single_face": True}
elif face_count > 1:
return {"has_single_face": False, "face_count": face_count}
else:
return {"has_single_face": False}
except Exception as e:
# In caso di errore (es. Base64 non valido), restituisci False
return {"has_single_face": False, "error": str(e), "debug": request.image_base64}
# Avvio del server (Hugging Face lo gestisce automaticamente)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860) |