diff --git a/facefusion/face_helper.py b/facefusion/face_helper.py index 5c608093..090c02cd 100644 --- a/facefusion/face_helper.py +++ b/facefusion/face_helper.py @@ -16,7 +16,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50000000, 0.61154464 ], [ 0.37913393, 0.77687500 ], [ 0.62086607, 0.77687500 ] - ]).astype(numpy.float32), + ]), 'arcface_112_v2': numpy.array( [ [ 0.34191607, 0.46157411 ], @@ -24,7 +24,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50022500, 0.64050536 ], [ 0.37097589, 0.82469196 ], [ 0.63151696, 0.82325089 ] - ]).astype(numpy.float32), + ]), 'arcface_128_v2': numpy.array( [ [ 0.36167656, 0.40387734 ], @@ -32,7 +32,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50019687, 0.56044219 ], [ 0.38710391, 0.72160547 ], [ 0.61507734, 0.72034453 ] - ]).astype(numpy.float32), + ]), 'dfl_head': numpy.array( [ [ 0.39062554, 0.59114583 ], @@ -40,7 +40,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.49414062, 0.70898442 ], [ 0.41796875, 0.82031255 ], [ 0.58007813, 0.82031255 ] - ]).astype(numpy.float32), + ]), 'dfl_whole_face': numpy.array( [ [ 0.36816406, 0.40429688 ], @@ -48,7 +48,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.49023438, 0.54296875 ], [ 0.39843755, 0.68554699 ], [ 0.59375543, 0.68554699 ] - ]).astype(numpy.float32), + ]), 'ffhq_512': numpy.array( [ [ 0.37691676, 0.46864664 ], @@ -56,7 +56,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50123859, 0.61331904 ], [ 0.39308822, 0.72541100 ], [ 0.61150205, 0.72490465 ] - ]).astype(numpy.float32), + ]), 'mtcnn_512': numpy.array( [ [ 0.36562865, 0.46733799 ], @@ -64,7 +64,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50019127, 0.61942959 ], [ 0.39032951, 0.77598822 ], [ 0.61178945, 0.77476328 ] - ]).astype(numpy.float32), + ]), 'styleganex_384': numpy.array( [ [ 0.42353745, 0.52289879 ], @@ -72,7 +72,7 @@ WARP_TEMPLATES : WarpTemplateSet =\ [ 0.50123859, 0.61331904 ], [ 0.43364461, 0.68337652 ], [ 0.57015325, 0.68306005 ] - ]).astype(numpy.float32) + ]) } diff --git a/facefusion/processors/choices.py b/facefusion/processors/choices.py index be020656..0a3c8768 100755 --- a/facefusion/processors/choices.py +++ b/facefusion/processors/choices.py @@ -4,7 +4,41 @@ from facefusion.common_helper import create_float_range, create_int_range from facefusion.processors.typing import AgeModifierModel, DeepSwapperModel, ExpressionRestorerModel, FaceDebuggerItem, FaceEditorModel, FaceEnhancerModel, FaceSwapperSet, FrameColorizerModel, FrameEnhancerModel, LipSyncerModel age_modifier_models : List[AgeModifierModel] = [ 'styleganex_age' ] -deep_swapper_models : List[DeepSwapperModel] = [ 'iperov/emma_watson_224', 'iperov/jackie_chan_224', 'iperov/keanu_reeves_320', 'iperov/sylvester_stallone_224', 'iperov/taylor_swift_224' ] +deep_swapper_models : List[DeepSwapperModel] =\ +[ + 'iperov/emma_watson_224', + 'iperov/keanu_reeves_320', + 'iperov/jackie_chan_224', + 'iperov/alexandra_daddario_224', + 'iperov/alexei_navalny_224', + 'iperov/amber_heard_224', + 'iperov/dilraba_dilmurat_224', + 'iperov/elon_musk_224', + 'iperov/emilia_clarke_224', + 'iperov/emma_watson_224', + 'iperov/erin_moriarty_224', + 'iperov/jackie_chan_224', + 'iperov/james_carrey_224', + 'iperov/jason_statham_320', + 'iperov/jessica_alba_224', + 'iperov/keanu_reeves_320', + 'iperov/lucy_liu_224', + 'iperov/margot_robbie_224', + 'iperov/meghan_markle_224', + 'iperov/natalie_dormer_224', + 'iperov/natalie_portman_224', + 'iperov/nicolas_coppola__224', + 'iperov/robert_downey_224', + 'iperov/rowan_atkinson_224', + 'iperov/ryan_reynolds_224', + 'iperov/scarlett_johansson_224', + 'iperov/sylvester_stallone_224', + 'iperov/taylor_swift_224', + 'iperov/thomas_cruise_224', + 'iperov/thomas_holland_224', + 'iperov/vin_diesel_224', + 'iperov/vladimir_putin_224' +] expression_restorer_models : List[ExpressionRestorerModel] = [ 'live_portrait' ] face_debugger_items : List[FaceDebuggerItem] = [ 'bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-landmark-68/5', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender', 'race' ] face_editor_models : List[FaceEditorModel] = [ 'live_portrait' ] diff --git a/facefusion/processors/modules/deep_swapper.py b/facefusion/processors/modules/deep_swapper.py index c1c15158..b7b9d2bb 100755 --- a/facefusion/processors/modules/deep_swapper.py +++ b/facefusion/processors/modules/deep_swapper.py @@ -25,114 +25,69 @@ from facefusion.vision import conditional_match_frame_color, read_image, read_st def create_model_set() -> ModelSet: - return\ - { - 'iperov/emma_watson_224': + model_config =\ + [ + ('iperov', 'emma_watson_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'keanu_reeves_320', 'dfl_whole_face', (320, 320)), + ('iperov', 'jackie_chan_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'alexandra_daddario_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'alexei_navalny_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'amber_heard_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'dilraba_dilmurat_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'elon_musk_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'emilia_clarke_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'emma_watson_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'erin_moriarty_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'jackie_chan_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'james_carrey_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'jason_statham_320', 'dfl_whole_face', (224, 224)), + ('iperov', 'jessica_alba_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'keanu_reeves_320', 'dfl_whole_face', (224, 224)), + ('iperov', 'lucy_liu_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'margot_robbie_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'meghan_markle_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'natalie_dormer_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'natalie_portman_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'nicolas_coppola__224', 'dfl_whole_face', (224, 224)), + ('iperov', 'robert_downey_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'rowan_atkinson_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'ryan_reynolds_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'scarlett_johansson_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'sylvester_stallone_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'taylor_swift_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'thomas_cruise_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'thomas_holland_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'vin_diesel_224', 'dfl_whole_face', (224, 224)), + ('iperov', 'vladimir_putin_224', 'dfl_whole_face', (224, 224)) + ] + model_set : ModelSet = {} + + for model_creator, model_name, model_template, model_size in model_config: + model_id = '/'.join([ model_creator, model_name ]) + + model_set[model_id] =\ { 'hashes': { 'deep_swapper': { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'emma_watson_224.hash'), - 'path': resolve_relative_path('../.assets/models/iperov/emma_watson_224.hash') + 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-' + model_creator, model_name + '.hash'), + 'path': resolve_relative_path('../.assets/models/' + model_creator + '/' + model_name + '.hash') } }, 'sources': { 'deep_swapper': { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'emma_watson_224.dfm'), - 'path': resolve_relative_path('../.assets/models/iperov/emma_watson_224.dfm') + 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-' + model_creator, model_name + '.dfm'), + 'path': resolve_relative_path('../.assets/models/' + model_creator + '/' + model_name + '.dfm') } }, - 'template': 'dfl_whole_face', - 'size': (224, 224), - }, - 'iperov/jackie_chan_224': - { - 'hashes': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'jackie_chan_224.hash'), - 'path': resolve_relative_path('../.assets/models/iperov/jackie_chan_224.hash') - } - }, - 'sources': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'jackie_chan_224.dfm'), - 'path': resolve_relative_path('../.assets/models/iperov/jackie_chan_224.dfm') - } - }, - 'template': 'dfl_whole_face', - 'size': (224, 224), - }, - 'iperov/keanu_reeves_320': - { - 'hashes': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'keanu_reeves_320.hash'), - 'path': resolve_relative_path('../.assets/models/iperov/keanu_reeves_320.hash') - } - }, - 'sources': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'keanu_reeves_320.dfm'), - 'path': resolve_relative_path('../.assets/models/iperov/keanu_reeves_320.dfm') - } - }, - 'template': 'dfl_whole_face', - 'size': (320, 320), - }, - 'iperov/sylvester_stallone_224': - { - 'hashes': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'sylvester_stallone_224.hash'), - 'path': resolve_relative_path('../.assets/models/iperov/sylvester_stallone_224.hash') - } - }, - 'sources': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'sylvester_stallone_224.dfm'), - 'path': resolve_relative_path('../.assets/models/iperov/sylvester_stallone_224.dfm') - } - }, - 'template': 'dfl_whole_face', - 'size': (224, 224), - }, - 'iperov/taylor_swift_224': - { - 'hashes': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'taylor_swift_224.hash'), - 'path': resolve_relative_path('../.assets/models/iperov/taylor_swift_224.hash') - } - }, - 'sources': - { - 'deep_swapper': - { - 'url': resolve_download_url_by_provider('huggingface', 'deepfacelive-models-iperov', 'taylor_swift_224.dfm'), - 'path': resolve_relative_path('../.assets/models/iperov/taylor_swift_224.dfm') - } - }, - 'template': 'dfl_whole_face', - 'size': (224, 224), + 'template': model_template, + 'size': model_size } - } + + return model_set def get_inference_pool() -> InferencePool: @@ -154,7 +109,7 @@ 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('--deep-swapper-model', help = wording.get('help.deep_swapper_model'), default = config.get_str_value('processors.deep_swapper_model', 'iperov/jackie_chan_224'), choices = processors_choices.deep_swapper_models) + group_processors.add_argument('--deep-swapper-model', help = wording.get('help.deep_swapper_model'), default = config.get_str_value('processors.deep_swapper_model', 'iperov/elon_musk_224'), choices = processors_choices.deep_swapper_models) group_processors.add_argument('--deep-swapper-morph', help = wording.get('help.deep_swapper_morph'), type = int, default = config.get_int_value('processors.deep_swapper_morph', '80'), choices = processors_choices.deep_swapper_morph_range, metavar = create_int_metavar(processors_choices.deep_swapper_morph_range)) facefusion.jobs.job_store.register_step_keys([ 'deep_swapper_model', 'deep_swapper_morph' ]) diff --git a/facefusion/processors/typing.py b/facefusion/processors/typing.py index 4a067c77..6a000c5a 100644 --- a/facefusion/processors/typing.py +++ b/facefusion/processors/typing.py @@ -5,7 +5,41 @@ from numpy._typing import NDArray from facefusion.typing import AppContext, AudioFrame, Face, FaceSet, VisionFrame AgeModifierModel = Literal['styleganex_age'] -DeepSwapperModel = Literal['iperov/emma_watson_224', 'iperov/jackie_chan_224', 'iperov/keanu_reeves_320', 'iperov/sylvester_stallone_224', 'iperov/taylor_swift_224'] +DeepSwapperModel = Literal\ +[ + 'iperov/emma_watson_224', + 'iperov/keanu_reeves_320', + 'iperov/jackie_chan_224', + 'iperov/alexandra_daddario_224', + 'iperov/alexei_navalny_224', + 'iperov/amber_heard_224', + 'iperov/dilraba_dilmurat_224', + 'iperov/elon_musk_224', + 'iperov/emilia_clarke_224', + 'iperov/emma_watson_224', + 'iperov/erin_moriarty_224', + 'iperov/jackie_chan_224', + 'iperov/james_carrey_224', + 'iperov/jason_statham_320', + 'iperov/jessica_alba_224', + 'iperov/keanu_reeves_320', + 'iperov/lucy_liu_224', + 'iperov/margot_robbie_224', + 'iperov/meghan_markle_224', + 'iperov/natalie_dormer_224', + 'iperov/natalie_portman_224', + 'iperov/nicolas_coppola__224', + 'iperov/robert_downey_224', + 'iperov/rowan_atkinson_224', + 'iperov/ryan_reynolds_224', + 'iperov/scarlett_johansson_224', + 'iperov/sylvester_stallone_224', + 'iperov/taylor_swift_224', + 'iperov/thomas_cruise_224', + 'iperov/thomas_holland_224', + 'iperov/vin_diesel_224', + 'iperov/vladimir_putin_224' +] ExpressionRestorerModel = Literal['live_portrait'] FaceDebuggerItem = Literal['bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-landmark-68/5', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender', 'race'] FaceEditorModel = Literal['live_portrait']