Spaces:
Runtime error
Runtime error
import numpy as np | |
import cv2 | |
import gradio as gr | |
from opencv_zoo.models.face_detection_yunet.yunet import YuNet | |
from opencv_zoo.models.license_plate_detection_yunet.lpd_yunet import LPD_YuNet | |
# Instantiate face detection YuNet | |
face_model = YuNet( | |
modelPath="opencv_zoo/models/face_detection_yunet/face_detection_yunet_2023mar.onnx", | |
inputSize=[320, 320], | |
confThreshold=0.9, | |
nmsThreshold=0.3, | |
topK=5000, | |
backendId=cv2.dnn.DNN_BACKEND_OPENCV, | |
targetId=cv2.dnn.DNN_TARGET_CPU, | |
) | |
# Instantiate license plate detection YuNet | |
lpd_model = LPD_YuNet( | |
modelPath="opencv_zoo/models/license_plate_detection_yunet/license_plate_detection_lpd_yunet_2023mar.onnx", | |
confThreshold=0.9, | |
nmsThreshold=0.3, | |
topK=5000, | |
keepTopK=750, | |
backendId=cv2.dnn.DNN_BACKEND_OPENCV, | |
targetId=cv2.dnn.DNN_TARGET_CPU, | |
) | |
def json_detections(face_results, lpd_results): | |
json_result = {} | |
json_result["faces"] = [] | |
json_result["license_plates"] = [] | |
for det in face_results if face_results is not None else []: | |
bbox = det[0:4].astype(np.int32) | |
json_result["faces"].append( | |
{ | |
"xmin": int(bbox[0]), | |
"ymin": int(bbox[1]), | |
"xmax": int(bbox[0]) + int(bbox[2]), | |
"ymax": int(bbox[1]) + int(bbox[3]), | |
} | |
) | |
for det in lpd_results if lpd_results is not None else []: | |
bbox = det[:-1].astype(np.int32) | |
x1, y1, x2, y2, x3, y3, x4, y4 = bbox | |
xmin = min(x1, x2, x3, x4) | |
xmax = max(x1, x2, x3, x4) | |
ymin = min(y1, y2, y3, y4) | |
ymax = max(y1, y2, y3, y4) | |
json_result["license_plates"].append( | |
{ | |
"xmin": int(xmin), | |
"ymin": int(ymin), | |
"xmax": int(xmax), | |
"ymax": int(ymax), | |
} | |
) | |
return json_result | |
def overlay_results(image, face_results, lpd_results): | |
# Draw face results on the input image | |
for det in face_results if face_results is not None else []: | |
bbox = det[0:4].astype(np.int32) | |
cv2.rectangle( | |
image, | |
(bbox[0], bbox[1]), | |
(bbox[0] + bbox[2], bbox[1] + bbox[3]), | |
(0, 0, 0), | |
-1, | |
) | |
# Draw lpd results on the input image | |
for det in lpd_results: | |
bbox = det[:-1].astype(np.int32) | |
x1, y1, x2, y2, x3, y3, x4, y4 = bbox | |
# The output of this is technically a parallelogram, but we will | |
# just black out the rectangle | |
xmin = min(x1, x2, x3, x4) | |
xmax = max(x1, x2, x3, x4) | |
ymin = min(y1, y2, y3, y4) | |
ymax = max(y1, y2, y3, y4) | |
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 0, 0), -1) | |
return image | |
def predict(image): | |
h, w, _ = image.shape | |
# Inference | |
face_model.setInputSize([w, h]) | |
lpd_model.setInputSize([w, h]) | |
infer_image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
face_results = face_model.infer(infer_image) | |
lpd_results = lpd_model.infer(infer_image) | |
# Process output | |
image = overlay_results(image, face_results, lpd_results) | |
json = json_detections(face_results, lpd_results) | |
return image, json | |
demo = gr.Interface( | |
title="Face and License Plate Obfuscator - YuNet", | |
fn=predict, | |
inputs=gr.Image(type="numpy", label="Original Image"), | |
outputs=[ | |
gr.Image(type="numpy", label="Output Image"), | |
gr.JSON(), | |
], | |
) | |
demo.launch() | |