From ffac0783d9344d97ed44afbe42d8f878093dd27e Mon Sep 17 00:00:00 2001 From: Henry Ruhs Date: Tue, 19 Nov 2024 15:08:11 +0100 Subject: [PATCH] =?UTF-8?q?Implement=20face=20enhancer=20weight=20for=20co?= =?UTF-8?q?deformer,=20Side=20Quest:=20has=20proces=E2=80=A6=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Implement face enhancer weight for codeformer, Side Quest: has processor checks * Fix typo --- facefusion.ini | 1 + facefusion/processors/choices.py | 1 + .../processors/modules/face_enhancer.py | 17 +++++++-- facefusion/processors/typing.py | 2 + .../uis/components/age_modifier_options.py | 5 ++- .../components/expression_restorer_options.py | 5 ++- .../uis/components/face_debugger_options.py | 3 +- .../uis/components/face_editor_options.py | 31 ++++++++-------- .../uis/components/face_enhancer_options.py | 37 ++++++++++++++----- .../uis/components/face_swapper_options.py | 5 ++- .../uis/components/frame_colorizer_options.py | 7 ++-- .../uis/components/frame_enhancer_options.py | 5 ++- .../uis/components/lip_syncer_options.py | 3 +- facefusion/uis/components/preview.py | 1 + facefusion/uis/typing.py | 1 + facefusion/wording.py | 4 +- 16 files changed, 87 insertions(+), 41 deletions(-) diff --git a/facefusion.ini b/facefusion.ini index 82dd234f..30eaf786 100644 --- a/facefusion.ini +++ b/facefusion.ini @@ -80,6 +80,7 @@ face_editor_head_yaw = face_editor_head_roll = face_enhancer_model = face_enhancer_blend = +face_enhancer_weight = face_swapper_model = face_swapper_pixel_boost = frame_colorizer_model = diff --git a/facefusion/processors/choices.py b/facefusion/processors/choices.py index 5b55ae3c..2318f92a 100755 --- a/facefusion/processors/choices.py +++ b/facefusion/processors/choices.py @@ -186,5 +186,6 @@ face_editor_head_pitch_range : Sequence[float] = create_float_range(-1.0, 1.0, 0 face_editor_head_yaw_range : Sequence[float] = create_float_range(-1.0, 1.0, 0.05) face_editor_head_roll_range : Sequence[float] = create_float_range(-1.0, 1.0, 0.05) face_enhancer_blend_range : Sequence[int] = create_int_range(0, 100, 1) +face_enhancer_weight_range : Sequence[float] = create_float_range(0.0, 1.0, 0.05) frame_colorizer_blend_range : Sequence[int] = create_int_range(0, 100, 1) frame_enhancer_blend_range : Sequence[int] = create_int_range(0, 100, 1) diff --git a/facefusion/processors/modules/face_enhancer.py b/facefusion/processors/modules/face_enhancer.py index 2591a30b..2124a4d4 100755 --- a/facefusion/processors/modules/face_enhancer.py +++ b/facefusion/processors/modules/face_enhancer.py @@ -8,7 +8,7 @@ import facefusion.jobs.job_manager import facefusion.jobs.job_store import facefusion.processors.core as processors from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, process_manager, state_manager, wording -from facefusion.common_helper import create_int_metavar +from facefusion.common_helper import create_float_metavar, create_int_metavar from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url from facefusion.face_analyser import get_many_faces, get_one_face from facefusion.face_helper import paste_back, warp_face_by_face_landmark_5 @@ -240,12 +240,14 @@ def register_args(program : ArgumentParser) -> None: if group_processors: group_processors.add_argument('--face-enhancer-model', help = wording.get('help.face_enhancer_model'), default = config.get_str_value('processors.face_enhancer_model', 'gfpgan_1.4'), choices = processors_choices.face_enhancer_models) group_processors.add_argument('--face-enhancer-blend', help = wording.get('help.face_enhancer_blend'), type = int, default = config.get_int_value('processors.face_enhancer_blend', '80'), choices = processors_choices.face_enhancer_blend_range, metavar = create_int_metavar(processors_choices.face_enhancer_blend_range)) - facefusion.jobs.job_store.register_step_keys([ 'face_enhancer_model', 'face_enhancer_blend' ]) + group_processors.add_argument('--face-enhancer-weight', help = wording.get('help.face_enhancer_weight'), type = float, default = config.get_float_value('processors.face_enhancer_weight', '1.0'), choices = processors_choices.face_enhancer_weight_range, metavar = create_float_metavar(processors_choices.face_enhancer_weight_range)) + facefusion.jobs.job_store.register_step_keys([ 'face_enhancer_model', 'face_enhancer_blend', 'face_enhancer_weight' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: apply_state_item('face_enhancer_model', args.get('face_enhancer_model')) apply_state_item('face_enhancer_blend', args.get('face_enhancer_blend')) + apply_state_item('face_enhancer_weight', args.get('face_enhancer_weight')) def pre_check() -> bool: @@ -296,7 +298,7 @@ def enhance_face(target_face : Face, temp_vision_frame : VisionFrame) -> VisionF crop_masks.append(occlusion_mask) crop_vision_frame = prepare_crop_frame(crop_vision_frame) - face_enhancer_weight = numpy.array([ 1 ]).astype(numpy.double) + face_enhancer_weight = numpy.array([ state_manager.get_item('face_enhancer_weight') ]).astype(numpy.double) crop_vision_frame = forward(crop_vision_frame, face_enhancer_weight) crop_vision_frame = normalize_crop_frame(crop_vision_frame) crop_mask = numpy.minimum.reduce(crop_masks).clip(0, 1) @@ -321,6 +323,15 @@ def forward(crop_vision_frame : VisionFrame, face_enhancer_weight : FaceEnhancer return crop_vision_frame +def has_weight_input() -> bool: + face_enhancer = get_inference_pool().get('face_enhancer') + + for deep_swapper_input in face_enhancer.get_inputs(): + if deep_swapper_input.name == 'weight': + return True + return False + + def prepare_crop_frame(crop_vision_frame : VisionFrame) -> VisionFrame: crop_vision_frame = crop_vision_frame[:, :, ::-1] / 255.0 crop_vision_frame = (crop_vision_frame - 0.5) / 0.5 diff --git a/facefusion/processors/typing.py b/facefusion/processors/typing.py index 2392fbe9..0de8dcd9 100644 --- a/facefusion/processors/typing.py +++ b/facefusion/processors/typing.py @@ -236,6 +236,7 @@ ProcessorStateKey = Literal\ 'face_editor_head_roll', 'face_enhancer_model', 'face_enhancer_blend', + 'face_enhancer_weight', 'face_swapper_model', 'face_swapper_pixel_boost', 'frame_colorizer_model', @@ -271,6 +272,7 @@ ProcessorState = TypedDict('ProcessorState', 'face_editor_head_roll' : float, 'face_enhancer_model' : FaceEnhancerModel, 'face_enhancer_blend' : int, + 'face_enhancer_weight' : float, 'face_swapper_model' : FaceSwapperModel, 'face_swapper_pixel_boost' : str, 'frame_colorizer_model' : FrameColorizerModel, diff --git a/facefusion/uis/components/age_modifier_options.py b/facefusion/uis/components/age_modifier_options.py index 73b1de23..ef80b78a 100755 --- a/facefusion/uis/components/age_modifier_options.py +++ b/facefusion/uis/components/age_modifier_options.py @@ -17,11 +17,12 @@ def render() -> None: global AGE_MODIFIER_MODEL_DROPDOWN global AGE_MODIFIER_DIRECTION_SLIDER + has_age_modifier = 'age_modifier' in state_manager.get_item('processors') AGE_MODIFIER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.age_modifier_model_dropdown'), choices = processors_choices.age_modifier_models, value = state_manager.get_item('age_modifier_model'), - visible = 'age_modifier' in state_manager.get_item('processors') + visible = has_age_modifier ) AGE_MODIFIER_DIRECTION_SLIDER = gradio.Slider( label = wording.get('uis.age_modifier_direction_slider'), @@ -29,7 +30,7 @@ def render() -> None: step = calc_float_step(processors_choices.age_modifier_direction_range), minimum = processors_choices.age_modifier_direction_range[0], maximum = processors_choices.age_modifier_direction_range[-1], - visible = 'age_modifier' in state_manager.get_item('processors') + visible = has_age_modifier ) register_ui_component('age_modifier_model_dropdown', AGE_MODIFIER_MODEL_DROPDOWN) register_ui_component('age_modifier_direction_slider', AGE_MODIFIER_DIRECTION_SLIDER) diff --git a/facefusion/uis/components/expression_restorer_options.py b/facefusion/uis/components/expression_restorer_options.py index eaa48ecf..06bc3fa3 100755 --- a/facefusion/uis/components/expression_restorer_options.py +++ b/facefusion/uis/components/expression_restorer_options.py @@ -17,11 +17,12 @@ def render() -> None: global EXPRESSION_RESTORER_MODEL_DROPDOWN global EXPRESSION_RESTORER_FACTOR_SLIDER + has_expression_restorer = 'expression_restorer' in state_manager.get_item('processors') EXPRESSION_RESTORER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.expression_restorer_model_dropdown'), choices = processors_choices.expression_restorer_models, value = state_manager.get_item('expression_restorer_model'), - visible = 'expression_restorer' in state_manager.get_item('processors') + visible = has_expression_restorer ) EXPRESSION_RESTORER_FACTOR_SLIDER = gradio.Slider( label = wording.get('uis.expression_restorer_factor_slider'), @@ -29,7 +30,7 @@ def render() -> None: step = calc_float_step(processors_choices.expression_restorer_factor_range), minimum = processors_choices.expression_restorer_factor_range[0], maximum = processors_choices.expression_restorer_factor_range[-1], - visible = 'expression_restorer' in state_manager.get_item('processors'), + visible = has_expression_restorer ) register_ui_component('expression_restorer_model_dropdown', EXPRESSION_RESTORER_MODEL_DROPDOWN) register_ui_component('expression_restorer_factor_slider', EXPRESSION_RESTORER_FACTOR_SLIDER) diff --git a/facefusion/uis/components/face_debugger_options.py b/facefusion/uis/components/face_debugger_options.py index 088b0877..4133638d 100755 --- a/facefusion/uis/components/face_debugger_options.py +++ b/facefusion/uis/components/face_debugger_options.py @@ -13,11 +13,12 @@ FACE_DEBUGGER_ITEMS_CHECKBOX_GROUP : Optional[gradio.CheckboxGroup] = None def render() -> None: global FACE_DEBUGGER_ITEMS_CHECKBOX_GROUP + has_face_debugger = 'face_debugger' in state_manager.get_item('processors') FACE_DEBUGGER_ITEMS_CHECKBOX_GROUP = gradio.CheckboxGroup( label = wording.get('uis.face_debugger_items_checkbox_group'), choices = processors_choices.face_debugger_items, value = state_manager.get_item('face_debugger_items'), - visible = 'face_debugger' in state_manager.get_item('processors') + visible = has_face_debugger ) register_ui_component('face_debugger_items_checkbox_group', FACE_DEBUGGER_ITEMS_CHECKBOX_GROUP) diff --git a/facefusion/uis/components/face_editor_options.py b/facefusion/uis/components/face_editor_options.py index cf4efa0f..ef846aaf 100755 --- a/facefusion/uis/components/face_editor_options.py +++ b/facefusion/uis/components/face_editor_options.py @@ -43,11 +43,12 @@ def render() -> None: global FACE_EDITOR_HEAD_YAW_SLIDER global FACE_EDITOR_HEAD_ROLL_SLIDER + has_face_editor = 'face_editor' in state_manager.get_item('processors') FACE_EDITOR_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.face_editor_model_dropdown'), choices = processors_choices.face_editor_models, value = state_manager.get_item('face_editor_model'), - visible = 'face_editor' in state_manager.get_item('processors') + visible = has_face_editor ) FACE_EDITOR_EYEBROW_DIRECTION_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_eyebrow_direction_slider'), @@ -55,7 +56,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_eyebrow_direction_range), minimum = processors_choices.face_editor_eyebrow_direction_range[0], maximum = processors_choices.face_editor_eyebrow_direction_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_EYE_GAZE_HORIZONTAL_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_eye_gaze_horizontal_slider'), @@ -63,7 +64,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_eye_gaze_horizontal_range), minimum = processors_choices.face_editor_eye_gaze_horizontal_range[0], maximum = processors_choices.face_editor_eye_gaze_horizontal_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_EYE_GAZE_VERTICAL_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_eye_gaze_vertical_slider'), @@ -71,7 +72,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_eye_gaze_vertical_range), minimum = processors_choices.face_editor_eye_gaze_vertical_range[0], maximum = processors_choices.face_editor_eye_gaze_vertical_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_EYE_OPEN_RATIO_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_eye_open_ratio_slider'), @@ -79,7 +80,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_eye_open_ratio_range), minimum = processors_choices.face_editor_eye_open_ratio_range[0], maximum = processors_choices.face_editor_eye_open_ratio_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_LIP_OPEN_RATIO_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_lip_open_ratio_slider'), @@ -87,7 +88,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_lip_open_ratio_range), minimum = processors_choices.face_editor_lip_open_ratio_range[0], maximum = processors_choices.face_editor_lip_open_ratio_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_GRIM_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_grim_slider'), @@ -95,7 +96,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_grim_range), minimum = processors_choices.face_editor_mouth_grim_range[0], maximum = processors_choices.face_editor_mouth_grim_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_POUT_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_pout_slider'), @@ -103,7 +104,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_pout_range), minimum = processors_choices.face_editor_mouth_pout_range[0], maximum = processors_choices.face_editor_mouth_pout_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_PURSE_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_purse_slider'), @@ -111,7 +112,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_purse_range), minimum = processors_choices.face_editor_mouth_purse_range[0], maximum = processors_choices.face_editor_mouth_purse_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_SMILE_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_smile_slider'), @@ -119,7 +120,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_smile_range), minimum = processors_choices.face_editor_mouth_smile_range[0], maximum = processors_choices.face_editor_mouth_smile_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_POSITION_HORIZONTAL_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_position_horizontal_slider'), @@ -127,7 +128,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_position_horizontal_range), minimum = processors_choices.face_editor_mouth_position_horizontal_range[0], maximum = processors_choices.face_editor_mouth_position_horizontal_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_MOUTH_POSITION_VERTICAL_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_mouth_position_vertical_slider'), @@ -135,7 +136,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_mouth_position_vertical_range), minimum = processors_choices.face_editor_mouth_position_vertical_range[0], maximum = processors_choices.face_editor_mouth_position_vertical_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_HEAD_PITCH_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_head_pitch_slider'), @@ -143,7 +144,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_head_pitch_range), minimum = processors_choices.face_editor_head_pitch_range[0], maximum = processors_choices.face_editor_head_pitch_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_HEAD_YAW_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_head_yaw_slider'), @@ -151,7 +152,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_head_yaw_range), minimum = processors_choices.face_editor_head_yaw_range[0], maximum = processors_choices.face_editor_head_yaw_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) FACE_EDITOR_HEAD_ROLL_SLIDER = gradio.Slider( label = wording.get('uis.face_editor_head_roll_slider'), @@ -159,7 +160,7 @@ def render() -> None: step = calc_float_step(processors_choices.face_editor_head_roll_range), minimum = processors_choices.face_editor_head_roll_range[0], maximum = processors_choices.face_editor_head_roll_range[-1], - visible = 'face_editor' in state_manager.get_item('processors'), + visible = has_face_editor ) register_ui_component('face_editor_model_dropdown', FACE_EDITOR_MODEL_DROPDOWN) register_ui_component('face_editor_eyebrow_direction_slider', FACE_EDITOR_EYEBROW_DIRECTION_SLIDER) diff --git a/facefusion/uis/components/face_enhancer_options.py b/facefusion/uis/components/face_enhancer_options.py index 5ce4c11a..d1710b67 100755 --- a/facefusion/uis/components/face_enhancer_options.py +++ b/facefusion/uis/components/face_enhancer_options.py @@ -3,25 +3,29 @@ from typing import List, Optional, Tuple import gradio from facefusion import state_manager, wording -from facefusion.common_helper import calc_int_step +from facefusion.common_helper import calc_float_step, calc_int_step from facefusion.processors import choices as processors_choices from facefusion.processors.core import load_processor_module +from facefusion.processors.modules.face_enhancer import has_weight_input from facefusion.processors.typing import FaceEnhancerModel from facefusion.uis.core import get_ui_component, register_ui_component FACE_ENHANCER_MODEL_DROPDOWN : Optional[gradio.Dropdown] = None FACE_ENHANCER_BLEND_SLIDER : Optional[gradio.Slider] = None +FACE_ENHANCER_WEIGHT_SLIDER : Optional[gradio.Slider] = None def render() -> None: global FACE_ENHANCER_MODEL_DROPDOWN global FACE_ENHANCER_BLEND_SLIDER + global FACE_ENHANCER_WEIGHT_SLIDER + has_face_enhancer = 'face_enhancer' in state_manager.get_item('processors') FACE_ENHANCER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.face_enhancer_model_dropdown'), choices = processors_choices.face_enhancer_models, value = state_manager.get_item('face_enhancer_model'), - visible = 'face_enhancer' in state_manager.get_item('processors') + visible = has_face_enhancer ) FACE_ENHANCER_BLEND_SLIDER = gradio.Slider( label = wording.get('uis.face_enhancer_blend_slider'), @@ -29,35 +33,50 @@ def render() -> None: step = calc_int_step(processors_choices.face_enhancer_blend_range), minimum = processors_choices.face_enhancer_blend_range[0], maximum = processors_choices.face_enhancer_blend_range[-1], - visible = 'face_enhancer' in state_manager.get_item('processors') + visible = has_face_enhancer + ) + FACE_ENHANCER_WEIGHT_SLIDER = gradio.Slider( + label = wording.get('uis.face_enhancer_weight_slider'), + value = state_manager.get_item('face_enhancer_weight'), + step = calc_float_step(processors_choices.face_enhancer_weight_range), + minimum = processors_choices.face_enhancer_weight_range[0], + maximum = processors_choices.face_enhancer_weight_range[-1], + visible = has_face_enhancer and has_weight_input() ) register_ui_component('face_enhancer_model_dropdown', FACE_ENHANCER_MODEL_DROPDOWN) register_ui_component('face_enhancer_blend_slider', FACE_ENHANCER_BLEND_SLIDER) + register_ui_component('face_enhancer_weight_slider', FACE_ENHANCER_WEIGHT_SLIDER) def listen() -> None: - FACE_ENHANCER_MODEL_DROPDOWN.change(update_face_enhancer_model, inputs = FACE_ENHANCER_MODEL_DROPDOWN, outputs = FACE_ENHANCER_MODEL_DROPDOWN) + FACE_ENHANCER_MODEL_DROPDOWN.change(update_face_enhancer_model, inputs = FACE_ENHANCER_MODEL_DROPDOWN, outputs = [ FACE_ENHANCER_MODEL_DROPDOWN, FACE_ENHANCER_WEIGHT_SLIDER ]) FACE_ENHANCER_BLEND_SLIDER.release(update_face_enhancer_blend, inputs = FACE_ENHANCER_BLEND_SLIDER) + FACE_ENHANCER_WEIGHT_SLIDER.release(update_face_enhancer_weight, inputs = FACE_ENHANCER_WEIGHT_SLIDER) processors_checkbox_group = get_ui_component('processors_checkbox_group') if processors_checkbox_group: - processors_checkbox_group.change(remote_update, inputs = processors_checkbox_group, outputs = [ FACE_ENHANCER_MODEL_DROPDOWN, FACE_ENHANCER_BLEND_SLIDER ]) + processors_checkbox_group.change(remote_update, inputs = processors_checkbox_group, outputs = [ FACE_ENHANCER_MODEL_DROPDOWN, FACE_ENHANCER_WEIGHT_SLIDER ]) def remote_update(processors : List[str]) -> Tuple[gradio.Dropdown, gradio.Slider]: has_face_enhancer = 'face_enhancer' in processors - return gradio.Dropdown(visible = has_face_enhancer), gradio.Slider(visible = has_face_enhancer) + return gradio.Dropdown(visible = has_face_enhancer), gradio.Slider(visible = has_face_enhancer and has_weight_input()) -def update_face_enhancer_model(face_enhancer_model : FaceEnhancerModel) -> gradio.Dropdown: +def update_face_enhancer_model(face_enhancer_model : FaceEnhancerModel) -> Tuple[gradio.Dropdown, gradio.Slider]: face_enhancer_module = load_processor_module('face_enhancer') face_enhancer_module.clear_inference_pool() state_manager.set_item('face_enhancer_model', face_enhancer_model) if face_enhancer_module.pre_check(): - return gradio.Dropdown(value = state_manager.get_item('face_enhancer_model')) - return gradio.Dropdown() + return gradio.Dropdown(value = state_manager.get_item('face_enhancer_model')), gradio.Slider(visible = has_weight_input()) + return gradio.Dropdown(), gradio.Slider() def update_face_enhancer_blend(face_enhancer_blend : float) -> None: state_manager.set_item('face_enhancer_blend', int(face_enhancer_blend)) + + +def update_face_enhancer_weight(face_enhancer_weight : float) -> None: + state_manager.set_item('face_enhancer_weight', face_enhancer_weight) + diff --git a/facefusion/uis/components/face_swapper_options.py b/facefusion/uis/components/face_swapper_options.py index e2259214..2d1f89b9 100755 --- a/facefusion/uis/components/face_swapper_options.py +++ b/facefusion/uis/components/face_swapper_options.py @@ -17,17 +17,18 @@ def render() -> None: global FACE_SWAPPER_MODEL_DROPDOWN global FACE_SWAPPER_PIXEL_BOOST_DROPDOWN + has_face_swapper = 'face_swapper' in state_manager.get_item('processors') FACE_SWAPPER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.face_swapper_model_dropdown'), choices = list(processors_choices.face_swapper_set.keys()), value = state_manager.get_item('face_swapper_model'), - visible = 'face_swapper' in state_manager.get_item('processors') + visible = has_face_swapper ) FACE_SWAPPER_PIXEL_BOOST_DROPDOWN = gradio.Dropdown( label = wording.get('uis.face_swapper_pixel_boost_dropdown'), choices = processors_choices.face_swapper_set.get(state_manager.get_item('face_swapper_model')), value = state_manager.get_item('face_swapper_pixel_boost'), - visible = 'face_swapper' in state_manager.get_item('processors') + visible = has_face_swapper ) register_ui_component('face_swapper_model_dropdown', FACE_SWAPPER_MODEL_DROPDOWN) register_ui_component('face_swapper_pixel_boost_dropdown', FACE_SWAPPER_PIXEL_BOOST_DROPDOWN) diff --git a/facefusion/uis/components/frame_colorizer_options.py b/facefusion/uis/components/frame_colorizer_options.py index 350d3e2e..5d7ed802 100755 --- a/facefusion/uis/components/frame_colorizer_options.py +++ b/facefusion/uis/components/frame_colorizer_options.py @@ -19,17 +19,18 @@ def render() -> None: global FRAME_COLORIZER_SIZE_DROPDOWN global FRAME_COLORIZER_BLEND_SLIDER + has_frame_colorizer = 'frame_colorizer' in state_manager.get_item('processors') FRAME_COLORIZER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.frame_colorizer_model_dropdown'), choices = processors_choices.frame_colorizer_models, value = state_manager.get_item('frame_colorizer_model'), - visible = 'frame_colorizer' in state_manager.get_item('processors') + visible = has_frame_colorizer ) FRAME_COLORIZER_SIZE_DROPDOWN = gradio.Dropdown( label = wording.get('uis.frame_colorizer_size_dropdown'), choices = processors_choices.frame_colorizer_sizes, value = state_manager.get_item('frame_colorizer_size'), - visible = 'frame_colorizer' in state_manager.get_item('processors') + visible = has_frame_colorizer ) FRAME_COLORIZER_BLEND_SLIDER = gradio.Slider( label = wording.get('uis.frame_colorizer_blend_slider'), @@ -37,7 +38,7 @@ def render() -> None: step = calc_int_step(processors_choices.frame_colorizer_blend_range), minimum = processors_choices.frame_colorizer_blend_range[0], maximum = processors_choices.frame_colorizer_blend_range[-1], - visible = 'frame_colorizer' in state_manager.get_item('processors') + visible = has_frame_colorizer ) register_ui_component('frame_colorizer_model_dropdown', FRAME_COLORIZER_MODEL_DROPDOWN) register_ui_component('frame_colorizer_size_dropdown', FRAME_COLORIZER_SIZE_DROPDOWN) diff --git a/facefusion/uis/components/frame_enhancer_options.py b/facefusion/uis/components/frame_enhancer_options.py index f8629ef7..99547ed2 100755 --- a/facefusion/uis/components/frame_enhancer_options.py +++ b/facefusion/uis/components/frame_enhancer_options.py @@ -17,11 +17,12 @@ def render() -> None: global FRAME_ENHANCER_MODEL_DROPDOWN global FRAME_ENHANCER_BLEND_SLIDER + has_frame_enhancer = 'frame_enhancer' in state_manager.get_item('processors') FRAME_ENHANCER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.frame_enhancer_model_dropdown'), choices = processors_choices.frame_enhancer_models, value = state_manager.get_item('frame_enhancer_model'), - visible = 'frame_enhancer' in state_manager.get_item('processors') + visible = has_frame_enhancer ) FRAME_ENHANCER_BLEND_SLIDER = gradio.Slider( label = wording.get('uis.frame_enhancer_blend_slider'), @@ -29,7 +30,7 @@ def render() -> None: step = calc_int_step(processors_choices.frame_enhancer_blend_range), minimum = processors_choices.frame_enhancer_blend_range[0], maximum = processors_choices.frame_enhancer_blend_range[-1], - visible = 'frame_enhancer' in state_manager.get_item('processors') + visible = has_frame_enhancer ) register_ui_component('frame_enhancer_model_dropdown', FRAME_ENHANCER_MODEL_DROPDOWN) register_ui_component('frame_enhancer_blend_slider', FRAME_ENHANCER_BLEND_SLIDER) diff --git a/facefusion/uis/components/lip_syncer_options.py b/facefusion/uis/components/lip_syncer_options.py index 7c195d93..16b0c0ff 100755 --- a/facefusion/uis/components/lip_syncer_options.py +++ b/facefusion/uis/components/lip_syncer_options.py @@ -14,11 +14,12 @@ LIP_SYNCER_MODEL_DROPDOWN : Optional[gradio.Dropdown] = None def render() -> None: global LIP_SYNCER_MODEL_DROPDOWN + has_lip_syncer = 'lip_syncer' in state_manager.get_item('processors') LIP_SYNCER_MODEL_DROPDOWN = gradio.Dropdown( label = wording.get('uis.lip_syncer_model_dropdown'), choices = processors_choices.lip_syncer_models, value = state_manager.get_item('lip_syncer_model'), - visible = 'lip_syncer' in state_manager.get_item('processors') + visible = has_lip_syncer ) register_ui_component('lip_syncer_model_dropdown', LIP_SYNCER_MODEL_DROPDOWN) diff --git a/facefusion/uis/components/preview.py b/facefusion/uis/components/preview.py index a956c29c..75cf9ed9 100755 --- a/facefusion/uis/components/preview.py +++ b/facefusion/uis/components/preview.py @@ -128,6 +128,7 @@ def listen() -> None: 'face_editor_head_yaw_slider', 'face_editor_head_roll_slider', 'face_enhancer_blend_slider', + 'face_enhancer_weight_slider', 'frame_colorizer_blend_slider', 'frame_enhancer_blend_slider', 'reference_face_distance_slider', diff --git a/facefusion/uis/typing.py b/facefusion/uis/typing.py index cb67782b..f7e894cc 100644 --- a/facefusion/uis/typing.py +++ b/facefusion/uis/typing.py @@ -35,6 +35,7 @@ ComponentName = Literal\ 'face_editor_mouth_smile_slider', 'face_enhancer_blend_slider', 'face_enhancer_model_dropdown', + 'face_enhancer_weight_slider', 'face_landmarker_model_dropdown', 'face_landmarker_score_slider', 'face_mask_blur_slider', diff --git a/facefusion/wording.py b/facefusion/wording.py index 38c64b92..8092d862 100755 --- a/facefusion/wording.py +++ b/facefusion/wording.py @@ -121,7 +121,7 @@ WORDING : Dict[str, Any] =\ 'reference_frame_number': 'specify the frame used to create the reference face', # face masker 'face_mask_types': 'mix and match different face mask types (choices: {choices})', - 'face_mask_blur': 'specify the degree of blur applied the box mask', + 'face_mask_blur': 'specify the degree of blur applied to the box mask', 'face_mask_padding': 'apply top, right, bottom and left padding to the box mask', 'face_mask_regions': 'choose the facial features used for the region mask (choices: {choices})', # frame extraction @@ -165,6 +165,7 @@ WORDING : Dict[str, Any] =\ 'face_editor_head_roll': 'specify the head roll', 'face_enhancer_model': 'choose the model responsible for enhancing the face', 'face_enhancer_blend': 'blend the enhanced into the previous face', + 'face_enhancer_weight': 'specify the degree of weight applied to the face', 'face_swapper_model': 'choose the model responsible for swapping the face', 'face_swapper_pixel_boost': 'choose the pixel boost resolution for the face swapper', 'frame_colorizer_model': 'choose the model responsible for colorizing the frame', @@ -260,6 +261,7 @@ WORDING : Dict[str, Any] =\ 'face_editor_mouth_purse_slider': 'FACE EDITOR MOUTH PURSE', 'face_editor_mouth_smile_slider': 'FACE EDITOR MOUTH SMILE', 'face_enhancer_blend_slider': 'FACE ENHANCER BLEND', + 'face_enhancer_weight_slider': 'FACE ENHANCER WEIGHT', 'face_enhancer_model_dropdown': 'FACE ENHANCER MODEL', 'face_landmarker_model_dropdown': 'FACE LANDMARKER MODEL', 'face_landmarker_score_slider': 'FACE LANDMARKER SCORE',