File size: 2,871 Bytes
55de749
 
 
 
 
 
 
 
 
cfc858c
55de749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289b241
55de749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289b241
55de749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eab64ba
 
55de749
 
 
 
 
 
6c227a3
55de749
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import gradio as gr
import math
import os
import yolov5
import cv2
import torch
import numpy as np

# load model
model_face = torch.load('face_model.pt')
model_face.eval()
model_plate = yolov5.load('keremberke/yolov5m-license-plate', device="cpu")
# # set model parameters
model_plate.conf = 0.25  # NMS confidence threshold
model_plate.iou = 0.45  # NMS IoU threshold
model_plate.agnostic = False  # NMS class-agnostic
model_plate.multi_label = False  # NMS multiple labels per box
model_plate.max_det = 1000  # maximum number of detections per image


def blur_plates_image(image, plate_blur):

    results_plate = model_plate(image, augment=True)
    boxes_plate_list = results_plate.pred[0][:, :4].cpu().numpy().tolist()
    for box in boxes_plate_list:
        ROI = image[int(box[1]):int(box[3]), int(box[0]):int(box[2])]

        blur_value = (int(plate_blur) * 2 - 1)
        blur = cv2.GaussianBlur(ROI, (blur_value, blur_value), 20, cv2.BORDER_DEFAULT)
        # Insert ROI back into image
        image[int(box[1]):int(box[3]), int(box[0]):int(box[2])] = blur

    return image


def blur_faces_image(image, face_blur):

    results = model_face(np.array(image))

    # parse results
    boxes_face_list = results.pred[0][:, :4].cpu().numpy().tolist() # x1, y1, x2, y2

    for box in boxes_face_list:
        p1 = (int(box[0]), int(box[1]))
        p2 = (int(box[2]), int(box[3]))
        w = p2[0] - p1[0]
        h = p2[1] - p1[1]

        circle_center = ((p1[0] + p2[0]) // 2, (p1[1] + p2[1]) // 2)
        circle_radius = int(math.sqrt(w * w + h * h) // 2)
        ROI = np.zeros(image.shape, dtype='uint8')
        cv2.circle(ROI, circle_center, circle_radius, (255, 255, 255), -1)

        blur_value = (int(face_blur) * 2 - 1)
        blur = cv2.GaussianBlur(image, (blur_value, blur_value), cv2.BORDER_DEFAULT)

        image = np.where(ROI > 0, blur, image)

    return image


def blur(image, face_blur, plate_blur):

    image = blur_plates_image(image, plate_blur)
    image = blur_faces_image(image, face_blur)

    return image


gr.Interface(
    fn=blur,
    inputs=[
        gr.Image(source="upload", type="numpy", optional=False),
        gr.Slider(minimum=0, maximum=30, step=1, value=10, label="Face Blur Intensity"),
        gr.Slider(minimum=0, maximum=30, step=1, value=10, label="Plate Blur Intensity"),
    ],
    outputs="image",
    title="Plate Licenses and Faces Blur",
    enable_queue=False,
    sidebar="<img src='images/22.png' width='100%'/>",
    description="This app uses image processing techniques to automatically blur out license plates and faces in photos. Protect the privacy of individuals and comply with regulations by obscuring sensitive information in your images with ease.",
    examples=[["images/22.png", 5, 5], ["images/18.jpg", 5, 5]],
    css=".gradio-container {margin-top:80px !important;}"
).launch()