Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

main.py 22 KB

You have to be logged in to leave a comment. Sign In
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
  1. if __name__ == "__main__":
  2. # Fix for linux
  3. import multiprocessing
  4. multiprocessing.set_start_method("spawn")
  5. from core.leras import nn
  6. nn.initialize_main_env()
  7. import os
  8. import sys
  9. import time
  10. import argparse
  11. from core import pathex
  12. from core import osex
  13. from pathlib import Path
  14. from core.interact import interact as io
  15. if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] < 6):
  16. raise Exception("This program requires at least Python 3.6")
  17. class fixPathAction(argparse.Action):
  18. def __call__(self, parser, namespace, values, option_string=None):
  19. setattr(namespace, self.dest, os.path.abspath(os.path.expanduser(values)))
  20. exit_code = 0
  21. parser = argparse.ArgumentParser()
  22. subparsers = parser.add_subparsers()
  23. def process_extract(arguments):
  24. osex.set_process_lowest_prio()
  25. from mainscripts import Extractor
  26. Extractor.main( detector = arguments.detector,
  27. input_path = Path(arguments.input_dir),
  28. output_path = Path(arguments.output_dir),
  29. output_debug = arguments.output_debug,
  30. manual_fix = arguments.manual_fix,
  31. manual_output_debug_fix = arguments.manual_output_debug_fix,
  32. manual_window_size = arguments.manual_window_size,
  33. face_type = arguments.face_type,
  34. max_faces_from_image = arguments.max_faces_from_image,
  35. image_size = arguments.image_size,
  36. jpeg_quality = arguments.jpeg_quality,
  37. cpu_only = arguments.cpu_only,
  38. force_gpu_idxs = [ int(x) for x in arguments.force_gpu_idxs.split(',') ] if arguments.force_gpu_idxs is not None else None,
  39. )
  40. p = subparsers.add_parser( "extract", help="Extract the faces from a pictures.")
  41. p.add_argument('--detector', dest="detector", choices=['s3fd','manual'], default=None, help="Type of detector.")
  42. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory. A directory containing the files you wish to process.")
  43. p.add_argument('--output-dir', required=True, action=fixPathAction, dest="output_dir", help="Output directory. This is where the extracted files will be stored.")
  44. p.add_argument('--output-debug', action="store_true", dest="output_debug", default=None, help="Writes debug images to <output-dir>_debug\ directory.")
  45. p.add_argument('--no-output-debug', action="store_false", dest="output_debug", default=None, help="Don't writes debug images to <output-dir>_debug\ directory.")
  46. p.add_argument('--face-type', dest="face_type", choices=['half_face', 'full_face', 'whole_face', 'head', 'mark_only'], default=None)
  47. p.add_argument('--max-faces-from-image', type=int, dest="max_faces_from_image", default=None, help="Max faces from image.")
  48. p.add_argument('--image-size', type=int, dest="image_size", default=None, help="Output image size.")
  49. p.add_argument('--jpeg-quality', type=int, dest="jpeg_quality", default=None, help="Jpeg quality.")
  50. p.add_argument('--manual-fix', action="store_true", dest="manual_fix", default=False, help="Enables manual extract only frames where faces were not recognized.")
  51. p.add_argument('--manual-output-debug-fix', action="store_true", dest="manual_output_debug_fix", default=False, help="Performs manual reextract input-dir frames which were deleted from [output_dir]_debug\ dir.")
  52. p.add_argument('--manual-window-size', type=int, dest="manual_window_size", default=1368, help="Manual fix window size. Default: 1368.")
  53. p.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Extract on CPU..")
  54. p.add_argument('--force-gpu-idxs', dest="force_gpu_idxs", default=None, help="Force to choose GPU indexes separated by comma.")
  55. p.set_defaults (func=process_extract)
  56. def process_sort(arguments):
  57. osex.set_process_lowest_prio()
  58. from mainscripts import Sorter
  59. Sorter.main (input_path=Path(arguments.input_dir), sort_by_method=arguments.sort_by_method)
  60. p = subparsers.add_parser( "sort", help="Sort faces in a directory.")
  61. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory. A directory containing the files you wish to process.")
  62. p.add_argument('--by', dest="sort_by_method", default=None, choices=("blur", "motion-blur", "face-yaw", "face-pitch", "face-source-rect-size", "hist", "hist-dissim", "brightness", "hue", "black", "origname", "oneface", "final-by-blur", "final-by-size", "absdiff"), help="Method of sorting. 'origname' sort by original filename to recover original sequence." )
  63. p.set_defaults (func=process_sort)
  64. def process_util(arguments):
  65. osex.set_process_lowest_prio()
  66. from mainscripts import Util
  67. if arguments.add_landmarks_debug_images:
  68. Util.add_landmarks_debug_images (input_path=arguments.input_dir)
  69. if arguments.recover_original_aligned_filename:
  70. Util.recover_original_aligned_filename (input_path=arguments.input_dir)
  71. if arguments.save_faceset_metadata:
  72. Util.save_faceset_metadata_folder (input_path=arguments.input_dir)
  73. if arguments.restore_faceset_metadata:
  74. Util.restore_faceset_metadata_folder (input_path=arguments.input_dir)
  75. if arguments.pack_faceset:
  76. io.log_info ("Performing faceset packing...\r\n")
  77. from samplelib import PackedFaceset
  78. PackedFaceset.pack( Path(arguments.input_dir) )
  79. if arguments.unpack_faceset:
  80. io.log_info ("Performing faceset unpacking...\r\n")
  81. from samplelib import PackedFaceset
  82. PackedFaceset.unpack( Path(arguments.input_dir) )
  83. p = subparsers.add_parser( "util", help="Utilities.")
  84. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory. A directory containing the files you wish to process.")
  85. p.add_argument('--add-landmarks-debug-images', action="store_true", dest="add_landmarks_debug_images", default=False, help="Add landmarks debug image for aligned faces.")
  86. p.add_argument('--recover-original-aligned-filename', action="store_true", dest="recover_original_aligned_filename", default=False, help="Recover original aligned filename.")
  87. p.add_argument('--save-faceset-metadata', action="store_true", dest="save_faceset_metadata", default=False, help="Save faceset metadata to file.")
  88. p.add_argument('--restore-faceset-metadata', action="store_true", dest="restore_faceset_metadata", default=False, help="Restore faceset metadata to file. Image filenames must be the same as used with save.")
  89. p.add_argument('--pack-faceset', action="store_true", dest="pack_faceset", default=False, help="")
  90. p.add_argument('--unpack-faceset', action="store_true", dest="unpack_faceset", default=False, help="")
  91. p.set_defaults (func=process_util)
  92. def process_train(arguments):
  93. osex.set_process_lowest_prio()
  94. kwargs = {'model_class_name' : arguments.model_name,
  95. 'saved_models_path' : Path(arguments.model_dir),
  96. 'training_data_src_path' : Path(arguments.training_data_src_dir),
  97. 'training_data_dst_path' : Path(arguments.training_data_dst_dir),
  98. 'pretraining_data_path' : Path(arguments.pretraining_data_dir) if arguments.pretraining_data_dir is not None else None,
  99. 'pretrained_model_path' : Path(arguments.pretrained_model_dir) if arguments.pretrained_model_dir is not None else None,
  100. 'no_preview' : arguments.no_preview,
  101. 'force_model_name' : arguments.force_model_name,
  102. 'force_gpu_idxs' : [ int(x) for x in arguments.force_gpu_idxs.split(',') ] if arguments.force_gpu_idxs is not None else None,
  103. 'cpu_only' : arguments.cpu_only,
  104. 'silent_start' : arguments.silent_start,
  105. 'execute_programs' : [ [int(x[0]), x[1] ] for x in arguments.execute_program ],
  106. 'debug' : arguments.debug,
  107. 'dump_ckpt' : arguments.dump_ckpt,
  108. }
  109. from mainscripts import Trainer
  110. Trainer.main(**kwargs)
  111. p = subparsers.add_parser( "train", help="Trainer")
  112. p.add_argument('--training-data-src-dir', required=True, action=fixPathAction, dest="training_data_src_dir", help="Dir of extracted SRC faceset.")
  113. p.add_argument('--training-data-dst-dir', required=True, action=fixPathAction, dest="training_data_dst_dir", help="Dir of extracted DST faceset.")
  114. p.add_argument('--pretraining-data-dir', action=fixPathAction, dest="pretraining_data_dir", default=None, help="Optional dir of extracted faceset that will be used in pretraining mode.")
  115. p.add_argument('--pretrained-model-dir', action=fixPathAction, dest="pretrained_model_dir", default=None, help="Optional dir of pretrain model files. (Currently only for Quick96).")
  116. p.add_argument('--model-dir', required=True, action=fixPathAction, dest="model_dir", help="Saved models dir.")
  117. p.add_argument('--model', required=True, dest="model_name", choices=pathex.get_all_dir_names_startswith ( Path(__file__).parent / 'models' , 'Model_'), help="Model class name.")
  118. p.add_argument('--debug', action="store_true", dest="debug", default=False, help="Debug samples.")
  119. p.add_argument('--no-preview', action="store_true", dest="no_preview", default=False, help="Disable preview window.")
  120. p.add_argument('--force-model-name', dest="force_model_name", default=None, help="Forcing to choose model name from model/ folder.")
  121. p.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Train on CPU.")
  122. p.add_argument('--force-gpu-idxs', dest="force_gpu_idxs", default=None, help="Force to choose GPU indexes separated by comma.")
  123. p.add_argument('--silent-start', action="store_true", dest="silent_start", default=False, help="Silent start. Automatically chooses Best GPU and last used model.")
  124. p.add_argument('--dump-ckpt', action="store_true", dest="dump_ckpt", default=False, help="Dump the model to ckpt format.")
  125. p.add_argument('--execute-program', dest="execute_program", default=[], action='append', nargs='+')
  126. p.set_defaults (func=process_train)
  127. def process_merge(arguments):
  128. osex.set_process_lowest_prio()
  129. from mainscripts import Merger
  130. Merger.main ( model_class_name = arguments.model_name,
  131. saved_models_path = Path(arguments.model_dir),
  132. force_model_name = arguments.force_model_name,
  133. input_path = Path(arguments.input_dir),
  134. output_path = Path(arguments.output_dir),
  135. output_mask_path = Path(arguments.output_mask_dir),
  136. aligned_path = Path(arguments.aligned_dir) if arguments.aligned_dir is not None else None,
  137. force_gpu_idxs = arguments.force_gpu_idxs,
  138. cpu_only = arguments.cpu_only)
  139. p = subparsers.add_parser( "merge", help="Merger")
  140. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory. A directory containing the files you wish to process.")
  141. p.add_argument('--output-dir', required=True, action=fixPathAction, dest="output_dir", help="Output directory. This is where the merged files will be stored.")
  142. p.add_argument('--output-mask-dir', required=True, action=fixPathAction, dest="output_mask_dir", help="Output mask directory. This is where the mask files will be stored.")
  143. p.add_argument('--aligned-dir', action=fixPathAction, dest="aligned_dir", default=None, help="Aligned directory. This is where the extracted of dst faces stored.")
  144. p.add_argument('--model-dir', required=True, action=fixPathAction, dest="model_dir", help="Model dir.")
  145. p.add_argument('--model', required=True, dest="model_name", choices=pathex.get_all_dir_names_startswith ( Path(__file__).parent / 'models' , 'Model_'), help="Model class name.")
  146. p.add_argument('--force-model-name', dest="force_model_name", default=None, help="Forcing to choose model name from model/ folder.")
  147. p.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Merge on CPU.")
  148. p.add_argument('--force-gpu-idxs', dest="force_gpu_idxs", default=None, help="Force to choose GPU indexes separated by comma.")
  149. p.set_defaults(func=process_merge)
  150. videoed_parser = subparsers.add_parser( "videoed", help="Video processing.").add_subparsers()
  151. def process_videoed_extract_video(arguments):
  152. osex.set_process_lowest_prio()
  153. from mainscripts import VideoEd
  154. VideoEd.extract_video (arguments.input_file, arguments.output_dir, arguments.output_ext, arguments.fps)
  155. p = videoed_parser.add_parser( "extract-video", help="Extract images from video file.")
  156. p.add_argument('--input-file', required=True, action=fixPathAction, dest="input_file", help="Input file to be processed. Specify .*-extension to find first file.")
  157. p.add_argument('--output-dir', required=True, action=fixPathAction, dest="output_dir", help="Output directory. This is where the extracted images will be stored.")
  158. p.add_argument('--output-ext', dest="output_ext", default=None, help="Image format (extension) of output files.")
  159. p.add_argument('--fps', type=int, dest="fps", default=None, help="How many frames of every second of the video will be extracted. 0 - full fps.")
  160. p.set_defaults(func=process_videoed_extract_video)
  161. def process_videoed_cut_video(arguments):
  162. osex.set_process_lowest_prio()
  163. from mainscripts import VideoEd
  164. VideoEd.cut_video (arguments.input_file,
  165. arguments.from_time,
  166. arguments.to_time,
  167. arguments.audio_track_id,
  168. arguments.bitrate)
  169. p = videoed_parser.add_parser( "cut-video", help="Cut video file.")
  170. p.add_argument('--input-file', required=True, action=fixPathAction, dest="input_file", help="Input file to be processed. Specify .*-extension to find first file.")
  171. p.add_argument('--from-time', dest="from_time", default=None, help="From time, for example 00:00:00.000")
  172. p.add_argument('--to-time', dest="to_time", default=None, help="To time, for example 00:00:00.000")
  173. p.add_argument('--audio-track-id', type=int, dest="audio_track_id", default=None, help="Specify audio track id.")
  174. p.add_argument('--bitrate', type=int, dest="bitrate", default=None, help="Bitrate of output file in Megabits.")
  175. p.set_defaults(func=process_videoed_cut_video)
  176. def process_videoed_denoise_image_sequence(arguments):
  177. osex.set_process_lowest_prio()
  178. from mainscripts import VideoEd
  179. VideoEd.denoise_image_sequence (arguments.input_dir, arguments.factor)
  180. p = videoed_parser.add_parser( "denoise-image-sequence", help="Denoise sequence of images, keeping sharp edges. Helps to remove pixel shake from the predicted face.")
  181. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory to be processed.")
  182. p.add_argument('--factor', type=int, dest="factor", default=None, help="Denoise factor (1-20).")
  183. p.set_defaults(func=process_videoed_denoise_image_sequence)
  184. def process_videoed_video_from_sequence(arguments):
  185. osex.set_process_lowest_prio()
  186. from mainscripts import VideoEd
  187. VideoEd.video_from_sequence (input_dir = arguments.input_dir,
  188. output_file = arguments.output_file,
  189. reference_file = arguments.reference_file,
  190. ext = arguments.ext,
  191. fps = arguments.fps,
  192. bitrate = arguments.bitrate,
  193. include_audio = arguments.include_audio,
  194. lossless = arguments.lossless)
  195. p = videoed_parser.add_parser( "video-from-sequence", help="Make video from image sequence.")
  196. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input file to be processed. Specify .*-extension to find first file.")
  197. p.add_argument('--output-file', required=True, action=fixPathAction, dest="output_file", help="Input file to be processed. Specify .*-extension to find first file.")
  198. p.add_argument('--reference-file', action=fixPathAction, dest="reference_file", help="Reference file used to determine proper FPS and transfer audio from it. Specify .*-extension to find first file.")
  199. p.add_argument('--ext', dest="ext", default='png', help="Image format (extension) of input files.")
  200. p.add_argument('--fps', type=int, dest="fps", default=None, help="FPS of output file. Overwritten by reference-file.")
  201. p.add_argument('--bitrate', type=int, dest="bitrate", default=None, help="Bitrate of output file in Megabits.")
  202. p.add_argument('--include-audio', action="store_true", dest="include_audio", default=False, help="Include audio from reference file.")
  203. p.add_argument('--lossless', action="store_true", dest="lossless", default=False, help="PNG codec.")
  204. p.set_defaults(func=process_videoed_video_from_sequence)
  205. facesettool_parser = subparsers.add_parser( "facesettool", help="Faceset tools.").add_subparsers()
  206. def process_faceset_enhancer(arguments):
  207. osex.set_process_lowest_prio()
  208. from mainscripts import FacesetEnhancer
  209. FacesetEnhancer.process_folder ( Path(arguments.input_dir),
  210. cpu_only=arguments.cpu_only,
  211. force_gpu_idxs=arguments.force_gpu_idxs
  212. )
  213. p = facesettool_parser.add_parser ("enhance", help="Enhance details in DFL faceset.")
  214. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory of aligned faces.")
  215. p.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Process on CPU.")
  216. p.add_argument('--force-gpu-idxs', dest="force_gpu_idxs", default=None, help="Force to choose GPU indexes separated by comma.")
  217. p.set_defaults(func=process_faceset_enhancer)
  218. p = facesettool_parser.add_parser ("resize", help="Resize DFL faceset.")
  219. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory of aligned faces.")
  220. def process_faceset_resizer(arguments):
  221. osex.set_process_lowest_prio()
  222. from mainscripts import FacesetResizer
  223. FacesetResizer.process_folder ( Path(arguments.input_dir) )
  224. p.set_defaults(func=process_faceset_resizer)
  225. def process_dev_test(arguments):
  226. osex.set_process_lowest_prio()
  227. from mainscripts import dev_misc
  228. dev_misc.dev_test( arguments.input_dir )
  229. p = subparsers.add_parser( "dev_test", help="")
  230. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  231. p.set_defaults (func=process_dev_test)
  232. # ========== XSeg
  233. xseg_parser = subparsers.add_parser( "xseg", help="XSeg tools.").add_subparsers()
  234. p = xseg_parser.add_parser( "editor", help="XSeg editor.")
  235. def process_xsegeditor(arguments):
  236. osex.set_process_lowest_prio()
  237. from XSegEditor import XSegEditor
  238. global exit_code
  239. exit_code = XSegEditor.start (Path(arguments.input_dir))
  240. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  241. p.set_defaults (func=process_xsegeditor)
  242. p = xseg_parser.add_parser( "apply", help="Apply trained XSeg model to the extracted faces.")
  243. def process_xsegapply(arguments):
  244. osex.set_process_lowest_prio()
  245. from mainscripts import XSegUtil
  246. XSegUtil.apply_xseg (Path(arguments.input_dir), Path(arguments.model_dir))
  247. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  248. p.add_argument('--model-dir', required=True, action=fixPathAction, dest="model_dir")
  249. p.set_defaults (func=process_xsegapply)
  250. p = xseg_parser.add_parser( "remove", help="Remove applied XSeg masks from the extracted faces.")
  251. def process_xsegremove(arguments):
  252. osex.set_process_lowest_prio()
  253. from mainscripts import XSegUtil
  254. XSegUtil.remove_xseg (Path(arguments.input_dir) )
  255. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  256. p.set_defaults (func=process_xsegremove)
  257. p = xseg_parser.add_parser( "remove_labels", help="Remove XSeg labels from the extracted faces.")
  258. def process_xsegremovelabels(arguments):
  259. osex.set_process_lowest_prio()
  260. from mainscripts import XSegUtil
  261. XSegUtil.remove_xseg_labels (Path(arguments.input_dir) )
  262. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  263. p.set_defaults (func=process_xsegremovelabels)
  264. p = xseg_parser.add_parser( "fetch", help="Copies faces containing XSeg polygons in <input_dir>_xseg dir.")
  265. def process_xsegfetch(arguments):
  266. osex.set_process_lowest_prio()
  267. from mainscripts import XSegUtil
  268. XSegUtil.fetch_xseg (Path(arguments.input_dir) )
  269. p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir")
  270. p.set_defaults (func=process_xsegfetch)
  271. def bad_args(arguments):
  272. parser.print_help()
  273. exit(0)
  274. parser.set_defaults(func=bad_args)
  275. arguments = parser.parse_args()
  276. arguments.func(arguments)
  277. if exit_code == 0:
  278. print ("Done.")
  279. exit(exit_code)
  280. '''
  281. import code
  282. code.interact(local=dict(globals(), **locals()))
  283. '''
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...