From 28f994ec1ed31444fe79807bccfab2c74996d644 Mon Sep 17 00:00:00 2001 From: henryruhs Date: Fri, 22 Mar 2024 15:37:15 +0100 Subject: [PATCH] Force download to be executed and exit --- README.md | 9 +++++---- facefusion.ini | 1 + facefusion/content_analyser.py | 6 +++--- facefusion/core.py | 25 ++++++++++++++++++++++++- facefusion/globals.py | 1 + facefusion/wording.py | 7 ++++--- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 4fab7d8f..ae3f4ef1 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ options: -v, --version show program's version number and exit misc: + --force-download force automate downloads and exit --skip-download omit automate downloads and remote lookups --headless run the program without a user interface --log-level {error,warn,info,debug} adjust the message severity displayed in the terminal @@ -47,11 +48,11 @@ execution: --execution-queue-count [1-32] specify the amount of frames each thread is processing memory: - --video-memory-strategy {strict,moderate,tolerant} balance fast frame processing and low vram usage - --system-memory-limit [0-128] limit the available ram that can be used while processing + --video-memory-strategy {strict,moderate,tolerant} balance fast frame processing and low VRAM usage + --system-memory-limit [0-128] limit the available RAM that can be used while processing face analyser: - --face-analyser-order {left-right,right-left,top-bottom,bottom-top,small-large,large-small,best-worst,worst-best} specify the order in which the face analyser detects faces. + --face-analyser-order {left-right,right-left,top-bottom,bottom-top,small-large,large-small,best-worst,worst-best} specify the order in which the face analyser detects faces --face-analyser-age {child,teen,adult,senior} filter the detected faces based on their age --face-analyser-gender {female,male} filter the detected faces based on their gender --face-detector-model {many,retinaface,scrfd,yoloface,yunet} choose the model responsible for detecting the face @@ -93,7 +94,7 @@ frame processors: --face-enhancer-model {codeformer,gfpgan_1.2,gfpgan_1.3,gfpgan_1.4,gpen_bfr_256,gpen_bfr_512,restoreformer_plus_plus} choose the model responsible for enhancing the face --face-enhancer-blend [0-100] blend the enhanced into the previous face --face-swapper-model {blendswap_256,inswapper_128,inswapper_128_fp16,simswap_256,simswap_512_unofficial,uniface_256} choose the model responsible for swapping the face - --frame-enhancer-model {lsdir_x4,nomos8k_sc_x4,real_esrgan_x4,real_esrgan_x4_fp16,span_kendata_x4} choose the model responsible for enhancing the frame + --frame-enhancer-model {lsdir_x4,nomos8k_sc_x4,real_esrgan_x4,real_esrgan_x4_fp16,real_hatgan_x4,span_kendata_x4} choose the model responsible for enhancing the frame --frame-enhancer-blend [0-100] blend the enhanced into the previous frame --lip-syncer-model {wav2lip_gan} choose the model responsible for syncing the lips diff --git a/facefusion.ini b/facefusion.ini index 1021c803..1449a519 100644 --- a/facefusion.ini +++ b/facefusion.ini @@ -4,6 +4,7 @@ target_path = output_path = [misc] +force_download = skip_download = headless = log_level = diff --git a/facefusion/content_analyser.py b/facefusion/content_analyser.py index 7025977b..3a55df86 100644 --- a/facefusion/content_analyser.py +++ b/facefusion/content_analyser.py @@ -1,4 +1,4 @@ -from typing import Any, Dict +from typing import Any from functools import lru_cache from time import sleep import threading @@ -9,7 +9,7 @@ from tqdm import tqdm import facefusion.globals from facefusion import process_manager, wording -from facefusion.typing import VisionFrame, ModelValue, Fps +from facefusion.typing import VisionFrame, ModelSet, Fps from facefusion.execution import apply_execution_provider_options from facefusion.vision import get_video_frame, count_video_frame_total, read_image, detect_video_fps from facefusion.filesystem import resolve_relative_path @@ -17,7 +17,7 @@ from facefusion.download import conditional_download CONTENT_ANALYSER = None THREAD_LOCK : threading.Lock = threading.Lock() -MODELS : Dict[str, ModelValue] =\ +MODELS : ModelSet =\ { 'open_nsfw': { diff --git a/facefusion/core.py b/facefusion/core.py index 505e59f1..72301f6a 100755 --- a/facefusion/core.py +++ b/facefusion/core.py @@ -23,7 +23,8 @@ from facefusion.execution import encode_execution_providers, decode_execution_pr from facefusion.normalizer import normalize_output_path, normalize_padding, normalize_fps from facefusion.memory import limit_system_memory from facefusion.statistics import conditional_log_statistics -from facefusion.filesystem import list_directory, get_temp_frame_paths, create_temp, move_temp, clear_temp, is_image, is_video, filter_audio_paths +from facefusion.download import conditional_download +from facefusion.filesystem import list_directory, get_temp_frame_paths, create_temp, move_temp, clear_temp, is_image, is_video, filter_audio_paths, resolve_relative_path from facefusion.ffmpeg import extract_frames, merge_video, copy_image, finalize_image, restore_audio, replace_audio from facefusion.vision import read_image, read_static_images, detect_image_resolution, restrict_video_fps, create_image_resolutions, get_video_frame, detect_video_resolution, detect_video_fps, restrict_video_resolution, restrict_image_resolution, create_video_resolutions, pack_resolution, unpack_resolution @@ -41,6 +42,7 @@ def cli() -> None: program.add_argument('-v', '--version', version = metadata.get('name') + ' ' + metadata.get('version'), action = 'version') # misc group_misc = program.add_argument_group('misc') + group_misc.add_argument('--force-download', help = wording.get('help.force_download'), action = 'store_true', default = config.get_bool_value('misc.force_download')) group_misc.add_argument('--skip-download', help = wording.get('help.skip_download'), action = 'store_true', default = config.get_bool_value('misc.skip_download')) group_misc.add_argument('--headless', help = wording.get('help.headless'), action = 'store_true', default = config.get_bool_value('misc.headless')) group_misc.add_argument('--log-level', help = wording.get('help.log_level'), default = config.get_str_value('misc.log_level', 'info'), choices = logger.get_log_levels()) @@ -113,6 +115,7 @@ def apply_args(program : ArgumentParser) -> None: facefusion.globals.target_path = args.target_path facefusion.globals.output_path = args.output_path # misc + facefusion.globals.force_download = args.force_download facefusion.globals.skip_download = args.skip_download facefusion.globals.headless = args.headless facefusion.globals.log_level = args.log_level @@ -186,6 +189,9 @@ def run(program : ArgumentParser) -> None: logger.init(facefusion.globals.log_level) if facefusion.globals.system_memory_limit > 0: limit_system_memory(facefusion.globals.system_memory_limit) + if facefusion.globals.force_download: + force_download() + return if not pre_check() or not content_analyser.pre_check() or not face_analyser.pre_check() or not face_masker.pre_check(): return for frame_processor_module in get_frame_processors_modules(facefusion.globals.frame_processors): @@ -256,6 +262,23 @@ def conditional_append_reference_faces() -> None: append_reference_face(frame_processor_module.__name__, reference_face) +def force_download() -> None: + download_directory_path = resolve_relative_path('../.assets/models') + available_frame_processors = list_directory('facefusion/processors/frame/modules') + model_list =\ + [ + content_analyser.MODELS, + face_analyser.MODELS, + face_masker.MODELS + ] + + for frame_processor_module in get_frame_processors_modules(available_frame_processors): + if hasattr(frame_processor_module, 'MODELS'): + model_list.append(frame_processor_module.MODELS) + urls = [ models[model].get('url') for models in model_list for model in models ] + conditional_download(download_directory_path, urls) + + def process_image(start_time : float) -> None: normed_output_path = normalize_output_path(facefusion.globals.target_path, facefusion.globals.output_path) if analyse_image(facefusion.globals.target_path): diff --git a/facefusion/globals.py b/facefusion/globals.py index 10b0d14b..d736880a 100755 --- a/facefusion/globals.py +++ b/facefusion/globals.py @@ -7,6 +7,7 @@ source_paths : Optional[List[str]] = None target_path : Optional[str] = None output_path : Optional[str] = None # misc +force_download : Optional[bool] = None skip_download : Optional[bool] = None headless : Optional[bool] = None log_level : Optional[LogLevel] = None diff --git a/facefusion/wording.py b/facefusion/wording.py index 39befc0d..e101668e 100755 --- a/facefusion/wording.py +++ b/facefusion/wording.py @@ -58,6 +58,7 @@ WORDING : Dict[str, Any] =\ 'target': 'choose single target image or video', 'output': 'specify the output file or directory', # misc + 'force_download': 'force automate downloads and exit', 'skip_download': 'omit automate downloads and remote lookups', 'headless': 'run the program without a user interface', 'log_level': 'adjust the message severity displayed in the terminal', @@ -66,10 +67,10 @@ WORDING : Dict[str, Any] =\ 'execution_thread_count': 'specify the amount of parallel threads while processing', 'execution_queue_count': 'specify the amount of frames each thread is processing', # memory - 'video_memory_strategy': 'balance fast frame processing and low vram usage', - 'system_memory_limit': 'limit the available ram that can be used while processing', + 'video_memory_strategy': 'balance fast frame processing and low VRAM usage', + 'system_memory_limit': 'limit the available RAM that can be used while processing', # face analyser - 'face_analyser_order': 'specify the order in which the face analyser detects faces.', + 'face_analyser_order': 'specify the order in which the face analyser detects faces', 'face_analyser_age': 'filter the detected faces based on their age', 'face_analyser_gender': 'filter the detected faces based on their gender', 'face_detector_model': 'choose the model responsible for detecting the face',