internal-v0 / logic /blur.py
e-bug's picture
Upload 31 files
9b0a8c5 verified
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