facetype / main.py
wyyadd's picture
fix: load model
0f1cdf3
import cv2
import numpy as np
import requests
import torch
from deepface import DeepFace
from fastapi import FastAPI, HTTPException
from model import MultiLabelClassifier, ensure_model_downloaded
app = FastAPI()
model_path = "data/classifier.pth"
ensure_model_downloaded(model_path)
model = MultiLabelClassifier(embedding_dim=4096, hidden_dim=1024)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.load_state_dict(torch.load(model_path, weights_only=True, map_location=device))
model.to(device).eval()
@app.get("/face-type")
def get_face_type(url: str):
try:
response = requests.get(url)
response.raise_for_status() # Raises HTTPError for bad responses
# Convert image data to numpy array in BGR format
img_array = np.frombuffer(response.content, dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=400, detail=f"Failed to download image from URL: {str(e)}")
pred_binary = get_pred_binary(img)
face_type = int(''.join(map(str, pred_binary)), 2)
return {"face_type": face_type}
def get_pred_binary(img: np.ndarray):
try:
embedding_objs = DeepFace.represent(
img_path=img,
model_name="VGG-Face")
except Exception as e:
raise HTTPException(status_code=500, detail="No face detected.")
ebd = torch.tensor(embedding_objs[0]['embedding'], dtype=torch.float32).to(device)
with torch.no_grad():
logits = model(ebd)
probs = torch.sigmoid(logits).cpu().numpy()
pred_binary = (probs > 0.5).astype(int)
return pred_binary