mirror of
https://github.com/Bing-su/adetailer.git
synced 2026-04-27 09:41:40 +00:00
feat: use separate sampler
This commit is contained in:
@@ -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"),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
17
sd_webui/sd_samplers.py
Normal 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
|
||||
Reference in New Issue
Block a user