diff --git a/deepface/detectors/FastMtcnnWrapper.py b/deepface/detectors/FastMtcnnWrapper.py index 20461a3..5e25941 100644 --- a/deepface/detectors/FastMtcnnWrapper.py +++ b/deepface/detectors/FastMtcnnWrapper.py @@ -4,23 +4,27 @@ from deepface.detectors import FaceDetector # Link -> https://github.com/timesler/facenet-pytorch # Examples https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch + def build_model(): - # Optional dependency + # this is not a must dependency. do not import it in the global level. try: from facenet_pytorch import MTCNN as fast_mtcnn except ModuleNotFoundError as e: - raise ImportError("This is an optional detector, ensure the library is installed. \ - Please install using 'pip install facenet-pytorch' ") from e + raise ImportError( + "FastMtcnn is an optional detector, ensure the library is installed." + "Please install using 'pip install facenet-pytorch' " + ) from e - - face_detector = fast_mtcnn(image_size=160, - thresholds=[0.6, 0.7, 0.7], # MTCNN thresholds - post_process=True, - device='cpu', - select_largest=False, # return result in descending order - ) + face_detector = fast_mtcnn( + image_size=160, + thresholds=[0.6, 0.7, 0.7], # MTCNN thresholds + post_process=True, + device="cpu", + select_largest=False, # return result in descending order + ) return face_detector + def xyxy_to_xywh(xyxy): """ Convert xyxy format to xywh format. @@ -30,6 +34,7 @@ def xyxy_to_xywh(xyxy): h = xyxy[3] - y + 1 return [x, y, w, h] + def detect_face(face_detector, img, align=True): resp = [] @@ -38,7 +43,9 @@ def detect_face(face_detector, img, align=True): img_region = [0, 0, img.shape[1], img.shape[0]] img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # mtcnn expects RGB but OpenCV read BGR - detections = face_detector.detect(img_rgb, landmarks=True) # returns boundingbox, prob, landmark + detections = face_detector.detect( + img_rgb, landmarks=True + ) # returns boundingbox, prob, landmark if len(detections[0]) > 0: for detection in zip(*detections): diff --git a/deepface/detectors/MediapipeWrapper.py b/deepface/detectors/MediapipeWrapper.py index 5753485..332be4f 100644 --- a/deepface/detectors/MediapipeWrapper.py +++ b/deepface/detectors/MediapipeWrapper.py @@ -4,7 +4,14 @@ from deepface.detectors import FaceDetector def build_model(): - import mediapipe as mp # this is not a must dependency. do not import it in the global level. + # 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) diff --git a/deepface/detectors/YoloWrapper.py b/deepface/detectors/YoloWrapper.py index a96011b..e6e67de 100644 --- a/deepface/detectors/YoloWrapper.py +++ b/deepface/detectors/YoloWrapper.py @@ -20,9 +20,16 @@ def build_model(): import os # Import the Ultralytics YOLO model - from ultralytics import YOLO + try: + from ultralytics import YOLO + except ModuleNotFoundError as e: + raise ImportError( + "Yolo is an optional detector, ensure the library is installed. \ + Please install using 'pip install ultralytics' " + ) from e from deepface.commons.functions import get_deepface_home + weight_path = f"{get_deepface_home()}{PATH}" # Download the model's weights if they don't exist @@ -38,8 +45,7 @@ def detect_face(face_detector, img, align=False): resp = [] # Detect faces - results = face_detector.predict( - img, verbose=False, show=False, conf=0.25)[0] + results = face_detector.predict(img, verbose=False, show=False, conf=0.25)[0] # For each face, extract the bounding box, the landmarks and confidence for result in results: @@ -48,7 +54,7 @@ def detect_face(face_detector, img, align=False): confidence = result.boxes.conf.tolist()[0] x, y, w, h = int(x - w / 2), int(y - h / 2), int(w), int(h) - detected_face = img[y: y + h, x: x + w].copy() + detected_face = img[y : y + h, x : x + w].copy() if align: # Tuple of x,y and confidence for left eye @@ -57,8 +63,10 @@ def detect_face(face_detector, img, align=False): right_eye = result.keypoints.xy[0][1], result.keypoints.conf[0][1] # Check the landmarks confidence before alignment - if (left_eye[1] > LANDMARKS_CONFIDENCE_THRESHOLD and - right_eye[1] > LANDMARKS_CONFIDENCE_THRESHOLD): + if ( + left_eye[1] > LANDMARKS_CONFIDENCE_THRESHOLD + and right_eye[1] > LANDMARKS_CONFIDENCE_THRESHOLD + ): detected_face = FaceDetector.alignment_procedure( detected_face, left_eye[0].cpu(), right_eye[0].cpu() )