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