forked from shaoanlu/faceswap-GAN
-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.py
133 lines (117 loc) · 5.07 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from IPython.display import display
from PIL import Image
import numpy as np
import cv2
import os
import yaml
def get_image_paths(directory):
return [x.path for x in os.scandir(directory) if x.name.endswith(".jpg") or x.name.endswith(".png")]
def load_images(image_paths, convert=None):
iter_all_images = (cv2.resize(cv2.imread(fn), (256,256)) for fn in image_paths)
if convert:
iter_all_images = (convert(img) for img in iter_all_images)
for i,image in enumerate( iter_all_images ):
if i == 0:
all_images = np.empty((len(image_paths),) + image.shape, dtype=image.dtype)
all_images[i] = image
return all_images
def get_transpose_axes( n ):
if n % 2 == 0:
y_axes = list(range(1, n-1, 2))
x_axes = list(range(0, n-1, 2))
else:
y_axes = list(range(0, n-1, 2))
x_axes = list(range(1, n-1, 2))
return y_axes, x_axes, [n-1]
def stack_images(images):
images_shape = np.array(images.shape)
new_axes = get_transpose_axes(len(images_shape))
new_shape = [np.prod(images_shape[x]) for x in new_axes]
return np.transpose(
images,
axes = np.concatenate(new_axes)
).reshape(new_shape)
def showG(test_A, test_B, path_A, path_B, batchSize):
figure_A = np.stack([
test_A,
np.squeeze(np.array([path_A([test_A[i:i+1]]) for i in range(test_A.shape[0])])),
np.squeeze(np.array([path_B([test_A[i:i+1]]) for i in range(test_A.shape[0])])),
], axis=1 )
figure_B = np.stack([
test_B,
np.squeeze(np.array([path_B([test_B[i:i+1]]) for i in range(test_B.shape[0])])),
np.squeeze(np.array([path_A([test_B[i:i+1]]) for i in range(test_B.shape[0])])),
], axis=1 )
figure = np.concatenate([figure_A, figure_B], axis=0)
figure = figure.reshape((4,batchSize//2) + figure.shape[1:])
figure = stack_images(figure)
figure = np.clip((figure + 1) * 255 / 2, 0, 255).astype('uint8')
figure = cv2.cvtColor(figure, cv2.COLOR_BGR2RGB)
display(Image.fromarray(figure))
def showG_mask(test_A, test_B, path_A, path_B, batchSize):
figure_A = np.stack([
test_A,
(np.squeeze(np.array([path_A([test_A[i:i+1]]) for i in range(test_A.shape[0])])))*2-1,
(np.squeeze(np.array([path_B([test_A[i:i+1]]) for i in range(test_A.shape[0])])))*2-1,
], axis=1 )
figure_B = np.stack([
test_B,
(np.squeeze(np.array([path_B([test_B[i:i+1]]) for i in range(test_B.shape[0])])))*2-1,
(np.squeeze(np.array([path_A([test_B[i:i+1]]) for i in range(test_B.shape[0])])))*2-1,
], axis=1 )
figure = np.concatenate([figure_A, figure_B], axis=0)
figure = figure.reshape((4,batchSize//2) + figure.shape[1:])
figure = stack_images(figure)
figure = np.clip((figure + 1) * 255 / 2, 0, 255).astype('uint8')
figure = cv2.cvtColor(figure, cv2.COLOR_BGR2RGB)
display(Image.fromarray(figure))
def showG_eyes(test_A, test_B, bm_eyes_A, bm_eyes_B, batchSize):
figure_A = np.stack([
(test_A + 1)/2,
bm_eyes_A,
bm_eyes_A * (test_A + 1)/2,
], axis=1 )
figure_B = np.stack([
(test_B + 1)/2,
bm_eyes_B,
bm_eyes_B * (test_B+1)/2,
], axis=1 )
figure = np.concatenate([figure_A, figure_B], axis=0)
figure = figure.reshape((4,batchSize//2) + figure.shape[1:])
figure = stack_images(figure)
figure = np.clip(figure * 255, 0, 255).astype('uint8')
figure = cv2.cvtColor(figure, cv2.COLOR_BGR2RGB)
display(Image.fromarray(figure))
def save_preview_image(test_A, test_B,
path_A, path_B,
path_bgr_A, path_bgr_B,
path_mask_A, path_mask_B,
batchSize, save_fn="preview.jpg"):
figure_A = np.stack([
test_A,
np.squeeze(np.array([path_bgr_B([test_A[i:i+1]]) for i in range(test_A.shape[0])])),
(np.squeeze(np.array([path_mask_B([test_A[i:i+1]]) for i in range(test_A.shape[0])])))*2-1,
np.squeeze(np.array([path_B([test_A[i:i+1]]) for i in range(test_A.shape[0])])),
], axis=1 )
figure_B = np.stack([
test_B,
np.squeeze(np.array([path_bgr_A([test_B[i:i+1]]) for i in range(test_B.shape[0])])),
(np.squeeze(np.array([path_mask_A([test_B[i:i+1]]) for i in range(test_B.shape[0])])))*2-1,
np.squeeze(np.array([path_A([test_B[i:i+1]]) for i in range(test_B.shape[0])])),
], axis=1 )
figure = np.concatenate([figure_A, figure_B], axis=0)
figure = figure.reshape((4,batchSize//2) + figure.shape[1:])
figure = stack_images(figure)
figure = np.clip((figure + 1) * 255 / 2, 0, 255).astype('uint8')
cv2.imwrite(save_fn, figure)
def load_yaml(path_configs):
with open(path_configs, 'r') as f:
return yaml.load(f)
def show_loss_config(loss_config):
"""
Print out loss configuration. Called in loss function automation.
Argument:
loss_config: A dictionary. Configuration regarding the optimization.
"""
for config, value in loss_config.items():
print(f"{config} = {value}")