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

Añadir herramienta de diagnóstico para la detección facial

Browse files
diagnostico_config.yaml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ title: Diagnóstico de Detección Facial
2
+ emoji: 🔍
3
+ colorFrom: blue
4
+ colorTo: indigo
5
+ sdk: streamlit
6
+ sdk_version: 1.43.2
7
+ app_file: diagnostico_huggingface.py
8
+ pinned: false
9
+ license: mit
diagnostico_huggingface.py ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import cv2
3
+ import numpy as np
4
+ import os
5
+ import base64
6
+ from PIL import Image
7
+ import io
8
+
9
+ def main():
10
+ st.title("Diagnóstico de Detección Facial")
11
+ st.write("Esta herramienta ayuda a diagnosticar problemas con la detección de rostros en Hugging Face.")
12
+
13
+ # Verificar archivos de modelo
14
+ st.subheader("1. Verificación de archivos de modelo")
15
+ model_files = [
16
+ "deploy.prototxt.txt",
17
+ "res10_300x300_ssd_iter_140000.caffemodel"
18
+ ]
19
+
20
+ missing_files = []
21
+ for file in model_files:
22
+ if os.path.exists(file):
23
+ st.success(f"✅ Archivo encontrado: {file}")
24
+ else:
25
+ st.error(f"❌ Archivo NO encontrado: {file}")
26
+ missing_files.append(file)
27
+
28
+ if missing_files:
29
+ st.warning("Intentando descargar archivos faltantes...")
30
+ try:
31
+ import download_models
32
+ download_models.main()
33
+ st.success("Descarga completada. Verificando archivos nuevamente...")
34
+
35
+ # Verificar nuevamente
36
+ still_missing = []
37
+ for file in missing_files:
38
+ if os.path.exists(file):
39
+ st.success(f"✅ Archivo ahora encontrado: {file}")
40
+ else:
41
+ st.error(f"❌ Archivo sigue faltando: {file}")
42
+ still_missing.append(file)
43
+
44
+ if still_missing:
45
+ st.error("No se pudieron descargar todos los archivos. La detección facial podría fallar.")
46
+ except Exception as e:
47
+ st.error(f"Error al descargar modelos: {e}")
48
+
49
+ # Cargar modelo de detección facial
50
+ st.subheader("2. Carga del modelo DNN")
51
+ try:
52
+ modelFile = "res10_300x300_ssd_iter_140000.caffemodel"
53
+ configFile = "deploy.prototxt.txt"
54
+ net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
55
+ st.success(f"✅ Modelo cargado correctamente. Tipo: {type(net)}")
56
+ except Exception as e:
57
+ st.error(f"❌ Error al cargar el modelo: {e}")
58
+ st.stop()
59
+
60
+ # Crear imagen de prueba
61
+ st.subheader("3. Prueba de detección con imagen de ejemplo")
62
+
63
+ # Opción 1: Usar una imagen predeterminada
64
+ example_image = None
65
+ col1, col2 = st.columns(2)
66
+
67
+ with col1:
68
+ st.write("Opción 1: Usar imagen de prueba")
69
+ use_example = st.checkbox("Usar imagen de ejemplo", value=True)
70
+
71
+ with col2:
72
+ st.write("Opción 2: Subir una imagen")
73
+ uploaded_file = st.file_uploader("Cargar imagen", type=["jpg", "jpeg", "png"])
74
+
75
+ if use_example:
76
+ # Crear una imagen de prueba con un óvalo como rostro
77
+ example_image = np.zeros((400, 400, 3), dtype=np.uint8)
78
+ # Dibujar un óvalo que simule un rostro
79
+ cv2.ellipse(example_image, (200, 200), (100, 140), 0, 0, 360, (200, 200, 200), -1)
80
+ # Dibujar ojos
81
+ cv2.circle(example_image, (150, 150), 15, (255, 255, 255), -1)
82
+ cv2.circle(example_image, (250, 150), 15, (255, 255, 255), -1)
83
+ # Dibujar boca
84
+ cv2.ellipse(example_image, (200, 250), (50, 20), 0, 0, 360, (150, 150, 150), -1)
85
+ st.image(example_image, caption="Imagen de ejemplo generada", channels="BGR")
86
+ test_image = example_image
87
+ elif uploaded_file is not None:
88
+ file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
89
+ test_image = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
90
+ st.image(test_image, caption="Imagen cargada", channels="BGR")
91
+ else:
92
+ st.warning("Por favor, usa la imagen de ejemplo o sube una imagen para continuar.")
93
+ st.stop()
94
+
95
+ # Ejecutar detección
96
+ st.subheader("4. Ejecutando detección facial")
97
+
98
+ # Crear un blob de la imagen
99
+ try:
100
+ h, w = test_image.shape[:2]
101
+ st.write(f"Dimensiones de la imagen: {w}x{h}")
102
+
103
+ blob = cv2.dnn.blobFromImage(cv2.resize(test_image, (300, 300)), 1.0,
104
+ (300, 300), (104.0, 177.0, 123.0))
105
+ st.success(f"✅ Blob creado correctamente. Forma: {blob.shape}")
106
+ except Exception as e:
107
+ st.error(f"❌ Error al crear blob: {e}")
108
+ st.stop()
109
+
110
+ # Realizar detección
111
+ try:
112
+ net.setInput(blob)
113
+ detections = net.forward()
114
+ st.success(f"✅ Detección realizada correctamente. Forma de detecciones: {detections.shape}")
115
+ except Exception as e:
116
+ st.error(f"❌ Error al realizar detección: {e}")
117
+ st.stop()
118
+
119
+ # Procesar resultados
120
+ st.subheader("5. Procesando resultados")
121
+
122
+ # Probando diferentes umbrales
123
+ threshold_values = [0.1, 0.2, 0.3, 0.4, 0.5]
124
+
125
+ for conf_threshold in threshold_values:
126
+ st.write(f"### Umbral: {conf_threshold}")
127
+
128
+ # Procesar detecciones
129
+ bboxes = []
130
+ frame_h, frame_w = test_image.shape[:2]
131
+ detection_count = 0
132
+
133
+ for i in range(detections.shape[2]):
134
+ confidence = detections[0, 0, i, 2]
135
+
136
+ if confidence > conf_threshold:
137
+ detection_count += 1
138
+ box = detections[0, 0, i, 3:7] * np.array([frame_w, frame_h, frame_w, frame_h])
139
+ x1, y1, x2, y2 = box.astype("int")
140
+
141
+ # Asegurar que las coordenadas estén dentro de los límites
142
+ x1, y1 = max(0, x1), max(0, y1)
143
+ x2, y2 = min(frame_w, x2), min(frame_h, y2)
144
+
145
+ # Verificar validez de la caja
146
+ width, height = x2 - x1, y2 - y1
147
+ if width <= 0 or height <= 0:
148
+ continue
149
+
150
+ bboxes.append([x1, y1, x2, y2, confidence])
151
+
152
+ # Dibujar resultados
153
+ result_image = test_image.copy()
154
+ for bbox in bboxes:
155
+ x1, y1, x2, y2, confidence = bbox
156
+ # Dibujar rectángulo verde grueso para mejor visibilidad
157
+ cv2.rectangle(result_image, (x1, y1), (x2, y2), (0, 255, 0), 3)
158
+ # Añadir texto con confianza
159
+ cv2.putText(result_image, f"{confidence:.2f}", (x1, y1-10),
160
+ cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
161
+
162
+ col1, col2 = st.columns(2)
163
+
164
+ with col1:
165
+ st.write(f"Detecciones encontradas: {len(bboxes)}")
166
+ st.write(f"Coordenadas de cajas: {bboxes}")
167
+
168
+ with col2:
169
+ # Convertir a RGB para mostrar
170
+ rgb_result = cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)
171
+ st.image(rgb_result, caption=f"Resultado con umbral {conf_threshold}", use_column_width=True)
172
+
173
+ # Añadir botón de descarga
174
+ if len(bboxes) > 0:
175
+ # Convertir imagen a bytes para descarga
176
+ pil_img = Image.fromarray(rgb_result)
177
+ buf = io.BytesIO()
178
+ pil_img.save(buf, format="PNG")
179
+ byte_im = buf.getvalue()
180
+
181
+ # Crear link de descarga
182
+ b64 = base64.b64encode(byte_im).decode()
183
+ href = f'<a href="data:image/png;base64,{b64}" download="deteccion_umbral_{conf_threshold}.png">Descargar imagen</a>'
184
+ st.markdown(href, unsafe_allow_html=True)
185
+
186
+ # Mostrar instrucciones finales
187
+ st.subheader("Conclusiones")
188
+ st.write("""
189
+ Si no ves cajas verdes en ninguno de los umbrales:
190
+ 1. Puede que el modelo no esté detectando correctamente los rostros
191
+ 2. Verifica que los archivos del modelo estén correctamente cargados
192
+ 3. Prueba con una imagen que contenga rostros más claros
193
+
194
+ Si ves cajas verdes en las imágenes de ejemplo pero no en tu aplicación principal:
195
+ 1. El problema podría estar en la visualización, no en la detección
196
+ 2. Revisa cómo se procesan y muestran las imágenes en la aplicación principal
197
+ """)
198
+
199
+ if __name__ == "__main__":
200
+ main()