Spaces:
Running
Running
felixrosberg
commited on
Commit
β’
eccdcbe
1
Parent(s):
12bb2e4
webcam, anonymization, compare setting/support
Browse files- .idea/vcs.xml +3 -0
- app.py +33 -12
- 9538.png β assets/girl_0.png +0 -0
- 10017.png β assets/girl_1.png +0 -0
- elon_musk_example.jpg β assets/musk.jpg +0 -0
- rick_astely_example.jpg β assets/rick.jpg +0 -0
.idea/vcs.xml
CHANGED
@@ -2,5 +2,8 @@
|
|
2 |
<project version="4">
|
3 |
<component name="VcsDirectoryMappings">
|
4 |
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
|
|
|
|
|
5 |
</component>
|
6 |
</project>
|
|
|
2 |
<project version="4">
|
3 |
<component name="VcsDirectoryMappings">
|
4 |
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
5 |
+
<mapping directory="$PROJECT_DIR$/arcface_model" vcs="Git" />
|
6 |
+
<mapping directory="$PROJECT_DIR$/g_model" vcs="Git" />
|
7 |
+
<mapping directory="$PROJECT_DIR$/retina_model" vcs="Git" />
|
8 |
</component>
|
9 |
</project>
|
app.py
CHANGED
@@ -13,7 +13,7 @@ from tensorflow.keras.models import load_model
|
|
13 |
from options.swap_options import SwapOptions
|
14 |
|
15 |
# Invalidated!
|
16 |
-
token =
|
17 |
|
18 |
opt = SwapOptions().parse()
|
19 |
|
@@ -44,17 +44,20 @@ blend_mask_base[80:250, 32:224] = 1
|
|
44 |
blend_mask_base = gaussian_filter(blend_mask_base, sigma=7)
|
45 |
|
46 |
|
47 |
-
def run_inference(target, source):
|
48 |
try:
|
49 |
source = np.array(source)
|
50 |
target = np.array(target)
|
51 |
|
52 |
# Prepare to load video
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
|
|
|
|
|
|
58 |
|
59 |
# read frame
|
60 |
im = target
|
@@ -79,6 +82,14 @@ def run_inference(target, source):
|
|
79 |
# align the detected face
|
80 |
M, pose_index = estimate_norm(lm_align, 256, "arcface", shrink_factor=1.0)
|
81 |
im_aligned = cv2.warpAffine(im, M, (256, 256), borderValue=0.0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
# face swap
|
84 |
changed_face_cage = G.predict([np.expand_dims((im_aligned - 127.5) / 127.5, axis=0),
|
@@ -97,7 +108,7 @@ def run_inference(target, source):
|
|
97 |
blend_mask = np.expand_dims(blend_mask, axis=-1)
|
98 |
total_img = (iim_aligned * blend_mask + total_img * (1 - blend_mask))
|
99 |
|
100 |
-
if
|
101 |
total_img = np.concatenate((im / 255.0, total_img), axis=1)
|
102 |
|
103 |
total_img = np.clip(total_img, 0, 1)
|
@@ -109,15 +120,25 @@ def run_inference(target, source):
|
|
109 |
print(e)
|
110 |
return None
|
111 |
|
112 |
-
|
113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
article="""
|
115 |
Demo is based of recent research from my Ph.D work. Results expects to be published in the coming months.
|
116 |
"""
|
117 |
|
118 |
iface = gradio.Interface(run_inference,
|
119 |
-
[gradio.inputs.Image(shape=None),
|
120 |
-
gradio.inputs.Image(shape=None)
|
|
|
|
|
121 |
gradio.outputs.Image(),
|
122 |
title="Face Swap",
|
123 |
description=description,
|
|
|
13 |
from options.swap_options import SwapOptions
|
14 |
|
15 |
# Invalidated!
|
16 |
+
token = os.environ['model_fetch']
|
17 |
|
18 |
opt = SwapOptions().parse()
|
19 |
|
|
|
44 |
blend_mask_base = gaussian_filter(blend_mask_base, sigma=7)
|
45 |
|
46 |
|
47 |
+
def run_inference(target, source, slider, settings):
|
48 |
try:
|
49 |
source = np.array(source)
|
50 |
target = np.array(target)
|
51 |
|
52 |
# Prepare to load video
|
53 |
+
if "anonymize" not in settings:
|
54 |
+
source_a = RetinaFace(np.expand_dims(source, axis=0)).numpy()[0]
|
55 |
+
source_h, source_w, _ = source.shape
|
56 |
+
source_lm = get_lm(source_a, source_w, source_h)
|
57 |
+
source_aligned = norm_crop(source, source_lm, image_size=256)
|
58 |
+
source_z = ArcFace.predict(np.expand_dims(tf.image.resize(source_aligned, [112, 112]) / 255.0, axis=0))
|
59 |
+
else:
|
60 |
+
source_z = None
|
61 |
|
62 |
# read frame
|
63 |
im = target
|
|
|
82 |
# align the detected face
|
83 |
M, pose_index = estimate_norm(lm_align, 256, "arcface", shrink_factor=1.0)
|
84 |
im_aligned = cv2.warpAffine(im, M, (256, 256), borderValue=0.0)
|
85 |
+
|
86 |
+
if "anonymize" in settings:
|
87 |
+
source_z = ArcFace.predict(np.expand_dims(tf.image.resize(im_aligned, [112, 112]) / 255.0, axis=0))
|
88 |
+
anon_ratio = int(512 * (slider / 100))
|
89 |
+
anon_vector = np.ones(shape=(1, 512))
|
90 |
+
anon_vector[:, :anon_ratio] = -1
|
91 |
+
np.random.shuffle(anon_vector)
|
92 |
+
source_z *= anon_vector
|
93 |
|
94 |
# face swap
|
95 |
changed_face_cage = G.predict([np.expand_dims((im_aligned - 127.5) / 127.5, axis=0),
|
|
|
108 |
blend_mask = np.expand_dims(blend_mask, axis=-1)
|
109 |
total_img = (iim_aligned * blend_mask + total_img * (1 - blend_mask))
|
110 |
|
111 |
+
if "compare" in settings:
|
112 |
total_img = np.concatenate((im / 255.0, total_img), axis=1)
|
113 |
|
114 |
total_img = np.clip(total_img, 0, 1)
|
|
|
120 |
print(e)
|
121 |
return None
|
122 |
|
123 |
+
|
124 |
+
description = "Performs subject agnostic identity transfer from a source face to all target faces. \n\n" \
|
125 |
+
"Options:\n" \
|
126 |
+
"compare returns the target image concatenated with the results.\n" \
|
127 |
+
"anonymize will ignore the source image and perform an identity permutation of target faces.\n" \
|
128 |
+
"\n" \
|
129 |
+
"Note, source image with too high resolution may not work properly!"
|
130 |
+
examples = [["assets/rick.jpg", "assets/musk.jpg", 80, ["compare"]],
|
131 |
+
["assets/girl_1.png", "assets/girl_0.png", 80, []],
|
132 |
+
["assets/musk.jpg", "assets/musk.jpg", 30, ["anonymize"]]]
|
133 |
article="""
|
134 |
Demo is based of recent research from my Ph.D work. Results expects to be published in the coming months.
|
135 |
"""
|
136 |
|
137 |
iface = gradio.Interface(run_inference,
|
138 |
+
[gradio.inputs.Image(shape=None, label='Target', source='webcam'),
|
139 |
+
gradio.inputs.Image(shape=None, label='Source'),
|
140 |
+
gradio.inputs.Slider(0, 100, default=80, label="Anonymization ratio (%)"),
|
141 |
+
gradio.inputs.CheckboxGroup(["compare", "anonymize"], label='Options')],
|
142 |
gradio.outputs.Image(),
|
143 |
title="Face Swap",
|
144 |
description=description,
|
9538.png β assets/girl_0.png
RENAMED
File without changes
|
10017.png β assets/girl_1.png
RENAMED
File without changes
|
elon_musk_example.jpg β assets/musk.jpg
RENAMED
File without changes
|
rick_astely_example.jpg β assets/rick.jpg
RENAMED
File without changes
|