Spaces:
Sleeping
Sleeping
| from PIL import Image | |
| import numpy as np | |
| import mediapipe as mp | |
| from utils.asyncHandler import asyncHandler | |
| import logging | |
| import cv2 | |
| class FaceFinder: | |
| def __init__(self): | |
| self.mpFace = mp.solutions.face_detection | |
| self.face = self.mpFace.FaceDetection() | |
| self.mpDraw = mp.solutions.drawing_utils | |
| async def find(self, img: Image): | |
| logging.info("Entered in the face finder component") | |
| try: | |
| img_array = np.array(img) | |
| img_rgb = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB) | |
| results = self.face.process(img_rgb) | |
| if not results.detections: | |
| return { | |
| "is_error": True, | |
| "error_message": "Face not found", | |
| "face_count": 0, | |
| "data": None | |
| } | |
| detections = results.detections | |
| detections = sorted(detections, key=lambda d: d.score[0], reverse=True) | |
| # Count high-confidence detections | |
| high_conf = [d for d in detections if d.score[0] > 0.6] | |
| face_count = len(high_conf) if len(high_conf) > 0 else 1 | |
| if face_count > 1: | |
| return { | |
| "is_error": True, | |
| "error_message": f"{face_count} faces detected", | |
| "face_count": face_count, | |
| "data": None | |
| } | |
| detection = detections[0] | |
| logging.info("Exited from the face finder component") | |
| return { | |
| "is_error": False, | |
| "error_message": None, | |
| "face_count": 1, | |
| "data": { | |
| "score": float(detection.score[0]), | |
| "relative_bounding_box": { | |
| "xmin": detection.location_data.relative_bounding_box.xmin, | |
| "ymin": detection.location_data.relative_bounding_box.ymin, | |
| "width": detection.location_data.relative_bounding_box.width, | |
| "height": detection.location_data.relative_bounding_box.height | |
| } | |
| } | |
| } | |
| except Exception as e: | |
| logging.error(f"Error in FaceFinder: {str(e)}") | |
| return { | |
| "is_error": True, | |
| "error_message": str(e), | |
| "data": None | |
| } |