File size: 2,981 Bytes
8fecf79
 
 
 
 
 
 
61bf480
 
9cd64d1
 
fa482a9
 
 
 
2dfc9b8
 
8fecf79
 
 
9cd64d1
8fecf79
 
 
 
 
a08672f
 
 
 
 
fa482a9
 
 
8fecf79
fa482a9
8fecf79
61bf480
fa482a9
 
 
 
 
 
 
61bf480
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a26804b
 
 
 
61bf480
f20940d
fa482a9
 
 
df7c7e2
f20940d
fa482a9
f20940d
 
fa482a9
61bf480
 
 
f20940d
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
import gradio as gr
import cv2
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
import os

# Definir rutas
code_path = '/app'  # Usando ruta del contenedor Docker
haarcascade_path = 'haarcascade_frontalface_default.xml'  # Usamos ruta relativa

# Rutas de los modelos
modelo_mejor_path = os.path.join(code_path, 'modelo_estimacion_edad_mejor.h5')
modelo_final_path = os.path.join(code_path, 'modelo_estimacion_edad_final.h5')

# Imprimir la ruta para verificar
print(f"Ruta al archivo Haar Cascade: {haarcascade_path}")

# Verificar si el archivo Haar Cascade existe
if not os.path.exists(haarcascade_path):
    print(f'No se encontr贸 el archivo Haar Cascade en {haarcascade_path}. Aseg煤rate de subirlo correctamente en tu Space.')
    exit()

# Cargar el clasificador Haar Cascade para detecci贸n de rostros
face_cascade = cv2.CascadeClassifier(haarcascade_path)

# Verificar si Haar Cascade se carg贸 correctamente
if face_cascade.empty():
    print("Error al cargar el clasificador Haar Cascade.")
    exit()

# Cargar ambos modelos
modelo_mejor = load_model(modelo_mejor_path)
modelo_final = load_model(modelo_final_path)

print('Modelos cargados exitosamente.')

# Funci贸n para procesar la imagen y predecir la edad
def estimar_edad(imagen, modelo_seleccionado="mejor"):
    # Seleccionar el modelo
    if modelo_seleccionado == "mejor":
        modelo = modelo_mejor
    else:
        modelo = modelo_final

    # Convertir la imagen a escala de grises para la detecci贸n de rostros
    gray = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

    # Detectar rostros en la imagen
    rostros = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    edades = []

    for (x, y, w, h) in rostros:
        # Extraer la regi贸n del rostro
        rostro = imagen[y:y+h, x:x+w]

        # Preprocesar la imagen del rostro
        rostro_rgb = cv2.cvtColor(rostro, cv2.COLOR_BGR2RGB)
        rostro_resized = cv2.resize(rostro_rgb, (128, 128))
        rostro_preprocessed = preprocess_input(rostro_resized)
        rostro_expanded = np.expand_dims(rostro_preprocessed, axis=0)

        # Realizar la predicci贸n de edad
        edad_predicha = modelo.predict(rostro_expanded)[0][0]
        edad_predicha = round(edad_predicha, 2)

        edades.append(edad_predicha)

    if len(edades) > 0:
        return f"Edad estimada: {round(np.mean(edades), 2)} a帽os"
    else:
        return "No se detectaron rostros en la imagen."

# Crear la interfaz con Gradio (desactivando flagging)
iface = gr.Interface(
    fn=estimar_edad, 
    inputs=[
        gr.Image(type="numpy", label="Sube una imagen"),
        gr.Radio(choices=["mejor", "final"], label="Selecciona el modelo")  # Elegir modelo
    ], 
    outputs="text",
    flagging="never"  # Desactivar flagging para evitar la creaci贸n del directorio 'flagged'
)

# Lanzar la interfaz de Gradio
iface.launch()