EP / app.py
alonb19's picture
Update app.py
a9eea25 verified
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import cv2
from PIL import Image
import numpy as np
from io import BytesIO
import requests
app = FastAPI()
class ImageRequest(BaseModel):
image_url: str
def buscar_existe(image_url):
try:
# Descargar la imagen desde la URL
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(image_url, headers=headers, timeout=30)
response.raise_for_status()
image = Image.open(BytesIO(response.content))
# Convertir a RGB si es necesario
if image.mode != 'RGB':
image = image.convert('RGB')
image = np.asarray(image)
existe = "NO"
print("Imagen shape: ", image.shape)
# Usar cascada de detecci贸n facial
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Convertir a escala de grises
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Detectar rostros
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE
)
if len(faces) > 0:
existe = "SI"
print(f"Se detectaron {len(faces)} rostro(s)")
else:
print("No se detectaron rostros")
return existe
except Exception as e:
print(f"Error procesando imagen: {str(e)}")
return "NO"
# Cambiar para aceptar JSON en el body
@app.post('/predict/')
async def predict_from_url(request: ImageRequest):
try:
print(f"Recibida URL: {request.image_url}")
prediction = buscar_existe(request.image_url)
return {"prediction": prediction}
except Exception as e:
print(f"Error en predict_from_url: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/")
async def root():
return {"message": "Servicio de detecci贸n de rostros funcionando"}
@app.get("/health")
async def health():
return {"status": "OK"}
# Ruta alternativa usando query parameter (por si acaso)
@app.get('/predict_get/')
async def predict_get(image_url: str):
try:
prediction = buscar_existe(image_url)
return {"prediction": prediction}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))