Spaces:
				
			
			
	
			
			
					
		Running
		
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
	| 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): | |
| # TINY = 1 | |
| # SMALL = 2 | |
| # MEDIUM = 3 | |
| 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 | |
| # Get the face detector | |
| 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 |