| | from __future__ import print_function |
| | import os |
| | import torch |
| | from torch.utils.model_zoo import load_url |
| | from enum import Enum |
| | import numpy as np |
| | import cv2 |
| | try: |
| | import urllib.request as request_file |
| | except BaseException: |
| | import urllib as request_file |
| |
|
| | from .models import FAN, ResNetDepth |
| | from .utils import * |
| |
|
| |
|
| | class LandmarksType(Enum): |
| | """Enum class defining the type of landmarks to detect. |
| | |
| | ``_2D`` - the detected points ``(x,y)`` are detected in a 2D space and follow the visible contour of the face |
| | ``_2halfD`` - this points represent the projection of the 3D points into 3D |
| | ``_3D`` - detect the points ``(x,y,z)``` in a 3D space |
| | |
| | """ |
| | _2D = 1 |
| | _2halfD = 2 |
| | _3D = 3 |
| |
|
| |
|
| | class NetworkSize(Enum): |
| | |
| | |
| | |
| | LARGE = 4 |
| |
|
| | def __new__(cls, value): |
| | member = object.__new__(cls) |
| | member._value_ = value |
| | return member |
| |
|
| | def __int__(self): |
| | return self.value |
| |
|
| | ROOT = os.path.dirname(os.path.abspath(__file__)) |
| |
|
| | class FaceAlignment: |
| | def __init__(self, landmarks_type, network_size=NetworkSize.LARGE, |
| | device='cuda', flip_input=False, face_detector='sfd', verbose=False): |
| | self.device = device |
| | self.flip_input = flip_input |
| | self.landmarks_type = landmarks_type |
| | self.verbose = verbose |
| |
|
| | network_size = int(network_size) |
| |
|
| | if 'cuda' in device: |
| | torch.backends.cudnn.benchmark = True |
| |
|
| | |
| | face_detector_module = __import__('face_detection.detection.' + face_detector, |
| | globals(), locals(), [face_detector], 0) |
| | self.face_detector = face_detector_module.FaceDetector(device=device, verbose=verbose) |
| |
|
| | def get_detections_for_batch(self, images): |
| | images = images[..., ::-1] |
| | detected_faces = self.face_detector.detect_from_batch(images.copy()) |
| | results = [] |
| |
|
| | for i, d in enumerate(detected_faces): |
| | if len(d) == 0: |
| | results.append(None) |
| | continue |
| | d = d[0] |
| | d = np.clip(d, 0, None) |
| | |
| | x1, y1, x2, y2 = map(int, d[:-1]) |
| | results.append((x1, y1, x2, y2)) |
| |
|
| | return results |