|
import cv2 |
|
import numpy as np |
|
import modules.config |
|
|
|
|
|
faceRestoreHelper = None |
|
|
|
|
|
def align_warp_face(self, landmark, border_mode='constant'): |
|
affine_matrix = cv2.estimateAffinePartial2D(landmark, self.face_template, method=cv2.LMEDS)[0] |
|
self.affine_matrices.append(affine_matrix) |
|
if border_mode == 'constant': |
|
border_mode = cv2.BORDER_CONSTANT |
|
elif border_mode == 'reflect101': |
|
border_mode = cv2.BORDER_REFLECT101 |
|
elif border_mode == 'reflect': |
|
border_mode = cv2.BORDER_REFLECT |
|
input_img = self.input_img |
|
cropped_face = cv2.warpAffine(input_img, affine_matrix, self.face_size, |
|
borderMode=border_mode, borderValue=(135, 133, 132)) |
|
return cropped_face |
|
|
|
|
|
def crop_image(img_rgb): |
|
global faceRestoreHelper |
|
|
|
if faceRestoreHelper is None: |
|
from extras.facexlib.utils.face_restoration_helper import FaceRestoreHelper |
|
faceRestoreHelper = FaceRestoreHelper( |
|
upscale_factor=1, |
|
model_rootpath=modules.config.path_controlnet, |
|
device='cpu' |
|
) |
|
|
|
faceRestoreHelper.clean_all() |
|
faceRestoreHelper.read_image(np.ascontiguousarray(img_rgb[:, :, ::-1].copy())) |
|
faceRestoreHelper.get_face_landmarks_5() |
|
|
|
landmarks = faceRestoreHelper.all_landmarks_5 |
|
|
|
|
|
if len(landmarks) == 0: |
|
print('No face detected') |
|
return img_rgb |
|
else: |
|
print(f'Detected {len(landmarks)} faces') |
|
|
|
result = align_warp_face(faceRestoreHelper, landmarks[0]) |
|
|
|
return np.ascontiguousarray(result[:, :, ::-1].copy()) |
|
|