from fastapi import FastAPI, UploadFile, File, Request from fastapi.responses import JSONResponse from fastapi.responses import HTMLResponse from pydantic import BaseModel from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates import torch import cv2 from PIL import Image from model import Resnet50FER from config import Resnet50Config # Crear una instancia de FastAPI app = FastAPI() # Directorio donde se encuentran los archivos estáticos (como imágenes) STATIC_DIR = "static" # Montar la carpeta 'static' para servir archivos estáticos como imágenes app.mount("/static", StaticFiles(directory="static"), name="static") # Configurar los templates usando Jinja2 templates = Jinja2Templates(directory="templates") # Definir la configuración de tu modelo config = Resnet50Config( num_classes=10 # Ejemplo: número de clases para tu tarea específica ) # Definir el contenido HTML directamente en Python html_content = """ FastAPI con Imagen de Fondo

FastAPI con Imagen de Fondo

Ejemplo de una aplicación FastAPI con una imagen de fondo.

""" # Ruta para la página principal con imagen de fondo configurada desde Python @app.get("/", response_class=HTMLResponse) async def homepage(request: Request): return HTMLResponse(content=html_content) # Crear una instancia de tu modelo model = Resnet50FER(config) model.eval() # Asegúrate de que el modelo esté en modo evaluación # Clase para los datos de entrada esperados en la solicitud class Item(BaseModel): # Asumiendo que tu modelo espera imágenes como entrada image: UploadFile # Usamos UploadFile para manejar la carga de archivos # Endpoint para subir la imagen @app.post("/upload/") async def upload_image(image: UploadFile = File(...)): return {"filename": image.filename} # Endpoint para hacer predicciones @app.post("/predict/") def predict(item: Item): # Procesar la imagen recibida image_bytes = item.image.file.read() # Aquí deberías procesar la imagen y convertirla al formato adecuado para tu modelo # Por ahora, simplemente mostramos un mensaje de ejemplo return {"message": "Endpoint para predicciones con Resnet50FER"} # Endpoint para reconocimiento facial @app.post("/recognize-face/") async def recognize_face(image: UploadFile = File(...)): try: # Leer la imagen contents = await image.read() img = Image.open(BytesIO(contents)) # Aquí deberías realizar el reconocimiento facial usando tu modelo entrenado # Ejemplo básico: detectar rostros con OpenCV face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') gray = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) # Procesar resultados y devolver respuesta detected_faces = [{"x": int(x), "y": int(y), "w": int(w), "h": int(h)} for (x, y, w, h) in faces] return JSONResponse(content={"detected_faces": detected_faces}) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # Ejecutar la aplicación con Uvicorn if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)