mirror of
https://github.com/Bing-su/adetailer.git
synced 2026-01-26 19:29:54 +00:00
feat(scripts): enable each tap
This commit is contained in:
@@ -12,6 +12,7 @@ from rich.table import Table
|
|||||||
from rich.traceback import Traceback
|
from rich.traceback import Traceback
|
||||||
|
|
||||||
from adetailer.__version__ import __version__
|
from adetailer.__version__ import __version__
|
||||||
|
from adetailer.args import ADetailerArgs
|
||||||
|
|
||||||
|
|
||||||
def processing(*args: Any) -> dict[str, Any]:
|
def processing(*args: Any) -> dict[str, Any]:
|
||||||
@@ -66,23 +67,30 @@ def sd_models() -> dict[str, str]:
|
|||||||
|
|
||||||
|
|
||||||
def ad_args(*args: Any) -> dict[str, Any]:
|
def ad_args(*args: Any) -> dict[str, Any]:
|
||||||
ad_args = [
|
ad_args = []
|
||||||
arg
|
for arg in args:
|
||||||
for arg in args
|
if not isinstance(arg, dict):
|
||||||
if isinstance(arg, dict) and arg.get("ad_model", "None") != "None"
|
continue
|
||||||
]
|
|
||||||
|
try:
|
||||||
|
a = ADetailerArgs(**arg)
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not a.need_skip():
|
||||||
|
ad_args.append(a)
|
||||||
|
|
||||||
if not ad_args:
|
if not ad_args:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
arg0 = ad_args[0]
|
arg0 = ad_args[0]
|
||||||
is_api = arg0.get("is_api", True)
|
|
||||||
return {
|
return {
|
||||||
"version": __version__,
|
"version": __version__,
|
||||||
"ad_model": arg0["ad_model"],
|
"ad_model": arg0.ad_model,
|
||||||
"ad_prompt": arg0.get("ad_prompt", ""),
|
"ad_prompt": arg0.ad_prompt,
|
||||||
"ad_negative_prompt": arg0.get("ad_negative_prompt", ""),
|
"ad_negative_prompt": arg0.ad_negative_prompt,
|
||||||
"ad_controlnet_model": arg0.get("ad_controlnet_model", "None"),
|
"ad_controlnet_model": arg0.ad_controlnet_model,
|
||||||
"is_api": type(is_api) is not tuple,
|
"is_api": arg0.is_api,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
20
aaaaaa/ui.py
20
aaaaaa/ui.py
@@ -162,7 +162,7 @@ def adui(
|
|||||||
states.append(state)
|
states.append(state)
|
||||||
infotext_fields.extend(infofields)
|
infotext_fields.extend(infofields)
|
||||||
|
|
||||||
# components: [bool, dict, dict, ...]
|
# components: [bool, bool, dict, dict, ...]
|
||||||
components = [ad_enable, ad_skip_img2img, *states]
|
components = [ad_enable, ad_skip_img2img, *states]
|
||||||
return components, infotext_fields
|
return components, infotext_fields
|
||||||
|
|
||||||
@@ -171,14 +171,22 @@ def one_ui_group(n: int, is_img2img: bool, webui_info: WebuiInfo):
|
|||||||
w = Widgets()
|
w = Widgets()
|
||||||
eid = partial(elem_id, n=n, is_img2img=is_img2img)
|
eid = partial(elem_id, n=n, is_img2img=is_img2img)
|
||||||
|
|
||||||
|
model_choices = (
|
||||||
|
[*webui_info.ad_model_list, "None"]
|
||||||
|
if n == 0
|
||||||
|
else ["None", *webui_info.ad_model_list]
|
||||||
|
)
|
||||||
|
|
||||||
with gr.Group():
|
with gr.Group():
|
||||||
with gr.Row():
|
with gr.Row(variant="compact"):
|
||||||
model_choices = (
|
w.ad_tap_enable = gr.Checkbox(
|
||||||
[*webui_info.ad_model_list, "None"]
|
label=f"Enable this tap ({ordinal(n + 1)})",
|
||||||
if n == 0
|
value=True,
|
||||||
else ["None", *webui_info.ad_model_list]
|
visible=True,
|
||||||
|
elem_id=eid("ad_tap_enable"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
w.ad_model = gr.Dropdown(
|
w.ad_model = gr.Dropdown(
|
||||||
label="ADetailer detector" + suffix(n),
|
label="ADetailer detector" + suffix(n),
|
||||||
choices=model_choices,
|
choices=model_choices,
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ class ArgsList(UserList):
|
|||||||
class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
||||||
ad_model: str = "None"
|
ad_model: str = "None"
|
||||||
ad_model_classes: str = ""
|
ad_model_classes: str = ""
|
||||||
|
ad_tap_enable: bool = True
|
||||||
ad_prompt: str = ""
|
ad_prompt: str = ""
|
||||||
ad_negative_prompt: str = ""
|
ad_negative_prompt: str = ""
|
||||||
ad_confidence: confloat(ge=0.0, le=1.0) = 0.3
|
ad_confidence: confloat(ge=0.0, le=1.0) = 0.3
|
||||||
@@ -119,7 +120,7 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
|||||||
p.pop(k, None)
|
p.pop(k, None)
|
||||||
|
|
||||||
def extra_params(self, suffix: str = "") -> dict[str, Any]:
|
def extra_params(self, suffix: str = "") -> dict[str, Any]:
|
||||||
if self.ad_model == "None":
|
if self.need_skip():
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
p = {name: getattr(self, attr) for attr, name in ALL_ARGS}
|
p = {name: getattr(self, attr) for attr, name in ALL_ARGS}
|
||||||
@@ -128,6 +129,7 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
|||||||
ppop("ADetailer model classes")
|
ppop("ADetailer model classes")
|
||||||
ppop("ADetailer prompt")
|
ppop("ADetailer prompt")
|
||||||
ppop("ADetailer negative prompt")
|
ppop("ADetailer negative prompt")
|
||||||
|
p.pop("ADetailer tap enable", None) # always pop
|
||||||
ppop("ADetailer mask only top k largest", cond=0)
|
ppop("ADetailer mask only top k largest", cond=0)
|
||||||
ppop("ADetailer mask min ratio", cond=0.0)
|
ppop("ADetailer mask min ratio", cond=0.0)
|
||||||
ppop("ADetailer mask max ratio", cond=1.0)
|
ppop("ADetailer mask max ratio", cond=1.0)
|
||||||
@@ -204,12 +206,13 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
|||||||
return self.ad_model.lower().startswith("mediapipe")
|
return self.ad_model.lower().startswith("mediapipe")
|
||||||
|
|
||||||
def need_skip(self) -> bool:
|
def need_skip(self) -> bool:
|
||||||
return self.ad_model == "None"
|
return self.ad_model == "None" or self.ad_tap_enable is False
|
||||||
|
|
||||||
|
|
||||||
_all_args = [
|
_all_args = [
|
||||||
("ad_model", "ADetailer model"),
|
("ad_model", "ADetailer model"),
|
||||||
("ad_model_classes", "ADetailer model classes"),
|
("ad_model_classes", "ADetailer model classes"),
|
||||||
|
("ad_tap_enable", "ADetailer tap enable"),
|
||||||
("ad_prompt", "ADetailer prompt"),
|
("ad_prompt", "ADetailer prompt"),
|
||||||
("ad_negative_prompt", "ADetailer negative prompt"),
|
("ad_negative_prompt", "ADetailer negative prompt"),
|
||||||
("ad_confidence", "ADetailer confidence"),
|
("ad_confidence", "ADetailer confidence"),
|
||||||
|
|||||||
@@ -187,7 +187,13 @@ class AfterDetailerScript(scripts.Script):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
ad_enabled = args_[0] if isinstance(args_[0], bool) else True
|
ad_enabled = args_[0] if isinstance(args_[0], bool) else True
|
||||||
not_none = any(arg.get("ad_model", "None") != "None" for arg in arg_list)
|
pydantic_args = []
|
||||||
|
for arg in arg_list:
|
||||||
|
try:
|
||||||
|
pydantic_args.append(ADetailerArgs(**arg))
|
||||||
|
except ValueError: # noqa: PERF203
|
||||||
|
continue
|
||||||
|
not_none = not all(arg.need_skip() for arg in pydantic_args)
|
||||||
return ad_enabled and not_none
|
return ad_enabled and not_none
|
||||||
|
|
||||||
def set_skip_img2img(self, p, *args_) -> None:
|
def set_skip_img2img(self, p, *args_) -> None:
|
||||||
|
|||||||
@@ -32,3 +32,17 @@ def test_is_mediapipe(ad_model: str, expect: bool) -> None:
|
|||||||
def test_need_skip(ad_model: str, expect: bool) -> None:
|
def test_need_skip(ad_model: str, expect: bool) -> None:
|
||||||
args = ADetailerArgs(ad_model=ad_model)
|
args = ADetailerArgs(ad_model=ad_model)
|
||||||
assert args.need_skip() is expect
|
assert args.need_skip() is expect
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("ad_model", "ad_tap_enable", "expect"),
|
||||||
|
[
|
||||||
|
("face_yolov8n.pt", False, True),
|
||||||
|
("mediapipe_face_full", False, True),
|
||||||
|
("None", True, True),
|
||||||
|
("ace_yolov8s.pt", True, False),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_need_skip_tap_enable(ad_model: str, ad_tap_enable: bool, expect: bool) -> None:
|
||||||
|
args = ADetailerArgs(ad_model=ad_model, ad_tap_enable=ad_tap_enable)
|
||||||
|
assert args.need_skip() is expect
|
||||||
|
|||||||
Reference in New Issue
Block a user