faceblur / app.py
mmkuznecov's picture
added oval blur
fc5caf7
import gradio as gr
import cv2
import numpy as np
from PIL import Image
from yolov8 import YOLOv8Face
model = YOLOv8Face('weights/yolov8n-face.onnx')
def detect_and_blur_faces(image, blur_style):
boxes, scores, classids, landmarks = model.detect(image)
output_image = image.copy()
for i, box in enumerate(boxes):
x1, y1, w, h = [int(val) for val in box]
x2, y2 = x1 + w, y1 + h
face = output_image[y1:y2, x1:x2]
blurred_face = cv2.GaussianBlur(face, (99, 99), 30)
if blur_style == 'Oval':
mask = np.zeros((y2-y1, x2-x1, 3), dtype=np.uint8)
ellipse_mask = cv2.ellipse(mask, (w//2, h//2), (w//2, h//2), 0, 0, 360, (255, 255, 255), -1)
blurred_face = np.where(ellipse_mask==np.array([255, 255, 255]), blurred_face, face)
output_image[y1:y2, x1:x2] = blurred_face
return output_image
# Set up the Gradio interface.
image_input = gr.inputs.Image(shape=(None, None))
blur_style = gr.inputs.Radio(['Rectangle', 'Oval'], label="Blur Style")
image_output = gr.outputs.Image(type='numpy')
gr.Interface(fn=detect_and_blur_faces, inputs=[image_input, blur_style], outputs=image_output, title="Face Detection and Blurring").launch()