jarondon82 commited on
Commit
7b0cfb4
·
1 Parent(s): aa93265

Agregar scripts de prueba para diagnóstico de detección facial

Browse files
Files changed (2) hide show
  1. detect_face_test.py +197 -0
  2. direct_detection.py +94 -0
detect_face_test.py ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import time
4
+
5
+ def main():
6
+ """
7
+ Script para probar la detección de rostros con diferentes configuraciones
8
+ y visualizar claramente los resultados.
9
+ """
10
+ print("Iniciando prueba de detección facial...")
11
+
12
+ # Cargar el modelo DNN preentrenado para detección de rostros
13
+ print("Cargando modelo DNN para detección facial...")
14
+
15
+ # Usar el modelo Caffe
16
+ modelFile = "models/deploy.prototxt"
17
+ weightsFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"
18
+
19
+ try:
20
+ face_net = cv2.dnn.readNetFromCaffe(modelFile, weightsFile)
21
+ print("Modelo DNN cargado correctamente.")
22
+ except Exception as e:
23
+ print(f"Error al cargar el modelo DNN: {str(e)}")
24
+ print("Intentando usar detección Haar en su lugar...")
25
+ face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
26
+ if face_cascade.empty():
27
+ print("Error: No se pudo cargar el clasificador Haar.")
28
+ return
29
+ use_dnn = False
30
+ else:
31
+ use_dnn = True
32
+
33
+ # Iniciar la cámara
34
+ cap = cv2.VideoCapture(0)
35
+
36
+ if not cap.isOpened():
37
+ print("Error: No se pudo abrir la cámara.")
38
+ return
39
+
40
+ print("Cámara iniciada correctamente. Presione 'q' para salir, 's' para guardar una captura.")
41
+
42
+ # Contador de frames
43
+ frame_count = 0
44
+ start_time = time.time()
45
+
46
+ # Umbrales de confianza para probar
47
+ confidence_thresholds = [0.5, 0.3, 0.1]
48
+ current_threshold_index = 0
49
+ current_threshold = confidence_thresholds[current_threshold_index]
50
+
51
+ def detect_face_dnn(net, frame, conf_threshold=0.5):
52
+ # Preparar la imagen para la red (redimensionar a 300x300 y normalizar)
53
+ h, w = frame.shape[:2]
54
+ blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
55
+ (300, 300), (104.0, 177.0, 123.0))
56
+
57
+ # Pasar la imagen a través de la red
58
+ net.setInput(blob)
59
+ detections = net.forward()
60
+
61
+ # Procesar las detecciones
62
+ bboxes = []
63
+ for i in range(detections.shape[2]):
64
+ confidence = detections[0, 0, i, 2]
65
+
66
+ if confidence > conf_threshold:
67
+ # Obtener coordenadas de la caja delimitadora
68
+ box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
69
+ x1, y1, x2, y2 = box.astype("int")
70
+
71
+ # Asegurarse de que las coordenadas estén dentro de la imagen
72
+ x1, y1 = max(0, x1), max(0, y1)
73
+ x2, y2 = min(w, x2), min(h, y2)
74
+
75
+ # Añadir caja y confianza
76
+ bboxes.append([x1, y1, x2, y2, confidence])
77
+
78
+ return bboxes if bboxes else None
79
+
80
+ def detect_face_haar(face_cascade, frame, scale_factor=1.1):
81
+ # Convertir a escala de grises para la detección Haar
82
+ gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
83
+
84
+ # Detectar rostros
85
+ faces = face_cascade.detectMultiScale(
86
+ gray,
87
+ scaleFactor=scale_factor,
88
+ minNeighbors=5,
89
+ minSize=(30, 30),
90
+ flags=cv2.CASCADE_SCALE_IMAGE
91
+ )
92
+
93
+ if len(faces) == 0:
94
+ return None
95
+
96
+ # Convertir al mismo formato que el DNN
97
+ bboxes = []
98
+ for (x, y, w, h) in faces:
99
+ bboxes.append([x, y, x+w, y+h, 1.0]) # Confianza simulada de 1.0
100
+
101
+ return bboxes
102
+
103
+ while True:
104
+ # Leer un frame de la cámara
105
+ ret, frame = cap.read()
106
+
107
+ if not ret:
108
+ print("Error al capturar el frame.")
109
+ break
110
+
111
+ # Incrementar contador
112
+ frame_count += 1
113
+ elapsed = time.time() - start_time
114
+ fps = frame_count / elapsed if elapsed > 0 else 0
115
+
116
+ # Crear copia del frame para dibujar
117
+ display_frame = frame.copy()
118
+
119
+ # Detectar rostros según el método seleccionado
120
+ if use_dnn:
121
+ bboxes = detect_face_dnn(face_net, frame, current_threshold)
122
+ method_text = f"DNN (Conf: {current_threshold})"
123
+ else:
124
+ bboxes = detect_face_haar(face_cascade, frame)
125
+ method_text = "Haar Cascade"
126
+
127
+ # Dibujar los rostros detectados
128
+ if bboxes is not None:
129
+ for box in bboxes:
130
+ x1, y1, x2, y2 = int(box[0]), int(box[1]), int(box[2]), int(box[3])
131
+
132
+ # Dibujar rectángulo verde grueso
133
+ cv2.rectangle(display_frame, (x1, y1), (x2, y2), (0, 255, 0), 3)
134
+
135
+ # Mostrar confianza
136
+ if len(box) > 4:
137
+ conf = box[4]
138
+ cv2.putText(display_frame, f"Conf: {conf:.2f}", (x1, y1 - 10),
139
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
140
+
141
+ face_count = len(bboxes)
142
+ status = f"Detectados: {face_count}"
143
+ else:
144
+ status = "No se detectaron rostros"
145
+
146
+ # Dibujar información en pantalla
147
+ h, w = display_frame.shape[:2]
148
+
149
+ # Método de detección
150
+ cv2.putText(display_frame, f"Método: {method_text}", (10, 30),
151
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
152
+
153
+ # Estado de detección
154
+ cv2.putText(display_frame, status, (10, 70),
155
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
156
+
157
+ # FPS
158
+ cv2.putText(display_frame, f"FPS: {fps:.1f}", (10, h - 20),
159
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
160
+
161
+ # Rectángulo de prueba en la esquina superior derecha
162
+ cv2.rectangle(display_frame, (w-150, 50), (w-50, 150), (0, 0, 255), 3)
163
+ cv2.putText(display_frame, "TEST", (w-130, 40),
164
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
165
+
166
+ # Mostrar resultado
167
+ cv2.imshow("Prueba de Detección Facial", display_frame)
168
+
169
+ # Manejo de teclas
170
+ key = cv2.waitKey(1) & 0xFF
171
+
172
+ # Salir si se presiona 'q'
173
+ if key == ord('q'):
174
+ break
175
+ # Cambiar umbral si se presiona 't'
176
+ elif key == ord('t'):
177
+ current_threshold_index = (current_threshold_index + 1) % len(confidence_thresholds)
178
+ current_threshold = confidence_thresholds[current_threshold_index]
179
+ print(f"Umbral cambiado a: {current_threshold}")
180
+ # Guardar imagen si se presiona 's'
181
+ elif key == ord('s'):
182
+ timestamp = time.strftime("%Y%m%d-%H%M%S")
183
+ filename = f"face_detection_{timestamp}.jpg"
184
+ cv2.imwrite(filename, display_frame)
185
+ print(f"Imagen guardada como {filename}")
186
+
187
+ # Imprime estadísticas
188
+ print(f"Frames totales: {frame_count}")
189
+ print(f"Tiempo total: {elapsed:.2f} segundos")
190
+ print(f"FPS promedio: {fps:.1f}")
191
+
192
+ # Liberar recursos
193
+ cap.release()
194
+ cv2.destroyAllWindows()
195
+
196
+ if __name__ == "__main__":
197
+ main()
direct_detection.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import time
3
+
4
+ def main():
5
+ """
6
+ Script simple para probar la captura de cámara y dibujo de rectángulos en tiempo real.
7
+ Este script no realiza detección facial, solo dibuja rectángulos predefinidos
8
+ para verificar que el hardware y la visualización funcionan correctamente.
9
+ """
10
+ print("Iniciando prueba de cámara directa...")
11
+
12
+ # Iniciar la cámara
13
+ cap = cv2.VideoCapture(0)
14
+
15
+ if not cap.isOpened():
16
+ print("Error: No se pudo abrir la cámara. Verifica la conexión y permisos.")
17
+ return
18
+
19
+ print("Cámara iniciada. Presiona 'q' para salir.")
20
+
21
+ # Contador de frames
22
+ frame_count = 0
23
+ start_time = time.time()
24
+
25
+ # Rectángulo fijo en el centro (simulando detección)
26
+ rect_size = 200
27
+
28
+ while True:
29
+ # Capturar frame
30
+ ret, frame = cap.read()
31
+
32
+ if not ret:
33
+ print("Error: No se pudo leer el frame. La cámara podría estar desconectada.")
34
+ break
35
+
36
+ # Conteo de FPS
37
+ frame_count += 1
38
+ elapsed_time = time.time() - start_time
39
+ fps = frame_count / elapsed_time if elapsed_time > 0 else 0
40
+
41
+ # Obtener dimensiones del frame
42
+ height, width, _ = frame.shape
43
+
44
+ # Crear una copia para dibujar
45
+ display = frame.copy()
46
+
47
+ # Dibujar rectángulo central fijo (simulando detección facial)
48
+ center_x, center_y = width // 2, height // 2
49
+ x1 = center_x - rect_size // 2
50
+ y1 = center_y - rect_size // 2
51
+ x2 = center_x + rect_size // 2
52
+ y2 = center_y + rect_size // 2
53
+
54
+ # Dibujar con color verde y grosor 3
55
+ cv2.rectangle(display, (x1, y1), (x2, y2), (0, 255, 0), 3)
56
+ cv2.putText(display, "ROSTRO SIMULADO", (x1, y1 - 10),
57
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
58
+
59
+ # Dibujar un segundo rectángulo en la esquina (para verificar que se dibujan correctamente)
60
+ cv2.rectangle(display, (50, 50), (200, 200), (0, 0, 255), 3)
61
+ cv2.putText(display, "PRUEBA", (50, 40),
62
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
63
+
64
+ # Mostrar información de FPS
65
+ cv2.putText(display, f"FPS: {fps:.1f}", (10, height - 30),
66
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
67
+
68
+ # Mostrar número de frame
69
+ cv2.putText(display, f"Frame: {frame_count}", (10, height - 60),
70
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
71
+
72
+ # Mostrar timestamp
73
+ timestamp = time.strftime("%H:%M:%S")
74
+ cv2.putText(display, f"Hora: {timestamp}", (width - 200, height - 30),
75
+ cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
76
+
77
+ # Mostrar resultado
78
+ cv2.imshow("Prueba de Visualización", display)
79
+
80
+ # Salir si se presiona 'q'
81
+ if cv2.waitKey(1) & 0xFF == ord('q'):
82
+ break
83
+
84
+ # Mostrar estadísticas
85
+ print(f"Frames capturados: {frame_count}")
86
+ print(f"Tiempo de ejecución: {elapsed_time:.2f} segundos")
87
+ print(f"FPS promedio: {fps:.2f}")
88
+
89
+ # Liberar recursos
90
+ cap.release()
91
+ cv2.destroyAllWindows()
92
+
93
+ if __name__ == "__main__":
94
+ main()