Fix the paste back speed

This commit is contained in:
henryruhs 2023-10-21 23:03:45 +02:00
parent d81371faea
commit 63bab0f84c

View File

@ -2,6 +2,7 @@ from typing import Tuple, Dict, Any
import cv2 import cv2
import numpy import numpy
import numpy as np
from cv2.typing import Size from cv2.typing import Size
from facefusion.typing import Frame, Kps, Matrix, Template from facefusion.typing import Frame, Kps, Matrix, Template
@ -33,21 +34,20 @@ def warp_face(temp_frame : Frame, kps : Kps, template : Template, size : Size) -
return crop_frame, affine_matrix return crop_frame, affine_matrix
def paste_back(temp_frame : Frame, crop_frame : Frame, affine_matrix : Matrix) -> Frame: def paste_back(temp_frame: Frame, crop_frame: Frame, affine_matrix: Matrix) -> Frame:
inverse_affine_matrix = cv2.invertAffineTransform(affine_matrix) inverse_affine_matrix = cv2.invertAffineTransform(affine_matrix)
temp_frame_height, temp_frame_width = temp_frame.shape[0:2] temp_frame_height, temp_frame_width = temp_frame.shape[0:2]
crop_frame_height, crop_frame_width = crop_frame.shape[0:2] crop_frame_height, crop_frame_width = crop_frame.shape[0:2]
inverse_crop_frame = cv2.warpAffine(crop_frame, inverse_affine_matrix, (temp_frame_width, temp_frame_height)) inverse_mask = numpy.full((crop_frame_height, crop_frame_width), 255).astype(numpy.float32)
inverse_mask = numpy.ones((crop_frame_height, crop_frame_width, 3)) inverse_crop_frame = cv2.warpAffine(inverse_mask, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
inverse_mask_frame = cv2.warpAffine(inverse_mask, inverse_affine_matrix, (temp_frame_width, temp_frame_height)) inverse_temp_frame = cv2.warpAffine(crop_frame, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
inverse_mask_frame = cv2.erode(inverse_mask_frame, numpy.ones((2, 2))) inverse_mask_size = int(numpy.sqrt(numpy.sum(inverse_crop_frame == 255)))
inverse_mask_border = inverse_mask_frame * inverse_crop_frame kernel_size = max(inverse_mask_size // 10, 10)
inverse_mask_area = numpy.sum(inverse_mask_frame) // 3 inverse_crop_frame = cv2.erode(inverse_crop_frame, numpy.ones((kernel_size, kernel_size)))
inverse_mask_edge = int(inverse_mask_area ** 0.5) // 20 kernel_size = max(inverse_mask_size // 20, 5)
inverse_mask_radius = inverse_mask_edge * 2 blur_size = kernel_size * 2 + 1
inverse_mask_center = cv2.erode(inverse_mask_frame, numpy.ones((inverse_mask_radius, inverse_mask_radius))) inverse_blur_frame = cv2.GaussianBlur(inverse_crop_frame, (blur_size , blur_size), 0) / 255
inverse_mask_blur_size = inverse_mask_edge * 2 + 1 inverse_blur_frame = numpy.reshape(inverse_blur_frame, [ temp_frame_height, temp_frame_width, 1 ])
inverse_mask_blur_area = cv2.GaussianBlur(inverse_mask_center, (inverse_mask_blur_size, inverse_mask_blur_size), 0) temp_frame = inverse_blur_frame * inverse_temp_frame + (1 - inverse_blur_frame) * temp_frame
temp_frame = inverse_mask_blur_area * inverse_mask_border + (1 - inverse_mask_blur_area) * temp_frame temp_frame = temp_frame.astype(numpy.uint8)
temp_frame = numpy.clip(temp_frame, 0, 255).astype(numpy.uint8)
return temp_frame return temp_frame