mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 17:24:32 +02:00
+10
-9
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user