From 9cee2cd1ed1b1360fed2416e6da99b18561427aa Mon Sep 17 00:00:00 2001
From: Vladimir Mandic
Date: Thu, 25 Sep 2025 13:44:56 -0400
Subject: [PATCH] fix metadata on batched images
Signed-off-by: Vladimir Mandic
---
CHANGELOG.md | 3 +-
modules/processing_info.py | 8 +-
modules/ui_common.py | 20 +-
modules/ui_control.py | 318 +-------------------------------
modules/ui_control_elements.py | 321 +++++++++++++++++++++++++++++++++
5 files changed, 343 insertions(+), 327 deletions(-)
create mode 100644 modules/ui_control_elements.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bcfa7def8..45ac06a67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
# Change Log for SD.Next
-## Update for 2025-09-24
+## Update for 2025-09-25
- **Models**
- [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B)
@@ -52,6 +52,7 @@
- **video** new LTX model selection
- replace `pynvml` with `nvidia-ml-py` for gpu monitoring
- **Fixes**
+ - ui: fix image metadata display when switching selected image in control tab
- framepack: add explicit hf-login before framepack load
- benchmark: remove forced sampler from system info benchmark
- xyz-grid: fix xyz grid with random seeds
diff --git a/modules/processing_info.py b/modules/processing_info.py
index 694fd52b3..e1d4d6379 100644
--- a/modules/processing_info.py
+++ b/modules/processing_info.py
@@ -31,13 +31,13 @@ def create_infotext(p: StableDiffusionProcessing, all_prompts=None, all_seeds=No
if all_subseeds is None:
all_subseeds = p.all_subseeds or [p.subseed]
while len(all_prompts) <= index:
- all_prompts.append(all_prompts[-1])
+ all_prompts.insert(0, p.prompt)
while len(all_seeds) <= index:
- all_seeds.append(all_seeds[-1])
+ all_seeds.insert(0, int(p.seed))
while len(all_subseeds) <= index:
- all_subseeds.append(all_subseeds[-1])
+ all_subseeds.insert(0, int(p.subseed))
while len(all_negative_prompts) <= index:
- all_negative_prompts.append(all_negative_prompts[-1])
+ all_negative_prompts.insert(0, p.negative_prompt)
comment = ', '.join(comments) if comments is not None and type(comments) is list else None
ops = list(set(p.ops))
args = {
diff --git a/modules/ui_common.py b/modules/ui_common.py
index 1c5499cf7..fa0d1322f 100644
--- a/modules/ui_common.py
+++ b/modules/ui_common.py
@@ -5,7 +5,7 @@ import shutil
import platform
import subprocess
import gradio as gr
-from modules import call_queue, shared, errors, ui_sections, ui_symbols, ui_components, generation_parameters_copypaste, images, scripts_manager, script_callbacks, infotext
+from modules import call_queue, shared, errors, ui_sections, ui_symbols, ui_components, generation_parameters_copypaste, images, scripts_manager, script_callbacks, infotext, processing
folder_symbol = ui_symbols.folder
@@ -19,6 +19,8 @@ def gr_show(visible=True):
def update_generation_info(generation_info, html_info, img_index):
try:
+ if len(generation_info) == 0 and processing.processed is not None:
+ generation_info = processing.processed.js() or {}
generation_json = json.loads(generation_info)
if len(generation_json["infotexts"]) == 0:
return html_info, 'no infotexts found'
@@ -29,8 +31,8 @@ def update_generation_info(generation_info, html_info, img_index):
info = generation_json["infotexts"][img_index]
html_info_formatted = infotext_to_html(info)
return html_info, html_info_formatted
- except Exception:
- pass
+ except Exception as e:
+ shared.log.warning(f'Update info: info="{generation_info}" {e}')
return html_info, html_info
@@ -238,7 +240,7 @@ def open_folder(result_gallery, gallery_index = 0):
subprocess.Popen(["xdg-open", path]) # pylint: disable=consider-using-with
-def create_output_panel(tabname, preview=True, prompt=None, height=None, transfer=True, scale=1):
+def create_output_panel(tabname, preview=True, prompt=None, height=None, transfer=True, scale=1, result_info=None):
with gr.Column(variant='panel', elem_id=f"{tabname}_results", scale=scale):
with gr.Group(elem_id=f"{tabname}_gallery_container"):
if tabname == "txt2img":
@@ -286,10 +288,11 @@ def create_output_panel(tabname, preview=True, prompt=None, height=None, transfe
generation_info = gr.Textbox(visible=False, elem_id=f'generation_info_{tabname}')
generation_info_button = gr.Button(visible=False, elem_id=f"{tabname}_generation_info_button")
+ result_field = result_info or html_info_formatted
generation_info_button.click(fn=update_generation_info, show_progress=False,
_js="(x, y, z) => [x, y, selected_gallery_index()]", # triggered on gallery change from js
inputs=[generation_info, html_info, html_info],
- outputs=[html_info, html_info_formatted],
+ outputs=[html_info, result_field],
)
save.click(fn=call_queue.wrap_gradio_call(save_files), show_progress=False,
_js="(x, y, z, i) => [x, y, z, selected_gallery_index()]",
@@ -354,11 +357,12 @@ def create_override_inputs(tab): # pylint: disable=unused-argument
def reuse_seed(seed_component: gr.Number, reuse_button: gr.Button, subseed:bool=False):
def reuse_click(selected_gallery_index):
selected_gallery_index = int(selected_gallery_index)
- from modules import processing
if processing.processed is None:
seed = -1
- elif selected_gallery_index >= len(processing.processed.all_seeds):
- selected_gallery_index -= len(processing.processed.images) - len(processing.processed.all_seeds) # if we have more images than seeds it is likely the grid image
+ elif len(processing.processed.images) > len(processing.processed.all_seeds): # if we have more images than seeds it is likely the grid image
+ selected_gallery_index -= (len(processing.processed.images) - len(processing.processed.all_seeds))
+ seed = processing.processed.all_seeds[selected_gallery_index] if not subseed else processing.processed.all_subseeds[selected_gallery_index]
+ elif selected_gallery_index <= len(processing.processed.all_seeds):
seed = processing.processed.all_seeds[selected_gallery_index] if not subseed else processing.processed.all_subseeds[selected_gallery_index]
elif len(processing.processed.all_seeds) > 0:
seed = processing.processed.all_seeds[0] if not subseed else processing.processed.all_subseeds[0]
diff --git a/modules/ui_control.py b/modules/ui_control.py
index 0fe361aa2..ecfe1fa01 100644
--- a/modules/ui_control.py
+++ b/modules/ui_control.py
@@ -1,15 +1,8 @@
import os
import time
import gradio as gr
-import matplotlib.pyplot as plt
from modules.control import unit
-from modules.control import processors # patrickvonplaten controlnet_aux
-from modules.control.units import controlnet # lllyasviel ControlNet
-from modules.control.units import xs # vislearn ControlNet-XS
-from modules.control.units import lite # vislearn ControlNet-XS
-from modules.control.units import t2iadapter # TencentARC T2I-Adapter
-from modules.control.units import reference # reference pipeline
-from modules import errors, shared, progress, ui_components, ui_symbols, ui_common, ui_sections, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports
+from modules import errors, shared, progress, ui_common, ui_sections, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports
from modules import ui_control_helpers as helpers
@@ -218,7 +211,7 @@ def create_ui(_blocks: gr.Blocks=None):
gr.HTML('Output
')
with gr.Tabs(elem_classes=['control-tabs'], elem_id='control-tab-output') as output_tabs:
with gr.Tab('Gallery', id='out-gallery'):
- output_gallery, _output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height)
+ output_gallery, output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height, result_info=result_txt)
with gr.Tab('Image', id='out-image'):
output_image = gr.Image(label="Output", show_label=False, type="pil", interactive=False, tool="editor", height=gr_height, elem_id='control_output_image', elem_classes=['control-image'])
with gr.Tab('Video', id='out-video'):
@@ -229,312 +222,9 @@ def create_ui(_blocks: gr.Blocks=None):
with gr.Tab('Preview', id='preview-image') as _tab_preview:
preview_process = gr.Image(label="Preview", show_label=False, type="pil", interactive=False, height=gr_height, visible=True, elem_id='control_preview', elem_classes=['control-image'])
- with gr.Accordion('Control elements', open=False, elem_id="control_elements"):
- with gr.Tabs(elem_id='control-tabs') as _tabs_control_type:
- with gr.Tab('ControlNet') as _tab_controlnet:
- gr.HTML('ControlNet')
- with gr.Row():
- extra_controls = [
- gr.Checkbox(label="Guess mode", value=False, scale=3),
- ]
- num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
- controlnet_ui_units = [] # list of hidable accordions
- for i in range(max_units):
- enabled = True if i==0 else False
- with gr.Accordion(f'ControlNet unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui:
- with gr.Row():
- enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
- process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
- model_id = gr.Dropdown(label="ControlNet", choices=controlnet.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
- ui_common.create_refresh_button(model_id, controlnet.list_models, lambda: {"choices": controlnet.list_models(refresh=True)}, f'controlnet_models_{i}_refresh')
- control_mode = gr.Dropdown(label="CN Mode", choices=['default'], value='default', visible=False, elem_id=f'control_unit-{i}-mode')
- model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=2.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
- control_start = gr.Slider(label="CN Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start')
- control_end = gr.Slider(label="CN End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end')
- control_tile = gr.Dropdown(label="CN Tiles", choices=[x.strip() for x in shared.opts.control_tiles.split(',') if 'x' in x], value='1x1', visible=False, elem_id=f'control_unit-{i}-tile')
- reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnet_unit-{i}-reset')
- image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnet_unit-{i}-upload')
- image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnet_unit-{i}-reuse')
- btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnet_unit-{i}-preview')
- image_preview = gr.Image(label="Input", type="pil", height=128, width=128, visible=False, interactive=True, show_label=False, show_download_button=False, container=False, elem_id=f'controlnet_unit-{i}-override')
- controlnet_ui_units.append(unit_ui)
- units.append(unit.Unit(
- unit_type = 'controlnet',
- index = i,
- enabled = enabled,
- result_txt = result_txt,
- enabled_cb = enabled_cb,
- reset_btn = reset_btn,
- process_id = process_id,
- model_id = model_id,
- model_strength = model_strength,
- preview_process = preview_process,
- preview_btn = btn_preview,
- image_upload = image_upload,
- image_reuse = image_reuse,
- image_preview = image_preview,
- control_start = control_start,
- control_end = control_end,
- control_mode = control_mode,
- control_tile = control_tile,
- extra_controls = extra_controls,
- )
- )
- if i == 0:
- units[-1].enabled = True # enable first unit in group
- num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnet_ui_units)
-
- with gr.Tab('T2I Adapter') as _tab_t2iadapter:
- gr.HTML('T2I-Adapter')
- with gr.Row():
- extra_controls = [
- gr.Slider(label="Control factor", minimum=0.0, maximum=1.0, step=0.05, value=1.0, scale=3),
- ]
- num_adapter_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
- adapter_ui_units = [] # list of hidable accordions
- for i in range(max_units):
- enabled = True if i==0 else False
- with gr.Accordion(f'T2I-Adapter unit {i+1}', visible= i < num_adapter_units.value, elem_classes='control-unit') as unit_ui:
- with gr.Row():
- enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
- process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
- model_id = gr.Dropdown(label="Adapter", choices=t2iadapter.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
- ui_common.create_refresh_button(model_id, t2iadapter.list_models, lambda: {"choices": t2iadapter.list_models(refresh=True)}, f'adapter_models_{i}_refresh')
- model_strength = gr.Slider(label="T2I Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
- reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'adapter_unit-{i}-reset')
- image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'adapter_unit-{i}-upload')
- image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'adapter_unit-{i}-reuse')
- btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'adapter_unit-{i}-preview')
- image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'adapter_unit-{i}-override')
- adapter_ui_units.append(unit_ui)
- units.append(unit.Unit(
- unit_type = 't2i adapter',
- index = i,
- enabled = enabled,
- result_txt = result_txt,
- enabled_cb = enabled_cb,
- reset_btn = reset_btn,
- process_id = process_id,
- model_id = model_id,
- model_strength = model_strength,
- preview_process = preview_process,
- preview_btn = btn_preview,
- image_upload = image_upload,
- image_reuse = image_reuse,
- image_preview = image_preview,
- extra_controls = extra_controls,
- )
- )
- if i == 0:
- units[-1].enabled = True # enable first unit in group
- num_adapter_units.change(fn=helpers.display_units, inputs=[num_adapter_units], outputs=adapter_ui_units)
-
- with gr.Tab('XS') as _tab_controlnetxs:
- gr.HTML('ControlNet XS')
- with gr.Row():
- extra_controls = [
- gr.Slider(label="Time embedding mix", minimum=0.0, maximum=1.0, step=0.05, value=0.0, scale=3)
- ]
- num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
- controlnetxs_ui_units = [] # list of hidable accordions
- for i in range(max_units):
- enabled = True if i==0 else False
- with gr.Accordion(f'ControlNet-XS unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui:
- with gr.Row():
- enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
- process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
- model_id = gr.Dropdown(label="ControlNet-XS", choices=xs.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
- ui_common.create_refresh_button(model_id, xs.list_models, lambda: {"choices": xs.list_models(refresh=True)}, f'xs_models_{i}_refresh')
- model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
- control_start = gr.Slider(label="Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start')
- control_end = gr.Slider(label="End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end')
- reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnetxs_unit-{i}-reset')
- image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnetxs_unit-{i}-upload')
- image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnetxs_unit-{i}-reuse')
- btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnetxs_unit-{i}-preview')
- image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'controlnetxs_unit-{i}-override')
- controlnetxs_ui_units.append(unit_ui)
- units.append(unit.Unit(
- unit_type = 'xs',
- index = i,
- enabled = enabled,
- result_txt = result_txt,
- enabled_cb = enabled_cb,
- reset_btn = reset_btn,
- process_id = process_id,
- model_id = model_id,
- model_strength = model_strength,
- preview_process = preview_process,
- preview_btn = btn_preview,
- image_upload = image_upload,
- image_reuse = image_reuse,
- image_preview = image_preview,
- control_start = control_start,
- control_end = control_end,
- extra_controls = extra_controls,
- )
- )
- if i == 0:
- units[-1].enabled = True # enable first unit in group
- num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnetxs_ui_units)
-
- with gr.Tab('Lite') as _tab_lite:
- gr.HTML('Control LLLite')
- with gr.Row():
- extra_controls = [
- ]
- num_lite_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
- lite_ui_units = [] # list of hidable accordions
- for i in range(max_units):
- enabled = True if i==0 else False
- with gr.Accordion(f'Control-LLLite unit {i+1}', visible= i < num_lite_units.value, elem_classes='control-unit') as unit_ui:
- with gr.Row():
- enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
- process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
- model_id = gr.Dropdown(label="Model", choices=lite.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
- ui_common.create_refresh_button(model_id, lite.list_models, lambda: {"choices": lite.list_models(refresh=True)}, f'lite_models_{i}_refresh')
- model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
- reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'lite_unit-{i}-reset')
- image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'lite_unit-{i}-upload')
- image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'lite_unit-{i}-reuse')
- image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'lite_unit-{i}-override')
- btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'lite_unit-{i}-preview')
- lite_ui_units.append(unit_ui)
- units.append(unit.Unit(
- unit_type = 'lite',
- index = i,
- enabled = enabled,
- result_txt = result_txt,
- enabled_cb = enabled_cb,
- reset_btn = reset_btn,
- process_id = process_id,
- model_id = model_id,
- model_strength = model_strength,
- preview_process = preview_process,
- preview_btn = btn_preview,
- image_upload = image_upload,
- image_reuse = image_reuse,
- image_preview = image_preview,
- extra_controls = extra_controls,
- )
- )
- if i == 0:
- units[-1].enabled = True # enable first unit in group
- num_lite_units.change(fn=helpers.display_units, inputs=[num_lite_units], outputs=lite_ui_units)
-
- with gr.Tab('Reference') as _tab_reference:
- gr.HTML('ControlNet reference-only control')
- with gr.Row():
- extra_controls = [
- gr.Radio(label="Reference context", choices=['Attention', 'Adain', 'Attention Adain'], value='Attention', interactive=True),
- gr.Slider(label="Style fidelity", minimum=0.0, maximum=1.0, step=0.05, value=0.5, interactive=True), # prompt vs control importance
- gr.Slider(label="Reference query weight", minimum=0.0, maximum=1.0, step=0.05, value=1.0, interactive=True),
- gr.Slider(label="Reference adain weight", minimum=0.0, maximum=2.0, step=0.05, value=1.0, interactive=True),
- ]
- for i in range(1): # can only have one reference unit
- enabled = True if i==0 else False
- with gr.Accordion(f'Reference unit {i+1}', visible=True, elem_classes='control-unit') as unit_ui:
- with gr.Row():
- enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
- model_id = gr.Dropdown(label="Reference", choices=reference.list_models(), value='Reference', visible=False, elem_id=f'control_unit-{i}-model_name')
- model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, visible=False, elem_id=f'control_unit-{i}-strength')
- reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'reference_unit-{i}-reset')
- image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'reference_unit-{i}-upload')
- image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'reference_unit-{i}-reuse')
- image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'reference_unit-{i}-override')
- btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'reference_unit-{i}-preview')
- units.append(unit.Unit(
- unit_type = 'reference',
- index = i,
- enabled = enabled,
- result_txt = result_txt,
- enabled_cb = enabled_cb,
- reset_btn = reset_btn,
- process_id = process_id,
- model_id = model_id,
- model_strength = model_strength,
- preview_process = preview_process,
- preview_btn = btn_preview,
- image_upload = image_upload,
- image_reuse = image_reuse,
- image_preview = image_preview,
- extra_controls = extra_controls,
- )
- )
- if i == 0:
- units[-1].enabled = True # enable first unit in group
-
- with gr.Accordion('Control settings', open=False, elem_classes=['control-settings']) as _tab_settings:
- with gr.Group(elem_classes=['processor-group']):
- settings = []
- with gr.Accordion('Global', open=True, elem_classes=['processor-settings']):
- control_hires = gr.Checkbox(label="Use control during hires", value=shared.opts.control_hires, elem_id='control_hires')
- def set_control_hires(value):
- shared.opts.control_active = value
- control_hires.change(fn=set_control_hires, inputs=[control_hires], outputs=[])
- control_max_units = gr.Slider(label="Maximum units", minimum=1, maximum=10, step=1, value=shared.opts.control_max_units, elem_id='control_max_units')
- def set_control_max_units(value):
- shared.opts.control_max_units = value
- control_max_units.change(fn=set_control_max_units, inputs=[control_max_units], outputs=[])
- control_tiles = gr.Textbox(label="Tiling options", value=shared.opts.control_tiles, elem_id='control_tiles')
- def set_control_tiles(value):
- shared.opts.control_tiles = value
- control_tiles.change(fn=set_control_tiles, inputs=[control_tiles], outputs=[])
- control_move_processor = gr.Checkbox(label="Move processor to CPU after use", value=shared.opts.control_move_processor, elem_id='control_move_processor')
- def set_control_move_processor(value):
- shared.opts.control_move_processor = value
- control_move_processor.change(fn=set_control_move_processor, inputs=[control_move_processor], outputs=[])
- control_unload_processor = gr.Checkbox(label="Unload processor after use", value=shared.opts.control_unload_processor, elem_id='control_unload_processor')
- def set_control_unload_processor(value):
- shared.opts.control_unload_processor = value
- control_unload_processor.change(fn=set_control_unload_processor, inputs=[control_unload_processor], outputs=[])
-
- with gr.Accordion('HED', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Scribble", value=False))
- with gr.Accordion('Midas depth', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Slider(label="Background threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
- settings.append(gr.Checkbox(label="Depth and normal", value=False))
- with gr.Accordion('MLSD', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Slider(label="Score threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
- settings.append(gr.Slider(label="Distance threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
- with gr.Accordion('OpenBody', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Body", value=True))
- settings.append(gr.Checkbox(label="Hands", value=False))
- settings.append(gr.Checkbox(label="Face", value=False))
- with gr.Accordion('PidiNet', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Scribble", value=False))
- settings.append(gr.Checkbox(label="Apply filter", value=False))
- with gr.Accordion('LineArt', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Coarse", value=False))
- with gr.Accordion('Leres Depth', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Boost", value=False))
- settings.append(gr.Slider(label="Near threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0))
- settings.append(gr.Slider(label="Depth threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0))
- with gr.Accordion('MediaPipe Face', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Slider(label="Max faces", minimum=1, maximum=10, step=1, value=1))
- settings.append(gr.Slider(label="Face confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.5))
- with gr.Accordion('Canny', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Slider(label="Low threshold", minimum=0, maximum=1000, step=1, value=100))
- settings.append(gr.Slider(label="High threshold", minimum=0, maximum=1000, step=1, value=200))
- with gr.Accordion('DWPose', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Radio(label="Pose Model", choices=['Tiny', 'Medium', 'Large'], value='Tiny'))
- settings.append(gr.Slider(label="Pose confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.3))
- with gr.Accordion('SegmentAnything', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Radio(label="Segment Model", choices=['Base', 'Large'], value='Base'))
- with gr.Accordion('Edge', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Parameter free", value=True))
- settings.append(gr.Radio(label="Edge mode", choices=['edge', 'gradient'], value='edge'))
- with gr.Accordion('Zoe Depth', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Checkbox(label="Gamma corrected", value=False))
- with gr.Accordion('Marigold Depth', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Dropdown(label="Color map", choices=['None'] + plt.colormaps(), value='None'))
- settings.append(gr.Slider(label="Denoising steps", minimum=1, maximum=99, step=1, value=10))
- settings.append(gr.Slider(label="Ensemble size", minimum=1, maximum=99, step=1, value=10))
- with gr.Accordion('Depth Anything', open=True, elem_classes=['processor-settings']):
- settings.append(gr.Dropdown(label="Depth map", choices=['none'] + masking.COLORMAP, value='inferno'))
- for setting in settings:
- setting.change(fn=processors.update_settings, inputs=settings, outputs=[])
+ from modules.ui_control_elements import create_ui_elements
+ create_ui_elements(units, result_txt, preview_process)
with gr.Row(elem_id="control_script_container"):
input_script_args = scripts_manager.scripts_current.setup_ui(parent='control', accordion=True)
diff --git a/modules/ui_control_elements.py b/modules/ui_control_elements.py
new file mode 100644
index 000000000..21f7b4ca5
--- /dev/null
+++ b/modules/ui_control_elements.py
@@ -0,0 +1,321 @@
+import gradio as gr
+import matplotlib.pyplot as plt
+from modules.control import unit
+from modules.control import processors # patrickvonplaten controlnet_aux
+from modules.control.units import controlnet # lllyasviel ControlNet
+from modules.control.units import xs # vislearn ControlNet-XS
+from modules.control.units import lite # vislearn ControlNet-XS
+from modules.control.units import t2iadapter # TencentARC T2I-Adapter
+from modules.control.units import reference # reference pipeline
+from modules import shared, ui_components, ui_symbols, ui_common, masking # pylint: disable=ungrouped-imports
+from modules import ui_control_helpers as helpers
+
+
+def create_ui_elements(units, result_txt, preview_process):
+ max_units = shared.opts.control_max_units
+ with gr.Accordion('Control elements', open=False, elem_id="control_elements"):
+ with gr.Tabs(elem_id='control-tabs') as _tabs_control_type:
+
+ with gr.Tab('ControlNet') as _tab_controlnet:
+ gr.HTML('ControlNet')
+ with gr.Row():
+ extra_controls = [
+ gr.Checkbox(label="Guess mode", value=False, scale=3),
+ ]
+ num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
+ controlnet_ui_units = [] # list of hidable accordions
+ for i in range(max_units):
+ enabled = True if i==0 else False
+ with gr.Accordion(f'ControlNet unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui:
+ with gr.Row():
+ enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
+ process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
+ model_id = gr.Dropdown(label="ControlNet", choices=controlnet.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
+ ui_common.create_refresh_button(model_id, controlnet.list_models, lambda: {"choices": controlnet.list_models(refresh=True)}, f'controlnet_models_{i}_refresh')
+ control_mode = gr.Dropdown(label="CN Mode", choices=['default'], value='default', visible=False, elem_id=f'control_unit-{i}-mode')
+ model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=2.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
+ control_start = gr.Slider(label="CN Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start')
+ control_end = gr.Slider(label="CN End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end')
+ control_tile = gr.Dropdown(label="CN Tiles", choices=[x.strip() for x in shared.opts.control_tiles.split(',') if 'x' in x], value='1x1', visible=False, elem_id=f'control_unit-{i}-tile')
+ reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnet_unit-{i}-reset')
+ image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnet_unit-{i}-upload')
+ image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnet_unit-{i}-reuse')
+ btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnet_unit-{i}-preview')
+ image_preview = gr.Image(label="Input", type="pil", height=128, width=128, visible=False, interactive=True, show_label=False, show_download_button=False, container=False, elem_id=f'controlnet_unit-{i}-override')
+ controlnet_ui_units.append(unit_ui)
+ units.append(unit.Unit(
+ unit_type = 'controlnet',
+ index = i,
+ enabled = enabled,
+ result_txt = result_txt,
+ enabled_cb = enabled_cb,
+ reset_btn = reset_btn,
+ process_id = process_id,
+ model_id = model_id,
+ model_strength = model_strength,
+ preview_process = preview_process,
+ preview_btn = btn_preview,
+ image_upload = image_upload,
+ image_reuse = image_reuse,
+ image_preview = image_preview,
+ control_start = control_start,
+ control_end = control_end,
+ control_mode = control_mode,
+ control_tile = control_tile,
+ extra_controls = extra_controls,
+ )
+ )
+ if i == 0:
+ units[-1].enabled = True # enable first unit in group
+ num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnet_ui_units)
+
+ with gr.Tab('T2I Adapter') as _tab_t2iadapter:
+ gr.HTML('T2I-Adapter')
+ with gr.Row():
+ extra_controls = [
+ gr.Slider(label="Control factor", minimum=0.0, maximum=1.0, step=0.05, value=1.0, scale=3),
+ ]
+ num_adapter_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
+ adapter_ui_units = [] # list of hidable accordions
+ for i in range(max_units):
+ enabled = True if i==0 else False
+ with gr.Accordion(f'T2I-Adapter unit {i+1}', visible= i < num_adapter_units.value, elem_classes='control-unit') as unit_ui:
+ with gr.Row():
+ enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
+ process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
+ model_id = gr.Dropdown(label="Adapter", choices=t2iadapter.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
+ ui_common.create_refresh_button(model_id, t2iadapter.list_models, lambda: {"choices": t2iadapter.list_models(refresh=True)}, f'adapter_models_{i}_refresh')
+ model_strength = gr.Slider(label="T2I Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
+ reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'adapter_unit-{i}-reset')
+ image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'adapter_unit-{i}-upload')
+ image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'adapter_unit-{i}-reuse')
+ btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'adapter_unit-{i}-preview')
+ image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'adapter_unit-{i}-override')
+ adapter_ui_units.append(unit_ui)
+ units.append(unit.Unit(
+ unit_type = 't2i adapter',
+ index = i,
+ enabled = enabled,
+ result_txt = result_txt,
+ enabled_cb = enabled_cb,
+ reset_btn = reset_btn,
+ process_id = process_id,
+ model_id = model_id,
+ model_strength = model_strength,
+ preview_process = preview_process,
+ preview_btn = btn_preview,
+ image_upload = image_upload,
+ image_reuse = image_reuse,
+ image_preview = image_preview,
+ extra_controls = extra_controls,
+ )
+ )
+ if i == 0:
+ units[-1].enabled = True # enable first unit in group
+ num_adapter_units.change(fn=helpers.display_units, inputs=[num_adapter_units], outputs=adapter_ui_units)
+
+ with gr.Tab('XS') as _tab_controlnetxs:
+ gr.HTML('ControlNet XS')
+ with gr.Row():
+ extra_controls = [
+ gr.Slider(label="Time embedding mix", minimum=0.0, maximum=1.0, step=0.05, value=0.0, scale=3)
+ ]
+ num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
+ controlnetxs_ui_units = [] # list of hidable accordions
+ for i in range(max_units):
+ enabled = True if i==0 else False
+ with gr.Accordion(f'ControlNet-XS unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui:
+ with gr.Row():
+ enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
+ process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
+ model_id = gr.Dropdown(label="ControlNet-XS", choices=xs.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
+ ui_common.create_refresh_button(model_id, xs.list_models, lambda: {"choices": xs.list_models(refresh=True)}, f'xs_models_{i}_refresh')
+ model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
+ control_start = gr.Slider(label="Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start')
+ control_end = gr.Slider(label="End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end')
+ reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnetxs_unit-{i}-reset')
+ image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnetxs_unit-{i}-upload')
+ image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnetxs_unit-{i}-reuse')
+ btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnetxs_unit-{i}-preview')
+ image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'controlnetxs_unit-{i}-override')
+ controlnetxs_ui_units.append(unit_ui)
+ units.append(unit.Unit(
+ unit_type = 'xs',
+ index = i,
+ enabled = enabled,
+ result_txt = result_txt,
+ enabled_cb = enabled_cb,
+ reset_btn = reset_btn,
+ process_id = process_id,
+ model_id = model_id,
+ model_strength = model_strength,
+ preview_process = preview_process,
+ preview_btn = btn_preview,
+ image_upload = image_upload,
+ image_reuse = image_reuse,
+ image_preview = image_preview,
+ control_start = control_start,
+ control_end = control_end,
+ extra_controls = extra_controls,
+ )
+ )
+ if i == 0:
+ units[-1].enabled = True # enable first unit in group
+ num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnetxs_ui_units)
+
+ with gr.Tab('Lite') as _tab_lite:
+ gr.HTML('Control LLLite')
+ with gr.Row():
+ extra_controls = [
+ ]
+ num_lite_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1)
+ lite_ui_units = [] # list of hidable accordions
+ for i in range(max_units):
+ enabled = True if i==0 else False
+ with gr.Accordion(f'Control-LLLite unit {i+1}', visible= i < num_lite_units.value, elem_classes='control-unit') as unit_ui:
+ with gr.Row():
+ enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
+ process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name')
+ model_id = gr.Dropdown(label="Model", choices=lite.list_models(), value='None', elem_id=f'control_unit-{i}-model_name')
+ ui_common.create_refresh_button(model_id, lite.list_models, lambda: {"choices": lite.list_models(refresh=True)}, f'lite_models_{i}_refresh')
+ model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength')
+ reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'lite_unit-{i}-reset')
+ image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'lite_unit-{i}-upload')
+ image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'lite_unit-{i}-reuse')
+ image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'lite_unit-{i}-override')
+ btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'lite_unit-{i}-preview')
+ lite_ui_units.append(unit_ui)
+ units.append(unit.Unit(
+ unit_type = 'lite',
+ index = i,
+ enabled = enabled,
+ result_txt = result_txt,
+ enabled_cb = enabled_cb,
+ reset_btn = reset_btn,
+ process_id = process_id,
+ model_id = model_id,
+ model_strength = model_strength,
+ preview_process = preview_process,
+ preview_btn = btn_preview,
+ image_upload = image_upload,
+ image_reuse = image_reuse,
+ image_preview = image_preview,
+ extra_controls = extra_controls,
+ )
+ )
+ if i == 0:
+ units[-1].enabled = True # enable first unit in group
+ num_lite_units.change(fn=helpers.display_units, inputs=[num_lite_units], outputs=lite_ui_units)
+
+ with gr.Tab('Reference') as _tab_reference:
+ gr.HTML('ControlNet reference-only control')
+ with gr.Row():
+ extra_controls = [
+ gr.Radio(label="Reference context", choices=['Attention', 'Adain', 'Attention Adain'], value='Attention', interactive=True),
+ gr.Slider(label="Style fidelity", minimum=0.0, maximum=1.0, step=0.05, value=0.5, interactive=True), # prompt vs control importance
+ gr.Slider(label="Reference query weight", minimum=0.0, maximum=1.0, step=0.05, value=1.0, interactive=True),
+ gr.Slider(label="Reference adain weight", minimum=0.0, maximum=2.0, step=0.05, value=1.0, interactive=True),
+ ]
+ for i in range(1): # can only have one reference unit
+ enabled = True if i==0 else False
+ with gr.Accordion(f'Reference unit {i+1}', visible=True, elem_classes='control-unit') as unit_ui:
+ with gr.Row():
+ enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled')
+ model_id = gr.Dropdown(label="Reference", choices=reference.list_models(), value='Reference', visible=False, elem_id=f'control_unit-{i}-model_name')
+ model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, visible=False, elem_id=f'control_unit-{i}-strength')
+ reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'reference_unit-{i}-reset')
+ image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'reference_unit-{i}-upload')
+ image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'reference_unit-{i}-reuse')
+ image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'reference_unit-{i}-override')
+ btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'reference_unit-{i}-preview')
+ units.append(unit.Unit(
+ unit_type = 'reference',
+ index = i,
+ enabled = enabled,
+ result_txt = result_txt,
+ enabled_cb = enabled_cb,
+ reset_btn = reset_btn,
+ process_id = process_id,
+ model_id = model_id,
+ model_strength = model_strength,
+ preview_process = preview_process,
+ preview_btn = btn_preview,
+ image_upload = image_upload,
+ image_reuse = image_reuse,
+ image_preview = image_preview,
+ extra_controls = extra_controls,
+ )
+ )
+ if i == 0:
+ units[-1].enabled = True # enable first unit in group
+
+ with gr.Accordion('Control settings', open=False, elem_classes=['control-settings']) as _tab_settings:
+ with gr.Group(elem_classes=['processor-group']):
+ settings = []
+ with gr.Accordion('Global', open=True, elem_classes=['processor-settings']):
+ control_hires = gr.Checkbox(label="Use control during hires", value=shared.opts.control_hires, elem_id='control_hires')
+ def set_control_hires(value):
+ shared.opts.control_active = value
+ control_hires.change(fn=set_control_hires, inputs=[control_hires], outputs=[])
+ control_max_units = gr.Slider(label="Maximum units", minimum=1, maximum=10, step=1, value=shared.opts.control_max_units, elem_id='control_max_units')
+ def set_control_max_units(value):
+ shared.opts.control_max_units = value
+ control_max_units.change(fn=set_control_max_units, inputs=[control_max_units], outputs=[])
+ control_tiles = gr.Textbox(label="Tiling options", value=shared.opts.control_tiles, elem_id='control_tiles')
+ def set_control_tiles(value):
+ shared.opts.control_tiles = value
+ control_tiles.change(fn=set_control_tiles, inputs=[control_tiles], outputs=[])
+ control_move_processor = gr.Checkbox(label="Move processor to CPU after use", value=shared.opts.control_move_processor, elem_id='control_move_processor')
+ def set_control_move_processor(value):
+ shared.opts.control_move_processor = value
+ control_move_processor.change(fn=set_control_move_processor, inputs=[control_move_processor], outputs=[])
+ control_unload_processor = gr.Checkbox(label="Unload processor after use", value=shared.opts.control_unload_processor, elem_id='control_unload_processor')
+ def set_control_unload_processor(value):
+ shared.opts.control_unload_processor = value
+ control_unload_processor.change(fn=set_control_unload_processor, inputs=[control_unload_processor], outputs=[])
+
+ with gr.Accordion('HED', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Scribble", value=False))
+ with gr.Accordion('Midas depth', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Slider(label="Background threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
+ settings.append(gr.Checkbox(label="Depth and normal", value=False))
+ with gr.Accordion('MLSD', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Slider(label="Score threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
+ settings.append(gr.Slider(label="Distance threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1))
+ with gr.Accordion('OpenBody', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Body", value=True))
+ settings.append(gr.Checkbox(label="Hands", value=False))
+ settings.append(gr.Checkbox(label="Face", value=False))
+ with gr.Accordion('PidiNet', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Scribble", value=False))
+ settings.append(gr.Checkbox(label="Apply filter", value=False))
+ with gr.Accordion('LineArt', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Coarse", value=False))
+ with gr.Accordion('Leres Depth', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Boost", value=False))
+ settings.append(gr.Slider(label="Near threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0))
+ settings.append(gr.Slider(label="Depth threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0))
+ with gr.Accordion('MediaPipe Face', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Slider(label="Max faces", minimum=1, maximum=10, step=1, value=1))
+ settings.append(gr.Slider(label="Face confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.5))
+ with gr.Accordion('Canny', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Slider(label="Low threshold", minimum=0, maximum=1000, step=1, value=100))
+ settings.append(gr.Slider(label="High threshold", minimum=0, maximum=1000, step=1, value=200))
+ with gr.Accordion('DWPose', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Radio(label="Pose Model", choices=['Tiny', 'Medium', 'Large'], value='Tiny'))
+ settings.append(gr.Slider(label="Pose confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.3))
+ with gr.Accordion('SegmentAnything', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Radio(label="Segment Model", choices=['Base', 'Large'], value='Base'))
+ with gr.Accordion('Edge', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Parameter free", value=True))
+ settings.append(gr.Radio(label="Edge mode", choices=['edge', 'gradient'], value='edge'))
+ with gr.Accordion('Zoe Depth', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Checkbox(label="Gamma corrected", value=False))
+ with gr.Accordion('Marigold Depth', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Dropdown(label="Color map", choices=['None'] + plt.colormaps(), value='None'))
+ settings.append(gr.Slider(label="Denoising steps", minimum=1, maximum=99, step=1, value=10))
+ settings.append(gr.Slider(label="Ensemble size", minimum=1, maximum=99, step=1, value=10))
+ with gr.Accordion('Depth Anything', open=True, elem_classes=['processor-settings']):
+ settings.append(gr.Dropdown(label="Depth map", choices=['none'] + masking.COLORMAP, value='inferno'))
+ for setting in settings:
+ setting.change(fn=processors.update_settings, inputs=settings, outputs=[])