Merge pull request #4350 from vladmandic/dev

refresh branch
This commit is contained in:
Vladimir Mandic
2025-11-02 06:35:34 -05:00
committed by GitHub
6 changed files with 37 additions and 34 deletions
+10 -9
View File
@@ -1,6 +1,6 @@
# Change Log for SD.Next
## Update for 2025-11-01
## Update for 2025-11-02
- **Features**
- **detailer**
@@ -10,17 +10,18 @@
- add inline wildcards using curly braces syntax
- add setting to control `cudnn` enable/disable
- **Fixes**
- fix: better handling of detailer settings, thanks @awsr
- fix: cleanup `--optional` installer
- fix: guard against multi-controlnet in hires
- fix: update diffusers
- fix: inpaint
- fix: model type detection
- fix: version detection when cloned with `.git` suffix
- fix: init `sdnq` on video model load
- fix: add vae scale override for chrono
- fix: add tracing to model detection
- ui: fix full-screen image viewer buttons with non-standard ui theme
- ui: control tab show override section
- fix: inpaint handling
- fix: model type detection
- fix: version detection when cloned with `.git` suffix, thanks @awsr
- fix: init `sdnq` on video model load
- fix: add vae scale override for chrono
- fix: add tracing to model detection
- ui: fix full-screen image viewer buttons with non-standard ui theme
- ui: control tab show override section
## Update for 2025-10-31
+5 -6
View File
@@ -307,16 +307,15 @@ def process_samples(p: StableDiffusionProcessing, samples):
info = create_infotext(p, p.prompts, p.seeds, p.subseeds, index=i)
images.save_image(Image.fromarray(sample), path=p.outpath_samples, basename="", seed=p.seeds[i], prompt=p.prompts[i], extension=shared.opts.samples_format, info=info, p=p, suffix="-before-detailer")
sample = detailer.detail(sample, p)
if sample is not None:
if isinstance(sample, list) and len(sample) > 1:
if isinstance(sample, list):
if len(sample) > 0:
image = Image.fromarray(sample[0])
if len(sample) > 1:
annotated = Image.fromarray(sample[1])
out_images.append(annotated)
out_infotexts.append("Detailer annotations")
elif isinstance(sample, list):
image = Image.fromarray(sample[0])
else:
image = Image.fromarray(sample)
elif sample is not None:
image = Image.fromarray(sample)
if p.color_corrections is not None and i < len(p.color_corrections):
p.ops.append('color')
+18 -16
View File
@@ -619,22 +619,6 @@ options_templates.update(options_section(('postprocessing', "Postprocessing"), {
"initial_noise_multiplier": OptionInfo(1.0, "Noise multiplier for image processing", gr.Slider, {"minimum": 0.1, "maximum": 1.5, "step": 0.01, "visible": False}),
"postprocessing_sep_detailer": OptionInfo("<h2>Detailer</h2>", "", gr.HTML),
"detailer_model": OptionInfo("Detailer", "Detailer model", gr.Radio, lambda: {"choices": [x.name() for x in detailers], "visible": False}),
"detailer_classes": OptionInfo("", "Detailer classes", gr.Textbox, { "visible": False}),
"detailer_conf": OptionInfo(0.6, "Min confidence", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_max": OptionInfo(2, "Max detected", gr.Slider, {"minimum": 1, "maximum": 10, "step": 1, "visible": False}),
"detailer_iou": OptionInfo(0.5, "Max overlap", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_sigma_adjust": OptionInfo(1.0, "Detailer sigma adjust", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_sigma_adjust_max": OptionInfo(1.0, "Detailer sigma end", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_min_size": OptionInfo(0.0, "Min object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_max_size": OptionInfo(1.0, "Max object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_padding": OptionInfo(20, "Item padding", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}),
"detailer_blur": OptionInfo(10, "Item edge blur", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}),
"detailer_models": OptionInfo(['face-yolo8n'], "Detailer models", gr.Dropdown, lambda: {"multiselect":True, "choices": list(yolo.list), "visible": False}),
"detailer_args": OptionInfo("", "Detailer args", gr.Textbox, { "visible": False}),
"detailer_merge": OptionInfo(False, "Merge multiple results from each detailer model", gr.Checkbox, {"visible": False}),
"detailer_sort": OptionInfo(False, "Sort detailer output by location", gr.Checkbox, {"visible": False}),
"detailer_save": OptionInfo(False, "Include detection results", gr.Checkbox, {"visible": False}),
"detailer_unload": OptionInfo(False, "Move detailer model to CPU when complete"),
"detailer_augment": OptionInfo(True, "Detailer use model augment"),
@@ -789,6 +773,24 @@ options_templates.update(options_section(('hidden_options', "Hidden options"), {
'schedulers_max_shift': OptionInfo(1.15, "Sampler max shift", gr.Slider, {"minimum": 0.0, "maximum": 4.0, "step": 0.01, "visible": False}),
'uni_pc_variant': OptionInfo("bh2", "UniPC variant", gr.Radio, {"choices": ["bh1", "bh2", "vary_coeff"], "visible": False}),
'uni_pc_skip_type': OptionInfo("time_uniform", "UniPC skip type", gr.Radio, {"choices": ["time_uniform", "time_quadratic", "logSNR"], "visible": False}),
# detailer settings are handled separately
"detailer_model": OptionInfo("Detailer", "Detailer model", gr.Radio, lambda: {"choices": [x.name() for x in detailers], "visible": False}),
"detailer_classes": OptionInfo("", "Detailer classes", gr.Textbox, { "visible": False}),
"detailer_conf": OptionInfo(0.6, "Min confidence", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_max": OptionInfo(2, "Max detected", gr.Slider, {"minimum": 1, "maximum": 10, "step": 1, "visible": False}),
"detailer_iou": OptionInfo(0.5, "Max overlap", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_sigma_adjust": OptionInfo(1.0, "Detailer sigma adjust", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_sigma_adjust_max": OptionInfo(1.0, "Detailer sigma end", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_min_size": OptionInfo(0.0, "Min object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_max_size": OptionInfo(1.0, "Max object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}),
"detailer_padding": OptionInfo(20, "Item padding", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}),
"detailer_blur": OptionInfo(10, "Item edge blur", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}),
"detailer_models": OptionInfo(['face-yolo8n'], "Detailer models", gr.Dropdown, lambda: {"multiselect":True, "choices": list(yolo.list), "visible": False}),
"detailer_args": OptionInfo("", "Detailer args", gr.Textbox, { "visible": False}),
"detailer_merge": OptionInfo(False, "Merge multiple results from each detailer model", gr.Checkbox, {"visible": False}),
"detailer_sort": OptionInfo(False, "Sort detailer output by location", gr.Checkbox, {"visible": False}),
"detailer_save": OptionInfo(False, "Include detection results", gr.Checkbox, {"visible": False}),
}))
+1 -1
View File
@@ -4,7 +4,7 @@ import sys
try:
default_min_time = float(os.environ.get('SD_MIN_TIMER', '0.05'))
default_min_time = float(os.environ.get('SD_MIN_TIMER', '0.1'))
except Exception:
default_min_time = 0.1
+2 -1
View File
@@ -208,7 +208,6 @@ def create_ui():
if (section_id, section_text) not in sections:
sections.append((section_id, section_text))
shared.log.debug(f'Settings: sections={len(sections)} settings={len(shared.opts.list())}/{len(list(shared.opts.data_labels))} quicksettings={len(quicksettings_list)}')
with gr.Tabs(elem_id="settings"):
quicksettings_list.clear()
for (section_id, section_text) in sections:
@@ -241,6 +240,8 @@ def create_ui():
create_dirty_indicator("show_all_pages", [])
request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications", visible=False)
shared.log.debug(f'Settings: sections={len(sections)} settings={len(shared.opts.list())}/{len(list(shared.opts.data_labels))} quicksettings={len(quicksettings_list)}')
with gr.TabItem("Update", id="system_update", elem_id="tab_update"):
from modules import update
update.create_ui()
+1 -1
Submodule wiki updated: 213bdc8365...6fc0696770