mirror of
https://github.com/iperov/DeepFaceLab.git
synced 2025-07-12 16:13:51 -07:00
fixed error "dll load failed" on some systems Expanded eyebrows line of face masks. It does not affect mask of FAN-x converter mode.
61 lines
2.4 KiB
Python
61 lines
2.4 KiB
Python
import time
|
|
|
|
import cv2
|
|
import numpy as np
|
|
|
|
from facelib import FaceType, LandmarksProcessor
|
|
from joblib import SubprocessFunctionCaller
|
|
from utils.pickle_utils import AntiPickler
|
|
|
|
from .Converter import Converter
|
|
|
|
class ConverterAvatar(Converter):
|
|
|
|
#override
|
|
def __init__(self, predictor_func,
|
|
predictor_input_size=0):
|
|
|
|
super().__init__(predictor_func, Converter.TYPE_FACE_AVATAR)
|
|
|
|
self.predictor_input_size = predictor_input_size
|
|
|
|
#dummy predict and sleep, tensorflow caching kernels. If remove it, conversion speed will be x2 slower
|
|
predictor_func ( np.zeros ( (predictor_input_size,predictor_input_size,3), dtype=np.float32 ),
|
|
np.zeros ( (predictor_input_size,predictor_input_size,3), dtype=np.float32 ),
|
|
np.zeros ( (predictor_input_size,predictor_input_size,3), dtype=np.float32 ) )
|
|
time.sleep(2)
|
|
|
|
predictor_func_host, predictor_func = SubprocessFunctionCaller.make_pair(predictor_func)
|
|
self.predictor_func_host = AntiPickler(predictor_func_host)
|
|
self.predictor_func = predictor_func
|
|
|
|
#overridable
|
|
def on_host_tick(self):
|
|
self.predictor_func_host.obj.process_messages()
|
|
|
|
#override
|
|
def cli_convert_face (self, f0, f0_lmrk, f1, f1_lmrk, f2, f2_lmrk, debug, **kwargs):
|
|
if debug:
|
|
debugs = []
|
|
|
|
inp_size = self.predictor_input_size
|
|
|
|
f0_mat = LandmarksProcessor.get_transform_mat (f0_lmrk, inp_size, face_type=FaceType.FULL_NO_ALIGN)
|
|
f1_mat = LandmarksProcessor.get_transform_mat (f1_lmrk, inp_size, face_type=FaceType.FULL_NO_ALIGN)
|
|
f2_mat = LandmarksProcessor.get_transform_mat (f2_lmrk, inp_size, face_type=FaceType.FULL_NO_ALIGN)
|
|
|
|
inp_f0 = cv2.warpAffine( f0, f0_mat, (inp_size, inp_size), flags=cv2.INTER_CUBIC )
|
|
inp_f1 = cv2.warpAffine( f1, f1_mat, (inp_size, inp_size), flags=cv2.INTER_CUBIC )
|
|
inp_f2 = cv2.warpAffine( f2, f2_mat, (inp_size, inp_size), flags=cv2.INTER_CUBIC )
|
|
|
|
prd_f = self.predictor_func ( inp_f0, inp_f1, inp_f2 )
|
|
|
|
out_img = np.clip(prd_f, 0.0, 1.0)
|
|
|
|
out_img = np.concatenate ( [cv2.resize ( inp_f1, (prd_f.shape[1], prd_f.shape[0]) ),
|
|
out_img], axis=1 )
|
|
|
|
if debug:
|
|
debugs += [out_img.copy()]
|
|
|
|
return debugs if debug else out_img
|