diff --git a/adetailer/args.py b/adetailer/args.py index 0e33ed0..de9096b 100644 --- a/adetailer/args.py +++ b/adetailer/args.py @@ -56,6 +56,8 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid): ad_steps: PositiveInt = 28 ad_use_cfg_scale: bool = False ad_cfg_scale: NonNegativeFloat = 7.0 + ad_use_noise_multiplier: bool = False + ad_noise_multiplier: confloat(ge=0.5, le=1.5) = 1.0 ad_restore_face: bool = False ad_controlnet_model: constr(regex=cn_model_regex) = "None" ad_controlnet_module: Optional[constr(regex=r".*inpaint.*|^None$")] = None @@ -179,6 +181,8 @@ _all_args = [ ("ad_steps", "ADetailer steps"), ("ad_use_cfg_scale", "ADetailer use separate CFG scale"), ("ad_cfg_scale", "ADetailer CFG scale"), + ("ad_use_noise_multiplier", "ADetailer use separate noise multiplier"), + ("ad_noise_multiplier", "ADetailer noise multiplier"), ("ad_restore_face", "ADetailer restore face"), ("ad_controlnet_model", "ADetailer ControlNet model"), ("ad_controlnet_module", "ADetailer ControlNet module"), diff --git a/adetailer/ui.py b/adetailer/ui.py index 8d53f98..2aa6fba 100644 --- a/adetailer/ui.py +++ b/adetailer/ui.py @@ -405,6 +405,31 @@ def inpainting(w: Widgets, n: int, is_img2img: bool): ) with gr.Row(): + with gr.Column(variant="compact"): + w.ad_use_initial_noise_multiplier = gr.Checkbox( + label="Use separate noise multiplier" + suffix(n), + value=False, + visible=True, + elem_id=eid("ad_use_noise_multiplier"), + ) + + w.ad_initial_noise_multiplier = gr.Slider( + label="Noise multiplier for img2img" + suffix(n), + minimum=0.5, + maximum=1.5, + step=0.01, + value=1.0, + visible=True, + elem_id=eid("ad_noise_multiplier"), + ) + + w.ad_use_initial_noise_multiplier.change( + gr_interactive, + inputs=w.ad_use_initial_noise_multiplier, + outputs=w.ad_initial_noise_multiplier, + queue=False, + ) + w.ad_restore_face = gr.Checkbox( label="Restore faces after ADetailer" + suffix(n), value=False, diff --git a/scripts/!adetailer.py b/scripts/!adetailer.py index e40d6df..d7b9058 100644 --- a/scripts/!adetailer.py +++ b/scripts/!adetailer.py @@ -282,6 +282,11 @@ class AfterDetailerScript(scripts.Script): return args.ad_cfg_scale return p.cfg_scale + def get_initial_noise_multiplier(self, p, args: ADetailerArgs) -> float | None: + if args.ad_use_noise_multiplier: + return args.ad_noise_multiplier + return None + def infotext(self, p) -> str: return create_infotext( p, p.all_prompts, p.all_seeds, p.all_subseeds, None, 0, 0 @@ -340,6 +345,7 @@ class AfterDetailerScript(scripts.Script): width, height = self.get_width_height(p, args) steps = self.get_steps(p, args) cfg_scale = self.get_cfg_scale(p, args) + initial_noise_multiplier = self.get_initial_noise_multiplier(p, args) sampler_name = p.sampler_name if sampler_name in ["PLMS", "UniPC"]: @@ -355,6 +361,7 @@ class AfterDetailerScript(scripts.Script): inpaint_full_res=args.ad_inpaint_only_masked, inpaint_full_res_padding=args.ad_inpaint_only_masked_padding, inpainting_mask_invert=0, + initial_noise_multiplier=initial_noise_multiplier, sd_model=p.sd_model, outpath_samples=p.outpath_samples, outpath_grids=p.outpath_grids,