Spaces:
Running
Running
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 |