import mediapipe as mp import numpy as np from typing import Tuple, List class CPUFaceHandler: """Handler for CPU-based face detection using MediaPipe. (2 ms/frame) This handler provides a simple interface for face detection using MediaPipe's face detection model. It's optimized for CPU usage and provides basic face detection functionality. """ def __init__(self, model_selection: int = 1, min_detection_confidence: float = 0.0): """Initialize the face detection handler.""" self.detector = mp.solutions.face_detection.FaceDetection( model_selection=model_selection, min_detection_confidence=min_detection_confidence, ) def detect(self, image: np.ndarray) -> Tuple[int, List[int]]: """Detect faces in the given image. Args: image (np.ndarray): RGB image array. Returns: Tuple[int, List[int]]: A tuple containing: - Number of faces detected (int) - Bounding box coordinates [x1, y1, x2, y2] if exactly one face is detected, empty list otherwise """ bboxs, scores = [], [] results = self.detector.process(image) detection_result = results.detections if detection_result is None: return bboxs, scores for detection in detection_result: bboxC = detection.location_data.relative_bounding_box x, y, w, h = bboxC.xmin, bboxC.ymin, bboxC.width, bboxC.height x1, y1, x2, y2 = x, y, x + w, y + h bboxs.append([x1, y1, x2, y2]) scores.append(detection.score[0]) return bboxs, scores def __call__(self, image: np.ndarray) -> Tuple[int, List[int]]: """Make the handler callable. Args: image (np.ndarray): RGB image array. Returns: Tuple[int, List[int]]: Same as detect() method. """ return self.detect(image)