Fast & Lightweight Millisecond-level Face Detector in Python
I thought I'll share some simple Python code to detect faces that makes use of YuNet: A Tiny Millisecond-level Face Detector. I adapted the code from here and snatched the model file yunet.onnx
from here—I couldn't get the int8 quant to perform perform consistently, so I would just go for the already very light base model.
import numpy as np
import cv2
detector = cv2.FaceDetectorYN_create('yunet.onnx', '', (0,0))
capture = cv2.VideoCapture(0)
SCALE = 1
while True:
_, img = capture.read()
h, w, channels = img.shape
assert(channels == 3)
w //= SCALE
h //= SCALE
detector.setInputSize((w,h))
_, faces = detector.detect(cv2.resize(img, (w,h)))
if faces is None:
faces = []
for face in faces:
face = [int(i)*SCALE for i in face]
color = (0, 0, 255)
box = face[:4]
cv2.rectangle(img, box, color, 2, cv2.LINE_AA)
landmarks = face[4:len(face)-1]
landmarks = np.array_split(landmarks, len(landmarks) / 2)
for landmark in landmarks:
cv2.circle(img, landmark, 5, color, -1, cv2.LINE_AA)
cv2.imshow('', img)
key = cv2.waitKey(10)
if key == ord('q'):
break
cv2.destroyAllWindows()
I added the SCALE
constant that can scale down the webcam image before feeding it into YuNet to process. When set to 4 it results in an 86% reduction in CPU usage—on my machine that means the code uses only around 0.3% of my total CPU. I could see myself in the future incorporating this code into some project that involves detecting a users face.