test_face_detection.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from __future__ import annotations
  2. import tempfile
  3. import unittest
  4. from pathlib import Path
  5. from unittest.mock import patch
  6. from PIL import Image
  7. from production_build_agents.tools.face_detection import detect_faces
  8. def _candidate(*, score: float, size: float = 48) -> list[float]:
  9. return [8, 8, size, size, *([0.0] * 10), score]
  10. class FaceDetectionTest(unittest.TestCase):
  11. def _detect(
  12. self,
  13. candidates: list[list[float]],
  14. ) -> dict:
  15. with tempfile.TemporaryDirectory() as temp_dir:
  16. root = Path(temp_dir)
  17. source = root / "source.png"
  18. Image.new("RGB", (128, 96), "white").save(source)
  19. with patch(
  20. "production_build_agents.tools.face_detection"
  21. "._detect_candidates",
  22. return_value=candidates,
  23. ):
  24. return detect_faces(source.as_posix(), output_dir=root / "out")
  25. def test_face_decision_requires_confident_visible_face(self) -> None:
  26. result = self._detect([_candidate(score=0.91)])
  27. self.assertEqual(result["decision"], "FACE")
  28. self.assertEqual(result["face_count"], 1)
  29. self.assertEqual(result["candidate_count"], 1)
  30. self.assertTrue(result["faces"][0]["accepted"])
  31. self.assertEqual(len(result["input_sha256"]), 64)
  32. self.assertEqual(len(result["model_sha256"]), 64)
  33. def test_no_candidate_is_no_face(self) -> None:
  34. result = self._detect([])
  35. self.assertEqual(result["decision"], "NO_FACE")
  36. self.assertEqual(result["face_count"], 0)
  37. self.assertEqual(result["candidate_count"], 0)
  38. def test_low_confidence_or_tiny_candidate_is_uncertain(self) -> None:
  39. for candidate in (
  40. _candidate(score=0.55),
  41. _candidate(score=0.91, size=12),
  42. ):
  43. with self.subTest(candidate=candidate):
  44. result = self._detect([candidate])
  45. self.assertEqual(result["decision"], "UNCERTAIN")
  46. self.assertEqual(result["face_count"], 0)