Skip to content

Commit b28e78a

Browse files
committed
init
1 parent 0870c30 commit b28e78a

File tree

210 files changed

+65463
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

210 files changed

+65463
-0
lines changed

LICENSE

Lines changed: 674 additions & 0 deletions
Large diffs are not rendered by default.

converters/Converter.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import copy
2+
'''
3+
You can implement your own Converter, check example ConverterMasked.py
4+
'''
5+
6+
class Converter(object):
7+
TYPE_FACE = 0 #calls convert_face
8+
TYPE_FACE_AVATAR = 1 #calls convert_face with avatar_operator_face
9+
TYPE_IMAGE = 2 #calls convert_image without landmarks
10+
TYPE_IMAGE_WITH_LANDMARKS = 3 #calls convert_image with landmarks
11+
12+
#overridable
13+
def __init__(self, predictor_func, type):
14+
self.predictor_func = predictor_func
15+
self.type = type
16+
17+
#overridable
18+
def on_cli_initialize(self):
19+
#cli initialization
20+
pass
21+
22+
#overridable
23+
def on_host_tick(self):
24+
pass
25+
26+
#overridable
27+
def cli_convert_face (self, img_bgr, img_face_landmarks, debug, avaperator_face_bgr=None, **kwargs):
28+
#return float32 image
29+
#if debug , return tuple ( images of any size and channels, ...)
30+
return image
31+
32+
#overridable
33+
def cli_convert_image (self, img_bgr, img_landmarks, debug):
34+
#img_landmarks not None, if input image is png with embedded data
35+
#return float32 image
36+
#if debug , return tuple ( images of any size and channels, ...)
37+
return image
38+
39+
#overridable
40+
def dummy_predict(self):
41+
#do dummy predict here
42+
pass
43+
44+
def copy(self):
45+
return copy.copy(self)
46+
47+
def copy_and_set_predictor(self, predictor_func):
48+
result = self.copy()
49+
result.predictor_func = predictor_func
50+
return result

converters/ConverterAvatar.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import time
2+
3+
import cv2
4+
import numpy as np
5+
6+
from facelib import FaceType, LandmarksProcessor
7+
from joblib import SubprocessFunctionCaller
8+
from utils.pickle_utils import AntiPickler
9+
10+
from .Converter import Converter
11+
12+
class ConverterAvatar(Converter):
13+
14+
#override
15+
def __init__(self, predictor_func,
16+
predictor_input_size=0):
17+
18+
super().__init__(predictor_func, Converter.TYPE_FACE_AVATAR)
19+
20+
self.predictor_input_size = predictor_input_size
21+
22+
#dummy predict and sleep, tensorflow caching kernels. If remove it, conversion speed will be x2 slower
23+
predictor_func ( np.zeros ( (predictor_input_size,predictor_input_size,3), dtype=np.float32 ),
24+
np.zeros ( (predictor_input_size,predictor_input_size,1), dtype=np.float32 ) )
25+
time.sleep(2)
26+
27+
predictor_func_host, predictor_func = SubprocessFunctionCaller.make_pair(predictor_func)
28+
self.predictor_func_host = AntiPickler(predictor_func_host)
29+
self.predictor_func = predictor_func
30+
31+
#overridable
32+
def on_host_tick(self):
33+
self.predictor_func_host.obj.process_messages()
34+
35+
#override
36+
def cli_convert_face (self, img_bgr, img_face_landmarks, debug, avaperator_face_bgr=None, **kwargs):
37+
if debug:
38+
debugs = [img_bgr.copy()]
39+
40+
img_size = img_bgr.shape[1], img_bgr.shape[0]
41+
42+
img_face_mask_a = LandmarksProcessor.get_image_hull_mask (img_bgr.shape, img_face_landmarks)
43+
img_face_mask_aaa = np.repeat(img_face_mask_a, 3, -1)
44+
45+
output_size = self.predictor_input_size
46+
face_mat = LandmarksProcessor.get_transform_mat (img_face_landmarks, output_size, face_type=FaceType.FULL)
47+
48+
dst_face_mask_a_0 = cv2.warpAffine( img_face_mask_a, face_mat, (output_size, output_size), flags=cv2.INTER_CUBIC )
49+
50+
predictor_input_dst_face_mask_a_0 = cv2.resize (dst_face_mask_a_0, (self.predictor_input_size,self.predictor_input_size), cv2.INTER_CUBIC )
51+
prd_inp_dst_face_mask_a = predictor_input_dst_face_mask_a_0[...,np.newaxis]
52+
53+
prd_inp_avaperator_face_bgr = cv2.resize (avaperator_face_bgr, (self.predictor_input_size,self.predictor_input_size), cv2.INTER_CUBIC )
54+
55+
prd_face_bgr = self.predictor_func ( prd_inp_avaperator_face_bgr, prd_inp_dst_face_mask_a )
56+
57+
out_img = img_bgr.copy()
58+
out_img = cv2.warpAffine( prd_face_bgr, face_mat, img_size, out_img, cv2.WARP_INVERSE_MAP | cv2.INTER_LANCZOS4, cv2.BORDER_TRANSPARENT )
59+
out_img = np.clip(out_img, 0.0, 1.0)
60+
61+
if debug:
62+
debugs += [out_img.copy()]
63+
64+
out_img = np.clip( img_bgr*(1-img_face_mask_aaa) + (out_img*img_face_mask_aaa) , 0, 1.0 )
65+
66+
if debug:
67+
debugs += [out_img.copy()]
68+
69+
70+
return debugs if debug else out_img

converters/ConverterImage.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import time
2+
3+
import cv2
4+
import numpy as np
5+
6+
from facelib import FaceType, LandmarksProcessor
7+
from joblib import SubprocessFunctionCaller
8+
from utils.pickle_utils import AntiPickler
9+
10+
from .Converter import Converter
11+
12+
class ConverterImage(Converter):
13+
14+
#override
15+
def __init__(self, predictor_func,
16+
predictor_input_size=0):
17+
18+
super().__init__(predictor_func, Converter.TYPE_IMAGE)
19+
20+
self.predictor_input_size = predictor_input_size
21+
22+
#dummy predict and sleep, tensorflow caching kernels. If remove it, conversion speed will be x2 slower
23+
predictor_func ( np.zeros ( (predictor_input_size,predictor_input_size,3), dtype=np.float32 ) )
24+
time.sleep(2)
25+
26+
predictor_func_host, predictor_func = SubprocessFunctionCaller.make_pair(predictor_func)
27+
self.predictor_func_host = AntiPickler(predictor_func_host)
28+
self.predictor_func = predictor_func
29+
30+
#overridable
31+
def on_host_tick(self):
32+
self.predictor_func_host.obj.process_messages()
33+
34+
#override
35+
def cli_convert_image (self, img_bgr, img_landmarks, debug):
36+
img_size = img_bgr.shape[1], img_bgr.shape[0]
37+
38+
predictor_input_bgr = cv2.resize ( img_bgr, (self.predictor_input_size, self.predictor_input_size), cv2.INTER_LANCZOS4 )
39+
40+
if debug:
41+
debugs = [predictor_input_bgr]
42+
43+
output = self.predictor_func ( predictor_input_bgr )
44+
45+
if debug:
46+
return (predictor_input_bgr,output,)
47+
if debug:
48+
debugs += [out_img.copy()]
49+
50+
return debugs if debug else output

0 commit comments

Comments
 (0)