App_python / app.py
GianmarcoJTA's picture
Update app.py
f20940d verified
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()