|
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 |