jarondon82 commited on
Commit
a4fde92
·
1 Parent(s): 6cbd157

Agregado modo de diagnostico facial al app.py

Browse files
Files changed (1) hide show
  1. app.py +136 -10
app.py CHANGED
@@ -20,14 +20,140 @@ try:
20
  except Exception as e:
21
  st.error(f"Error al comprobar/descargar modelos: {e}")
22
 
23
- try:
24
- # Importar la aplicación principal
25
- print("Starting Face Detection Application...")
26
- from streamlit_app import main
 
 
 
 
27
 
28
- # Main entry point
29
- if __name__ == "__main__":
30
- main()
31
- except Exception as e:
32
- st.error(f"Error al iniciar la aplicación: {e}")
33
- st.error("Por favor, revise los logs para más información.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  except Exception as e:
21
  st.error(f"Error al comprobar/descargar modelos: {e}")
22
 
23
+ # Modo diagnóstico
24
+ if 'modo_diagnostico' not in st.session_state:
25
+ st.session_state.modo_diagnostico = False
26
+
27
+ # Función para el modo de diagnóstico
28
+ def modo_diagnostico():
29
+ st.title("Diagnóstico de Detección Facial")
30
+ st.write("Esta herramienta ayuda a identificar problemas con la detección de rostros.")
31
 
32
+ # Verificar modelos
33
+ st.subheader("1. Verificación de archivos de modelo")
34
+ for archivo in model_files:
35
+ if os.path.exists(archivo):
36
+ st.success(f" Modelo encontrado: {archivo}")
37
+ else:
38
+ st.error(f"❌ Modelo NO encontrado: {archivo}")
39
+
40
+ # Probar carga del modelo
41
+ st.subheader("2. Prueba de carga del modelo")
42
+ try:
43
+ import cv2
44
+ import numpy as np
45
+ from PIL import Image
46
+ import io
47
+ import base64
48
+
49
+ modelFile = "res10_300x300_ssd_iter_140000.caffemodel"
50
+ configFile = "deploy.prototxt.txt"
51
+
52
+ net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
53
+ st.success(f"✅ Modelo cargado correctamente: {type(net)}")
54
+
55
+ # Crear imagen de prueba
56
+ st.subheader("3. Probar detección")
57
+
58
+ # Crear una imagen de prueba con un óvalo como rostro
59
+ example_image = np.zeros((400, 400, 3), dtype=np.uint8)
60
+ # Dibujar un óvalo que simule un rostro
61
+ cv2.ellipse(example_image, (200, 200), (100, 140), 0, 0, 360, (200, 200, 200), -1)
62
+ # Dibujar ojos
63
+ cv2.circle(example_image, (150, 150), 15, (255, 255, 255), -1)
64
+ cv2.circle(example_image, (250, 150), 15, (255, 255, 255), -1)
65
+ # Dibujar boca
66
+ cv2.ellipse(example_image, (200, 250), (50, 20), 0, 0, 360, (150, 150, 150), -1)
67
+
68
+ # Mostrar imagen de prueba
69
+ st.image(example_image, caption="Imagen de prueba", channels="BGR")
70
+
71
+ # Detectar rostros en la imagen de prueba
72
+ h, w = example_image.shape[:2]
73
+ blob = cv2.dnn.blobFromImage(cv2.resize(example_image, (300, 300)), 1.0,
74
+ (300, 300), (104.0, 177.0, 123.0))
75
+
76
+ net.setInput(blob)
77
+ detections = net.forward()
78
+
79
+ # Dibujar resultados con diferentes umbrales
80
+ umbral = st.slider("Umbral de confianza", 0.1, 0.9, 0.3, 0.1)
81
+
82
+ # Procesar detecciones
83
+ bboxes = []
84
+ frame_h, frame_w = example_image.shape[:2]
85
+
86
+ for i in range(detections.shape[2]):
87
+ confidence = detections[0, 0, i, 2]
88
+
89
+ if confidence > umbral:
90
+ box = detections[0, 0, i, 3:7] * np.array([frame_w, frame_h, frame_w, frame_h])
91
+ x1, y1, x2, y2 = box.astype("int")
92
+
93
+ # Asegurar coordenadas válidas
94
+ x1 = max(0, min(x1, frame_w - 1))
95
+ y1 = max(0, min(y1, frame_h - 1))
96
+ x2 = max(0, min(x2, frame_w - 1))
97
+ y2 = max(0, min(y2, frame_h - 1))
98
+
99
+ # Verificar validez de la caja
100
+ width, height = x2 - x1, y2 - y1
101
+ if width <= 0 or height <= 0:
102
+ continue
103
+
104
+ bboxes.append([x1, y1, x2, y2, confidence])
105
+
106
+ # Dibujar resultados
107
+ result_image = example_image.copy()
108
+ for bbox in bboxes:
109
+ x1, y1, x2, y2, confidence = bbox
110
+ # Dibujar rectángulo verde grueso
111
+ cv2.rectangle(result_image, (x1, y1), (x2, y2), (0, 255, 0), 3)
112
+ # Añadir texto con confianza
113
+ cv2.putText(result_image, f"{confidence:.2f}", (x1, y1-10),
114
+ cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
115
+
116
+ st.image(result_image, caption=f"Resultado con umbral {umbral}", channels="BGR")
117
+
118
+ # Mostrar estadísticas
119
+ st.subheader("Estadísticas de detección")
120
+ st.write(f"Detecciones encontradas: {len(bboxes)}")
121
+
122
+ if len(bboxes) > 0:
123
+ st.success("✅ La detección facial funciona correctamente")
124
+ else:
125
+ st.error("❌ No se detectaron rostros en la imagen de prueba")
126
+
127
+ # Diagnóstico
128
+ if len(bboxes) == 0:
129
+ st.subheader("Posibles problemas:")
130
+ st.write("""
131
+ 1. El modelo no se está cargando correctamente.
132
+ 2. El procesamiento de la imagen es incorrecto.
133
+ 3. El umbral de confianza es demasiado alto.
134
+ 4. Hay un problema con la visualizaci��n de los resultados.
135
+ """)
136
+
137
+ except Exception as e:
138
+ st.error(f"Error en el diagnóstico: {e}")
139
+
140
+ # Crear un sidebar con opciones
141
+ st.sidebar.title("Opciones")
142
+ modo = st.sidebar.radio("Seleccionar modo:", ["Aplicación principal", "Diagnóstico"])
143
+
144
+ if modo == "Diagnóstico":
145
+ # Ejecutar diagnóstico
146
+ modo_diagnostico()
147
+ else:
148
+ # Ejecutar aplicación principal
149
+ try:
150
+ # Importar la aplicación principal
151
+ print("Starting Face Detection Application...")
152
+ from streamlit_app import main
153
+
154
+ # Main entry point
155
+ if __name__ == "__main__":
156
+ main()
157
+ except Exception as e:
158
+ st.error(f"Error al iniciar la aplicación: {e}")
159
+ st.error("Por favor, revise los logs para más información.")