diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e65354..9b9f919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 1.2.5 + +Allow seed selection in inpainting. + +# 1.2.4 + +Fix default settings by marking only managed field as do_not_save. + +See the discussion here : https://github.com/glucauze/sd-webui-faceswaplab/issues/62 + # 1.2.3 Speed up ui : change the way default settings are manage by not storing them in ui-config.json diff --git a/client_api/api_utils.py b/client_api/api_utils.py index 4847acd..d699469 100644 --- a/client_api/api_utils.py +++ b/client_api/api_utils.py @@ -48,6 +48,7 @@ class InpaintingOptions(BaseModel): inpainting_model: str = Field( description="Inpainting model", examples=["Current"], default="Current" ) + inpainting_seed: int = Field(description="Inpainting Seed", ge=-1, default=-1) class InswappperOptions(BaseModel): diff --git a/client_api/test.safetensors b/client_api/test.safetensors index a24d1b6..ebdf37a 100644 Binary files a/client_api/test.safetensors and b/client_api/test.safetensors differ diff --git a/scripts/faceswaplab_globals.py b/scripts/faceswaplab_globals.py index 46f3965..93c8b05 100644 --- a/scripts/faceswaplab_globals.py +++ b/scripts/faceswaplab_globals.py @@ -16,7 +16,7 @@ ) # Defining the version flag for the application -VERSION_FLAG: str = "v1.2.4" +VERSION_FLAG: str = "v1.2.5" # Defining the path for 'sd-webui-faceswaplab' inside the 'extensions' directory EXTENSION_PATH = os.path.join("extensions", "sd-webui-faceswaplab") diff --git a/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py b/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py index d4409a1..6761053 100644 --- a/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py +++ b/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py @@ -12,6 +12,7 @@ class InpaintingOptions: inpainting_steps: int = 20 inpainting_sampler: str = "Euler" inpainting_model: str = "Current" + inpainting_seed: int = -1 @staticmethod def from_gradio(components: List[gr.components.Component]) -> "InpaintingOptions": @@ -38,4 +39,5 @@ def from_api_dto(dto: Optional[api_utils.InpaintingOptions]) -> "InpaintingOptio inpainting_steps=dto.inpainting_steps, inpainting_sampler=dto.inpainting_sampler, inpainting_model=dto.inpainting_model, + inpainting_seed=dto.inpainting_seed, ) diff --git a/scripts/faceswaplab_inpainting/i2i_pp.py b/scripts/faceswaplab_inpainting/i2i_pp.py index 1826949..4daa41c 100644 --- a/scripts/faceswaplab_inpainting/i2i_pp.py +++ b/scripts/faceswaplab_inpainting/i2i_pp.py @@ -63,6 +63,7 @@ def img2img_diffusion( "prompt": prompt, "negative_prompt": negative_prompt, "denoising_strength": options.inpainting_denoising_strengh, + "seed": options.inpainting_seed, } # Remove the following as they are not always supported on all platform : # "override_settings": { diff --git a/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py index 8bb7180..1c40d82 100644 --- a/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py @@ -4,68 +4,71 @@ from scripts.faceswaplab_utils.sd_utils import get_sd_option -def face_inpainting_ui( - name: str, id_prefix: str = "faceswaplab", description: str = "" -) -> List[gr.components.Component]: - with gr.Accordion(name, open=False): - gr.Markdown(description) - inpainting_denoising_strength = gr.Slider( - 0, - 1, - 0, - step=0.01, - elem_id=f"{id_prefix}_pp_inpainting_denoising_strength", - label="Denoising strenght", - ) +def face_inpainting_ui(id_prefix: str = "faceswaplab") -> List[gr.components.Component]: + inpainting_denoising_strength = gr.Slider( + 0, + 1, + 0, + step=0.01, + elem_id=f"{id_prefix}_pp_inpainting_denoising_strength", + label="Denoising strenght", + ) - inpainting_denoising_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" - ), - elem_id=f"{id_prefix}_pp_inpainting_denoising_prompt", - label="Inpainting prompt use [gender] instead of men or woman", + inpainting_denoising_prompt = gr.Textbox( + get_sd_option( + "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" + ), + elem_id=f"{id_prefix}_pp_inpainting_denoising_prompt", + label="Inpainting prompt use [gender] instead of men or woman", + ) + inpainting_denoising_negative_prompt = gr.Textbox( + get_sd_option("faceswaplab_pp_default_inpainting_negative_prompt", "blurry"), + elem_id=f"{id_prefix}_pp_inpainting_denoising_neg_prompt", + label="Inpainting negative prompt use [gender] instead of men or woman", + ) + with gr.Row(): + samplers_names = [s.name for s in sd_samplers.all_samplers] + inpainting_sampler = gr.Dropdown( + choices=samplers_names, + value=[samplers_names[0]], + label="Inpainting Sampler", + elem_id=f"{id_prefix}_pp_inpainting_sampler", ) - inpainting_denoising_negative_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_negative_prompt", "blurry" - ), - elem_id=f"{id_prefix}_pp_inpainting_denoising_neg_prompt", - label="Inpainting negative prompt use [gender] instead of men or woman", + inpainting_denoising_steps = gr.Slider( + 1, + 150, + 20, + step=1, + label="Inpainting steps", + elem_id=f"{id_prefix}_pp_inpainting_steps", ) - with gr.Row(): - samplers_names = [s.name for s in sd_samplers.all_samplers] - inpainting_sampler = gr.Dropdown( - choices=samplers_names, - value=[samplers_names[0]], - label="Inpainting Sampler", - elem_id=f"{id_prefix}_pp_inpainting_sampler", - ) - inpainting_denoising_steps = gr.Slider( - 1, - 150, - 20, - step=1, - label="Inpainting steps", - elem_id=f"{id_prefix}_pp_inpainting_steps", - ) - inpaiting_model = gr.Dropdown( - choices=["Current"] + sd_models.checkpoint_tiles(), - default="Current", - label="sd model (experimental)", - elem_id=f"{id_prefix}_pp_inpainting_sd_model", - ) + inpaiting_model = gr.Dropdown( + choices=["Current"] + sd_models.checkpoint_tiles(), + default="Current", + label="sd model (experimental)", + elem_id=f"{id_prefix}_pp_inpainting_sd_model", + ) + + inpaiting_seed = gr.Number( + label="Inpainting seed", + value=0, + minimum=0, + precision=0, + elem_id=f"{id_prefix}_pp_inpainting_seed", + ) - gradio_components: List[gr.components.Component] = [ - inpainting_denoising_strength, - inpainting_denoising_prompt, - inpainting_denoising_negative_prompt, - inpainting_denoising_steps, - inpainting_sampler, - inpaiting_model, - ] + gradio_components: List[gr.components.Component] = [ + inpainting_denoising_strength, + inpainting_denoising_prompt, + inpainting_denoising_negative_prompt, + inpainting_denoising_steps, + inpainting_sampler, + inpaiting_model, + inpaiting_seed, + ] - for component in gradio_components: - setattr(component, "do_not_save_to_config", True) + for component in gradio_components: + setattr(component, "do_not_save_to_config", True) - return gradio_components + return gradio_components diff --git a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py index a741809..e173c92 100644 --- a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py @@ -4,6 +4,7 @@ from modules import shared, sd_models from scripts.faceswaplab_postprocessing.postprocessing_options import InpaintingWhen from scripts.faceswaplab_utils.sd_utils import get_sd_option +from scripts.faceswaplab_ui.faceswaplab_inpainting_ui import face_inpainting_ui def postprocessing_ui() -> List[gr.components.Component]: @@ -66,9 +67,10 @@ def postprocessing_ui() -> List[gr.components.Component]: label="Upscaler visibility (if scale = 1)", elem_id="faceswaplab_pp_upscaler_visibility", ) - with gr.Accordion(f"Post Inpainting", open=True): + + with gr.Accordion(label="Global-Inpainting (all faces)", open=False): gr.Markdown( - """Inpainting sends image to inpainting with a mask on face (once for each faces).""" + "Inpainting sends image to inpainting with a mask on face (once for each faces)." ) inpainting_when = gr.Dropdown( elem_id="faceswaplab_pp_inpainting_when", @@ -76,52 +78,8 @@ def postprocessing_ui() -> List[gr.components.Component]: value=[InpaintingWhen.BEFORE_RESTORE_FACE.value], label="Enable/When", ) - inpainting_denoising_strength = gr.Slider( - 0, - 1, - 0, - step=0.01, - elem_id="faceswaplab_pp_inpainting_denoising_strength", - label="Denoising strenght (will send face to img2img after processing)", - ) + global_inpainting = face_inpainting_ui("faceswaplab_gpp") - inpainting_denoising_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" - ), - elem_id="faceswaplab_pp_inpainting_denoising_prompt", - label="Inpainting prompt use [gender] instead of men or woman", - ) - inpainting_denoising_negative_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_negative_prompt", "blurry" - ), - elem_id="faceswaplab_pp_inpainting_denoising_neg_prompt", - label="Inpainting negative prompt use [gender] instead of men or woman", - ) - with gr.Row(): - samplers_names = [s.name for s in modules.sd_samplers.all_samplers] # type: ignore - inpainting_sampler = gr.Dropdown( - choices=samplers_names, - value=[samplers_names[0]], - label="Inpainting Sampler", - elem_id="faceswaplab_pp_inpainting_sampler", - ) - inpainting_denoising_steps = gr.Slider( - 1, - 150, - 20, - step=1, - label="Inpainting steps", - elem_id="faceswaplab_pp_inpainting_steps", - ) - - inpaiting_model = gr.Dropdown( - choices=["Current"] + sd_models.checkpoint_tiles(), - default="Current", - label="sd model (experimental)", - elem_id="faceswaplab_pp_inpainting_sd_model", - ) components = [ face_restorer_name, face_restorer_visibility, @@ -130,13 +88,7 @@ def postprocessing_ui() -> List[gr.components.Component]: upscaler_scale, upscaler_visibility, inpainting_when, - inpainting_denoising_strength, - inpainting_denoising_prompt, - inpainting_denoising_negative_prompt, - inpainting_denoising_steps, - inpainting_sampler, - inpaiting_model, - ] + ] + global_inpainting # Ask sd to not store in ui-config.json for component in components: diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py index 20dbacf..df5a803 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py @@ -249,19 +249,19 @@ def refresh_fn(selected: str): elem_id=f"{id_prefix}_face{unit_num}_min_ref_similarity", ) - pre_inpainting = face_inpainting_ui( - name="Pre-Inpainting (Before swapping)", - id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", - description="Pre-inpainting sends face to inpainting before swapping", - ) + with gr.Accordion(label="Pre-Inpainting (before swapping)", open=False): + gr.Markdown("Pre-inpainting sends face to inpainting before swapping") + pre_inpainting = face_inpainting_ui( + id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", + ) options = faceswap_unit_advanced_options(is_img2img, unit_num, id_prefix) - post_inpainting = face_inpainting_ui( - name="Post-Inpainting (After swapping)", - id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", - description="Post-inpainting sends face to inpainting after swapping", - ) + with gr.Accordion(label="Post-Inpainting (After swapping)", open=False): + gr.Markdown("Pre-inpainting sends face to inpainting before swapping") + post_inpainting = face_inpainting_ui( + id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", + ) gradio_components: List[gr.components.Component] = ( [