54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from deepface.detectors import FaceDetector
|
|
|
|
# Link - https://google.github.io/mediapipe/solutions/face_detection
|
|
|
|
|
|
def build_model():
|
|
import mediapipe as mp # this is not a must dependency. do not import it in the global level.
|
|
|
|
mp_face_detection = mp.solutions.face_detection
|
|
face_detection = mp_face_detection.FaceDetection(min_detection_confidence=0.7)
|
|
return face_detection
|
|
|
|
|
|
def detect_face(face_detector, img, align=True):
|
|
resp = []
|
|
|
|
img_width = img.shape[1]
|
|
img_height = img.shape[0]
|
|
|
|
results = face_detector.process(img)
|
|
|
|
if results.detections:
|
|
for detection in results.detections:
|
|
|
|
(confidence,) = detection.score
|
|
|
|
bounding_box = detection.location_data.relative_bounding_box
|
|
landmarks = detection.location_data.relative_keypoints
|
|
|
|
x = int(bounding_box.xmin * img_width)
|
|
w = int(bounding_box.width * img_width)
|
|
y = int(bounding_box.ymin * img_height)
|
|
h = int(bounding_box.height * img_height)
|
|
|
|
right_eye = (int(landmarks[0].x * img_width), int(landmarks[0].y * img_height))
|
|
left_eye = (int(landmarks[1].x * img_width), int(landmarks[1].y * img_height))
|
|
# nose = (int(landmarks[2].x * img_width), int(landmarks[2].y * img_height))
|
|
# mouth = (int(landmarks[3].x * img_width), int(landmarks[3].y * img_height))
|
|
# right_ear = (int(landmarks[4].x * img_width), int(landmarks[4].y * img_height))
|
|
# left_ear = (int(landmarks[5].x * img_width), int(landmarks[5].y * img_height))
|
|
|
|
if x > 0 and y > 0:
|
|
detected_face = img[y : y + h, x : x + w]
|
|
img_region = [x, y, w, h]
|
|
|
|
if align:
|
|
detected_face = FaceDetector.alignment_procedure(
|
|
detected_face, left_eye, right_eye
|
|
)
|
|
|
|
resp.append((detected_face, img_region, confidence))
|
|
|
|
return resp
|