victorisgeek commited on
Commit
a97be07
1 Parent(s): 98b2f02

Upload 8 files

Browse files
Files changed (8) hide show
  1. .pre-commit-config.yaml +35 -0
  2. .style.yapf +3 -0
  3. requirements.txt +5 -0
  4. run_faceswapper.py +106 -0
  5. run_posetransfer.py +103 -0
  6. setup.py +21 -0
  7. test.sh +13 -0
  8. web_ui.py +194 -0
.pre-commit-config.yaml ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: yapf
5
+ name: yapf
6
+ entry: yapf --style .style.yapf -i
7
+ language: system
8
+ files: \.py$
9
+
10
+ - repo: https://github.com/pre-commit/pre-commit-hooks
11
+ rev: a11d9314b22d8f8c7556443875b731ef05965464
12
+ hooks:
13
+ - id: check-merge-conflict
14
+ - id: check-symlinks
15
+ - id: end-of-file-fixer
16
+ - id: trailing-whitespace
17
+ - id: detect-private-key
18
+ - id: check-added-large-files
19
+
20
+ - repo: local
21
+ hooks:
22
+ - id: flake8
23
+ name: flake8
24
+ entry: flake8 --count --select=E9,F63,F7,F82 --show-source --statistics
25
+ language: system
26
+ files: \.py$
27
+
28
+ - repo: local
29
+ hooks:
30
+ - id: clang-format-with-version-check
31
+ name: clang-format
32
+ description: Format files with ClangFormat
33
+ entry: bash .clang_format.hook -style=Google -i
34
+ language: system
35
+ files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|cuh|proto)$
.style.yapf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ [style]
2
+ based_on_style = pep8
3
+ column_limit = 80
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ moviepy
2
+ gradio>=4.8
3
+ insightface
4
+ flake8
5
+ yapf
run_faceswapper.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ from dofaker import FaceSwapper
3
+
4
+
5
+ def parse_args():
6
+ parser = argparse.ArgumentParser(description='running face swap')
7
+ parser.add_argument('--source',
8
+ help='select an image or video to be swapped',
9
+ dest='source',
10
+ required=True)
11
+ parser.add_argument('--dst_face_paths',
12
+ help='select images in source to be swapped',
13
+ dest='dst_face_paths',
14
+ nargs='+',
15
+ default=None)
16
+ parser.add_argument(
17
+ '--src_face_paths',
18
+ help='select images to replace dst_faces in source image or video.',
19
+ dest='src_face_paths',
20
+ nargs='+',
21
+ required=True)
22
+ parser.add_argument('--output_dir',
23
+ help='output directory',
24
+ dest='output_dir',
25
+ default='output')
26
+ parser.add_argument('--det_model_name',
27
+ help='detection model name for insightface',
28
+ dest='det_model_name',
29
+ default='buffalo_l')
30
+ parser.add_argument('--det_model_dir',
31
+ help='detection model dir for insightface',
32
+ dest='det_model_dir',
33
+ default='weights/models')
34
+ parser.add_argument('--swap_model_name',
35
+ help='swap model name',
36
+ dest='swap_model_name',
37
+ default='inswapper')
38
+ parser.add_argument('--image_sr_model',
39
+ help='image super resolution model',
40
+ dest='image_sr_model',
41
+ default='bsrgan')
42
+ parser.add_argument('--face_swap_model_dir',
43
+ help='swap model path',
44
+ dest='face_swap_model_dir',
45
+ default='weights/models')
46
+ parser.add_argument('--image_sr_model_dir',
47
+ help='image super resolution model dir',
48
+ dest='image_sr_model_dir',
49
+ default='weights/models')
50
+ parser.add_argument('--face_enhance_name',
51
+ help='face enhance model',
52
+ dest='face_enhance_name',
53
+ default='gfpgan')
54
+ parser.add_argument('--face_enhance_model_dir',
55
+ help='face enhance model dir',
56
+ dest='face_enhance_model_dir',
57
+ default='weights/models')
58
+ parser.add_argument('--face_sim_thre',
59
+ help='similarity of face embedding threshold',
60
+ dest='face_sim_thre',
61
+ default=0.5)
62
+ parser.add_argument('--log_iters',
63
+ help='print log intervals',
64
+ dest='log_iters',
65
+ default=10,
66
+ type=int)
67
+ parser.add_argument('--use_enhancer',
68
+ help='whether use face enhance model',
69
+ dest='use_enhancer',
70
+ action='store_true')
71
+ parser.add_argument('--use_sr',
72
+ help='whether use image super resolution model',
73
+ dest='use_sr',
74
+ action='store_true')
75
+ parser.add_argument('--sr_scale',
76
+ help='image super resolution scale',
77
+ dest='sr_scale',
78
+ default=1,
79
+ type=float)
80
+ return parser.parse_args()
81
+
82
+
83
+ if __name__ == '__main__':
84
+ args = parse_args()
85
+ faker = FaceSwapper(
86
+ face_det_model=args.det_model_name,
87
+ face_det_model_dir=args.det_model_dir,
88
+ face_swap_model=args.swap_model_name,
89
+ face_swap_model_dir=args.face_swap_model_dir,
90
+ image_sr_model=args.image_sr_model,
91
+ image_sr_model_dir=args.image_sr_model_dir,
92
+ face_enhance_model=args.face_enhance_name,
93
+ face_enhance_model_dir=args.face_enhance_model_dir,
94
+ face_sim_thre=args.face_sim_thre,
95
+ log_iters=args.log_iters,
96
+ use_enhancer=args.use_enhancer,
97
+ use_sr=args.use_sr,
98
+ scale=args.sr_scale,
99
+ )
100
+
101
+ faker.run(
102
+ input_path=args.source,
103
+ dst_face_paths=args.dst_face_paths,
104
+ src_face_paths=args.src_face_paths,
105
+ output_dir=args.output_dir,
106
+ )
run_posetransfer.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ from dofaker import PoseSwapper
3
+
4
+
5
+ def parse_args():
6
+ parser = argparse.ArgumentParser(description='running face swap')
7
+ parser.add_argument('--source',
8
+ help='select an image or video to be swapped',
9
+ dest='source',
10
+ required=True)
11
+ parser.add_argument('--target',
12
+ help='the target pose image',
13
+ dest='target',
14
+ required=True)
15
+ parser.add_argument('--output_dir',
16
+ help='output directory',
17
+ dest='output_dir',
18
+ default='output')
19
+ parser.add_argument('--pose_estimator_name',
20
+ help='pose estimator name',
21
+ dest='pose_estimator_name',
22
+ default='openpose_body')
23
+ parser.add_argument('--pose_estimator_model_dir',
24
+ help='pose estimator model dir',
25
+ dest='pose_estimator_model_dir',
26
+ default='weights/models')
27
+ parser.add_argument('--pose_transfer_name',
28
+ help='pose transfer name',
29
+ dest='pose_transfer_name',
30
+ default='pose_transfer')
31
+ parser.add_argument('--pose_transfer_model_dir',
32
+ help='pose transfer model dir',
33
+ dest='pose_transfer_model_dir',
34
+ default='weights/models')
35
+ parser.add_argument('--det_model_name',
36
+ help='detection model name for insightface',
37
+ dest='det_model_name',
38
+ default='buffalo_l')
39
+ parser.add_argument('--det_model_dir',
40
+ help='detection model dir for insightface',
41
+ dest='det_model_dir',
42
+ default='weights/models')
43
+ parser.add_argument('--image_sr_model',
44
+ help='image super resolution model',
45
+ dest='image_sr_model',
46
+ default='bsrgan')
47
+ parser.add_argument('--image_sr_model_dir',
48
+ help='image super resolution model dir',
49
+ dest='image_sr_model_dir',
50
+ default='weights/models')
51
+ parser.add_argument('--face_enhance_name',
52
+ help='face enhance model',
53
+ dest='face_enhance_name',
54
+ default='gfpgan')
55
+ parser.add_argument('--face_enhance_model_dir',
56
+ help='face enhance model dir',
57
+ dest='face_enhance_model_dir',
58
+ default='weights/models')
59
+ parser.add_argument('--log_iters',
60
+ help='print log intervals',
61
+ dest='log_iters',
62
+ default=10,
63
+ type=int)
64
+ parser.add_argument('--use_enhancer',
65
+ help='whether use face enhance model',
66
+ dest='use_enhancer',
67
+ action='store_true')
68
+ parser.add_argument('--use_sr',
69
+ help='whether use image super resolution model',
70
+ dest='use_sr',
71
+ action='store_true')
72
+ parser.add_argument('--sr_scale',
73
+ help='image super resolution scale',
74
+ dest='sr_scale',
75
+ default=1,
76
+ type=float)
77
+ return parser.parse_args()
78
+
79
+
80
+ if __name__ == '__main__':
81
+ args = parse_args()
82
+ faker = PoseSwapper(
83
+ pose_estimator_name=args.pose_estimator_name,
84
+ pose_estimator_model_dir=args.pose_estimator_model_dir,
85
+ pose_transfer_name=args.pose_transfer_name,
86
+ pose_transfer_model_dir=args.pose_transfer_model_dir,
87
+ face_det_model=args.det_model_name,
88
+ face_det_model_dir=args.det_model_dir,
89
+ image_sr_model=args.image_sr_model,
90
+ image_sr_model_dir=args.image_sr_model_dir,
91
+ face_enhance_name=args.face_enhance_name,
92
+ face_enhance_model_dir=args.face_enhance_model_dir,
93
+ log_iters=args.log_iters,
94
+ use_enhancer=args.use_enhancer,
95
+ use_sr=args.use_sr,
96
+ scale=args.sr_scale,
97
+ )
98
+
99
+ faker.run(
100
+ input_path=args.source,
101
+ target_path=args.target,
102
+ output_dir=args.output_dir,
103
+ )
setup.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from setuptools import setup, find_packages
2
+
3
+ with open('requirements.txt') as file:
4
+ REQUIRED_PACKAGES = file.read()
5
+
6
+ setup(name='dofaker',
7
+ version='0.1',
8
+ keywords=('face swap'),
9
+ description='A simple face swap tool',
10
+ url='https://github.com/justld/dofaker',
11
+ author='justld',
12
+ author_email='1207540056@qq.com',
13
+ packages=find_packages(),
14
+ include_package_data=True,
15
+ platforms='any',
16
+ install_requires=REQUIRED_PACKAGES,
17
+ scripts=[],
18
+ license='GPL 3.0',
19
+ entry_points={'console_scripts': [
20
+ 'dofaker = web_ui:main',
21
+ ]})
test.sh ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # python run_faceswapper.py --source docs/test/multi.png --dst_face_paths docs/test/dst1.png --src_face_paths docs/test/trump.jpg
2
+
3
+ # python run_faceswapper.py --source docs/test/multi.png --dst_face_paths docs/test/dst1.png docs/test/dst2.png --src_face_paths docs/test/trump.jpg docs/test/taitan.jpeg
4
+
5
+ # python run_faceswapper.py --source docs/test/multi.png --dst_face_paths docs/test/dst1.png docs/test/dst2.png --src_face_paths docs/test/trump.jpg docs/test/taitan.jpeg --use_enhancer
6
+
7
+ python run_faceswapper.py --source docs/test/multi.png --dst_face_paths docs/test/dst1.png docs/test/dst2.png --src_face_paths docs/test/trump.jpg docs/test/taitan.jpeg --use_enhancer --use_sr --sr_scale 2.0
8
+
9
+ # python run_posetransfer.py --source docs/test/condition.jpg --target docs/test/target_pose_reference.jpg
10
+
11
+ # python run_posetransfer.py --source docs/test/condition.jpg --target docs/test/target_pose_reference.jpg --use_enhancer
12
+
13
+ python run_posetransfer.py --source docs/test/condition.jpg --target docs/test/target_pose_reference.jpg --use_enhancer --use_sr --sr_scale 2.0
web_ui.py ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+
3
+ import gradio as gr
4
+ from dofaker import FaceSwapper, PoseSwapper
5
+
6
+
7
+ def parse_args():
8
+ parser = argparse.ArgumentParser(description='running face swap')
9
+ parser.add_argument(
10
+ '--inbrowser',
11
+ help=
12
+ 'whether to automatically launch the interface in a new tab on the default browser.',
13
+ dest='inbrowser',
14
+ default=True)
15
+ parser.add_argument(
16
+ '--server_port',
17
+ help=
18
+ 'will start gradio app on this port (if available). Can be set by environment variable GRADIO_SERVER_PORT. If None, will search for an available port starting at 7860.',
19
+ dest='server_port',
20
+ type=int,
21
+ default=None)
22
+ return parser.parse_args()
23
+
24
+
25
+ def swap_face(input_path, dst_path, src_path, use_enhancer, use_sr, scale,
26
+ face_sim_thre):
27
+ faker = FaceSwapper(use_enhancer=use_enhancer,
28
+ use_sr=use_sr,
29
+ scale=scale,
30
+ face_sim_thre=face_sim_thre)
31
+ output_path = faker.run(input_path, dst_path, src_path)
32
+ return output_path
33
+
34
+
35
+ def swap_pose(input_path, target_path, use_enhancer, use_sr, scale):
36
+ faker = PoseSwapper(use_enhancer=use_enhancer, use_sr=use_sr, scale=scale)
37
+ output_path = faker.run(input_path, target_path)
38
+ return output_path
39
+
40
+
41
+ def main():
42
+ args = parse_args()
43
+
44
+ with gr.Blocks(title='DoFaker') as web_ui:
45
+ gr.Markdown('DoFaker: Face Swap and pose swap web ui')
46
+ with gr.Tab('FaceSwapper'):
47
+ gr.Markdown('DoFaker: Face Swap Web UI')
48
+ with gr.Tab('Image'):
49
+ with gr.Row():
50
+ with gr.Column():
51
+ gr.Markdown('The source image to be swapped')
52
+ image_input = gr.Image(type='filepath')
53
+ with gr.Row():
54
+ with gr.Column():
55
+ gr.Markdown(
56
+ 'target face included in source image')
57
+ dst_face_image = gr.Image(type='filepath')
58
+ with gr.Column():
59
+ gr.Markdown(
60
+ 'source face to replace target face')
61
+ src_face_image = gr.Image(type='filepath')
62
+
63
+ with gr.Column():
64
+ output_image = gr.Image(type='filepath')
65
+ use_enhancer = gr.Checkbox(
66
+ label="face enhance",
67
+ info="Whether use face enhance model.")
68
+ with gr.Row():
69
+ use_sr = gr.Checkbox(
70
+ label="super resolution",
71
+ info="Whether use image resolution model.")
72
+ scale = gr.Number(
73
+ value=1, label='image super resolution scale')
74
+ with gr.Row():
75
+ face_sim_thre = gr.Number(
76
+ value=0.6,
77
+ label='face similarity threshold',
78
+ minimum=0.0,
79
+ maximum=1.0)
80
+ convert_button = gr.Button('Swap')
81
+ convert_button.click(fn=swap_face,
82
+ inputs=[
83
+ image_input, dst_face_image,
84
+ src_face_image, use_enhancer,
85
+ use_sr, scale, face_sim_thre
86
+ ],
87
+ outputs=[output_image],
88
+ api_name='image swap')
89
+
90
+ with gr.Tab('Video'):
91
+ with gr.Row():
92
+ with gr.Column():
93
+ gr.Markdown('The source video to be swapped')
94
+ video_input = gr.Video()
95
+ with gr.Row():
96
+ with gr.Column():
97
+ gr.Markdown(
98
+ 'target face included in source image')
99
+ dst_face_image = gr.Image(type='filepath')
100
+ with gr.Column():
101
+ gr.Markdown(
102
+ 'source face to replace target face')
103
+ src_face_image = gr.Image(type='filepath')
104
+
105
+ with gr.Column():
106
+ output_video = gr.Video()
107
+ use_enhancer = gr.Checkbox(
108
+ label="face enhance",
109
+ info="Whether use face enhance model.")
110
+ with gr.Row():
111
+ use_sr = gr.Checkbox(
112
+ label="super resolution",
113
+ info="Whether use image resolution model.")
114
+ scale = gr.Number(
115
+ value=1, label='image super resolution scale')
116
+ with gr.Row():
117
+ face_sim_thre = gr.Number(
118
+ value=0.6,
119
+ label='face similarity threshold',
120
+ minimum=0.0,
121
+ maximum=1.0)
122
+ convert_button = gr.Button('Swap')
123
+ convert_button.click(fn=swap_face,
124
+ inputs=[
125
+ video_input, dst_face_image,
126
+ src_face_image, use_enhancer,
127
+ use_sr, scale, face_sim_thre
128
+ ],
129
+ outputs=[output_video],
130
+ api_name='video swap')
131
+
132
+ with gr.Tab('PoseSwapper'):
133
+ gr.Markdown('DoFaker: Pose Swap Web UI')
134
+ with gr.Tab('Image'):
135
+ with gr.Row():
136
+ with gr.Column():
137
+ gr.Markdown('The source image to be swapped')
138
+ image_input = gr.Image(type='filepath')
139
+ gr.Markdown('The target image with pose')
140
+ target = gr.Image(type='filepath')
141
+
142
+ with gr.Column():
143
+ output_image = gr.Image(type='filepath')
144
+ use_enhancer = gr.Checkbox(
145
+ label="face enhance",
146
+ info="Whether use face enhance model.")
147
+ with gr.Row():
148
+ use_sr = gr.Checkbox(
149
+ label="super resolution",
150
+ info="Whether use image resolution model.")
151
+ scale = gr.Number(
152
+ value=1, label='image super resolution scale')
153
+ convert_button = gr.Button('Swap')
154
+ convert_button.click(fn=swap_pose,
155
+ inputs=[
156
+ image_input, target,
157
+ use_enhancer, use_sr, scale
158
+ ],
159
+ outputs=[output_image],
160
+ api_name='image swap')
161
+
162
+ # with gr.Tab('Video'):
163
+ # with gr.Row():
164
+ # with gr.Column():
165
+ # gr.Markdown('The source video to be swapped')
166
+ # video_input = gr.Image(type='filepath')
167
+ # gr.Markdown('The target image with pose')
168
+ # target = gr.Video()
169
+
170
+ # with gr.Column():
171
+ # output_video = gr.Video()
172
+ # use_enhancer = gr.Checkbox(
173
+ # label="face enhance",
174
+ # info="Whether use face enhance model.")
175
+ # with gr.Row():
176
+ # use_sr = gr.Checkbox(
177
+ # label="super resolution",
178
+ # info="Whether use image resolution model.")
179
+ # scale = gr.Number(value=1,
180
+ # label='image super resolution scale')
181
+ # convert_button = gr.Button('Swap')
182
+ # convert_button.click(fn=swap_pose,
183
+ # inputs=[
184
+ # video_input, target, use_enhancer,
185
+ # use_sr, scale
186
+ # ],
187
+ # outputs=[output_video],
188
+ # api_name='video swap')
189
+
190
+ web_ui.launch(inbrowser=args.inbrowser, server_port=args.server_port)
191
+
192
+
193
+ if __name__ == '__main__':
194
+ main()