import numpy as np import pytest from deepface.modules.detection import extract_faces, DetectedFace, FacialAreaRegion def sanitize_landmarks(region, width, height): def is_valid_landmark(coord, width, height): if coord is None: return False try: x, y = coord except (TypeError, ValueError): return False return 0 <= x < width and 0 <= y < height landmarks = { "left_eye": region.left_eye, "right_eye": region.right_eye, "nose": region.nose, "mouth_left": region.mouth_left, "mouth_right": region.mouth_right, } for key, value in landmarks.items(): if not is_valid_landmark(value, 100, 100): landmarks[key] = None return landmarks def test_sanitize_landmarks(): region = FacialAreaRegion( x=10, y=10, w=50, h=50, left_eye=(-5, 20), # invalid right_eye=(20, 200), # invalid nose=(30, 30), # valid mouth_left=(150, 20), # invalid mouth_right=(20, -10), # invalid confidence=0.9 ) landmarks = sanitize_landmarks(region, 100, 100) print("Sanitized landmarks:", landmarks) assert landmarks["left_eye"] is None assert landmarks["right_eye"] is None assert landmarks["nose"] == (30, 30) assert landmarks["mouth_left"] is None assert landmarks["mouth_right"] is None print("Test passed: Invalid landmarks are sanitized to None.") def test_extract_faces_sanitizes_landmarks(monkeypatch): # Create a dummy image img = np.zeros((100, 100, 3), dtype=np.uint8) # Create a DetectedFace with off-image landmarks facial_area = FacialAreaRegion( x=10, y=10, w=50, h=50, left_eye=(-5, 20), # invalid right_eye=(20, 200), # invalid nose=(30, 30), # valid mouth_left=(150, 20), # invalid mouth_right=(20, -10), # invalid confidence=0.9 ) detected_face = DetectedFace(img=img, facial_area=facial_area, confidence=0.9) # Patch detect_faces to return our test face monkeypatch.setattr("f_deepface.deepface.modules.detection.detect_faces", lambda *args, **kwargs: [detected_face]) # Use a different backend that will call detect_faces result = extract_faces(img, detector_backend="opencv", enforce_detection=False) facial_area_out = result[0]["facial_area"] print("Output facial_area:", facial_area_out) # Debug print assert facial_area_out["left_eye"] is None assert facial_area_out["right_eye"] is None assert facial_area_out.get("nose") == (30, 30) assert facial_area_out.get("mouth_left") is None assert facial_area_out.get("mouth_right") is None if __name__ == "__main__": test_sanitize_landmarks()