mirror of
https://github.com/iperov/DeepFaceLab.git
synced 2025-07-06 13:02:15 -07:00
fix mask editor,
upd manuals
This commit is contained in:
parent
0fa9d269ec
commit
de8d75b4f7
9 changed files with 127 additions and 77 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -134,10 +134,10 @@ class InteractBase(object):
|
||||||
self.mouse_events[wnd_name] = []
|
self.mouse_events[wnd_name] = []
|
||||||
self.mouse_events[wnd_name] += [ (x, y, ev, flags) ]
|
self.mouse_events[wnd_name] += [ (x, y, ev, flags) ]
|
||||||
|
|
||||||
def add_key_event(self, wnd_name, key):
|
def add_key_event(self, wnd_name, ord_key, ctrl_pressed, alt_pressed, shift_pressed):
|
||||||
if wnd_name not in self.key_events:
|
if wnd_name not in self.key_events:
|
||||||
self.key_events[wnd_name] = []
|
self.key_events[wnd_name] = []
|
||||||
self.key_events[wnd_name] += [ (key,) ]
|
self.key_events[wnd_name] += [ (ord_key, chr(ord_key), ctrl_pressed, alt_pressed, shift_pressed) ]
|
||||||
|
|
||||||
def get_mouse_events(self, wnd_name):
|
def get_mouse_events(self, wnd_name):
|
||||||
ar = self.mouse_events.get(wnd_name, [])
|
ar = self.mouse_events.get(wnd_name, [])
|
||||||
|
@ -289,14 +289,19 @@ class InteractDesktop(InteractBase):
|
||||||
|
|
||||||
if has_windows or has_capture_keys:
|
if has_windows or has_capture_keys:
|
||||||
wait_key_time = max(1, int(sleep_time*1000) )
|
wait_key_time = max(1, int(sleep_time*1000) )
|
||||||
key = cv2.waitKey(wait_key_time) & 0xFF
|
ord_key = cv2.waitKey(wait_key_time)
|
||||||
|
shift_pressed = False
|
||||||
|
if ord_key != -1:
|
||||||
|
if chr(ord_key) >= 'A' and chr(ord_key) <= 'Z':
|
||||||
|
shift_pressed = True
|
||||||
|
ord_key += 32
|
||||||
else:
|
else:
|
||||||
if sleep_time != 0:
|
if sleep_time != 0:
|
||||||
time.sleep(sleep_time)
|
time.sleep(sleep_time)
|
||||||
|
|
||||||
if has_capture_keys and key != 255:
|
if has_capture_keys and ord_key != -1:
|
||||||
for wnd_name in self.capture_keys_windows:
|
for wnd_name in self.capture_keys_windows:
|
||||||
self.add_key_event (wnd_name, key)
|
self.add_key_event (wnd_name, ord_key, False, False, shift_pressed)
|
||||||
|
|
||||||
def on_wait_any_key(self):
|
def on_wait_any_key(self):
|
||||||
cv2.waitKey(0)
|
cv2.waitKey(0)
|
||||||
|
|
11
main.py
11
main.py
|
@ -17,12 +17,11 @@ class fixPathAction(argparse.Action):
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
multiprocessing.set_start_method("spawn")
|
multiprocessing.set_start_method("spawn")
|
||||||
|
|
||||||
os_utils.set_process_lowest_prio()
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
subparsers = parser.add_subparsers()
|
subparsers = parser.add_subparsers()
|
||||||
|
|
||||||
def process_extract(arguments):
|
def process_extract(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import Extractor
|
from mainscripts import Extractor
|
||||||
Extractor.main( arguments.input_dir,
|
Extractor.main( arguments.input_dir,
|
||||||
arguments.output_dir,
|
arguments.output_dir,
|
||||||
|
@ -51,6 +50,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults (func=process_extract)
|
p.set_defaults (func=process_extract)
|
||||||
|
|
||||||
def process_sort(arguments):
|
def process_sort(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import Sorter
|
from mainscripts import Sorter
|
||||||
Sorter.main (input_path=arguments.input_dir, sort_by_method=arguments.sort_by_method)
|
Sorter.main (input_path=arguments.input_dir, sort_by_method=arguments.sort_by_method)
|
||||||
|
|
||||||
|
@ -60,6 +60,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults (func=process_sort)
|
p.set_defaults (func=process_sort)
|
||||||
|
|
||||||
def process_util(arguments):
|
def process_util(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import Util
|
from mainscripts import Util
|
||||||
|
|
||||||
if arguments.convert_png_to_jpg:
|
if arguments.convert_png_to_jpg:
|
||||||
|
@ -79,6 +80,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults (func=process_util)
|
p.set_defaults (func=process_util)
|
||||||
|
|
||||||
def process_train(arguments):
|
def process_train(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
args = {'training_data_src_dir' : arguments.training_data_src_dir,
|
args = {'training_data_src_dir' : arguments.training_data_src_dir,
|
||||||
'training_data_dst_dir' : arguments.training_data_dst_dir,
|
'training_data_dst_dir' : arguments.training_data_dst_dir,
|
||||||
'model_path' : arguments.model_dir,
|
'model_path' : arguments.model_dir,
|
||||||
|
@ -106,6 +108,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults (func=process_train)
|
p.set_defaults (func=process_train)
|
||||||
|
|
||||||
def process_convert(arguments):
|
def process_convert(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
args = {'input_dir' : arguments.input_dir,
|
args = {'input_dir' : arguments.input_dir,
|
||||||
'output_dir' : arguments.output_dir,
|
'output_dir' : arguments.output_dir,
|
||||||
'aligned_dir' : arguments.aligned_dir,
|
'aligned_dir' : arguments.aligned_dir,
|
||||||
|
@ -133,6 +136,7 @@ if __name__ == "__main__":
|
||||||
videoed_parser = subparsers.add_parser( "videoed", help="Video processing.").add_subparsers()
|
videoed_parser = subparsers.add_parser( "videoed", help="Video processing.").add_subparsers()
|
||||||
|
|
||||||
def process_videoed_extract_video(arguments):
|
def process_videoed_extract_video(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import VideoEd
|
from mainscripts import VideoEd
|
||||||
VideoEd.extract_video (arguments.input_file, arguments.output_dir, arguments.output_ext, arguments.fps)
|
VideoEd.extract_video (arguments.input_file, arguments.output_dir, arguments.output_ext, arguments.fps)
|
||||||
p = videoed_parser.add_parser( "extract-video", help="Extract images from video file.")
|
p = videoed_parser.add_parser( "extract-video", help="Extract images from video file.")
|
||||||
|
@ -143,6 +147,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults(func=process_videoed_extract_video)
|
p.set_defaults(func=process_videoed_extract_video)
|
||||||
|
|
||||||
def process_videoed_cut_video(arguments):
|
def process_videoed_cut_video(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import VideoEd
|
from mainscripts import VideoEd
|
||||||
VideoEd.cut_video (arguments.input_file,
|
VideoEd.cut_video (arguments.input_file,
|
||||||
arguments.from_time,
|
arguments.from_time,
|
||||||
|
@ -158,6 +163,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults(func=process_videoed_cut_video)
|
p.set_defaults(func=process_videoed_cut_video)
|
||||||
|
|
||||||
def process_videoed_denoise_image_sequence(arguments):
|
def process_videoed_denoise_image_sequence(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import VideoEd
|
from mainscripts import VideoEd
|
||||||
VideoEd.denoise_image_sequence (arguments.input_dir, arguments.ext, arguments.factor)
|
VideoEd.denoise_image_sequence (arguments.input_dir, arguments.ext, arguments.factor)
|
||||||
p = videoed_parser.add_parser( "denoise-image-sequence", help="Denoise sequence of images, keeping sharp edges. This allows you to make the final fake more believable, since the neural network is not able to make a detailed skin texture, but it makes the edges quite clear. Therefore, if the whole frame is more `blurred`, then a fake will seem more believable. Especially true for scenes of the film, which are usually very clear.")
|
p = videoed_parser.add_parser( "denoise-image-sequence", help="Denoise sequence of images, keeping sharp edges. This allows you to make the final fake more believable, since the neural network is not able to make a detailed skin texture, but it makes the edges quite clear. Therefore, if the whole frame is more `blurred`, then a fake will seem more believable. Especially true for scenes of the film, which are usually very clear.")
|
||||||
|
@ -167,6 +173,7 @@ if __name__ == "__main__":
|
||||||
p.set_defaults(func=process_videoed_denoise_image_sequence)
|
p.set_defaults(func=process_videoed_denoise_image_sequence)
|
||||||
|
|
||||||
def process_videoed_video_from_sequence(arguments):
|
def process_videoed_video_from_sequence(arguments):
|
||||||
|
os_utils.set_process_lowest_prio()
|
||||||
from mainscripts import VideoEd
|
from mainscripts import VideoEd
|
||||||
VideoEd.video_from_sequence (arguments.input_dir,
|
VideoEd.video_from_sequence (arguments.input_dir,
|
||||||
arguments.output_file,
|
arguments.output_file,
|
||||||
|
|
|
@ -411,7 +411,7 @@ class ExtractSubprocessor(Subprocessor):
|
||||||
new_y = np.clip (y, 0, h-1) / self.view_scale
|
new_y = np.clip (y, 0, h-1) / self.view_scale
|
||||||
|
|
||||||
key_events = io.get_key_events(self.wnd_name)
|
key_events = io.get_key_events(self.wnd_name)
|
||||||
key, = key_events[-1] if len(key_events) > 0 else (0,)
|
key, chr_key, ctrl_pressed, alt_pressed, shift_pressed = key_events[-1] if len(key_events) > 0 else (0,0,False,False,False)
|
||||||
|
|
||||||
if key == ord('\r') or key == ord('\n'):
|
if key == ord('\r') or key == ord('\n'):
|
||||||
#confirm frame
|
#confirm frame
|
||||||
|
|
|
@ -46,9 +46,11 @@ class MaskEditor:
|
||||||
|
|
||||||
self.polys_mask = None
|
self.polys_mask = None
|
||||||
|
|
||||||
|
self.mouse_x = self.mouse_y = 9999
|
||||||
self.screen_status_block = None
|
self.screen_status_block = None
|
||||||
self.screen_status_block_dirty = True
|
self.screen_status_block_dirty = True
|
||||||
|
self.screen_changed = True
|
||||||
|
|
||||||
def set_state(self, state):
|
def set_state(self, state):
|
||||||
self.state = state
|
self.state = state
|
||||||
|
|
||||||
|
@ -175,10 +177,12 @@ class MaskEditor:
|
||||||
def set_screen_status_block_dirty(self):
|
def set_screen_status_block_dirty(self):
|
||||||
self.screen_status_block_dirty = True
|
self.screen_status_block_dirty = True
|
||||||
|
|
||||||
|
def switch_screen_changed(self):
|
||||||
|
result = self.screen_changed
|
||||||
|
self.screen_changed = False
|
||||||
|
return result
|
||||||
|
|
||||||
def make_screen(self):
|
def make_screen(self):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
screen_overlay = self.get_screen_overlay()
|
screen_overlay = self.get_screen_overlay()
|
||||||
final_mask = self.get_mask()
|
final_mask = self.get_mask()
|
||||||
|
|
||||||
|
@ -201,6 +205,7 @@ class MaskEditor:
|
||||||
|
|
||||||
def mask_finish(self, n_clip=True):
|
def mask_finish(self, n_clip=True):
|
||||||
if self.state == self.STATE_MASKING:
|
if self.state == self.STATE_MASKING:
|
||||||
|
self.screen_changed = True
|
||||||
if self.ie_polys.n_list().n <= 2:
|
if self.ie_polys.n_list().n <= 2:
|
||||||
self.ie_polys.n_dec()
|
self.ie_polys.n_dec()
|
||||||
self.state = self.STATE_NONE
|
self.state = self.STATE_NONE
|
||||||
|
@ -210,10 +215,13 @@ class MaskEditor:
|
||||||
def set_mouse_pos(self,x,y):
|
def set_mouse_pos(self,x,y):
|
||||||
mouse_x = x % (self.sw) - self.pw
|
mouse_x = x % (self.sw) - self.pw
|
||||||
mouse_y = y % (self.sh) - self.ph
|
mouse_y = y % (self.sh) - self.ph
|
||||||
self.mouse_xy = np.array( [mouse_x, mouse_y] )
|
if mouse_x != self.mouse_x and mouse_y != self.mouse_y:
|
||||||
self.mouse_x, self.mouse_y = self.mouse_xy
|
self.mouse_xy = np.array( [mouse_x, mouse_y] )
|
||||||
|
self.mouse_x, self.mouse_y = self.mouse_xy
|
||||||
|
self.screen_changed = True
|
||||||
|
|
||||||
def mask_point(self, type):
|
def mask_point(self, type):
|
||||||
|
self.screen_changed = True
|
||||||
if self.state == self.STATE_MASKING and \
|
if self.state == self.STATE_MASKING and \
|
||||||
self.ie_polys.n_list().type != type:
|
self.ie_polys.n_list().type != type:
|
||||||
self.mask_finish()
|
self.mask_finish()
|
||||||
|
@ -252,9 +260,12 @@ def mask_editor_main(input_dir, confirmed_dir=None, skipped_dir=None):
|
||||||
done_paths = []
|
done_paths = []
|
||||||
|
|
||||||
image_paths_total = len(image_paths)
|
image_paths_total = len(image_paths)
|
||||||
|
|
||||||
|
do_prev_count = 0
|
||||||
|
do_save_move_count = 0
|
||||||
|
do_save_count = 0
|
||||||
|
do_skip_move_count = 0
|
||||||
|
do_skip_count = 0
|
||||||
|
|
||||||
is_exit = False
|
is_exit = False
|
||||||
while not is_exit:
|
while not is_exit:
|
||||||
|
@ -294,6 +305,7 @@ def mask_editor_main(input_dir, confirmed_dir=None, skipped_dir=None):
|
||||||
'[Mouse wheel] - undo/redo poly or point. [+ctrl] - undo to begin/redo to end',
|
'[Mouse wheel] - undo/redo poly or point. [+ctrl] - undo to begin/redo to end',
|
||||||
'[q] - prev image. [w] - skip and move to %s. [e] - save and move to %s. ' % (skipped_path.name, confirmed_path.name),
|
'[q] - prev image. [w] - skip and move to %s. [e] - save and move to %s. ' % (skipped_path.name, confirmed_path.name),
|
||||||
'[z] - prev image. [x] - skip. [c] - save. ',
|
'[z] - prev image. [x] - skip. [c] - save. ',
|
||||||
|
'hold [shift] - speed up the frame counter by 10.'
|
||||||
'[esc] - quit'
|
'[esc] - quit'
|
||||||
]
|
]
|
||||||
ed = MaskEditor(img, mask, ie_polys, get_status_lines_func)
|
ed = MaskEditor(img, mask, ie_polys, get_status_lines_func)
|
||||||
|
@ -301,75 +313,101 @@ def mask_editor_main(input_dir, confirmed_dir=None, skipped_dir=None):
|
||||||
next = False
|
next = False
|
||||||
while not next:
|
while not next:
|
||||||
io.process_messages(0.005)
|
io.process_messages(0.005)
|
||||||
|
|
||||||
for (x,y,ev,flags) in io.get_mouse_events(wnd_name):
|
if do_prev_count + do_save_move_count + do_save_count + do_skip_move_count + do_skip_count == 0:
|
||||||
ed.set_mouse_pos(x, y)
|
for (x,y,ev,flags) in io.get_mouse_events(wnd_name):
|
||||||
if filepath is not None:
|
ed.set_mouse_pos(x, y)
|
||||||
if ev == io.EVENT_LBUTTONDOWN:
|
if filepath is not None:
|
||||||
ed.mask_point(1)
|
if ev == io.EVENT_LBUTTONDOWN:
|
||||||
elif ev == io.EVENT_RBUTTONDOWN:
|
ed.mask_point(1)
|
||||||
ed.mask_point(0)
|
elif ev == io.EVENT_RBUTTONDOWN:
|
||||||
elif ev == io.EVENT_MBUTTONDOWN:
|
ed.mask_point(0)
|
||||||
ed.mask_finish()
|
elif ev == io.EVENT_MBUTTONDOWN:
|
||||||
elif ev == io.EVENT_MOUSEWHEEL:
|
ed.mask_finish()
|
||||||
if flags & 0x80000000 != 0:
|
elif ev == io.EVENT_MOUSEWHEEL:
|
||||||
if flags & 0x8 != 0:
|
if flags & 0x80000000 != 0:
|
||||||
ed.undo_to_begin_point()
|
if flags & 0x8 != 0:
|
||||||
|
ed.undo_to_begin_point()
|
||||||
|
else:
|
||||||
|
ed.undo_point()
|
||||||
else:
|
else:
|
||||||
ed.undo_point()
|
if flags & 0x8 != 0:
|
||||||
else:
|
ed.redo_to_end_point()
|
||||||
if flags & 0x8 != 0:
|
else:
|
||||||
ed.redo_to_end_point()
|
ed.redo_point()
|
||||||
else:
|
|
||||||
ed.redo_point()
|
|
||||||
|
|
||||||
key_events = [ ev for ev, in io.get_key_events(wnd_name) ]
|
for key, chr_key, ctrl_pressed, alt_pressed, shift_pressed in io.get_key_events(wnd_name):
|
||||||
for key in key_events:
|
if chr_key == 'q' or chr_key == 'z':
|
||||||
if key == ord('q') or key == ord('z'):
|
do_prev_count = 1 if not shift_pressed else 10
|
||||||
if len(done_paths) > 0:
|
elif key == 27: #esc
|
||||||
image_paths.insert(0, filepath)
|
is_exit = True
|
||||||
filepath = done_paths.pop(-1)
|
|
||||||
|
|
||||||
if filepath.parent != input_path:
|
|
||||||
new_filename_path = input_path / filepath.name
|
|
||||||
filepath.rename ( new_filename_path )
|
|
||||||
image_paths.insert(0, new_filename_path)
|
|
||||||
else:
|
|
||||||
image_paths.insert(0, filepath)
|
|
||||||
|
|
||||||
next = True
|
next = True
|
||||||
break
|
break
|
||||||
elif filepath is not None and ( key == ord('e') or key == ord('c') ):
|
elif filepath is not None:
|
||||||
|
if chr_key == 'e':
|
||||||
|
do_save_move_count = 1 if not shift_pressed else 10
|
||||||
|
elif chr_key == 'c':
|
||||||
|
do_save_count = 1 if not shift_pressed else 10
|
||||||
|
elif chr_key == 'w':
|
||||||
|
do_skip_move_count = 1 if not shift_pressed else 10
|
||||||
|
elif chr_key == 'x':
|
||||||
|
do_skip_count = 1 if not shift_pressed else 10
|
||||||
|
|
||||||
|
if do_prev_count > 0:
|
||||||
|
do_prev_count -= 1
|
||||||
|
if len(done_paths) > 0:
|
||||||
|
image_paths.insert(0, filepath)
|
||||||
|
filepath = done_paths.pop(-1)
|
||||||
|
|
||||||
|
if filepath.parent != input_path:
|
||||||
|
new_filename_path = input_path / filepath.name
|
||||||
|
filepath.rename ( new_filename_path )
|
||||||
|
image_paths.insert(0, new_filename_path)
|
||||||
|
else:
|
||||||
|
image_paths.insert(0, filepath)
|
||||||
|
|
||||||
|
next = True
|
||||||
|
elif filepath is not None:
|
||||||
|
if do_save_move_count > 0:
|
||||||
|
do_save_move_count -= 1
|
||||||
|
|
||||||
|
ed.mask_finish()
|
||||||
|
dflimg.embed_and_set (str(filepath), ie_polys=ed.get_ie_polys() )
|
||||||
|
|
||||||
|
done_paths += [ confirmed_path / filepath.name ]
|
||||||
|
filepath.rename(done_paths[-1])
|
||||||
|
|
||||||
|
next = True
|
||||||
|
elif do_save_count > 0:
|
||||||
|
do_save_count -= 1
|
||||||
|
|
||||||
ed.mask_finish()
|
ed.mask_finish()
|
||||||
dflimg.embed_and_set (str(filepath), ie_polys=ed.get_ie_polys() )
|
dflimg.embed_and_set (str(filepath), ie_polys=ed.get_ie_polys() )
|
||||||
|
|
||||||
if key == ord('e'):
|
done_paths += [filepath]
|
||||||
new_filename_path = confirmed_path / filepath.name
|
|
||||||
filepath.rename(new_filename_path)
|
|
||||||
done_paths += [new_filename_path]
|
|
||||||
else:
|
|
||||||
done_paths += [filepath]
|
|
||||||
|
|
||||||
|
next = True
|
||||||
|
elif do_skip_move_count > 0:
|
||||||
|
do_skip_move_count -= 1
|
||||||
|
|
||||||
|
done_paths += [skipped_path / filepath.name]
|
||||||
|
filepath.rename(done_paths[-1])
|
||||||
|
|
||||||
|
next = True
|
||||||
|
elif do_skip_count > 0:
|
||||||
|
do_skip_count -= 1
|
||||||
|
|
||||||
|
done_paths += [filepath]
|
||||||
|
|
||||||
next = True
|
next = True
|
||||||
break
|
else:
|
||||||
|
do_save_move_count = do_save_count = do_skip_move_count = do_skip_count = 0
|
||||||
|
|
||||||
elif filepath is not None and ( key == ord('w') or key == ord('x') ):
|
if do_prev_count + do_save_move_count + do_save_count + do_skip_move_count + do_skip_count == 0:
|
||||||
if key == ord('w'):
|
if ed.switch_screen_changed():
|
||||||
new_filename_path = skipped_path / filepath.name
|
io.show_image (wnd_name, ed.make_screen() )
|
||||||
filepath.rename(new_filename_path)
|
|
||||||
done_paths += [new_filename_path]
|
|
||||||
else:
|
|
||||||
done_paths += [filepath]
|
|
||||||
|
|
||||||
next = True
|
|
||||||
break
|
|
||||||
elif key == 27: #esc
|
|
||||||
is_exit = True
|
|
||||||
next = True
|
|
||||||
break
|
|
||||||
screen = ed.make_screen()
|
|
||||||
|
|
||||||
io.show_image (wnd_name, screen )
|
|
||||||
io.process_messages(0.005)
|
io.process_messages(0.005)
|
||||||
|
|
||||||
io.destroy_all_windows()
|
io.destroy_all_windows()
|
||||||
|
|
|
@ -273,8 +273,8 @@ def main(args, device_args):
|
||||||
is_showing = True
|
is_showing = True
|
||||||
|
|
||||||
key_events = io.get_key_events(wnd_name)
|
key_events = io.get_key_events(wnd_name)
|
||||||
key, = key_events[-1] if len(key_events) > 0 else (0,)
|
key, chr_key, ctrl_pressed, alt_pressed, shift_pressed = key_events[-1] if len(key_events) > 0 else (0,0,False,False,False)
|
||||||
|
|
||||||
if key == ord('\n') or key == ord('\r'):
|
if key == ord('\n') or key == ord('\r'):
|
||||||
s2c.put ( {'op': 'close'} )
|
s2c.put ( {'op': 'close'} )
|
||||||
elif key == ord('s'):
|
elif key == ord('s'):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue