File size: 5,275 Bytes
3e04925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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 = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FastAPI con Imagen de Fondo</title>
    <style>
        body {
            background-image: url('static/background.png'); /* Ruta a tu imagen de fondo en la carpeta 'static' */
            background-size: cover;
            background-repeat: no-repeat;
            background-attachment: fixed;
            font-family: Arial, sans-serif;
            color: #333;
            margin: 0;
            padding: 0;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background-color: rgba(255, 255, 255, 0.8); /* Fondo semi-transparente para mejor legibilidad */
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>FastAPI con Imagen de Fondo</h1>
        <p>Ejemplo de una aplicación FastAPI con una imagen de fondo.</p>
        <form id="uploadForm" action="/upload/" method="post" enctype="multipart/form-data" onsubmit="uploadImage(event)">
            <input type="file" name="image" accept="image/*" required>
            <button type="submit">Subir Imagen</button>
        </form>
    </div>
    <script>
        async function uploadImage(event) {
            event.preventDefault();  // Evita el envío tradicional del formulario
            const formData = new FormData();
            formData.append('image', document.querySelector('input[name="image"]').files[0]);
            try {
                const response = await fetch('/recognize-face/', {
                    method: 'POST',
                    body: formData
                });
                if (!response.ok) {
                    throw new Error('Error al enviar la imagen');
                }
                const result = await response.json();
                console.log(result);
            } catch (error) {
                console.error('Error:', error);
            }
        }
     </script>
</body>
</html>
"""

# 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)