feat: use separate sampler

This commit is contained in:
Bingsu
2023-07-18 12:55:00 +09:00
parent ee75bb8e16
commit 8018318582
4 changed files with 65 additions and 6 deletions

View File

@@ -57,6 +57,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_sampler: bool = False
ad_sampler: str = "DPM++ 2M Karras"
ad_use_noise_multiplier: bool = False
ad_noise_multiplier: confloat(ge=0.5, le=1.5) = 1.0
ad_restore_face: bool = False
@@ -129,6 +131,10 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
"ADetailer use separate CFG scale",
["ADetailer use separate CFG scale", "ADetailer CFG scale"],
)
ppop(
"ADetailer use separate sampler",
["ADetailer use separate sampler", "ADetailer sampler"],
)
ppop(
"ADetailer use separate noise multiplier",
["ADetailer use separate noise multiplier", "ADetailer noise multiplier"],
@@ -191,6 +197,8 @@ _all_args = [
("ad_steps", "ADetailer steps"),
("ad_use_cfg_scale", "ADetailer use separate CFG scale"),
("ad_cfg_scale", "ADetailer CFG scale"),
("ad_use_sampler", "ADetailer use separate sampler"),
("ad_sampler", "ADetailer sampler"),
("ad_use_noise_multiplier", "ADetailer use separate noise multiplier"),
("ad_noise_multiplier", "ADetailer noise multiplier"),
("ad_restore_face", "ADetailer restore face"),

View File

@@ -65,6 +65,7 @@ def adui(
num_models: int,
is_img2img: bool,
model_list: list[str],
samplers: list[str],
t2i_button: gr.Button,
i2i_button: gr.Button,
):
@@ -97,6 +98,7 @@ def adui(
n=n,
is_img2img=is_img2img,
model_list=model_list,
samplers=samplers,
t2i_button=t2i_button,
i2i_button=i2i_button,
)
@@ -113,6 +115,7 @@ def one_ui_group(
n: int,
is_img2img: bool,
model_list: list[str],
samplers: list[str],
t2i_button: gr.Button,
i2i_button: gr.Button,
):
@@ -171,7 +174,7 @@ def one_ui_group(
with gr.Accordion(
"Inpainting", open=False, elem_id=eid("ad_inpainting_accordion")
):
inpainting(w, n, is_img2img)
inpainting(w, n, is_img2img, samplers)
with gr.Group():
controlnet(w, n, is_img2img)
@@ -268,7 +271,7 @@ def mask_preprocessing(w: Widgets, n: int, is_img2img: bool):
)
def inpainting(w: Widgets, n: int, is_img2img: bool):
def inpainting(w: Widgets, n: int, is_img2img: bool, samplers: list[str]):
eid = partial(elem_id, n=n, is_img2img=is_img2img)
with gr.Group():
@@ -405,6 +408,29 @@ def inpainting(w: Widgets, n: int, is_img2img: bool):
)
with gr.Row():
with gr.Column(variant="compact"):
w.ad_use_sampler = gr.Checkbox(
label="Use separate sampler" + suffix(n),
value=False,
visible=True,
elem_id=eid("ad_use_sampler"),
)
w.ad_sampler = gr.Dropdown(
choices=samplers,
value="DPM++ 2M Karras",
visible=True,
interactive=False,
elem_id=eid("ad_sampler"),
)
w.ad_use_sampler.change(
gr_interactive,
inputs=w.ad_use_sampler,
outputs=w.ad_sampler,
queue=False,
)
with gr.Column(variant="compact"):
w.ad_use_noise_multiplier = gr.Checkbox(
label="Use separate noise multiplier" + suffix(n),
@@ -430,6 +456,7 @@ def inpainting(w: Widgets, n: int, is_img2img: bool):
queue=False,
)
with gr.Row():
w.ad_restore_face = gr.Checkbox(
label="Restore faces after ADetailer" + suffix(n),
value=False,

View File

@@ -43,6 +43,7 @@ from sd_webui.processing import (
create_infotext,
process_images,
)
from sd_webui.sd_samplers import all_samplers
from sd_webui.shared import cmd_opts, opts, state
no_huggingface = getattr(cmd_opts, "ad_no_huggingface", False)
@@ -115,11 +116,13 @@ class AfterDetailerScript(scripts.Script):
def ui(self, is_img2img):
num_models = opts.data.get("ad_max_models", 2)
model_list = list(model_mapping.keys())
samplers = [sampler.name for sampler in all_samplers]
components, infotext_fields = adui(
num_models,
is_img2img,
model_list,
samplers,
txt2img_submit_button,
img2img_submit_button,
)
@@ -296,6 +299,13 @@ class AfterDetailerScript(scripts.Script):
return args.ad_cfg_scale
return p.cfg_scale
def get_sampler(self, p, args: ADetailerArgs) -> str:
sampler = args.ad_sampler if args.ad_use_sampler else p.sampler
if sampler in ["PLMS", "UniPC"]:
sampler = "Euler"
return sampler
def get_initial_noise_multiplier(self, p, args: ADetailerArgs) -> float | None:
if args.ad_use_noise_multiplier:
return args.ad_noise_multiplier
@@ -361,10 +371,7 @@ class AfterDetailerScript(scripts.Script):
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"]:
sampler_name = "Euler"
sampler_name = self.get_sampler(p, args)
i2i = StableDiffusionProcessingImg2Img(
init_images=[image],

17
sd_webui/sd_samplers.py Normal file
View File

@@ -0,0 +1,17 @@
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Any, Callable, NamedTuple
class SamplerData(NamedTuple):
name: str
constructor: Callable
aliases: list[str]
options: dict[str, Any]
all_samplers: list[SamplerData] = []
else:
from modules.sd_samplers import all_samplers