|
from typing import List, Tuple, Optional |
|
from abc import ABC, abstractmethod |
|
import numpy as np |
|
|
|
|
|
|
|
|
|
|
|
class Detector(ABC): |
|
@abstractmethod |
|
def detect_faces(self, img: np.ndarray) -> List["FacialAreaRegion"]: |
|
""" |
|
Interface for detect and align face |
|
|
|
Args: |
|
img (np.ndarray): pre-loaded image as numpy array |
|
|
|
Returns: |
|
results (List[FacialAreaRegion]): A list of FacialAreaRegion objects |
|
where each object contains: |
|
|
|
- facial_area (FacialAreaRegion): The facial area region represented |
|
as x, y, w, h, left_eye and right_eye. left eye and right eye are |
|
eyes on the left and right respectively with respect to the person |
|
instead of observer. |
|
""" |
|
pass |
|
|
|
|
|
class FacialAreaRegion: |
|
x: int |
|
y: int |
|
w: int |
|
h: int |
|
left_eye: Tuple[int, int] |
|
right_eye: Tuple[int, int] |
|
confidence: float |
|
|
|
def __init__( |
|
self, |
|
x: int, |
|
y: int, |
|
w: int, |
|
h: int, |
|
left_eye: Optional[Tuple[int, int]] = None, |
|
right_eye: Optional[Tuple[int, int]] = None, |
|
confidence: Optional[float] = None, |
|
): |
|
""" |
|
Initialize a Face object. |
|
|
|
Args: |
|
x (int): The x-coordinate of the top-left corner of the bounding box. |
|
y (int): The y-coordinate of the top-left corner of the bounding box. |
|
w (int): The width of the bounding box. |
|
h (int): The height of the bounding box. |
|
left_eye (tuple): The coordinates (x, y) of the left eye with respect to |
|
the person instead of observer. Default is None. |
|
right_eye (tuple): The coordinates (x, y) of the right eye with respect to |
|
the person instead of observer. Default is None. |
|
confidence (float, optional): Confidence score associated with the face detection. |
|
Default is None. |
|
""" |
|
self.x = x |
|
self.y = y |
|
self.w = w |
|
self.h = h |
|
self.left_eye = left_eye |
|
self.right_eye = right_eye |
|
self.confidence = confidence |
|
|
|
|
|
class DetectedFace: |
|
img: np.ndarray |
|
facial_area: FacialAreaRegion |
|
confidence: float |
|
|
|
def __init__(self, img: np.ndarray, facial_area: FacialAreaRegion, confidence: float): |
|
""" |
|
Initialize detected face object. |
|
|
|
Args: |
|
img (np.ndarray): detected face image as numpy array |
|
facial_area (FacialAreaRegion): detected face's metadata (e.g. bounding box) |
|
confidence (float): confidence score for face detection |
|
""" |
|
self.img = img |
|
self.facial_area = facial_area |
|
self.confidence = confidence |
|
|