Introduce download scopes (#826)

* Introduce download scopes

* Limit download scopes to force-download command
This commit is contained in:
Henry Ruhs 2024-11-26 18:21:11 +01:00 committed by GitHub
parent acdddc730e
commit 33db393af9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 232 additions and 206 deletions

View File

@ -103,6 +103,7 @@ execution_queue_count =
[download] [download]
download_providers = download_providers =
download_scope =
[memory] [memory]
video_memory_strategy = 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')) apply_state_item('execution_queue_count', args.get('execution_queue_count'))
# download # download
apply_state_item('download_providers', args.get('download_providers')) apply_state_item('download_providers', args.get('download_providers'))
apply_state_item('download_scope', args.get('download_scope'))
# memory # memory
apply_state_item('video_memory_strategy', args.get('video_memory_strategy')) apply_state_item('video_memory_strategy', args.get('video_memory_strategy'))
apply_state_item('system_memory_limit', args.get('system_memory_limit')) 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 typing import List, Sequence
from facefusion.common_helper import create_float_range, create_int_range 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' ] 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}', 'github': 'https://github.com/facefusion/facefusion-assets/releases/download/{base_name}/{file_name}',
'huggingface': 'https://huggingface.co/facefusion/{base_name}/resolve/main/{file_name}' 'huggingface': 'https://huggingface.co/facefusion/{base_name}/resolve/main/{file_name}'
} }
download_scopes : List[DownloadScope] = [ 'lite', 'full' ]
log_level_set : LogLevelSet =\ 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.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.filesystem import resolve_relative_path from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore 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 from facefusion.vision import count_video_frame_total, detect_video_fps, get_video_frame, read_image
PROBABILITY_LIMIT = 0.80 PROBABILITY_LIMIT = 0.80
@ -17,7 +17,7 @@ STREAM_COUNTER = 0
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'open_nsfw': 'open_nsfw':
@ -54,7 +54,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
return create_static_model_set().get('open_nsfw') return create_static_model_set('full').get('open_nsfw')
def pre_check() -> bool: def pre_check() -> bool:

View File

@ -138,7 +138,7 @@ def force_download() -> ErrorCode:
for module in common_modules + processor_modules: for module in common_modules + processor_modules:
if hasattr(module, 'create_static_model_set'): 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_hashes = model.get('hashes')
model_sources = model.get('sources') model_sources = model.get('sources')

View File

@ -8,11 +8,11 @@ from facefusion.download import conditional_download_hashes, conditional_downloa
from facefusion.face_helper import warp_face_by_face_landmark_5 from facefusion.face_helper import warp_face_by_face_landmark_5
from facefusion.filesystem import resolve_relative_path from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore 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) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'fairface': 'fairface':
@ -51,7 +51,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
return create_static_model_set().get('fairface') return create_static_model_set('full').get('fairface')
def pre_check() -> bool: 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.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.filesystem import resolve_relative_path
from facefusion.thread_helper import thread_semaphore 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 from facefusion.vision import resize_frame_resolution, unpack_resolution
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'retinaface': 'retinaface':
@ -91,7 +91,7 @@ def clear_inference_pool() -> None:
def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]: def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]:
model_hashes = {} model_hashes = {}
model_sources = {} model_sources = {}
model_set = create_static_model_set() model_set = create_static_model_set('full')
if state_manager.get_item('face_detector_model') in [ 'many', 'retinaface' ]: if state_manager.get_item('face_detector_model') in [ 'many', 'retinaface' ]:
model_hashes['retinaface'] = model_set.get('retinaface').get('hashes').get('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.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.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore 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) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'2dfan4': '2dfan4':
@ -90,7 +90,7 @@ def clear_inference_pool() -> None:
def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]: def collect_model_downloads() -> Tuple[DownloadSet, DownloadSet]:
model_set = create_static_model_set() model_set = create_static_model_set('full')
model_hashes =\ model_hashes =\
{ {
'fan_68_5': model_set.get('fan_68_5').get('hashes').get('fan_68_5') 'fan_68_5': model_set.get('fan_68_5').get('hashes').get('fan_68_5')
@ -132,7 +132,7 @@ 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]: 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') model_size = create_static_model_set('full').get('2dfan4').get('size')
scale = 195 / numpy.subtract(bounding_box[2:], bounding_box[:2]).max().clip(1, None) 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 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) rotated_matrix, rotated_size = create_rotated_matrix_and_size(face_angle, model_size)
@ -151,7 +151,7 @@ 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]: 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') model_size = create_static_model_set('full').get('peppa_wutz').get('size')
scale = 195 / numpy.subtract(bounding_box[2:], bounding_box[:2]).max().clip(1, None) 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 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) rotated_matrix, rotated_size = create_rotated_matrix_and_size(face_angle, model_size)

View File

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

View File

@ -8,11 +8,11 @@ from facefusion.download import conditional_download_hashes, conditional_downloa
from facefusion.face_helper import warp_face_by_face_landmark_5 from facefusion.face_helper import warp_face_by_face_landmark_5
from facefusion.filesystem import resolve_relative_path from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import conditional_thread_semaphore 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) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'arcface': 'arcface':
@ -49,7 +49,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
return create_static_model_set().get('arcface') return create_static_model_set('full').get('arcface')
def pre_check() -> bool: 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.processors.typing import AgeModifierDirection, AgeModifierInputs
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore 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 from facefusion.vision import match_frame_color, read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'styleganex_age': 'styleganex_age':
@ -76,7 +76,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
age_modifier_model = state_manager.get_item('age_modifier_model') age_modifier_model = state_manager.get_item('age_modifier_model')
return create_static_model_set().get(age_modifier_model) return create_static_model_set('full').get(age_modifier_model)
def register_args(program : ArgumentParser) -> None: def register_args(program : ArgumentParser) -> None:

View File

@ -21,13 +21,16 @@ from facefusion.processors import choices as processors_choices
from facefusion.processors.typing import DeepSwapperInputs, DeepSwapperMorph from facefusion.processors.typing import DeepSwapperInputs, DeepSwapperMorph
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore 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 from facefusion.vision import conditional_match_frame_color, read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
model_config =\ model_config = []
if download_scope == 'full':
model_config.extend(
[ [
('druuzil', 'adrianne_palicki_384', (384, 384)), ('druuzil', 'adrianne_palicki_384', (384, 384)),
('druuzil', 'agnetha_falskog_224', (224, 224)), ('druuzil', 'agnetha_falskog_224', (224, 224)),
@ -99,7 +102,11 @@ def create_static_model_set() -> ModelSet:
('edel', 'ivanka_trump_224', (224, 224)), ('edel', 'ivanka_trump_224', (224, 224)),
('edel', 'lize_dzjabrailova_224', (224, 224)), ('edel', 'lize_dzjabrailova_224', (224, 224)),
('edel', 'sidney_sweeney_224', (224, 224)), ('edel', 'sidney_sweeney_224', (224, 224)),
('edel', 'winona_ryder_224', (224, 224)), ('edel', 'winona_ryder_224', (224, 224))
])
if download_scope in [ 'lite', 'full' ]:
model_config.extend(
[
('iperov', 'alexandra_daddario_224', (224, 224)), ('iperov', 'alexandra_daddario_224', (224, 224)),
('iperov', 'alexei_navalny_224', (224, 224)), ('iperov', 'alexei_navalny_224', (224, 224)),
('iperov', 'amber_heard_224', (224, 224)), ('iperov', 'amber_heard_224', (224, 224)),
@ -123,7 +130,11 @@ def create_static_model_set() -> ModelSet:
('iperov', 'thomas_cruise_224', (224, 224)), ('iperov', 'thomas_cruise_224', (224, 224)),
('iperov', 'thomas_holland_224', (224, 224)), ('iperov', 'thomas_holland_224', (224, 224)),
('iperov', 'vin_diesel_224', (224, 224)), ('iperov', 'vin_diesel_224', (224, 224)),
('iperov', 'vladimir_putin_224', (224, 224)), ('iperov', 'vladimir_putin_224', (224, 224))
])
if download_scope == 'full':
model_config.extend(
[
('jen', 'angelica_trae_288', (288, 288)), ('jen', 'angelica_trae_288', (288, 288)),
('jen', 'ella_freya_224', (224, 224)), ('jen', 'ella_freya_224', (224, 224)),
('jen', 'emma_myers_320', (320, 320)), ('jen', 'emma_myers_320', (320, 320)),
@ -175,7 +186,7 @@ def create_static_model_set() -> ModelSet:
('rumateus', 'shay_mitchell_224', (224, 224)), ('rumateus', 'shay_mitchell_224', (224, 224)),
('rumateus', 'sophie_turner_224', (224, 224)), ('rumateus', 'sophie_turner_224', (224, 224)),
('rumateus', 'taylor_swift_224', (224, 224)) ('rumateus', 'taylor_swift_224', (224, 224))
] ])
model_set : ModelSet = {} model_set : ModelSet = {}
for model_creator, model_name, model_size in model_config: for model_creator, model_name, model_size in model_config:
@ -219,7 +230,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
deep_swapper_model = state_manager.get_item('deep_swapper_model') deep_swapper_model = state_manager.get_item('deep_swapper_model')
return create_static_model_set().get(deep_swapper_model) return create_static_model_set('full').get(deep_swapper_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore 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 from facefusion.vision import get_video_frame, read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'live_portrait': 'live_portrait':
@ -87,7 +87,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
expression_restorer_model = state_manager.get_item('expression_restorer_model') expression_restorer_model = state_manager.get_item('expression_restorer_model')
return create_static_model_set().get(expression_restorer_model) return create_static_model_set('full').get(expression_restorer_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import FaceEditorInputs, LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitRotation, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore 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 from facefusion.vision import read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'live_portrait': 'live_portrait':
@ -117,7 +117,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
face_editor_model = state_manager.get_item('face_editor_model') face_editor_model = state_manager.get_item('face_editor_model')
return create_static_model_set().get(face_editor_model) return create_static_model_set('full').get(face_editor_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import FaceEnhancerInputs, FaceEnhancerWeight
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore 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 from facefusion.vision import read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'codeformer': 'codeformer':
@ -234,7 +234,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
face_enhancer_model = state_manager.get_item('face_enhancer_model') face_enhancer_model = state_manager.get_item('face_enhancer_model')
return create_static_model_set().get(face_enhancer_model) return create_static_model_set('full').get(face_enhancer_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import FaceSwapperInputs
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore 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 from facefusion.vision import read_image, read_static_image, read_static_images, unpack_resolution, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'blendswap_256': 'blendswap_256':
@ -348,7 +348,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
face_swapper_model = state_manager.get_item('face_swapper_model') face_swapper_model = state_manager.get_item('face_swapper_model')
return create_static_model_set().get(face_swapper_model) return create_static_model_set('full').get(face_swapper_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import FrameColorizerInputs
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import thread_semaphore 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 from facefusion.vision import read_image, read_static_image, unpack_resolution, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'ddcolor': 'ddcolor':
@ -140,7 +140,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
frame_colorizer_model = state_manager.get_item('frame_colorizer_model') frame_colorizer_model = state_manager.get_item('frame_colorizer_model')
return create_static_model_set().get(frame_colorizer_model) return create_static_model_set('full').get(frame_colorizer_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import FrameEnhancerInputs
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore 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 from facefusion.vision import create_tile_frames, merge_tile_frames, read_image, read_static_image, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'clear_reality_x4': 'clear_reality_x4':
@ -397,7 +397,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
frame_enhancer_model = state_manager.get_item('frame_enhancer_model') frame_enhancer_model = state_manager.get_item('frame_enhancer_model')
return create_static_model_set().get(frame_enhancer_model) return create_static_model_set('full').get(frame_enhancer_model)
def register_args(program : ArgumentParser) -> None: 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.processors.typing import LipSyncerInputs
from facefusion.program_helper import find_argument_group from facefusion.program_helper import find_argument_group
from facefusion.thread_helper import conditional_thread_semaphore 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 from facefusion.vision import read_image, read_static_image, restrict_video_fps, write_image
@lru_cache(maxsize = None) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'wav2lip_96': 'wav2lip_96':
@ -86,7 +86,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
lip_syncer_model = state_manager.get_item('lip_syncer_model') lip_syncer_model = state_manager.get_item('lip_syncer_model')
return create_static_model_set().get(lip_syncer_model) return create_static_model_set('full').get(lip_syncer_model)
def register_args(program : ArgumentParser) -> None: def register_args(program : ArgumentParser) -> None:

View File

@ -207,6 +207,14 @@ def create_download_providers_program() -> ArgumentParser:
return program return program
def create_download_scope_program() -> ArgumentParser:
program = ArgumentParser(add_help = False)
group_download = program.add_argument_group('download')
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_scope' ])
return program
def create_memory_program() -> ArgumentParser: def create_memory_program() -> ArgumentParser:
program = ArgumentParser(add_help = False) program = ArgumentParser(add_help = False)
group_memory = program.add_argument_group('memory') group_memory = program.add_argument_group('memory')
@ -260,7 +268,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('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('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('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_providers_program(), create_download_scope_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
# job manager # 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-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) 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'] DownloadProviderKey = Literal['github', 'huggingface']
DownloadProviderSet = Dict[DownloadProviderKey, str] DownloadProviderSet = Dict[DownloadProviderKey, str]
DownloadScope = Literal['lite', 'full']
Download = TypedDict('Download', Download = TypedDict('Download',
{ {
'url' : str, 'url' : str,
@ -249,6 +250,7 @@ StateKey = Literal\
'execution_thread_count', 'execution_thread_count',
'execution_queue_count', 'execution_queue_count',
'download_providers', 'download_providers',
'download_scope',
'video_memory_strategy', 'video_memory_strategy',
'system_memory_limit', 'system_memory_limit',
'log_level', 'log_level',
@ -309,6 +311,7 @@ State = TypedDict('State',
'execution_thread_count' : int, 'execution_thread_count' : int,
'execution_queue_count' : int, 'execution_queue_count' : int,
'download_providers' : List[DownloadProviderKey], 'download_providers' : List[DownloadProviderKey],
'download_scope' : DownloadScope,
'video_memory_strategy' : VideoMemoryStrategy, 'video_memory_strategy' : VideoMemoryStrategy,
'system_memory_limit' : int, 'system_memory_limit' : int,
'log_level' : LogLevel, 'log_level' : LogLevel,

View File

@ -3,7 +3,7 @@ from typing import Optional, Sequence, Tuple
import gradio import gradio
import facefusion.choices 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.common_helper import calc_float_step, get_last
from facefusion.typing import Angle, FaceDetectorModel, Score from facefusion.typing import Angle, FaceDetectorModel, Score
from facefusion.uis.core import register_ui_component 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) state_manager.set_item('face_detector_model', face_detector_model)
if face_detector.pre_check(): 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)) 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(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() return gradio.Dropdown(), gradio.Dropdown()

View File

@ -8,11 +8,11 @@ from facefusion import inference_manager
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
from facefusion.filesystem import resolve_relative_path from facefusion.filesystem import resolve_relative_path
from facefusion.thread_helper import thread_semaphore 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) @lru_cache(maxsize = None)
def create_static_model_set() -> ModelSet: def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
return\ return\
{ {
'kim_vocal_2': 'kim_vocal_2':
@ -47,7 +47,7 @@ def clear_inference_pool() -> None:
def get_model_options() -> ModelOptions: def get_model_options() -> ModelOptions:
return create_static_model_set().get('kim_vocal_2') return create_static_model_set('full').get('kim_vocal_2')
def pre_check() -> bool: 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', 'execution_queue_count': 'specify the amount of frames each thread is processing',
# download # download
'download_providers': 'download using different providers (choices: {choices}, ...)', 'download_providers': 'download using different providers (choices: {choices}, ...)',
'download_scope': 'specify the download scope',
# memory # memory
'video_memory_strategy': 'balance fast processing and low VRAM usage', 'video_memory_strategy': 'balance fast processing and low VRAM usage',
'system_memory_limit': 'limit the available RAM that can be used while processing', 'system_memory_limit': 'limit the available RAM that can be used while processing',