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)