mirror of
https://github.com/facefusion/facefusion.git
synced 2026-04-30 21:37:49 +02:00
Scope for Args (#988)
* Add API scopes * Add API scopes * Add API scopes * Add API scopes * Add API scopes * Add API scopes * Add API scopes * Add API scopes * Remove system memory limit (#986) * Add session_id, make token size more reasonable (#983) * Add session_id, make token size more reasonable * Use more direct approach * Fix more stuff * Fix ignore comments * Fix naming * Fix lint
This commit is contained in:
@@ -1,23 +1,22 @@
|
||||
from typing import get_args
|
||||
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import JSONResponse
|
||||
from starlette.status import HTTP_200_OK
|
||||
|
||||
from facefusion import state_manager
|
||||
from facefusion.types import StateKey
|
||||
from facefusion import args_store, state_manager
|
||||
|
||||
|
||||
async def get_state(request : Request) -> JSONResponse:
|
||||
return JSONResponse(state_manager.get_state(), status_code = HTTP_200_OK)
|
||||
api_args = args_store.filter_api_args(state_manager.get_state()) #type:ignore[arg-type]
|
||||
return JSONResponse(state_manager.collect_state(api_args), status_code = HTTP_200_OK)
|
||||
|
||||
|
||||
async def set_state(request : Request) -> JSONResponse:
|
||||
body = await request.json()
|
||||
api_args = args_store.get_api_args()
|
||||
|
||||
for key, value in body.items():
|
||||
if key in get_args(StateKey):
|
||||
if key in api_args:
|
||||
state_manager.set_item(key, value)
|
||||
|
||||
return JSONResponse(state_manager.get_state(), status_code = HTTP_200_OK)
|
||||
|
||||
__api_args__ = args_store.filter_api_args(state_manager.get_state()) #type:ignore[arg-type]
|
||||
return JSONResponse(state_manager.collect_state(__api_args__), status_code = HTTP_200_OK)
|
||||
|
||||
@@ -1,44 +1,10 @@
|
||||
from facefusion import state_manager
|
||||
from facefusion.filesystem import get_file_name, is_video, resolve_file_paths
|
||||
from facefusion.jobs import job_store
|
||||
from facefusion.normalizer import normalize_fps, normalize_space
|
||||
from facefusion.processors.core import get_processors_modules
|
||||
from facefusion.types import ApplyStateItem, Args
|
||||
from facefusion.vision import detect_video_fps
|
||||
|
||||
|
||||
def reduce_step_args(args : Args) -> Args:
|
||||
step_args =\
|
||||
{
|
||||
key: args[key] for key in args if key in job_store.get_step_keys()
|
||||
}
|
||||
return step_args
|
||||
|
||||
|
||||
def reduce_job_args(args : Args) -> Args:
|
||||
job_args =\
|
||||
{
|
||||
key: args[key] for key in args if key in job_store.get_job_keys()
|
||||
}
|
||||
return job_args
|
||||
|
||||
|
||||
def collect_step_args() -> Args:
|
||||
step_args =\
|
||||
{
|
||||
key: state_manager.get_item(key) for key in job_store.get_step_keys() #type:ignore[arg-type]
|
||||
}
|
||||
return step_args
|
||||
|
||||
|
||||
def collect_job_args() -> Args:
|
||||
job_args =\
|
||||
{
|
||||
key: state_manager.get_item(key) for key in job_store.get_job_keys() #type:ignore[arg-type]
|
||||
}
|
||||
return job_args
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
# general
|
||||
apply_state_item('command', args.get('command'))
|
||||
@@ -0,0 +1,66 @@
|
||||
from typing import List
|
||||
|
||||
from facefusion.types import Args, ArgsStore, Scope
|
||||
|
||||
|
||||
ARGS_STORE : ArgsStore =\
|
||||
{
|
||||
'api': [],
|
||||
'cli': [],
|
||||
'sys': []
|
||||
}
|
||||
|
||||
|
||||
def get_api_args() -> List[str]:
|
||||
return ARGS_STORE.get('api')
|
||||
|
||||
|
||||
def get_sys_args() -> List[str]:
|
||||
return ARGS_STORE.get('sys')
|
||||
|
||||
|
||||
def get_cli_args() -> List[str]:
|
||||
return ARGS_STORE.get('cli')
|
||||
|
||||
|
||||
def register_args(keys : List[str], scopes : List[Scope]) -> None:
|
||||
for key in keys:
|
||||
for scope in scopes:
|
||||
if scope == 'api':
|
||||
ARGS_STORE['api'].append(key)
|
||||
if scope == 'cli':
|
||||
ARGS_STORE['cli'].append(key)
|
||||
if scope == 'sys':
|
||||
ARGS_STORE['sys'].append(key)
|
||||
|
||||
|
||||
def filter_api_args(args : Args) -> Args:
|
||||
api_args =\
|
||||
{
|
||||
key: args.get(key) for key in args if key in get_api_args() #type:ignore[literal-required]
|
||||
}
|
||||
return api_args
|
||||
|
||||
|
||||
def filter_sys_args(args : Args) -> Args:
|
||||
sys_args =\
|
||||
{
|
||||
key: args.get(key) for key in args if key in get_sys_args() #type:ignore[literal-required]
|
||||
}
|
||||
return sys_args
|
||||
|
||||
|
||||
def filter_cli_args(args : Args) -> Args:
|
||||
cli_args =\
|
||||
{
|
||||
key: args.get(key) for key in args if key in get_cli_args() #type:ignore[literal-required]
|
||||
}
|
||||
return cli_args
|
||||
|
||||
|
||||
def filter_step_args(args : Args) -> Args:
|
||||
step_args =\
|
||||
{
|
||||
key: args.get(key) for key in args if key in get_cli_args() and key not in get_sys_args() #type:ignore[literal-required]
|
||||
}
|
||||
return step_args
|
||||
+15
-14
@@ -7,9 +7,9 @@ from time import time
|
||||
|
||||
import uvicorn
|
||||
|
||||
from facefusion import benchmarker, cli_helper, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, hash_helper, logger, state_manager, translator, voice_extractor
|
||||
from facefusion import args_store, benchmarker, cli_helper, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, hash_helper, logger, state_manager, translator, voice_extractor
|
||||
from facefusion.apis.core import create_api
|
||||
from facefusion.args import apply_args, collect_job_args, reduce_job_args, reduce_step_args
|
||||
from facefusion.args_helper import apply_args
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources
|
||||
from facefusion.exit_helper import hard_exit, signal_exit
|
||||
from facefusion.filesystem import get_file_extension, get_file_name, is_image, is_video, resolve_file_paths, resolve_file_pattern
|
||||
@@ -194,7 +194,7 @@ def route_job_manager(args : Args) -> ErrorCode:
|
||||
return 1
|
||||
|
||||
if state_manager.get_item('command') == 'job-add-step':
|
||||
step_args = reduce_step_args(args)
|
||||
step_args = args_store.filter_step_args(args)
|
||||
|
||||
if job_manager.add_step(state_manager.get_item('job_id'), step_args):
|
||||
logger.info(translator.get('job_step_added').format(job_id = state_manager.get_item('job_id')), __name__)
|
||||
@@ -203,7 +203,7 @@ def route_job_manager(args : Args) -> ErrorCode:
|
||||
return 1
|
||||
|
||||
if state_manager.get_item('command') == 'job-remix-step':
|
||||
step_args = reduce_step_args(args)
|
||||
step_args = args_store.filter_step_args(args)
|
||||
|
||||
if job_manager.remix_step(state_manager.get_item('job_id'), state_manager.get_item('step_index'), step_args):
|
||||
logger.info(translator.get('job_remix_step_added').format(job_id = state_manager.get_item('job_id'), step_index = state_manager.get_item('step_index')), __name__)
|
||||
@@ -212,7 +212,7 @@ def route_job_manager(args : Args) -> ErrorCode:
|
||||
return 1
|
||||
|
||||
if state_manager.get_item('command') == 'job-insert-step':
|
||||
step_args = reduce_step_args(args)
|
||||
step_args = args_store.filter_step_args(args)
|
||||
|
||||
if job_manager.insert_step(state_manager.get_item('job_id'), state_manager.get_item('step_index'), step_args):
|
||||
logger.info(translator.get('job_step_inserted').format(job_id = state_manager.get_item('job_id'), step_index = state_manager.get_item('step_index')), __name__)
|
||||
@@ -266,7 +266,7 @@ def route_job_runner() -> ErrorCode:
|
||||
|
||||
def process_headless(args : Args) -> ErrorCode:
|
||||
job_id = job_helper.suggest_job_id('headless')
|
||||
step_args = reduce_step_args(args)
|
||||
step_args = args_store.filter_step_args(args)
|
||||
|
||||
if job_manager.create_job(job_id) and job_manager.add_step(job_id, step_args) and job_manager.submit_job(job_id) and job_runner.run_job(job_id, process_step):
|
||||
return 0
|
||||
@@ -275,10 +275,9 @@ def process_headless(args : Args) -> ErrorCode:
|
||||
|
||||
def process_batch(args : Args) -> ErrorCode:
|
||||
job_id = job_helper.suggest_job_id('batch')
|
||||
step_args = reduce_step_args(args)
|
||||
job_args = reduce_job_args(args)
|
||||
source_paths = resolve_file_pattern(job_args.get('source_pattern'))
|
||||
target_paths = resolve_file_pattern(job_args.get('target_pattern'))
|
||||
step_args = args_store.filter_step_args(args)
|
||||
source_paths = resolve_file_pattern(step_args.get('source_pattern'))
|
||||
target_paths = resolve_file_pattern(step_args.get('target_pattern'))
|
||||
|
||||
if job_manager.create_job(job_id):
|
||||
if source_paths and target_paths:
|
||||
@@ -287,7 +286,7 @@ def process_batch(args : Args) -> ErrorCode:
|
||||
step_args['target_path'] = target_path
|
||||
|
||||
try:
|
||||
step_args['output_path'] = job_args.get('output_pattern').format(index = index, source_name = get_file_name(source_path), target_name = get_file_name(target_path), target_extension = get_file_extension(target_path))
|
||||
step_args['output_path'] = step_args.get('output_pattern').format(index = index, source_name = get_file_name(source_path), target_name = get_file_name(target_path), target_extension = get_file_extension(target_path))
|
||||
except KeyError:
|
||||
return 1
|
||||
|
||||
@@ -301,7 +300,7 @@ def process_batch(args : Args) -> ErrorCode:
|
||||
step_args['target_path'] = target_path
|
||||
|
||||
try:
|
||||
step_args['output_path'] = job_args.get('output_pattern').format(index = index, target_name = get_file_name(target_path), target_extension = get_file_extension(target_path))
|
||||
step_args['output_path'] = step_args.get('output_pattern').format(index = index, target_name = get_file_name(target_path), target_extension = get_file_extension(target_path))
|
||||
except KeyError:
|
||||
return 1
|
||||
|
||||
@@ -314,8 +313,10 @@ def process_batch(args : Args) -> ErrorCode:
|
||||
|
||||
def process_step(job_id : str, step_index : int, step_args : Args) -> bool:
|
||||
step_total = job_manager.count_step_total(job_id)
|
||||
step_args.update(collect_job_args())
|
||||
apply_args(step_args, state_manager.set_item)
|
||||
cli_args = args_store.filter_cli_args(state_manager.get_state()) #type:ignore[arg-type]
|
||||
args = cli_args.copy()
|
||||
args.update(step_args)
|
||||
apply_args(args, state_manager.set_item)
|
||||
|
||||
logger.info(translator.get('processing_step').format(step_current = step_index + 1, step_total = step_total), __name__)
|
||||
if common_pre_check() and processors_pre_check():
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
from typing import List
|
||||
|
||||
from facefusion.types import JobStore
|
||||
|
||||
JOB_STORE : JobStore =\
|
||||
{
|
||||
'job_keys': [],
|
||||
'step_keys': []
|
||||
}
|
||||
|
||||
|
||||
def get_job_keys() -> List[str]:
|
||||
return JOB_STORE.get('job_keys')
|
||||
|
||||
|
||||
def get_step_keys() -> List[str]:
|
||||
return JOB_STORE.get('step_keys')
|
||||
|
||||
|
||||
def register_job_keys(job_keys : List[str]) -> None:
|
||||
for job_key in job_keys:
|
||||
JOB_STORE['job_keys'].append(job_key)
|
||||
|
||||
|
||||
def register_step_keys(step_keys : List[str]) -> None:
|
||||
for step_key in step_keys:
|
||||
JOB_STORE['step_keys'].append(step_key)
|
||||
@@ -4,9 +4,9 @@ from functools import lru_cache
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.choices
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_int_metavar, is_macos
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -126,7 +126,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
if group_processors:
|
||||
group_processors.add_argument('--age-modifier-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'age_modifier_model', 'fran'), choices = age_modifier_choices.age_modifier_models)
|
||||
group_processors.add_argument('--age-modifier-direction', help = translator.get('help.direction', __package__), type = int, default = config.get_int_value('processors', 'age_modifier_direction', '0'), choices = age_modifier_choices.age_modifier_direction_range, metavar = create_int_metavar(age_modifier_choices.age_modifier_direction_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'age_modifier_model', 'age_modifier_direction' ])
|
||||
facefusion.args_store.register_args([ 'age_modifier_model', 'age_modifier_direction' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -5,10 +5,10 @@ from typing import List, Tuple
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import is_macos, is_windows
|
||||
from facefusion.common_helper import is_macos
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
from facefusion.execution import has_execution_provider
|
||||
from facefusion.filesystem import in_directory, is_image, is_video, resolve_relative_path
|
||||
@@ -51,7 +51,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/ben_2.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'ben',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.0, 0.0, 0.0 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
@@ -80,7 +79,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/birefnet_general.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'birefnet',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.0, 0.0, 0.0 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
@@ -109,69 +107,10 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/birefnet_portrait.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'birefnet',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.0, 0.0, 0.0 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
},
|
||||
'corridor_key_1024':
|
||||
{
|
||||
'__metadata__':
|
||||
{
|
||||
'vendor': 'nikopueringer',
|
||||
'license': 'Non-Commercial',
|
||||
'year': 2025
|
||||
},
|
||||
'hashes':
|
||||
{
|
||||
'background_remover':
|
||||
{
|
||||
'url': resolve_download_url('models-3.6.0', 'corridor_key_1024.hash'),
|
||||
'path': resolve_relative_path('../.assets/models/corridor_key_1024.hash')
|
||||
}
|
||||
},
|
||||
'sources':
|
||||
{
|
||||
'background_remover':
|
||||
{
|
||||
'url': resolve_download_url('models-3.6.0', 'corridor_key_1024.onnx'),
|
||||
'path': resolve_relative_path('../.assets/models/corridor_key_1024.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'corridor_key',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
},
|
||||
'corridor_key_2048':
|
||||
{
|
||||
'__metadata__':
|
||||
{
|
||||
'vendor': 'nikopueringer',
|
||||
'license': 'Non-Commercial',
|
||||
'year': 2025
|
||||
},
|
||||
'hashes':
|
||||
{
|
||||
'background_remover':
|
||||
{
|
||||
'url': resolve_download_url('models-3.6.0', 'corridor_key_2048.hash'),
|
||||
'path': resolve_relative_path('../.assets/models/corridor_key_2048.hash')
|
||||
}
|
||||
},
|
||||
'sources':
|
||||
{
|
||||
'background_remover':
|
||||
{
|
||||
'url': resolve_download_url('models-3.6.0', 'corridor_key_2048.onnx'),
|
||||
'path': resolve_relative_path('../.assets/models/corridor_key_2048.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'corridor_key',
|
||||
'size': (2048, 2048),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
},
|
||||
'isnet_general':
|
||||
{
|
||||
'__metadata__':
|
||||
@@ -196,7 +135,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/isnet_general.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'isnet',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.5, 0.5, 0.5 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
@@ -225,7 +163,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/modnet.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'modnet',
|
||||
'size': (512, 512),
|
||||
'mean': [ 0.5, 0.5, 0.5 ],
|
||||
'standard_deviation': [ 0.5, 0.5, 0.5 ]
|
||||
@@ -254,7 +191,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/ormbg.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'ormbg',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.0, 0.0, 0.0 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
@@ -283,7 +219,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/rmbg_1.4.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'rmbg',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.5, 0.5, 0.5 ],
|
||||
'standard_deviation': [ 1.0, 1.0, 1.0 ]
|
||||
@@ -312,7 +247,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/rmbg_2.0.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'rmbg',
|
||||
'size': (1024, 1024),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -341,7 +275,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/silueta.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'silueta',
|
||||
'size': (320, 320),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -370,7 +303,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/u2net_cloth.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'u2net_cloth',
|
||||
'size': (768, 768),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -399,7 +331,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/u2net_general.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'u2net',
|
||||
'size': (320, 320),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -428,7 +359,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/u2net_human.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'u2net',
|
||||
'size': (320, 320),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -457,7 +387,6 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet:
|
||||
'path': resolve_relative_path('../.assets/models/u2netp.onnx')
|
||||
}
|
||||
},
|
||||
'type': 'u2netp',
|
||||
'size': (320, 320),
|
||||
'mean': [ 0.485, 0.456, 0.406 ],
|
||||
'standard_deviation': [ 0.229, 0.224, 0.225 ]
|
||||
@@ -478,9 +407,7 @@ def clear_inference_pool() -> None:
|
||||
|
||||
|
||||
def resolve_execution_providers() -> List[ExecutionProvider]:
|
||||
model_type = get_model_options().get('type')
|
||||
|
||||
if is_macos() and has_execution_provider('coreml') or is_windows() and has_execution_provider('directml') and model_type == 'corridor_key':
|
||||
if is_macos() and has_execution_provider('coreml'):
|
||||
return [ 'cpu' ]
|
||||
return state_manager.get_item('execution_providers')
|
||||
|
||||
@@ -493,16 +420,14 @@ def get_model_options() -> ModelOptions:
|
||||
def register_args(program : ArgumentParser) -> None:
|
||||
group_processors = find_argument_group(program, 'processors')
|
||||
if group_processors:
|
||||
group_processors.add_argument('--background-remover-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'background_remover_model', 'modnet'), choices = background_remover_choices.background_remover_models)
|
||||
group_processors.add_argument('--background-remover-fill-color', help = translator.get('help.fill_color', __package__), type = partial(sanitize_int_range, int_range = background_remover_choices.background_remover_color_range), default = config.get_int_list('processors', 'background_remover_fill_color', '0 0 0 0'), nargs = '+')
|
||||
group_processors.add_argument('--background-remover-despill-color', help = translator.get('help.despill_color', __package__), type = partial(sanitize_int_range, int_range = background_remover_choices.background_remover_color_range), default = config.get_int_list('processors', 'background_remover_despill_color', '0 0 0 0'), nargs = '+')
|
||||
facefusion.jobs.job_store.register_step_keys([ 'background_remover_model', 'background_remover_fill_color', 'background_remover_despill_color' ])
|
||||
group_processors.add_argument('--background-remover-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'background_remover_model', 'rmbg_2.0'), choices = background_remover_choices.background_remover_models)
|
||||
group_processors.add_argument('--background-remover-color', help = translator.get('help.color', __package__), type = partial(sanitize_int_range, int_range = background_remover_choices.background_remover_color_range), default = config.get_int_list('processors', 'background_remover_color', '0 0 0 0'), nargs = '+')
|
||||
facefusion.args_store.register_args([ 'background_remover_model', 'background_remover_color' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
apply_state_item('background_remover_model', args.get('background_remover_model'))
|
||||
apply_state_item('background_remover_fill_color', normalize_color(args.get('background_remover_fill_color')))
|
||||
apply_state_item('background_remover_despill_color', normalize_color(args.get('background_remover_despill_color')))
|
||||
apply_state_item('background_remover_color', normalize_color(args.get('background_remover_color')))
|
||||
|
||||
|
||||
def pre_check() -> bool:
|
||||
@@ -533,26 +458,16 @@ def post_process() -> None:
|
||||
|
||||
|
||||
def remove_background(temp_vision_frame : VisionFrame) -> Tuple[VisionFrame, Mask]:
|
||||
model_type = get_model_options().get('type')
|
||||
|
||||
if model_type == 'corridor_key':
|
||||
remove_vision_mask, remove_vision_frame = forward_corridor_key(prepare_temp_frame(temp_vision_frame))
|
||||
remove_vision_frame = numpy.squeeze(remove_vision_frame).transpose(1, 2, 0)
|
||||
remove_vision_frame = numpy.clip(remove_vision_frame * 255, 0, 255).astype(numpy.uint8)
|
||||
temp_vision_frame = cv2.resize(remove_vision_frame[:, :, ::-1], temp_vision_frame.shape[:2][::-1])
|
||||
else:
|
||||
remove_vision_mask = forward(prepare_temp_frame(temp_vision_frame))
|
||||
|
||||
remove_vision_mask = normalize_vision_mask(remove_vision_mask)
|
||||
remove_vision_mask = cv2.resize(remove_vision_mask, temp_vision_frame.shape[:2][::-1])
|
||||
temp_vision_frame = apply_despill_color(temp_vision_frame)
|
||||
temp_vision_frame = apply_fill_color(temp_vision_frame, remove_vision_mask)
|
||||
return temp_vision_frame, remove_vision_mask
|
||||
temp_vision_mask = forward(prepare_temp_frame(temp_vision_frame))
|
||||
temp_vision_mask = normalize_vision_mask(temp_vision_mask)
|
||||
temp_vision_mask = cv2.resize(temp_vision_mask, temp_vision_frame.shape[:2][::-1])
|
||||
temp_vision_frame = apply_background_color(temp_vision_frame, temp_vision_mask)
|
||||
return temp_vision_frame, temp_vision_mask
|
||||
|
||||
|
||||
def forward(temp_vision_frame : VisionFrame) -> VisionFrame:
|
||||
background_remover = get_inference_pool().get('background_remover')
|
||||
model_type = get_model_options().get('type')
|
||||
model_name = state_manager.get_item('background_remover_model')
|
||||
|
||||
with thread_semaphore():
|
||||
remove_vision_frame = background_remover.run(None,
|
||||
@@ -560,42 +475,20 @@ def forward(temp_vision_frame : VisionFrame) -> VisionFrame:
|
||||
'input': temp_vision_frame
|
||||
})[0]
|
||||
|
||||
if model_type == 'u2net_cloth':
|
||||
if model_name == 'u2net_cloth':
|
||||
remove_vision_frame = numpy.argmax(remove_vision_frame, axis = 1)
|
||||
|
||||
return remove_vision_frame
|
||||
|
||||
|
||||
def forward_corridor_key(temp_vision_frame : VisionFrame) -> Tuple[Mask, VisionFrame]:
|
||||
background_remover = get_inference_pool().get('background_remover')
|
||||
|
||||
with thread_semaphore():
|
||||
remove_vision_mask, remove_vision_frame = background_remover.run(None,
|
||||
{
|
||||
'input': temp_vision_frame
|
||||
})
|
||||
|
||||
return remove_vision_mask, remove_vision_frame
|
||||
|
||||
|
||||
def prepare_temp_frame(temp_vision_frame : VisionFrame) -> VisionFrame:
|
||||
model_type = get_model_options().get('type')
|
||||
model_size = get_model_options().get('size')
|
||||
model_mean = get_model_options().get('mean')
|
||||
model_standard_deviation = get_model_options().get('standard_deviation')
|
||||
|
||||
if model_type == 'corridor_key':
|
||||
coarse_color = temp_vision_frame[:, :, ::-1].astype(numpy.float32) / 255.0
|
||||
coarse_bias = coarse_color[:, :, 1] - numpy.maximum(coarse_color[:, :, 0], coarse_color[:, :, 2])
|
||||
coarse_vision_mask = cv2.resize(1.0 - numpy.clip(coarse_bias * 2.0, 0, 1), model_size)[:, :, numpy.newaxis]
|
||||
|
||||
temp_vision_frame = cv2.resize(temp_vision_frame, model_size)
|
||||
temp_vision_frame = temp_vision_frame[:, :, ::-1] / 255.0
|
||||
temp_vision_frame = (temp_vision_frame - model_mean) / model_standard_deviation
|
||||
|
||||
if model_type == 'corridor_key':
|
||||
temp_vision_frame = numpy.concatenate([ temp_vision_frame, coarse_vision_mask ], axis = 2)
|
||||
|
||||
temp_vision_frame = temp_vision_frame.transpose(2, 0, 1)
|
||||
temp_vision_frame = numpy.expand_dims(temp_vision_frame, axis = 0).astype(numpy.float32)
|
||||
return temp_vision_frame
|
||||
@@ -607,32 +500,16 @@ def normalize_vision_mask(temp_vision_mask : Mask) -> Mask:
|
||||
return temp_vision_mask
|
||||
|
||||
|
||||
def apply_fill_color(temp_vision_frame : VisionFrame, temp_vision_mask : Mask) -> VisionFrame:
|
||||
background_remover_fill_color = state_manager.get_item('background_remover_fill_color')
|
||||
def apply_background_color(temp_vision_frame : VisionFrame, temp_vision_mask : Mask) -> VisionFrame:
|
||||
background_remover_color = state_manager.get_item('background_remover_color')
|
||||
temp_vision_mask = temp_vision_mask.astype(numpy.float32) / 255
|
||||
temp_vision_mask = numpy.expand_dims(temp_vision_mask, axis = 2)
|
||||
temp_vision_mask = (1 - temp_vision_mask) * background_remover_fill_color[-1] / 255
|
||||
fill_vision_frame = numpy.zeros_like(temp_vision_frame)
|
||||
fill_vision_frame[:, :, 0] = background_remover_fill_color[2]
|
||||
fill_vision_frame[:, :, 1] = background_remover_fill_color[1]
|
||||
fill_vision_frame[:, :, 2] = background_remover_fill_color[0]
|
||||
temp_vision_frame = temp_vision_frame * (1 - temp_vision_mask) + fill_vision_frame * temp_vision_mask
|
||||
temp_vision_frame = temp_vision_frame.astype(numpy.uint8)
|
||||
return temp_vision_frame
|
||||
|
||||
|
||||
def apply_despill_color(temp_vision_frame : VisionFrame) -> VisionFrame:
|
||||
background_remover_despill_color = state_manager.get_item('background_remover_despill_color')
|
||||
temp_vision_frame = temp_vision_frame.astype(numpy.float32)
|
||||
color_alpha = background_remover_despill_color[3] / 255.0
|
||||
despill_vision_frame = numpy.zeros_like(temp_vision_frame)
|
||||
despill_vision_frame[:, :, 0] = background_remover_despill_color[2]
|
||||
despill_vision_frame[:, :, 1] = background_remover_despill_color[1]
|
||||
despill_vision_frame[:, :, 2] = background_remover_despill_color[0]
|
||||
color_weight = despill_vision_frame / numpy.maximum(numpy.max(background_remover_despill_color[:3]), 1)
|
||||
color_limit = numpy.roll(temp_vision_frame, 1, 2) + numpy.roll(temp_vision_frame, -1, 2)
|
||||
limit_vision_frame = numpy.minimum(temp_vision_frame, color_limit * 0.5)
|
||||
temp_vision_frame = temp_vision_frame + (limit_vision_frame - temp_vision_frame) * color_alpha * color_weight
|
||||
temp_vision_mask = (1 - temp_vision_mask) * background_remover_color[-1] / 255
|
||||
color_frame = numpy.zeros_like(temp_vision_frame)
|
||||
color_frame[:, :, 0] = background_remover_color[2]
|
||||
color_frame[:, :, 1] = background_remover_color[1]
|
||||
color_frame[:, :, 2] = background_remover_color[0]
|
||||
temp_vision_frame = temp_vision_frame * (1 - temp_vision_mask) + color_frame * temp_vision_mask
|
||||
temp_vision_frame = temp_vision_frame.astype(numpy.uint8)
|
||||
return temp_vision_frame
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import cv2
|
||||
import numpy
|
||||
from cv2.typing import Size
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_int_metavar
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url_by_provider
|
||||
@@ -278,7 +278,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
if group_processors:
|
||||
group_processors.add_argument('--deep-swapper-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'deep_swapper_model', 'iperov/elon_musk_224'), choices = deep_swapper_choices.deep_swapper_models)
|
||||
group_processors.add_argument('--deep-swapper-morph', help = translator.get('help.morph', __package__), type = int, default = config.get_int_value('processors', 'deep_swapper_morph', '100'), choices = deep_swapper_choices.deep_swapper_morph_range, metavar = create_int_metavar(deep_swapper_choices.deep_swapper_morph_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'deep_swapper_model', 'deep_swapper_morph' ])
|
||||
facefusion.args_store.register_args([ 'deep_swapper_model', 'deep_swapper_morph' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -5,8 +5,8 @@ from typing import Tuple
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_int_metavar
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -102,7 +102,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
group_processors.add_argument('--expression-restorer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'expression_restorer_model', 'live_portrait'), choices = expression_restorer_choices.expression_restorer_models)
|
||||
group_processors.add_argument('--expression-restorer-factor', help = translator.get('help.factor', __package__), type = int, default = config.get_int_value('processors', 'expression_restorer_factor', '80'), choices = expression_restorer_choices.expression_restorer_factor_range, metavar = create_int_metavar(expression_restorer_choices.expression_restorer_factor_range))
|
||||
group_processors.add_argument('--expression-restorer-areas', help = translator.get('help.areas', __package__).format(choices = ', '.join(expression_restorer_choices.expression_restorer_areas)), default = config.get_str_list('processors', 'expression_restorer_areas', ' '.join(expression_restorer_choices.expression_restorer_areas)), choices = expression_restorer_choices.expression_restorer_areas, nargs = '+', metavar = 'EXPRESSION_RESTORER_AREAS')
|
||||
facefusion.jobs.job_store.register_step_keys([ 'expression_restorer_model', 'expression_restorer_factor', 'expression_restorer_areas' ])
|
||||
facefusion.args_store.register_args([ 'expression_restorer_model', 'expression_restorer_factor', 'expression_restorer_areas' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -3,8 +3,8 @@ from argparse import ArgumentParser
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, logger, state_manager, translator, video_manager
|
||||
from facefusion.face_analyser import scale_face
|
||||
from facefusion.face_helper import warp_face_by_face_landmark_5
|
||||
@@ -31,7 +31,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
group_processors = find_argument_group(program, 'processors')
|
||||
if group_processors:
|
||||
group_processors.add_argument('--face-debugger-items', help = translator.get('help.items', __package__).format(choices = ', '.join(face_debugger_choices.face_debugger_items)), default = config.get_str_list('processors', 'face_debugger_items', 'face-landmark-5/68 face-mask'), choices = face_debugger_choices.face_debugger_items, nargs = '+', metavar = 'FACE_DEBUGGER_ITEMS')
|
||||
facefusion.jobs.job_store.register_step_keys([ 'face_debugger_items' ])
|
||||
facefusion.args_store.register_args([ 'face_debugger_items' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -5,8 +5,8 @@ from typing import Tuple
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_float_metavar
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -144,7 +144,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
group_processors.add_argument('--face-editor-head-pitch', help = translator.get('help.head_pitch', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_pitch', '0'), choices = face_editor_choices.face_editor_head_pitch_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_pitch_range))
|
||||
group_processors.add_argument('--face-editor-head-yaw', help = translator.get('help.head_yaw', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_yaw', '0'), choices = face_editor_choices.face_editor_head_yaw_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_yaw_range))
|
||||
group_processors.add_argument('--face-editor-head-roll', help = translator.get('help.head_roll', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_roll', '0'), choices = face_editor_choices.face_editor_head_roll_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_roll_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'face_editor_model', 'face_editor_eyebrow_direction', 'face_editor_eye_gaze_horizontal', 'face_editor_eye_gaze_vertical', 'face_editor_eye_open_ratio', 'face_editor_lip_open_ratio', 'face_editor_mouth_grim', 'face_editor_mouth_pout', 'face_editor_mouth_purse', 'face_editor_mouth_smile', 'face_editor_mouth_position_horizontal', 'face_editor_mouth_position_vertical', 'face_editor_head_pitch', 'face_editor_head_yaw', 'face_editor_head_roll' ])
|
||||
facefusion.args_store.register_args([ 'face_editor_model', 'face_editor_eyebrow_direction', 'face_editor_eye_gaze_horizontal', 'face_editor_eye_gaze_vertical', 'face_editor_eye_open_ratio', 'face_editor_lip_open_ratio', 'face_editor_mouth_grim', 'face_editor_mouth_pout', 'face_editor_mouth_purse', 'face_editor_mouth_smile', 'face_editor_mouth_position_horizontal', 'face_editor_mouth_position_vertical', 'face_editor_head_pitch', 'face_editor_head_yaw', 'face_editor_head_roll' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -3,8 +3,8 @@ from functools import lru_cache
|
||||
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_float_metavar, create_int_metavar
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -295,7 +295,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
group_processors.add_argument('--face-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_enhancer_model', 'gfpgan_1.4'), choices = face_enhancer_choices.face_enhancer_models)
|
||||
group_processors.add_argument('--face-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'face_enhancer_blend', '80'), choices = face_enhancer_choices.face_enhancer_blend_range, metavar = create_int_metavar(face_enhancer_choices.face_enhancer_blend_range))
|
||||
group_processors.add_argument('--face-enhancer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_enhancer_weight', '0.5'), choices = face_enhancer_choices.face_enhancer_weight_range, metavar = create_float_metavar(face_enhancer_choices.face_enhancer_weight_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'face_enhancer_model', 'face_enhancer_blend', 'face_enhancer_weight' ])
|
||||
facefusion.args_store.register_args([ 'face_enhancer_model', 'face_enhancer_blend', 'face_enhancer_weight' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -5,9 +5,9 @@ from typing import List, Optional, Tuple
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.choices
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import get_first, is_macos
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -518,7 +518,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
face_swapper_pixel_boost_choices = face_swapper_choices.face_swapper_set.get(known_args.face_swapper_model)
|
||||
group_processors.add_argument('--face-swapper-pixel-boost', help = translator.get('help.pixel_boost', __package__), default = config.get_str_value('processors', 'face_swapper_pixel_boost', get_first(face_swapper_pixel_boost_choices)), choices = face_swapper_pixel_boost_choices)
|
||||
group_processors.add_argument('--face-swapper-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_swapper_weight', '0.5'), choices = face_swapper_choices.face_swapper_weight_range)
|
||||
facefusion.jobs.job_store.register_step_keys([ 'face_swapper_model', 'face_swapper_pixel_boost', 'face_swapper_weight' ])
|
||||
facefusion.args_store.register_args([ 'face_swapper_model', 'face_swapper_pixel_boost', 'face_swapper_weight' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -5,8 +5,8 @@ from typing import List
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_int_metavar, is_macos
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -187,7 +187,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
group_processors.add_argument('--frame-colorizer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_colorizer_model', 'ddcolor'), choices = frame_colorizer_choices.frame_colorizer_models)
|
||||
group_processors.add_argument('--frame-colorizer-size', help = translator.get('help.size', __package__), type = str, default = config.get_str_value('processors', 'frame_colorizer_size', '256x256'), choices = frame_colorizer_choices.frame_colorizer_sizes)
|
||||
group_processors.add_argument('--frame-colorizer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_colorizer_blend', '100'), choices = frame_colorizer_choices.frame_colorizer_blend_range, metavar = create_int_metavar(frame_colorizer_choices.frame_colorizer_blend_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'frame_colorizer_model', 'frame_colorizer_blend', 'frame_colorizer_size' ])
|
||||
facefusion.args_store.register_args([ 'frame_colorizer_model', 'frame_colorizer_blend', 'frame_colorizer_size' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -4,8 +4,8 @@ from functools import lru_cache
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, inference_manager, logger, state_manager, translator, video_manager
|
||||
from facefusion.common_helper import create_int_metavar, is_macos
|
||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||
@@ -575,7 +575,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
if group_processors:
|
||||
group_processors.add_argument('--frame-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_enhancer_model', 'span_kendata_x4'), choices = frame_enhancer_choices.frame_enhancer_models)
|
||||
group_processors.add_argument('--frame-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_enhancer_blend', '80'), choices = frame_enhancer_choices.frame_enhancer_blend_range, metavar = create_int_metavar(frame_enhancer_choices.frame_enhancer_blend_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'frame_enhancer_model', 'frame_enhancer_blend' ])
|
||||
facefusion.args_store.register_args([ 'frame_enhancer_model', 'frame_enhancer_blend' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
@@ -4,8 +4,8 @@ from functools import lru_cache
|
||||
import cv2
|
||||
import numpy
|
||||
|
||||
import facefusion.args_store
|
||||
import facefusion.jobs.job_manager
|
||||
import facefusion.jobs.job_store
|
||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, state_manager, translator, video_manager, voice_extractor
|
||||
from facefusion.audio import read_static_voice
|
||||
from facefusion.common_helper import create_float_metavar
|
||||
@@ -134,7 +134,7 @@ def register_args(program : ArgumentParser) -> None:
|
||||
if group_processors:
|
||||
group_processors.add_argument('--lip-syncer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'lip_syncer_model', 'wav2lip_gan_96'), choices = lip_syncer_choices.lip_syncer_models)
|
||||
group_processors.add_argument('--lip-syncer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'lip_syncer_weight', '0.5'), choices = lip_syncer_choices.lip_syncer_weight_range, metavar = create_float_metavar(lip_syncer_choices.lip_syncer_weight_range))
|
||||
facefusion.jobs.job_store.register_step_keys([ 'lip_syncer_model', 'lip_syncer_weight' ])
|
||||
facefusion.args_store.register_args([ 'lip_syncer_model', 'lip_syncer_weight' ], scopes = [ 'api', 'cli' ])
|
||||
|
||||
|
||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||
|
||||
+27
-28
@@ -3,12 +3,11 @@ from argparse import ArgumentParser, HelpFormatter
|
||||
from functools import partial
|
||||
|
||||
import facefusion.choices
|
||||
from facefusion import config, metadata, state_manager, translator
|
||||
from facefusion import args_store, config, metadata, state_manager, translator
|
||||
from facefusion.common_helper import create_float_metavar, create_int_metavar, get_first, get_last
|
||||
from facefusion.execution import get_available_execution_providers
|
||||
from facefusion.ffmpeg import get_available_encoder_set
|
||||
from facefusion.filesystem import get_file_name, resolve_file_paths
|
||||
from facefusion.jobs import job_store
|
||||
from facefusion.processors.core import get_processors_modules
|
||||
from facefusion.sanitizer import sanitize_int_range, sanitize_job_id
|
||||
|
||||
@@ -25,7 +24,7 @@ def create_config_path_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('--config-path', help = translator.get('help.config_path'), default = 'facefusion.ini')
|
||||
job_store.register_job_keys([ 'config_path' ])
|
||||
args_store.register_args([ 'config_path' ], scopes = [ 'cli' ])
|
||||
apply_config_path(program)
|
||||
return program
|
||||
|
||||
@@ -34,7 +33,7 @@ def create_temp_path_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('--temp-path', help = translator.get('help.temp_path'), default = config.get_str_value('paths', 'temp_path', tempfile.gettempdir()))
|
||||
job_store.register_job_keys([ 'temp_path' ])
|
||||
args_store.register_args([ 'temp_path' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -42,7 +41,7 @@ def create_jobs_path_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('--jobs-path', help = translator.get('help.jobs_path'), default = config.get_str_value('paths', 'jobs_path', '.jobs'))
|
||||
job_store.register_job_keys([ 'jobs_path' ])
|
||||
args_store.register_args([ 'jobs_path' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -50,7 +49,7 @@ def create_source_paths_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('-s', '--source-paths', help = translator.get('help.source_paths'), default = config.get_str_list('paths', 'source_paths'), nargs = '+')
|
||||
job_store.register_step_keys([ 'source_paths' ])
|
||||
args_store.register_args([ 'source_paths' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -58,7 +57,7 @@ def create_target_path_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('-t', '--target-path', help = translator.get('help.target_path'), default = config.get_str_value('paths', 'target_path'))
|
||||
job_store.register_step_keys([ 'target_path' ])
|
||||
args_store.register_args([ 'target_path' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -66,7 +65,7 @@ def create_output_path_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_paths = program.add_argument_group('paths')
|
||||
group_paths.add_argument('-o', '--output-path', help = translator.get('help.output_path'), default = config.get_str_value('paths', 'output_path'))
|
||||
job_store.register_step_keys([ 'output_path' ])
|
||||
args_store.register_args([ 'output_path' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -74,7 +73,7 @@ def create_source_pattern_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_patterns = program.add_argument_group('patterns')
|
||||
group_patterns.add_argument('-s', '--source-pattern', help = translator.get('help.source_pattern'), default = config.get_str_value('patterns', 'source_pattern'))
|
||||
job_store.register_job_keys([ 'source_pattern' ])
|
||||
args_store.register_args([ 'source_pattern' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -82,7 +81,7 @@ def create_target_pattern_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_patterns = program.add_argument_group('patterns')
|
||||
group_patterns.add_argument('-t', '--target-pattern', help = translator.get('help.target_pattern'), default = config.get_str_value('patterns', 'target_pattern'))
|
||||
job_store.register_job_keys([ 'target_pattern' ])
|
||||
args_store.register_args([ 'target_pattern' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -90,7 +89,7 @@ def create_output_pattern_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_patterns = program.add_argument_group('patterns')
|
||||
group_patterns.add_argument('-o', '--output-pattern', help = translator.get('help.output_pattern'), default = config.get_str_value('patterns', 'output_pattern'))
|
||||
job_store.register_job_keys([ 'output_pattern' ])
|
||||
args_store.register_args([ 'output_pattern' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -104,7 +103,7 @@ def create_face_detector_program() -> ArgumentParser:
|
||||
group_face_detector.add_argument('--face-detector-margin', help = translator.get('help.face_detector_margin'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_detector_margin_range), default = config.get_int_list('face_detector', 'face_detector_margin', '0 0 0 0'), nargs = '+')
|
||||
group_face_detector.add_argument('--face-detector-angles', help = translator.get('help.face_detector_angles'), type = int, default = config.get_int_list('face_detector', 'face_detector_angles', '0'), choices = facefusion.choices.face_detector_angles, nargs = '+', metavar = 'FACE_DETECTOR_ANGLES')
|
||||
group_face_detector.add_argument('--face-detector-score', help = translator.get('help.face_detector_score'), type = float, default = config.get_float_value('face_detector', 'face_detector_score', '0.5'), choices = facefusion.choices.face_detector_score_range, metavar = create_float_metavar(facefusion.choices.face_detector_score_range))
|
||||
job_store.register_step_keys([ 'face_detector_model', 'face_detector_size', 'face_detector_margin', 'face_detector_angles', 'face_detector_score' ])
|
||||
args_store.register_args([ 'face_detector_model', 'face_detector_size', 'face_detector_margin', 'face_detector_angles', 'face_detector_score' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -113,7 +112,7 @@ def create_face_landmarker_program() -> ArgumentParser:
|
||||
group_face_landmarker = program.add_argument_group('face landmarker')
|
||||
group_face_landmarker.add_argument('--face-landmarker-model', help = translator.get('help.face_landmarker_model'), default = config.get_str_value('face_landmarker', 'face_landmarker_model', '2dfan4'), choices = facefusion.choices.face_landmarker_models)
|
||||
group_face_landmarker.add_argument('--face-landmarker-score', help = translator.get('help.face_landmarker_score'), type = float, default = config.get_float_value('face_landmarker', 'face_landmarker_score', '0.5'), choices = facefusion.choices.face_landmarker_score_range, metavar = create_float_metavar(facefusion.choices.face_landmarker_score_range))
|
||||
job_store.register_step_keys([ 'face_landmarker_model', 'face_landmarker_score' ])
|
||||
args_store.register_args([ 'face_landmarker_model', 'face_landmarker_score' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -129,7 +128,7 @@ def create_face_selector_program() -> ArgumentParser:
|
||||
group_face_selector.add_argument('--reference-face-position', help = translator.get('help.reference_face_position'), type = int, default = config.get_int_value('face_selector', 'reference_face_position', '0'))
|
||||
group_face_selector.add_argument('--reference-face-distance', help = translator.get('help.reference_face_distance'), type = float, default = config.get_float_value('face_selector', 'reference_face_distance', '0.3'), choices = facefusion.choices.reference_face_distance_range, metavar = create_float_metavar(facefusion.choices.reference_face_distance_range))
|
||||
group_face_selector.add_argument('--reference-frame-number', help = translator.get('help.reference_frame_number'), type = int, default = config.get_int_value('face_selector', 'reference_frame_number', '0'))
|
||||
job_store.register_step_keys([ 'face_selector_mode', 'face_selector_order', 'face_selector_gender', 'face_selector_race', 'face_selector_age_start', 'face_selector_age_end', 'reference_face_position', 'reference_face_distance', 'reference_frame_number' ])
|
||||
args_store.register_args([ 'face_selector_mode', 'face_selector_order', 'face_selector_gender', 'face_selector_race', 'face_selector_age_start', 'face_selector_age_end', 'reference_face_position', 'reference_face_distance', 'reference_frame_number' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -143,7 +142,7 @@ def create_face_masker_program() -> ArgumentParser:
|
||||
group_face_masker.add_argument('--face-mask-regions', help = translator.get('help.face_mask_regions').format(choices = ', '.join(facefusion.choices.face_mask_regions)), default = config.get_str_list('face_masker', 'face_mask_regions', ' '.join(facefusion.choices.face_mask_regions)), choices = facefusion.choices.face_mask_regions, nargs = '+', metavar = 'FACE_MASK_REGIONS')
|
||||
group_face_masker.add_argument('--face-mask-blur', help = translator.get('help.face_mask_blur'), type = float, default = config.get_float_value('face_masker', 'face_mask_blur', '0.3'), choices = facefusion.choices.face_mask_blur_range, metavar = create_float_metavar(facefusion.choices.face_mask_blur_range))
|
||||
group_face_masker.add_argument('--face-mask-padding', help = translator.get('help.face_mask_padding'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_mask_padding_range), default = config.get_int_list('face_masker', 'face_mask_padding', '0 0 0 0'), nargs = '+')
|
||||
job_store.register_step_keys([ 'face_occluder_model', 'face_parser_model', 'face_mask_types', 'face_mask_areas', 'face_mask_regions', 'face_mask_blur', 'face_mask_padding' ])
|
||||
args_store.register_args([ 'face_occluder_model', 'face_parser_model', 'face_mask_types', 'face_mask_areas', 'face_mask_regions', 'face_mask_blur', 'face_mask_padding' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -151,7 +150,7 @@ def create_voice_extractor_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_voice_extractor = program.add_argument_group('voice extractor')
|
||||
group_voice_extractor.add_argument('--voice-extractor-model', help = translator.get('help.voice_extractor_model'), default = config.get_str_value('voice_extractor', 'voice_extractor_model', 'kim_vocal_2'), choices = facefusion.choices.voice_extractor_models)
|
||||
job_store.register_step_keys([ 'voice_extractor_model' ])
|
||||
args_store.register_args([ 'voice_extractor_model' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -162,7 +161,7 @@ def create_frame_extraction_program() -> ArgumentParser:
|
||||
group_frame_extraction.add_argument('--trim-frame-end', help = translator.get('help.trim_frame_end'), type = int, default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_end'))
|
||||
group_frame_extraction.add_argument('--temp-frame-format', help = translator.get('help.temp_frame_format'), default = config.get_str_value('frame_extraction', 'temp_frame_format', 'png'), choices = facefusion.choices.temp_frame_formats)
|
||||
group_frame_extraction.add_argument('--keep-temp', help = translator.get('help.keep_temp'), action = 'store_true', default = config.get_bool_value('frame_extraction', 'keep_temp'))
|
||||
job_store.register_step_keys([ 'trim_frame_start', 'trim_frame_end', 'temp_frame_format', 'keep_temp' ])
|
||||
args_store.register_args([ 'trim_frame_start', 'trim_frame_end', 'temp_frame_format', 'keep_temp' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -180,7 +179,7 @@ def create_output_creation_program() -> ArgumentParser:
|
||||
group_output_creation.add_argument('--output-video-quality', help = translator.get('help.output_video_quality'), type = int, default = config.get_int_value('output_creation', 'output_video_quality', '80'), choices = facefusion.choices.output_video_quality_range, metavar = create_int_metavar(facefusion.choices.output_video_quality_range))
|
||||
group_output_creation.add_argument('--output-video-scale', help = translator.get('help.output_video_scale'), type = float, default = config.get_float_value('output_creation', 'output_video_scale', '1.0'), choices = facefusion.choices.output_video_scale_range)
|
||||
group_output_creation.add_argument('--output-video-fps', help = translator.get('help.output_video_fps'), type = float, default = config.get_float_value('output_creation', 'output_video_fps'))
|
||||
job_store.register_step_keys([ 'output_image_quality', 'output_image_scale', 'output_audio_encoder', 'output_audio_quality', 'output_audio_volume', 'output_video_encoder', 'output_video_preset', 'output_video_quality', 'output_video_scale', 'output_video_fps' ])
|
||||
args_store.register_args([ 'output_image_quality', 'output_image_scale', 'output_audio_encoder', 'output_audio_quality', 'output_audio_volume', 'output_video_encoder', 'output_video_preset', 'output_video_quality', 'output_video_scale', 'output_video_fps' ], scopes = [ 'api', 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -188,8 +187,8 @@ def create_processors_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
available_processors = [ get_file_name(file_path) for file_path in resolve_file_paths('facefusion/processors/modules') ]
|
||||
group_processors = program.add_argument_group('processors')
|
||||
group_processors.add_argument('--processors', help = translator.get('help.processors').format(choices = ', '.join(available_processors)), default = config.get_str_list('processors', 'processors', 'face_swapper'), choices = available_processors, nargs = '+', metavar = 'PROCESSORS')
|
||||
job_store.register_step_keys([ 'processors' ])
|
||||
group_processors.add_argument('--processors', help = translator.get('help.processors').format(choices = ', '.join(available_processors)), default = config.get_str_list('processors', 'processors', 'face_swapper'), choices = available_processors, nargs = '+')
|
||||
args_store.register_args([ 'processors' ], scopes = [ 'api', 'cli' ])
|
||||
for processor_module in get_processors_modules(available_processors):
|
||||
processor_module.register_args(program)
|
||||
return program
|
||||
@@ -199,7 +198,7 @@ def create_download_providers_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_download = program.add_argument_group('download')
|
||||
group_download.add_argument('--download-providers', help = translator.get('help.download_providers').format(choices = ', '.join(facefusion.choices.download_providers)), default = config.get_str_list('download', 'download_providers', ' '.join(facefusion.choices.download_providers)), choices = facefusion.choices.download_providers, nargs = '+', metavar = 'DOWNLOAD_PROVIDERS')
|
||||
job_store.register_job_keys([ 'download_providers' ])
|
||||
args_store.register_args([ 'download_providers' ], scopes = [ 'cli', 'sys' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -207,7 +206,7 @@ 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 = translator.get('help.download_scope'), default = config.get_str_value('download', 'download_scope', 'lite'), choices = facefusion.choices.download_scopes)
|
||||
job_store.register_job_keys([ 'download_scope' ])
|
||||
args_store.register_args([ 'download_scope' ], scopes = [ 'cli', 'sys' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -232,10 +231,10 @@ def create_execution_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
available_execution_providers = get_available_execution_providers()
|
||||
group_execution = program.add_argument_group('execution')
|
||||
group_execution.add_argument('--execution-device-ids', help = translator.get('help.execution_device_ids'), type = int, default = config.get_int_list('execution', 'execution_device_ids', '0'), nargs = '+', metavar = 'EXECUTION_DEVICE_IDS')
|
||||
group_execution.add_argument('--execution-device-ids', help = translator.get('help.execution_device_ids'), type = int, default = config.get_str_list('execution', 'execution_device_ids', '0'), nargs = '+', metavar = 'EXECUTION_DEVICE_IDS')
|
||||
group_execution.add_argument('--execution-providers', help = translator.get('help.execution_providers').format(choices = ', '.join(available_execution_providers)), default = config.get_str_list('execution', 'execution_providers', get_first(available_execution_providers)), choices = available_execution_providers, nargs = '+', metavar = 'EXECUTION_PROVIDERS')
|
||||
group_execution.add_argument('--execution-thread-count', help = translator.get('help.execution_thread_count'), type = int, default = config.get_int_value('execution', 'execution_thread_count', '8'), choices = facefusion.choices.execution_thread_count_range, metavar = create_int_metavar(facefusion.choices.execution_thread_count_range))
|
||||
job_store.register_job_keys([ 'execution_device_ids', 'execution_providers', 'execution_thread_count' ])
|
||||
args_store.register_args([ 'execution_device_ids', 'execution_providers', 'execution_thread_count' ], scopes = [ 'cli', 'sys' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -243,7 +242,7 @@ def create_memory_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_memory = program.add_argument_group('memory')
|
||||
group_memory.add_argument('--video-memory-strategy', help = translator.get('help.video_memory_strategy'), default = config.get_str_value('memory', 'video_memory_strategy', 'strict'), choices = facefusion.choices.video_memory_strategies)
|
||||
job_store.register_job_keys([ 'video_memory_strategy' ])
|
||||
args_store.register_args([ 'video_memory_strategy' ], scopes = [ 'cli', 'sys' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -251,7 +250,7 @@ def create_log_level_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_misc = program.add_argument_group('misc')
|
||||
group_misc.add_argument('--log-level', help = translator.get('help.log_level'), default = config.get_str_value('misc', 'log_level', 'info'), choices = facefusion.choices.log_levels)
|
||||
job_store.register_job_keys([ 'log_level' ])
|
||||
args_store.register_args([ 'log_level' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -259,7 +258,7 @@ def create_halt_on_error_program() -> ArgumentParser:
|
||||
program = ArgumentParser(add_help = False)
|
||||
group_misc = program.add_argument_group('misc')
|
||||
group_misc.add_argument('--halt-on-error', help = translator.get('help.halt_on_error'), action = 'store_true', default = config.get_bool_value('misc', 'halt_on_error'))
|
||||
job_store.register_job_keys([ 'halt_on_error' ])
|
||||
args_store.register_args([ 'halt_on_error' ], scopes = [ 'cli' ])
|
||||
return program
|
||||
|
||||
|
||||
@@ -298,7 +297,7 @@ def create_program() -> ArgumentParser:
|
||||
sub_program.add_parser('batch-run', help = translator.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 = translator.get('help.force_download'), parents = [ create_download_providers_program(), create_download_scope_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
|
||||
sub_program.add_parser('benchmark', help = translator.get('help.benchmark'), parents = [ create_temp_path_program(), collect_step_program(), create_benchmark_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
|
||||
sub_program.add_parser('api', help = translator.get('help.api'), parents = [ create_config_path_program(), create_temp_path_program(), create_jobs_path_program(), create_api_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
|
||||
sub_program.add_parser('api', help = translator.get('help.api'), parents = [ create_config_path_program(), create_temp_path_program(), create_jobs_path_program(), create_api_program(), collect_step_program(), collect_job_program() ], formatter_class = create_help_formatter_large)
|
||||
sub_program.add_parser('job-list', help = translator.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 = translator.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-submit', help = translator.get('help.job_submit'), parents = [ create_job_id_program(), create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large)
|
||||
|
||||
+11
-11
@@ -2,27 +2,31 @@ from typing import Any, Union
|
||||
|
||||
from facefusion.app_context import detect_app_context
|
||||
from facefusion.processors.types import ProcessorState, ProcessorStateKey, ProcessorStateSet
|
||||
from facefusion.types import State, StateKey, StateSet
|
||||
from facefusion.types import Args, State, StateKey, StateSet
|
||||
|
||||
STATE_SET : Union[StateSet, ProcessorStateSet] =\
|
||||
{
|
||||
'cli': {}, #type:ignore[assignment]
|
||||
'api': {} #type:ignore[assignment]
|
||||
'api': {}, #type:ignore[assignment]
|
||||
'cli': {} #type:ignore[assignment]
|
||||
}
|
||||
|
||||
|
||||
def get_state() -> Union[State, ProcessorState]:
|
||||
app_context = detect_app_context()
|
||||
return STATE_SET.get(app_context)
|
||||
return STATE_SET.get(app_context) #type:ignore[return-value]
|
||||
|
||||
|
||||
def sync_state() -> None:
|
||||
STATE_SET['cli'] = STATE_SET.get('api') #type:ignore[assignment]
|
||||
def collect_state(args : Args) -> Union[State, ProcessorState]:
|
||||
state =\
|
||||
{
|
||||
key: get_item(key) for key in args #type:ignore[arg-type]
|
||||
}
|
||||
return state #type:ignore[return-value]
|
||||
|
||||
|
||||
def init_item(key : Union[StateKey, ProcessorStateKey], value : Any) -> None:
|
||||
STATE_SET['cli'][key] = value #type:ignore[literal-required]
|
||||
STATE_SET['api'][key] = value #type:ignore[literal-required]
|
||||
STATE_SET['cli'][key] = value #type:ignore[literal-required]
|
||||
|
||||
|
||||
def get_item(key : Union[StateKey, ProcessorStateKey]) -> Any:
|
||||
@@ -34,9 +38,5 @@ def set_item(key : Union[StateKey, ProcessorStateKey], value : Any) -> None:
|
||||
STATE_SET[app_context][key] = value #type:ignore[literal-required]
|
||||
|
||||
|
||||
def sync_item(key : Union[StateKey, ProcessorStateKey]) -> None:
|
||||
STATE_SET['cli'][key] = STATE_SET.get('api').get(key) #type:ignore[literal-required]
|
||||
|
||||
|
||||
def clear_item(key : Union[StateKey, ProcessorStateKey]) -> None:
|
||||
set_item(key, None)
|
||||
|
||||
+19
-16
@@ -60,12 +60,12 @@ VideoWriterSet : TypeAlias = Dict[str, cv2.VideoWriter]
|
||||
CameraCaptureSet : TypeAlias = Dict[str, cv2.VideoCapture]
|
||||
VideoPoolSet = TypedDict('VideoPoolSet',
|
||||
{
|
||||
'capture': VideoCaptureSet,
|
||||
'writer': VideoWriterSet
|
||||
'capture' : VideoCaptureSet,
|
||||
'writer' : VideoWriterSet
|
||||
})
|
||||
CameraPoolSet = TypedDict('CameraPoolSet',
|
||||
{
|
||||
'capture': CameraCaptureSet
|
||||
'capture' : CameraCaptureSet
|
||||
})
|
||||
|
||||
ColorMode = Literal['rgb', 'rgba']
|
||||
@@ -95,8 +95,17 @@ Margin : TypeAlias = Tuple[int, int, int, int]
|
||||
Orientation = Literal['landscape', 'portrait']
|
||||
Resolution : TypeAlias = Tuple[int, int]
|
||||
|
||||
ProcessState = Literal['checking', 'processing', 'stopping', 'pending']
|
||||
Args : TypeAlias = Dict[str, Any]
|
||||
Scope : TypeAlias = Literal['api', 'cli', 'sys']
|
||||
|
||||
ArgsStore = TypedDict('ArgsStore',
|
||||
{
|
||||
'api' : List[str],
|
||||
'cli' : List[str],
|
||||
'sys' : List[str]
|
||||
})
|
||||
|
||||
ProcessState = Literal['checking', 'processing', 'stopping', 'pending']
|
||||
UpdateProgress : TypeAlias = Callable[[int], None]
|
||||
ProcessStep : TypeAlias = Callable[[str, int, Args], bool]
|
||||
|
||||
@@ -106,10 +115,10 @@ Token : TypeAlias = str
|
||||
SessionId : TypeAlias = str
|
||||
Session = TypedDict('Session',
|
||||
{
|
||||
'access_token': Token,
|
||||
'refresh_token': Token,
|
||||
'created_at': datetime,
|
||||
'expires_at': datetime
|
||||
'access_token' : Token,
|
||||
'refresh_token' : Token,
|
||||
'created_at' : datetime,
|
||||
'expires_at' : datetime
|
||||
})
|
||||
|
||||
Command : TypeAlias = str
|
||||
@@ -244,11 +253,6 @@ AppContext = Literal['cli', 'api']
|
||||
InferencePool : TypeAlias = Dict[str, InferenceSession]
|
||||
InferencePoolSet : TypeAlias = Dict[AppContext, Dict[str, InferencePool]]
|
||||
|
||||
JobStore = TypedDict('JobStore',
|
||||
{
|
||||
'job_keys' : List[str],
|
||||
'step_keys' : List[str]
|
||||
})
|
||||
JobOutputSet : TypeAlias = Dict[str, List[str]]
|
||||
JobStatus = Literal['drafted', 'queued', 'completed', 'failed']
|
||||
JobStepStatus = Literal['drafted', 'queued', 'started', 'completed', 'failed']
|
||||
@@ -351,7 +355,7 @@ State = TypedDict('State',
|
||||
'benchmark_cycle_count' : int,
|
||||
'face_detector_model' : FaceDetectorModel,
|
||||
'face_detector_size' : str,
|
||||
'face_detector_margin': Margin,
|
||||
'face_detector_margin' : Margin,
|
||||
'face_detector_angles' : List[Angle],
|
||||
'face_detector_score' : Score,
|
||||
'face_landmarker_model' : FaceLandmarkerModel,
|
||||
@@ -372,7 +376,7 @@ State = TypedDict('State',
|
||||
'face_mask_regions' : List[FaceMaskRegion],
|
||||
'face_mask_blur' : float,
|
||||
'face_mask_padding' : Padding,
|
||||
'voice_extractor_model': VoiceExtractorModel,
|
||||
'voice_extractor_model' : VoiceExtractorModel,
|
||||
'trim_frame_start' : int,
|
||||
'trim_frame_end' : int,
|
||||
'temp_frame_format' : TempFrameFormat,
|
||||
@@ -400,4 +404,3 @@ State = TypedDict('State',
|
||||
})
|
||||
ApplyStateItem : TypeAlias = Callable[[Any, Any], None]
|
||||
StateSet : TypeAlias = Dict[AppContext, State]
|
||||
|
||||
|
||||
@@ -3,12 +3,13 @@ from typing import Iterator
|
||||
import pytest
|
||||
from starlette.testclient import TestClient
|
||||
|
||||
from facefusion import metadata, session_manager, state_manager
|
||||
from facefusion import args_store, metadata, session_manager, state_manager
|
||||
from facefusion.apis.core import create_api
|
||||
|
||||
|
||||
@pytest.fixture(scope = 'module')
|
||||
def test_client() -> Iterator[TestClient]:
|
||||
args_store.register_args([ 'execution_providers' ], scopes = [ 'api' ])
|
||||
state_manager.init_item('execution_providers', [ 'cpu' ])
|
||||
|
||||
with TestClient(create_api()) as test_client:
|
||||
|
||||
Reference in New Issue
Block a user