Introduce download scopes

This commit is contained in:
henryruhs 2024-11-26 14:05:34 +01:00
parent acdddc730e
commit 4de4d18dda
24 changed files with 252 additions and 213 deletions

View File

@ -103,6 +103,7 @@ execution_queue_count =
[download]
download_providers =
download_scope =
[memory]
video_memory_strategy =

View File

@ -120,6 +120,7 @@ def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
apply_state_item('execution_queue_count', args.get('execution_queue_count'))
# download
apply_state_item('download_providers', args.get('download_providers'))
apply_state_item('download_scope', args.get('download_scope'))
# memory
apply_state_item('video_memory_strategy', args.get('video_memory_strategy'))
apply_state_item('system_memory_limit', args.get('system_memory_limit'))

View File

@ -2,7 +2,7 @@ import logging
from typing import List, Sequence
from facefusion.common_helper import create_float_range, create_int_range
from facefusion.typing import Angle, DownloadProviderSet, ExecutionProviderSet, FaceDetectorSet, FaceLandmarkerModel, FaceMaskRegion, FaceMaskType, FaceSelectorMode, FaceSelectorOrder, Gender, JobStatus, LogLevelSet, OutputAudioEncoder, OutputVideoEncoder, OutputVideoPreset, Race, Score, TempFrameFormat, UiWorkflow, VideoMemoryStrategy
from facefusion.typing import Angle, DownloadProviderSet, DownloadScope, ExecutionProviderSet, FaceDetectorSet, FaceLandmarkerModel, FaceMaskRegion, FaceMaskType, FaceSelectorMode, FaceSelectorOrder, Gender, JobStatus, LogLevelSet, OutputAudioEncoder, OutputVideoEncoder, OutputVideoPreset, Race, Score, TempFrameFormat, UiWorkflow, VideoMemoryStrategy
video_memory_strategies : List[VideoMemoryStrategy] = [ 'strict', 'moderate', 'tolerant' ]
@ -43,6 +43,7 @@ download_provider_set : DownloadProviderSet =\
'github': 'https://github.com/facefusion/facefusion-assets/releases/download/{base_name}/{file_name}',
'huggingface': 'https://huggingface.co/facefusion/{base_name}/resolve/main/{file_name}'
}
download_scopes : List[DownloadScope] = [ 'lite', 'medium', 'full' ]
log_level_set : LogLevelSet =\
{

View File

@ -8,7 +8,7 @@ from facefusion import inference_manager, state_manager, wording
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import Fps, InferencePool, ModelOptions, ModelSet, VisionFrame
from facefusion.typing import DownloadScope, Fps, InferencePool, ModelOptions, ModelSet, VisionFrame
from facefusion.vision import count_video_frame_total, detect_video_fps, get_video_frame, read_image
PROBABILITY_LIMIT = 0.80
@ -17,7 +17,7 @@ STREAM_COUNTER = 0
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'open_nsfw':
@ -54,7 +54,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
return create_static_model_set().get('open_nsfw')
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get('open_nsfw')
def pre_check() -> bool:

View File

@ -138,7 +138,7 @@ def force_download() -> ErrorCode:
for module in common_modules + processor_modules:
if hasattr(module, 'create_static_model_set'):
for model in module.create_static_model_set().values():
for model in module.create_static_model_set(state_manager.get_item('download_scope')).values():
model_hashes = model.get('hashes')
model_sources = model.get('sources')

View File

@ -3,16 +3,16 @@ from typing import List, Tuple
import numpy
from facefusion import inference_manager
from facefusion import inference_manager, state_manager
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.face_helper import warp_face_by_face_landmark_5
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import Age, FaceLandmark5, Gender, InferencePool, ModelOptions, ModelSet, Race, VisionFrame
from facefusion.typing import Age, DownloadScope, FaceLandmark5, Gender, InferencePool, ModelOptions, ModelSet, Race, VisionFrame
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'fairface':
@ -51,7 +51,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
return create_static_model_set().get('fairface')
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get('fairface')
def pre_check() -> bool:

View File

@ -9,12 +9,12 @@ from facefusion.download import conditional_download_hashes, conditional_downloa
from facefusion.face_helper import create_rotated_matrix_and_size, create_static_anchors, distance_to_bounding_box, distance_to_face_landmark_5, normalize_bounding_box, transform_bounding_box, transform_points
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import Angle, BoundingBox, Detection, DownloadSet, FaceLandmark5, InferencePool, ModelSet, Score, VisionFrame
from facefusion.typing import Angle, BoundingBox, Detection, DownloadScope, DownloadSet, FaceLandmark5, InferencePool, ModelSet, Score, VisionFrame
from facefusion.vision import resize_frame_resolution, unpack_resolution
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'retinaface':
@ -91,7 +91,8 @@ def clear_inference_pool() -> None:
def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]:
model_hashes = {}
model_sources = {}
model_set = create_static_model_set()
download_scope = state_manager.get_item('download_scope')
model_set = create_static_model_set(download_scope)
if state_manager.get_item('face_detector_model') in [ 'many', 'retinaface' ]:
model_hashes['retinaface'] = model_set.get('retinaface').get('hashes').get('retinaface')

View File

@ -9,11 +9,11 @@ from facefusion.download import conditional_download_hashes, conditional_downloa
from facefusion.face_helper import create_rotated_matrix_and_size, estimate_matrix_by_face_landmark_5, transform_points, warp_face_by_translation
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import Angle, BoundingBox, DownloadSet, FaceLandmark5, FaceLandmark68, InferencePool, ModelSet, Prediction, Score, VisionFrame
from facefusion.typing import Angle, BoundingBox, DownloadScope, DownloadSet, FaceLandmark5, FaceLandmark68, InferencePool, ModelSet, Prediction, Score, VisionFrame
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'2dfan4':
@ -90,7 +90,8 @@ def clear_inference_pool() -> None:
def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]:
model_set = create_static_model_set()
download_scope = state_manager.get_item('download_scope')
model_set = create_static_model_set(download_scope)
model_hashes =\
{
'fan_68_5': model_set.get('fan_68_5').get('hashes').get('fan_68_5')
@ -132,7 +133,8 @@ def detect_face_landmarks(vision_frame : VisionFrame, bounding_box : BoundingBox
def detect_with_2dfan4(temp_vision_frame: VisionFrame, bounding_box: BoundingBox, face_angle: Angle) -> Tuple[FaceLandmark68, Score]:
model_size = create_static_model_set().get('2dfan4').get('size')
download_scope = state_manager.get_item('download_scope')
model_size = create_static_model_set(download_scope).get('2dfan4').get('size')
scale = 195 / numpy.subtract(bounding_box[2:], bounding_box[:2]).max().clip(1, None)
translation = (model_size[0] - numpy.add(bounding_box[2:], bounding_box[:2]) * scale) * 0.5
rotated_matrix, rotated_size = create_rotated_matrix_and_size(face_angle, model_size)
@ -151,7 +153,8 @@ def detect_with_2dfan4(temp_vision_frame: VisionFrame, bounding_box: BoundingBox
def detect_with_peppa_wutz(temp_vision_frame : VisionFrame, bounding_box : BoundingBox, face_angle : Angle) -> Tuple[FaceLandmark68, Score]:
model_size = create_static_model_set().get('peppa_wutz').get('size')
download_scope = state_manager.get_item('download_scope')
model_size = create_static_model_set(download_scope).get('peppa_wutz').get('size')
scale = 195 / numpy.subtract(bounding_box[2:], bounding_box[:2]).max().clip(1, None)
translation = (model_size[0] - numpy.add(bounding_box[2:], bounding_box[:2]) * scale) * 0.5
rotated_matrix, rotated_size = create_rotated_matrix_and_size(face_angle, model_size)

View File

@ -5,11 +5,11 @@ import cv2
import numpy
from cv2.typing import Size
from facefusion import inference_manager
from facefusion import inference_manager, state_manager
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import DownloadSet, FaceLandmark68, FaceMaskRegion, InferencePool, Mask, ModelSet, Padding, VisionFrame
from facefusion.typing import DownloadScope, DownloadSet, FaceLandmark68, FaceMaskRegion, InferencePool, Mask, ModelSet, Padding, VisionFrame
FACE_MASK_REGIONS : Dict[FaceMaskRegion, int] =\
{
@ -27,7 +27,7 @@ FACE_MASK_REGIONS : Dict[FaceMaskRegion, int] =\
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'face_occluder':
@ -83,7 +83,8 @@ def clear_inference_pool() -> None:
def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]:
model_set = create_static_model_set()
download_scope = state_manager.get_item('download_scope')
model_set = create_static_model_set(download_scope)
model_hashes =\
{
'face_occluder': model_set.get('face_occluder').get('hashes').get('face_occluder'),
@ -118,7 +119,8 @@ def create_static_box_mask(crop_size : Size, face_mask_blur : float, face_mask_p
def create_occlusion_mask(crop_vision_frame : VisionFrame) -> Mask:
model_size = create_static_model_set().get('face_occluder').get('size')
download_scope = state_manager.get_item('download_scope')
model_size = create_static_model_set(download_scope).get('face_occluder').get('size')
prepare_vision_frame = cv2.resize(crop_vision_frame, model_size)
prepare_vision_frame = numpy.expand_dims(prepare_vision_frame, axis = 0).astype(numpy.float32) / 255
prepare_vision_frame = prepare_vision_frame.transpose(0, 1, 2, 3)
@ -130,7 +132,8 @@ def create_occlusion_mask(crop_vision_frame : VisionFrame) -> Mask:
def create_region_mask(crop_vision_frame : VisionFrame, face_mask_regions : List[FaceMaskRegion]) -> Mask:
model_size = create_static_model_set().get('face_parser').get('size')
download_scope = state_manager.get_item('download_scope')
model_size = create_static_model_set(download_scope).get('face_parser').get('size')
prepare_vision_frame = cv2.resize(crop_vision_frame, model_size)
prepare_vision_frame = prepare_vision_frame[:, :, ::-1].astype(numpy.float32) / 255
prepare_vision_frame = numpy.subtract(prepare_vision_frame, numpy.array([ 0.485, 0.456, 0.406 ]).astype(numpy.float32))

View File

@ -3,16 +3,16 @@ from typing import Tuple
import numpy
from facefusion import inference_manager
from facefusion import inference_manager, state_manager
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.face_helper import warp_face_by_face_landmark_5
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import Embedding, FaceLandmark5, InferencePool, ModelOptions, ModelSet, VisionFrame
from facefusion.typing import DownloadScope, Embedding, FaceLandmark5, InferencePool, ModelOptions, ModelSet, VisionFrame
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'arcface':
@ -49,7 +49,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
return create_static_model_set().get('arcface')
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get('arcface')
def pre_check() -> bool:

View File

@ -23,12 +23,12 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import AgeModifierDirection, AgeModifierInputs
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import match_frame_color, read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'styleganex_age':
@ -76,7 +76,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
age_modifier_model = state_manager.get_item('age_modifier_model')
return create_static_model_set().get(age_modifier_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(age_modifier_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -21,161 +21,172 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import DeepSwapperInputs, DeepSwapperMorph
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import conditional_match_frame_color, read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
model_config =\
[
('druuzil', 'adrianne_palicki_384', (384, 384)),
('druuzil', 'agnetha_falskog_224', (224, 224)),
('druuzil', 'alan_ritchson_320', (320, 320)),
('druuzil', 'alicia_vikander_320', (320, 320)),
('druuzil', 'amber_midthunder_320', (320, 320)),
('druuzil', 'andras_arato_384', (384, 384)),
('druuzil', 'andrew_tate_320', (320, 320)),
('druuzil', 'anne_hathaway_320', (320, 320)),
('druuzil', 'anya_chalotra_320', (320, 320)),
('druuzil', 'arnold_schwarzenegger_320', (320, 320)),
('druuzil', 'benjamin_affleck_320', (320, 320)),
('druuzil', 'benjamin_stiller_384', (384, 384)),
('druuzil', 'bradley_pitt_224', (224, 224)),
('druuzil', 'bryan_cranston_320', (320, 320)),
('druuzil', 'catherine_blanchett_352', (352, 352)),
('druuzil', 'christian_bale_320', (320, 320)),
('druuzil', 'christopher_hemsworth_320', (320, 320)),
('druuzil', 'christoph_waltz_384', (384, 384)),
('druuzil', 'cillian_murphy_320', (320, 320)),
('druuzil', 'cobie_smulders_256', (256, 256)),
('druuzil', 'dwayne_johnson_384', (384, 384)),
('druuzil', 'edward_norton_320', (320, 320)),
('druuzil', 'elisabeth_shue_320', (320, 320)),
('druuzil', 'elizabeth_olsen_384', (384, 384)),
('druuzil', 'elon_musk_320', (320, 320)),
('druuzil', 'emily_blunt_320', (320, 320)),
('druuzil', 'emma_stone_384', (384, 384)),
('druuzil', 'emma_watson_320', (320, 320)),
('druuzil', 'erin_moriarty_384', (384, 384)),
('druuzil', 'eva_green_320', (320, 320)),
('druuzil', 'ewan_mcgregor_320', (320, 320)),
('druuzil', 'florence_pugh_320', (320, 320)),
('druuzil', 'freya_allan_320', (320, 320)),
('druuzil', 'gary_cole_224', (224, 224)),
('druuzil', 'gigi_hadid_224', (224, 224)),
('druuzil', 'harrison_ford_384', (384, 384)),
('druuzil', 'hayden_christensen_320', (320, 320)),
('druuzil', 'heath_ledger_320', (320, 320)),
('druuzil', 'henry_cavill_448', (448, 448)),
('druuzil', 'hugh_jackman_384', (384, 384)),
('druuzil', 'idris_elba_320', (320, 320)),
('druuzil', 'jack_nicholson_320', (320, 320)),
('druuzil', 'james_mcavoy_320', (320, 320)),
('druuzil', 'james_varney_320', (320, 320)),
('druuzil', 'jason_momoa_320', (320, 320)),
('druuzil', 'jason_statham_320', (320, 320)),
('druuzil', 'jennifer_connelly_384', (384, 384)),
('druuzil', 'jimmy_donaldson_320', (320, 320)),
('druuzil', 'jordan_peterson_384', (384, 384)),
('druuzil', 'karl_urban_224', (224, 224)),
('druuzil', 'kate_beckinsale_384', (384, 384)),
('druuzil', 'laurence_fishburne_384', (384, 384)),
('druuzil', 'lili_reinhart_320', (320, 320)),
('druuzil', 'mads_mikkelsen_384', (384, 384)),
('druuzil', 'mary_winstead_320', (320, 320)),
('druuzil', 'melina_juergens_320', (320, 320)),
('druuzil', 'michael_fassbender_320', (320, 320)),
('druuzil', 'michael_fox_320', (320, 320)),
('druuzil', 'millie_bobby_brown_320', (320, 320)),
('druuzil', 'morgan_freeman_320', (320, 320)),
('druuzil', 'patrick_stewart_320', (320, 320)),
('druuzil', 'rebecca_ferguson_320', (320, 320)),
('druuzil', 'scarlett_johansson_320', (320, 320)),
('druuzil', 'seth_macfarlane_384', (384, 384)),
('druuzil', 'thomas_cruise_320', (320, 320)),
('druuzil', 'thomas_hanks_384', (384, 384)),
('edel', 'emma_roberts_224', (224, 224)),
('edel', 'ivanka_trump_224', (224, 224)),
('edel', 'lize_dzjabrailova_224', (224, 224)),
('edel', 'sidney_sweeney_224', (224, 224)),
('edel', 'winona_ryder_224', (224, 224)),
('iperov', 'alexandra_daddario_224', (224, 224)),
('iperov', 'alexei_navalny_224', (224, 224)),
('iperov', 'amber_heard_224', (224, 224)),
('iperov', 'dilraba_dilmurat_224', (224, 224)),
('iperov', 'elon_musk_224', (224, 224)),
('iperov', 'emilia_clarke_224', (224, 224)),
('iperov', 'emma_watson_224', (224, 224)),
('iperov', 'erin_moriarty_224', (224, 224)),
('iperov', 'jackie_chan_224', (224, 224)),
('iperov', 'james_carrey_224', (224, 224)),
('iperov', 'jason_statham_320', (320, 320)),
('iperov', 'keanu_reeves_320', (320, 320)),
('iperov', 'margot_robbie_224', (224, 224)),
('iperov', 'natalie_dormer_224', (224, 224)),
('iperov', 'nicolas_coppola_224', (224, 224)),
('iperov', 'robert_downey_224', (224, 224)),
('iperov', 'rowan_atkinson_224', (224, 224)),
('iperov', 'ryan_reynolds_224', (224, 224)),
('iperov', 'scarlett_johansson_224', (224, 224)),
('iperov', 'sylvester_stallone_224', (224, 224)),
('iperov', 'thomas_cruise_224', (224, 224)),
('iperov', 'thomas_holland_224', (224, 224)),
('iperov', 'vin_diesel_224', (224, 224)),
('iperov', 'vladimir_putin_224', (224, 224)),
('jen', 'angelica_trae_288', (288, 288)),
('jen', 'ella_freya_224', (224, 224)),
('jen', 'emma_myers_320', (320, 320)),
('jen', 'evie_pickerill_224', (224, 224)),
('jen', 'kang_hyewon_320', (320, 320)),
('jen', 'maddie_mead_224', (224, 224)),
('jen', 'nicole_turnbull_288', (288, 288)),
('mats', 'alica_schmidt_320', (320, 320)),
('mats', 'ashley_alexiss_224', (224, 224)),
('mats', 'billie_eilish_224', (224, 224)),
('mats', 'brie_larson_224', (224, 224)),
('mats', 'cara_delevingne_224', (224, 224)),
('mats', 'carolin_kebekus_224', (224, 224)),
('mats', 'chelsea_clinton_224', (224, 224)),
('mats', 'claire_boucher_224', (224, 224)),
('mats', 'corinna_kopf_224', (224, 224)),
('mats', 'florence_pugh_224', (224, 224)),
('mats', 'hillary_clinton_224', (224, 224)),
('mats', 'jenna_fischer_224', (224, 224)),
('mats', 'kim_jisoo_320', (320, 320)),
('mats', 'mica_suarez_320', (320, 320)),
('mats', 'shailene_woodley_224', (224, 224)),
('mats', 'shraddha_kapoor_320', (320, 320)),
('mats', 'yu_jimin_352', (352, 352)),
('rumateus', 'alison_brie_224', (224, 224)),
('rumateus', 'amber_heard_224', (224, 224)),
('rumateus', 'angelina_jolie_224', (224, 224)),
('rumateus', 'aubrey_plaza_224', (224, 224)),
('rumateus', 'bridget_regan_224', (224, 224)),
('rumateus', 'cobie_smulders_224', (224, 224)),
('rumateus', 'deborah_woll_224', (224, 224)),
('rumateus', 'dua_lipa_224', (224, 224)),
('rumateus', 'emma_stone_224', (224, 224)),
('rumateus', 'hailee_steinfeld_224', (224, 224)),
('rumateus', 'hilary_duff_224', (224, 224)),
('rumateus', 'jessica_alba_224', (224, 224)),
('rumateus', 'jessica_biel_224', (224, 224)),
('rumateus', 'john_cena_224', (224, 224)),
('rumateus', 'kim_kardashian_224', (224, 224)),
('rumateus', 'kristen_bell_224', (224, 224)),
('rumateus', 'lucy_liu_224', (224, 224)),
('rumateus', 'margot_robbie_224', (224, 224)),
('rumateus', 'megan_fox_224', (224, 224)),
('rumateus', 'meghan_markle_224', (224, 224)),
('rumateus', 'millie_bobby_brown_224', (224, 224)),
('rumateus', 'natalie_portman_224', (224, 224)),
('rumateus', 'nicki_minaj_224', (224, 224)),
('rumateus', 'olivia_wilde_224', (224, 224)),
('rumateus', 'shay_mitchell_224', (224, 224)),
('rumateus', 'sophie_turner_224', (224, 224)),
('rumateus', 'taylor_swift_224', (224, 224))
]
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
model_config = []
if download_scope == 'full':
model_config.extend(
[
('druuzil', 'adrianne_palicki_384', (384, 384)),
('druuzil', 'agnetha_falskog_224', (224, 224)),
('druuzil', 'alan_ritchson_320', (320, 320)),
('druuzil', 'alicia_vikander_320', (320, 320)),
('druuzil', 'amber_midthunder_320', (320, 320)),
('druuzil', 'andras_arato_384', (384, 384)),
('druuzil', 'andrew_tate_320', (320, 320)),
('druuzil', 'anne_hathaway_320', (320, 320)),
('druuzil', 'anya_chalotra_320', (320, 320)),
('druuzil', 'arnold_schwarzenegger_320', (320, 320)),
('druuzil', 'benjamin_affleck_320', (320, 320)),
('druuzil', 'benjamin_stiller_384', (384, 384)),
('druuzil', 'bradley_pitt_224', (224, 224)),
('druuzil', 'bryan_cranston_320', (320, 320)),
('druuzil', 'catherine_blanchett_352', (352, 352)),
('druuzil', 'christian_bale_320', (320, 320)),
('druuzil', 'christopher_hemsworth_320', (320, 320)),
('druuzil', 'christoph_waltz_384', (384, 384)),
('druuzil', 'cillian_murphy_320', (320, 320)),
('druuzil', 'cobie_smulders_256', (256, 256)),
('druuzil', 'dwayne_johnson_384', (384, 384)),
('druuzil', 'edward_norton_320', (320, 320)),
('druuzil', 'elisabeth_shue_320', (320, 320)),
('druuzil', 'elizabeth_olsen_384', (384, 384)),
('druuzil', 'elon_musk_320', (320, 320)),
('druuzil', 'emily_blunt_320', (320, 320)),
('druuzil', 'emma_stone_384', (384, 384)),
('druuzil', 'emma_watson_320', (320, 320)),
('druuzil', 'erin_moriarty_384', (384, 384)),
('druuzil', 'eva_green_320', (320, 320)),
('druuzil', 'ewan_mcgregor_320', (320, 320)),
('druuzil', 'florence_pugh_320', (320, 320)),
('druuzil', 'freya_allan_320', (320, 320)),
('druuzil', 'gary_cole_224', (224, 224)),
('druuzil', 'gigi_hadid_224', (224, 224)),
('druuzil', 'harrison_ford_384', (384, 384)),
('druuzil', 'hayden_christensen_320', (320, 320)),
('druuzil', 'heath_ledger_320', (320, 320)),
('druuzil', 'henry_cavill_448', (448, 448)),
('druuzil', 'hugh_jackman_384', (384, 384)),
('druuzil', 'idris_elba_320', (320, 320)),
('druuzil', 'jack_nicholson_320', (320, 320)),
('druuzil', 'james_mcavoy_320', (320, 320)),
('druuzil', 'james_varney_320', (320, 320)),
('druuzil', 'jason_momoa_320', (320, 320)),
('druuzil', 'jason_statham_320', (320, 320)),
('druuzil', 'jennifer_connelly_384', (384, 384)),
('druuzil', 'jimmy_donaldson_320', (320, 320)),
('druuzil', 'jordan_peterson_384', (384, 384)),
('druuzil', 'karl_urban_224', (224, 224)),
('druuzil', 'kate_beckinsale_384', (384, 384)),
('druuzil', 'laurence_fishburne_384', (384, 384)),
('druuzil', 'lili_reinhart_320', (320, 320)),
('druuzil', 'mads_mikkelsen_384', (384, 384)),
('druuzil', 'mary_winstead_320', (320, 320)),
('druuzil', 'melina_juergens_320', (320, 320)),
('druuzil', 'michael_fassbender_320', (320, 320)),
('druuzil', 'michael_fox_320', (320, 320)),
('druuzil', 'millie_bobby_brown_320', (320, 320)),
('druuzil', 'morgan_freeman_320', (320, 320)),
('druuzil', 'patrick_stewart_320', (320, 320)),
('druuzil', 'rebecca_ferguson_320', (320, 320)),
('druuzil', 'scarlett_johansson_320', (320, 320)),
('druuzil', 'seth_macfarlane_384', (384, 384)),
('druuzil', 'thomas_cruise_320', (320, 320)),
('druuzil', 'thomas_hanks_384', (384, 384)),
('edel', 'emma_roberts_224', (224, 224)),
('edel', 'ivanka_trump_224', (224, 224)),
('edel', 'lize_dzjabrailova_224', (224, 224)),
('edel', 'sidney_sweeney_224', (224, 224)),
('edel', 'winona_ryder_224', (224, 224))
])
if download_scope == 'medium' or download_scope == 'full':
model_config.extend(
[
('iperov', 'alexandra_daddario_224', (224, 224)),
('iperov', 'alexei_navalny_224', (224, 224)),
('iperov', 'amber_heard_224', (224, 224)),
('iperov', 'dilraba_dilmurat_224', (224, 224)),
('iperov', 'elon_musk_224', (224, 224)),
('iperov', 'emilia_clarke_224', (224, 224)),
('iperov', 'emma_watson_224', (224, 224)),
('iperov', 'erin_moriarty_224', (224, 224)),
('iperov', 'jackie_chan_224', (224, 224)),
('iperov', 'james_carrey_224', (224, 224)),
('iperov', 'jason_statham_320', (320, 320)),
('iperov', 'keanu_reeves_320', (320, 320)),
('iperov', 'margot_robbie_224', (224, 224)),
('iperov', 'natalie_dormer_224', (224, 224)),
('iperov', 'nicolas_coppola_224', (224, 224)),
('iperov', 'robert_downey_224', (224, 224)),
('iperov', 'rowan_atkinson_224', (224, 224)),
('iperov', 'ryan_reynolds_224', (224, 224)),
('iperov', 'scarlett_johansson_224', (224, 224)),
('iperov', 'sylvester_stallone_224', (224, 224)),
('iperov', 'thomas_cruise_224', (224, 224)),
('iperov', 'thomas_holland_224', (224, 224)),
('iperov', 'vin_diesel_224', (224, 224)),
('iperov', 'vladimir_putin_224', (224, 224))
])
if download_scope == 'full':
model_config.extend(
[
('jen', 'angelica_trae_288', (288, 288)),
('jen', 'ella_freya_224', (224, 224)),
('jen', 'emma_myers_320', (320, 320)),
('jen', 'evie_pickerill_224', (224, 224)),
('jen', 'kang_hyewon_320', (320, 320)),
('jen', 'maddie_mead_224', (224, 224)),
('jen', 'nicole_turnbull_288', (288, 288)),
('mats', 'alica_schmidt_320', (320, 320)),
('mats', 'ashley_alexiss_224', (224, 224)),
('mats', 'billie_eilish_224', (224, 224)),
('mats', 'brie_larson_224', (224, 224)),
('mats', 'cara_delevingne_224', (224, 224)),
('mats', 'carolin_kebekus_224', (224, 224)),
('mats', 'chelsea_clinton_224', (224, 224)),
('mats', 'claire_boucher_224', (224, 224)),
('mats', 'corinna_kopf_224', (224, 224)),
('mats', 'florence_pugh_224', (224, 224)),
('mats', 'hillary_clinton_224', (224, 224)),
('mats', 'jenna_fischer_224', (224, 224)),
('mats', 'kim_jisoo_320', (320, 320)),
('mats', 'mica_suarez_320', (320, 320)),
('mats', 'shailene_woodley_224', (224, 224)),
('mats', 'shraddha_kapoor_320', (320, 320)),
('mats', 'yu_jimin_352', (352, 352)),
('rumateus', 'alison_brie_224', (224, 224)),
('rumateus', 'amber_heard_224', (224, 224)),
('rumateus', 'angelina_jolie_224', (224, 224)),
('rumateus', 'aubrey_plaza_224', (224, 224)),
('rumateus', 'bridget_regan_224', (224, 224)),
('rumateus', 'cobie_smulders_224', (224, 224)),
('rumateus', 'deborah_woll_224', (224, 224)),
('rumateus', 'dua_lipa_224', (224, 224)),
('rumateus', 'emma_stone_224', (224, 224)),
('rumateus', 'hailee_steinfeld_224', (224, 224)),
('rumateus', 'hilary_duff_224', (224, 224)),
('rumateus', 'jessica_alba_224', (224, 224)),
('rumateus', 'jessica_biel_224', (224, 224)),
('rumateus', 'john_cena_224', (224, 224)),
('rumateus', 'kim_kardashian_224', (224, 224)),
('rumateus', 'kristen_bell_224', (224, 224)),
('rumateus', 'lucy_liu_224', (224, 224)),
('rumateus', 'margot_robbie_224', (224, 224)),
('rumateus', 'megan_fox_224', (224, 224)),
('rumateus', 'meghan_markle_224', (224, 224)),
('rumateus', 'millie_bobby_brown_224', (224, 224)),
('rumateus', 'natalie_portman_224', (224, 224)),
('rumateus', 'nicki_minaj_224', (224, 224)),
('rumateus', 'olivia_wilde_224', (224, 224)),
('rumateus', 'shay_mitchell_224', (224, 224)),
('rumateus', 'sophie_turner_224', (224, 224)),
('rumateus', 'taylor_swift_224', (224, 224))
])
model_set : ModelSet = {}
for model_creator, model_name, model_size in model_config:
@ -219,7 +230,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
deep_swapper_model = state_manager.get_item('deep_swapper_model')
return create_static_model_set().get(deep_swapper_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(deep_swapper_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -23,12 +23,12 @@ from facefusion.processors.typing import ExpressionRestorerInputs
from facefusion.processors.typing import LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import get_video_frame, read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'live_portrait':
@ -87,7 +87,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
expression_restorer_model = state_manager.get_item('expression_restorer_model')
return create_static_model_set().get(expression_restorer_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(expression_restorer_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -22,12 +22,12 @@ from facefusion.processors.live_portrait import create_rotation, limit_euler_ang
from facefusion.processors.typing import FaceEditorInputs, LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitRotation, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, FaceLandmark68, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, FaceLandmark68, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'live_portrait':
@ -117,7 +117,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
face_editor_model = state_manager.get_item('face_editor_model')
return create_static_model_set().get(face_editor_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(face_editor_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -21,12 +21,12 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import FaceEnhancerInputs, FaceEnhancerWeight
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'codeformer':
@ -234,7 +234,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
face_enhancer_model = state_manager.get_item('face_enhancer_model')
return create_static_model_set().get(face_enhancer_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(face_enhancer_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -24,12 +24,12 @@ from facefusion.processors.pixel_boost import explode_pixel_boost, implode_pixel
from facefusion.processors.typing import FaceSwapperInputs
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Embedding, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Embedding, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import read_image, read_static_image, read_static_images, unpack_resolution, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'blendswap_256':
@ -348,7 +348,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
face_swapper_model = state_manager.get_item('face_swapper_model')
return create_static_model_set().get(face_swapper_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(face_swapper_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -16,12 +16,12 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import FrameColorizerInputs
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import read_image, read_static_image, unpack_resolution, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'ddcolor':
@ -140,7 +140,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
frame_colorizer_model = state_manager.get_item('frame_colorizer_model')
return create_static_model_set().get(frame_colorizer_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(frame_colorizer_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -16,12 +16,12 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import FrameEnhancerInputs
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import ApplyStateItem, Args, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import create_tile_frames, merge_tile_frames, read_image, read_static_image, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'clear_reality_x4':
@ -397,7 +397,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
frame_enhancer_model = state_manager.get_item('frame_enhancer_model')
return create_static_model_set().get(frame_enhancer_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(frame_enhancer_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -22,12 +22,12 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import LipSyncerInputs
from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore
from facefusion.typing import ApplyStateItem, Args, AudioFrame, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.typing import ApplyStateItem, Args, AudioFrame, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, QueuePayload, UpdateProgress, VisionFrame
from facefusion.vision import read_image, read_static_image, restrict_video_fps, write_image
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'wav2lip_96':
@ -86,7 +86,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
lip_syncer_model = state_manager.get_item('lip_syncer_model')
return create_static_model_set().get(lip_syncer_model)
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get(lip_syncer_model)
def register_args(program : ArgumentParser) -> None:

View File

@ -199,11 +199,12 @@ def create_execution_program() -> ArgumentParser:
return program
def create_download_providers_program() -> ArgumentParser:
def create_download_program() -> ArgumentParser:
program = ArgumentParser(add_help = False)
group_download = program.add_argument_group('download')
group_download.add_argument('--download-providers', help = wording.get('help.download_providers').format(choices = ', '.join(list(facefusion.choices.download_provider_set.keys()))), default = config.get_str_list('download.download_providers', 'github'), choices = list(facefusion.choices.download_provider_set.keys()), nargs = '+', metavar = 'DOWNLOAD_PROVIDERS')
job_store.register_job_keys([ 'download_providers' ])
group_download.add_argument('--download-scope', help = wording.get('help.download_scope'), default = config.get_str_value('download.download_scope', 'lite'), choices = list(facefusion.choices.download_scopes))
job_store.register_job_keys([ 'download_providers', 'download_scope' ])
return program
@ -248,7 +249,7 @@ def collect_step_program() -> ArgumentParser:
def collect_job_program() -> ArgumentParser:
return ArgumentParser(parents= [ create_execution_program(), create_download_providers_program(), create_memory_program(), create_log_level_program() ], add_help = False)
return ArgumentParser(parents= [ create_execution_program(), create_download_program(), create_memory_program(), create_log_level_program() ], add_help = False)
def create_program() -> ArgumentParser:
@ -260,7 +261,7 @@ def create_program() -> ArgumentParser:
sub_program.add_parser('run', help = wording.get('help.run'), parents = [ create_config_path_program(), create_temp_path_program(), create_jobs_path_program(), create_source_paths_program(), create_target_path_program(), create_output_path_program(), collect_step_program(), create_uis_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
sub_program.add_parser('headless-run', help = wording.get('help.headless_run'), parents = [ create_config_path_program(), create_temp_path_program(), create_jobs_path_program(), create_source_paths_program(), create_target_path_program(), create_output_path_program(), collect_step_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
sub_program.add_parser('batch-run', help = wording.get('help.batch_run'), parents = [ create_config_path_program(), create_temp_path_program(), create_jobs_path_program(), create_source_pattern_program(), create_target_pattern_program(), create_output_pattern_program(), collect_step_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
sub_program.add_parser('force-download', help = wording.get('help.force_download'), parents = [ create_download_providers_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
sub_program.add_parser('force-download', help = wording.get('help.force_download'), parents = [ create_download_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
# job manager
sub_program.add_parser('job-list', help = wording.get('help.job_list'), parents = [ create_job_status_program(), create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
sub_program.add_parser('job-create', help = wording.get('help.job_create'), parents = [ create_job_id_program(), create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)

View File

@ -119,6 +119,7 @@ ExecutionProviderSet = Dict[ExecutionProviderKey, ExecutionProviderValue]
DownloadProviderKey = Literal['github', 'huggingface']
DownloadProviderSet = Dict[DownloadProviderKey, str]
DownloadScope = Literal['lite', 'medium', 'full']
Download = TypedDict('Download',
{
'url' : str,
@ -249,6 +250,7 @@ StateKey = Literal\
'execution_thread_count',
'execution_queue_count',
'download_providers',
'download_scope',
'video_memory_strategy',
'system_memory_limit',
'log_level',
@ -309,6 +311,7 @@ State = TypedDict('State',
'execution_thread_count' : int,
'execution_queue_count' : int,
'download_providers' : List[DownloadProviderKey],
'download_scope' : DownloadScope,
'video_memory_strategy' : VideoMemoryStrategy,
'system_memory_limit' : int,
'log_level' : LogLevel,

View File

@ -3,7 +3,7 @@ from typing import Optional, Sequence, Tuple
import gradio
import facefusion.choices
from facefusion import choices, face_detector, state_manager, wording
from facefusion import face_detector, state_manager, wording
from facefusion.common_helper import calc_float_step, get_last
from facefusion.typing import Angle, FaceDetectorModel, Score
from facefusion.uis.core import register_ui_component
@ -65,7 +65,7 @@ def update_face_detector_model(face_detector_model : FaceDetectorModel) -> Tuple
state_manager.set_item('face_detector_model', face_detector_model)
if face_detector.pre_check():
face_detector_size_choices = choices.face_detector_set.get(state_manager.get_item('face_detector_model'))
face_detector_size_choices = facefusion.choices.face_detector_set.get(state_manager.get_item('face_detector_model'))
state_manager.set_item('face_detector_size', get_last(face_detector_size_choices))
return gradio.Dropdown(value = state_manager.get_item('face_detector_model')), gradio.Dropdown(value = state_manager.get_item('face_detector_size'), choices = face_detector_size_choices)
return gradio.Dropdown(), gradio.Dropdown()

View File

@ -4,15 +4,15 @@ from typing import Tuple
import numpy
import scipy
from facefusion import inference_manager
from facefusion import inference_manager, state_manager
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import thread_semaphore
from facefusion.typing import Audio, AudioChunk, InferencePool, ModelOptions, ModelSet
from facefusion.typing import Audio, AudioChunk, DownloadScope, InferencePool, ModelOptions, ModelSet
@lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet:
def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\
{
'kim_vocal_2':
@ -47,7 +47,8 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions:
return create_static_model_set().get('kim_vocal_2')
download_scope = state_manager.get_item('download_scope')
return create_static_model_set(download_scope).get('kim_vocal_2')
def pre_check() -> bool:

View File

@ -185,6 +185,7 @@ WORDING : Dict[str, Any] =\
'execution_queue_count': 'specify the amount of frames each thread is processing',
# download
'download_providers': 'download using different providers (choices: {choices}, ...)',
'download_scope': 'specify the download scope',
# memory
'video_memory_strategy': 'balance fast processing and low VRAM usage',
'system_memory_limit': 'limit the available RAM that can be used while processing',