Spaces:
Sleeping
Sleeping
| from typing import Any, List | |
| import numpy as np | |
| from deepface.models.Detector import Detector, FacialAreaRegion | |
| # Link - https://google.github.io/mediapipe/solutions/face_detection | |
| class MediaPipeClient(Detector): | |
| def __init__(self): | |
| self.model = self.build_model() | |
| def build_model(self) -> Any: | |
| """ | |
| Build a mediapipe face detector model | |
| Returns: | |
| model (Any) | |
| """ | |
| # this is not a must dependency. do not import it in the global level. | |
| try: | |
| import mediapipe as mp | |
| except ModuleNotFoundError as e: | |
| raise ImportError( | |
| "MediaPipe is an optional detector, ensure the library is installed." | |
| "Please install using 'pip install mediapipe' " | |
| ) from e | |
| mp_face_detection = mp.solutions.face_detection | |
| face_detection = mp_face_detection.FaceDetection(min_detection_confidence=0.7) | |
| return face_detection | |
| def detect_faces(self, img: np.ndarray) -> List[FacialAreaRegion]: | |
| """ | |
| Detect and align face with mediapipe | |
| Args: | |
| img (np.ndarray): pre-loaded image as numpy array | |
| Returns: | |
| results (List[FacialAreaRegion]): A list of FacialAreaRegion objects | |
| """ | |
| resp = [] | |
| img_width = img.shape[1] | |
| img_height = img.shape[0] | |
| results = self.model.process(img) | |
| # If no face has been detected, return an empty list | |
| if results.detections is None: | |
| return resp | |
| # Extract the bounding box, the landmarks and the confidence score | |
| for current_detection in results.detections: | |
| (confidence,) = current_detection.score | |
| bounding_box = current_detection.location_data.relative_bounding_box | |
| landmarks = current_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)) | |
| facial_area = FacialAreaRegion( | |
| x=x, y=y, w=w, h=h, left_eye=left_eye, right_eye=right_eye, confidence=confidence | |
| ) | |
| resp.append(facial_area) | |
| return resp | |