mirror of
https://github.com/Bing-su/adetailer.git
synced 2026-04-21 23:09:06 +00:00
Merge branch 'dev' into main
This commit is contained in:
@@ -8,7 +8,7 @@ repos:
|
||||
- id: mixed-line-ending
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: "v0.0.280"
|
||||
rev: "v0.0.284"
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix, --exit-non-zero-on-fix]
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# Changelog
|
||||
|
||||
## 2023-08-14
|
||||
|
||||
- v23.8.0
|
||||
- `[PROMPT]` 키워드 추가. `ad_prompt` 또는 `ad_negative_prompt`에 사용하면 입력 프롬프트로 대체됨 (PR #243)
|
||||
- Only top k largest 옵션 추가 (PR #264)
|
||||
- ultralytics 버전 업데이트
|
||||
|
||||
|
||||
## 2023-07-31
|
||||
|
||||
- v23.7.11
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "23.7.11"
|
||||
__version__ = "23.8.0"
|
||||
|
||||
@@ -41,6 +41,7 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
||||
ad_prompt: str = ""
|
||||
ad_negative_prompt: str = ""
|
||||
ad_confidence: confloat(ge=0.0, le=1.0) = 0.3
|
||||
ad_mask_k_largest: NonNegativeInt = 0
|
||||
ad_mask_min_ratio: confloat(ge=0.0, le=1.0) = 0.0
|
||||
ad_mask_max_ratio: confloat(ge=0.0, le=1.0) = 1.0
|
||||
ad_dilate_erode: int = 4
|
||||
@@ -112,6 +113,7 @@ class ADetailerArgs(BaseModel, extra=Extra.forbid):
|
||||
|
||||
ppop("ADetailer prompt")
|
||||
ppop("ADetailer negative prompt")
|
||||
ppop("ADetailer mask only top k largest", cond=0)
|
||||
ppop("ADetailer mask min ratio", cond=0.0)
|
||||
ppop("ADetailer mask max ratio", cond=1.0)
|
||||
ppop("ADetailer x offset", cond=0)
|
||||
@@ -188,6 +190,7 @@ _all_args = [
|
||||
("ad_prompt", "ADetailer prompt"),
|
||||
("ad_negative_prompt", "ADetailer negative prompt"),
|
||||
("ad_confidence", "ADetailer confidence"),
|
||||
("ad_mask_k_largest", "ADetailer mask only top k largest"),
|
||||
("ad_mask_min_ratio", "ADetailer mask min ratio"),
|
||||
("ad_mask_max_ratio", "ADetailer mask max ratio"),
|
||||
("ad_x_offset", "ADetailer x offset"),
|
||||
|
||||
@@ -215,6 +215,16 @@ def filter_by_ratio(pred: PredictOutput, low: float, high: float) -> PredictOutp
|
||||
return pred
|
||||
|
||||
|
||||
def filter_k_largest(pred: PredictOutput, k: int = 0) -> PredictOutput:
|
||||
if not pred.bboxes or k == 0:
|
||||
return pred
|
||||
areas = [bbox_area(bbox) for bbox in pred.bboxes]
|
||||
idx = np.argsort(areas)[-k:]
|
||||
pred.bboxes = [pred.bboxes[i] for i in idx]
|
||||
pred.masks = [pred.masks[i] for i in idx]
|
||||
return pred
|
||||
|
||||
|
||||
# Merge / Invert
|
||||
def mask_merge(masks: list[Image.Image]) -> list[Image.Image]:
|
||||
arrs = [np.array(m) for m in masks]
|
||||
|
||||
@@ -194,7 +194,7 @@ def detection(w: Widgets, n: int, is_img2img: bool):
|
||||
eid = partial(elem_id, n=n, is_img2img=is_img2img)
|
||||
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
with gr.Column(variant="compact"):
|
||||
w.ad_confidence = gr.Slider(
|
||||
label="Detection model confidence threshold" + suffix(n),
|
||||
minimum=0.0,
|
||||
@@ -204,6 +204,15 @@ def detection(w: Widgets, n: int, is_img2img: bool):
|
||||
visible=True,
|
||||
elem_id=eid("ad_confidence"),
|
||||
)
|
||||
w.ad_mask_k_largest = gr.Slider(
|
||||
label="Mask only the top k largest (0 to disable)" + suffix(n),
|
||||
minumum=0,
|
||||
maximum=10,
|
||||
step=1,
|
||||
value=0,
|
||||
visible=True,
|
||||
elem_id=eid("ad_mask_k_largest"),
|
||||
)
|
||||
|
||||
with gr.Column(variant="compact"):
|
||||
w.ad_mask_min_ratio = gr.Slider(
|
||||
|
||||
@@ -44,11 +44,9 @@ def run_pip(*args):
|
||||
def install():
|
||||
deps = [
|
||||
# requirements
|
||||
("ultralytics", "8.0.145", None),
|
||||
("mediapipe", "0.10.2", None),
|
||||
("rich", "13.4.2", None),
|
||||
# ultralytics
|
||||
("py-cpuinfo", None, None),
|
||||
("ultralytics", "8.0.154", None),
|
||||
("mediapipe", "0.10.3", None),
|
||||
("rich", "13.0.0", None),
|
||||
# mediapipe
|
||||
("protobuf", "3.20", "3.9999"),
|
||||
]
|
||||
|
||||
@@ -26,7 +26,12 @@ from adetailer import (
|
||||
)
|
||||
from adetailer.args import ALL_ARGS, BBOX_SORTBY, ADetailerArgs, EnableChecker
|
||||
from adetailer.common import PredictOutput
|
||||
from adetailer.mask import filter_by_ratio, mask_preprocess, sort_bboxes
|
||||
from adetailer.mask import (
|
||||
filter_by_ratio,
|
||||
filter_k_largest,
|
||||
mask_preprocess,
|
||||
sort_bboxes,
|
||||
)
|
||||
from adetailer.traceback import rich_traceback
|
||||
from adetailer.ui import adui, ordinal, suffix
|
||||
from controlnet_ext import ControlNetExt, controlnet_exists, get_cn_models
|
||||
@@ -244,6 +249,8 @@ class AfterDetailerScript(scripts.Script):
|
||||
for n in range(len(prompts)):
|
||||
if not prompts[n]:
|
||||
prompts[n] = blank_replacement
|
||||
elif "[PROMPT]" in prompts[n]:
|
||||
prompts[n] = prompts[n].replace("[PROMPT]", f" {blank_replacement} ")
|
||||
return prompts
|
||||
|
||||
def get_prompt(self, p, args: ADetailerArgs) -> tuple[list[str], list[str]]:
|
||||
@@ -461,6 +468,7 @@ class AfterDetailerScript(scripts.Script):
|
||||
pred = filter_by_ratio(
|
||||
pred, low=args.ad_mask_min_ratio, high=args.ad_mask_max_ratio
|
||||
)
|
||||
pred = filter_k_largest(pred, k=args.ad_mask_k_largest)
|
||||
pred = self.sort_bboxes(pred)
|
||||
return mask_preprocess(
|
||||
pred.masks,
|
||||
|
||||
Reference in New Issue
Block a user