import cv2 import numpy as np import time import os from retinaface import RetinaFace def blur_faces(image, blur_amount=30, verbose=False): # Start timer start_time = time.time() # Convert image from BGR to RGB (if using OpenCV's imread) # image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Detect faces using RetinaFace detection_start = time.time() faces = RetinaFace.detect_faces(image) detection_time = time.time() - detection_start # Create a copy of the image output_image = image.copy() face_count = 0 blurring_start = time.time() # import pdb; pdb.set_trace() # Process each face if faces and isinstance(faces, dict): for face_key in faces: face_count += 1 face_data = faces[face_key] # Get bounding box coordinates x1, y1, x2, y2 = face_data['facial_area'] # Ensure the coordinates are within the image boundaries ih, iw = image.shape[:2] x1, y1 = max(0, x1), max(0, y1) x2, y2 = min(iw, x2), min(ih, y2) # Extract face region face_region = output_image[y1:y2, x1:x2] # Apply blur blurred_face = cv2.GaussianBlur(face_region, (blur_amount, blur_amount), 0) # Replace face region with blurred version output_image[y1:y2, x1:x2] = blurred_face blurring_time = time.time() - blurring_start total_time = time.time() - start_time if verbose: # Print timing information print(f"Face blurring performance metrics:") print(f"Total faces detected: {face_count}") print(f"Face detection time: {detection_time:.4f} seconds") print(f"Face blurring time: {blurring_time:.4f} seconds") print(f"Total processing time: {total_time:.4f} seconds") print(f"Average time per face: {(total_time/max(1, face_count)):.4f} seconds") return output_image, { "face_count": face_count, "detection_time": detection_time, "blurring_time": blurring_time, "total_time": total_time, "avg_time_per_face": total_time/max(1, face_count) } # Example usage if __name__ == "__main__": # Read an image from file image_path = "multiple_people2.jpeg" # Replace with your image path output_path = "blurred_output.jpg" # Output path for the blurred image image = cv2.imread(image_path) if image is None: print(f"Could not read image from {image_path}") else: # Process the image with timing result_image, timing_info = blur_faces(image, blur_amount=31) # Save the result cv2.imwrite(output_path, result_image) print(f"Blurred image saved to {output_path}") ## requirements and cv2 # pip install retina-face # pip install opencv-python