Team Ai
Apppublic

jarondon82/ComputerVisionProject

sourceHugging Faceupdated 2y agoView on Hugging Face
1likes
detect_face_test.py197 linesDownload Raw Back to root
1import cv22import numpy as np3import time4 5def main():6    """7    Script para probar la detección de rostros con diferentes configuraciones8    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 rostros13    print("Cargando modelo DNN para detección facial...")14    15    # Usar el modelo Caffe16    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            return29        use_dnn = False30    else:31        use_dnn = True32    33    # Iniciar la cámara34    cap = cv2.VideoCapture(0)35    36    if not cap.isOpened():37        print("Error: No se pudo abrir la cámara.")38        return39    40    print("Cámara iniciada correctamente. Presione 'q' para salir, 's' para guardar una captura.")41    42    # Contador de frames43    frame_count = 044    start_time = time.time()45    46    # Umbrales de confianza para probar47    confidence_thresholds = [0.5, 0.3, 0.1]48    current_threshold_index = 049    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 red58        net.setInput(blob)59        detections = net.forward()60        61        # Procesar las detecciones62        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 delimitadora68                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 imagen72                x1, y1 = max(0, x1), max(0, y1)73                x2, y2 = min(w, x2), min(h, y2)74                75                # Añadir caja y confianza76                bboxes.append([x1, y1, x2, y2, confidence])77        78        return bboxes if bboxes else None79    80    def detect_face_haar(face_cascade, frame, scale_factor=1.1):81        # Convertir a escala de grises para la detección Haar82        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)83        84        # Detectar rostros85        faces = face_cascade.detectMultiScale(86            gray,87            scaleFactor=scale_factor,88            minNeighbors=5,89            minSize=(30, 30),90            flags=cv2.CASCADE_SCALE_IMAGE91        )92        93        if len(faces) == 0:94            return None95            96        # Convertir al mismo formato que el DNN97        bboxes = []98        for (x, y, w, h) in faces:99            bboxes.append([x, y, x+w, y+h, 1.0])  # Confianza simulada de 1.0100            101        return bboxes102    103    while True:104        # Leer un frame de la cámara105        ret, frame = cap.read()106        107        if not ret:108            print("Error al capturar el frame.")109            break110        111        # Incrementar contador112        frame_count += 1113        elapsed = time.time() - start_time114        fps = frame_count / elapsed if elapsed > 0 else 0115        116        # Crear copia del frame para dibujar117        display_frame = frame.copy()118        119        # Detectar rostros según el método seleccionado120        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 detectados128        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 grueso133                cv2.rectangle(display_frame, (x1, y1), (x2, y2), (0, 255, 0), 3)134                135                # Mostrar confianza136                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 pantalla147        h, w = display_frame.shape[:2]148        149        # Método de detección150        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ón154        cv2.putText(display_frame, status, (10, 70),155                   cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)156        157        # FPS158        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 derecha162        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 resultado167        cv2.imshow("Prueba de Detección Facial", display_frame)168        169        # Manejo de teclas170        key = cv2.waitKey(1) & 0xFF171        172        # Salir si se presiona 'q'173        if key == ord('q'):174            break175        # 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ísticas188    print(f"Frames totales: {frame_count}")189    print(f"Tiempo total: {elapsed:.2f} segundos")190    print(f"FPS promedio: {fps:.1f}")191    192    # Liberar recursos193    cap.release()194    cv2.destroyAllWindows()195 196if __name__ == "__main__":197    main()