|
import gradio as gr
|
|
from PIL import Image
|
|
from backend.lora import get_lora_models
|
|
from state import get_settings
|
|
from backend.models.lcmdiffusion_setting import ControlNetSetting
|
|
from backend.annotators.image_control_factory import ImageControlFactory
|
|
|
|
_controlnet_models_map = None
|
|
_controlnet_enabled = False
|
|
_adapter_path = None
|
|
|
|
app_settings = get_settings()
|
|
|
|
|
|
def on_user_input(
|
|
enable: bool,
|
|
adapter_name: str,
|
|
conditioning_scale: float,
|
|
control_image: Image,
|
|
preprocessor: str,
|
|
):
|
|
if not isinstance(adapter_name, str):
|
|
gr.Warning("Please select a valid ControlNet model")
|
|
return gr.Checkbox(value=False)
|
|
|
|
settings = app_settings.settings.lcm_diffusion_setting
|
|
if settings.controlnet is None:
|
|
settings.controlnet = ControlNetSetting()
|
|
|
|
if enable and (adapter_name is None or adapter_name == ""):
|
|
gr.Warning("Please select a valid ControlNet adapter")
|
|
return gr.Checkbox(value=False)
|
|
elif enable and not control_image:
|
|
gr.Warning("Please provide a ControlNet control image")
|
|
return gr.Checkbox(value=False)
|
|
|
|
if control_image is None:
|
|
return gr.Checkbox(value=enable)
|
|
|
|
if preprocessor == "None":
|
|
processed_control_image = control_image
|
|
else:
|
|
image_control_factory = ImageControlFactory()
|
|
control = image_control_factory.create_control(preprocessor)
|
|
processed_control_image = control.get_control_image(control_image)
|
|
|
|
if not enable:
|
|
settings.controlnet.enabled = False
|
|
else:
|
|
settings.controlnet.enabled = True
|
|
settings.controlnet.adapter_path = _controlnet_models_map[adapter_name]
|
|
settings.controlnet.conditioning_scale = float(conditioning_scale)
|
|
settings.controlnet._control_image = processed_control_image
|
|
|
|
|
|
|
|
|
|
|
|
global _controlnet_enabled
|
|
global _adapter_path
|
|
if settings.controlnet.enabled != _controlnet_enabled or (
|
|
settings.controlnet.enabled
|
|
and settings.controlnet.adapter_path != _adapter_path
|
|
):
|
|
settings.rebuild_pipeline = True
|
|
_controlnet_enabled = settings.controlnet.enabled
|
|
_adapter_path = settings.controlnet.adapter_path
|
|
return gr.Checkbox(value=enable)
|
|
|
|
|
|
def on_change_conditioning_scale(cond_scale):
|
|
print(cond_scale)
|
|
app_settings.settings.lcm_diffusion_setting.controlnet.conditioning_scale = (
|
|
cond_scale
|
|
)
|
|
|
|
|
|
def get_controlnet_ui() -> None:
|
|
with gr.Blocks() as ui:
|
|
gr.HTML(
|
|
'Download ControlNet v1.1 model from <a href="https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main">ControlNet v1.1 </a> (723 MB files) and place it in <b>controlnet_models</b> folder,restart the app'
|
|
)
|
|
with gr.Row():
|
|
with gr.Column():
|
|
with gr.Row():
|
|
global _controlnet_models_map
|
|
_controlnet_models_map = get_lora_models(
|
|
app_settings.settings.lcm_diffusion_setting.dirs["controlnet"]
|
|
)
|
|
controlnet_models = list(_controlnet_models_map.keys())
|
|
default_model = (
|
|
controlnet_models[0] if len(controlnet_models) else None
|
|
)
|
|
|
|
enabled_checkbox = gr.Checkbox(
|
|
label="Enable ControlNet",
|
|
info="Enable ControlNet",
|
|
show_label=True,
|
|
)
|
|
model_dropdown = gr.Dropdown(
|
|
_controlnet_models_map.keys(),
|
|
label="ControlNet model",
|
|
info="ControlNet model to load (.safetensors format)",
|
|
value=default_model,
|
|
interactive=True,
|
|
)
|
|
conditioning_scale_slider = gr.Slider(
|
|
0.0,
|
|
1.0,
|
|
value=0.5,
|
|
step=0.05,
|
|
label="ControlNet conditioning scale",
|
|
interactive=True,
|
|
)
|
|
control_image = gr.Image(
|
|
label="Control image",
|
|
type="pil",
|
|
)
|
|
preprocessor_radio = gr.Radio(
|
|
[
|
|
"Canny",
|
|
"Depth",
|
|
"LineArt",
|
|
"MLSD",
|
|
"NormalBAE",
|
|
"Pose",
|
|
"SoftEdge",
|
|
"Shuffle",
|
|
"None",
|
|
],
|
|
label="Preprocessor",
|
|
info="Select the preprocessor for the control image",
|
|
value="Canny",
|
|
interactive=True,
|
|
)
|
|
|
|
enabled_checkbox.input(
|
|
fn=on_user_input,
|
|
inputs=[
|
|
enabled_checkbox,
|
|
model_dropdown,
|
|
conditioning_scale_slider,
|
|
control_image,
|
|
preprocessor_radio,
|
|
],
|
|
outputs=[enabled_checkbox],
|
|
)
|
|
model_dropdown.input(
|
|
fn=on_user_input,
|
|
inputs=[
|
|
enabled_checkbox,
|
|
model_dropdown,
|
|
conditioning_scale_slider,
|
|
control_image,
|
|
preprocessor_radio,
|
|
],
|
|
outputs=[enabled_checkbox],
|
|
)
|
|
conditioning_scale_slider.input(
|
|
fn=on_user_input,
|
|
inputs=[
|
|
enabled_checkbox,
|
|
model_dropdown,
|
|
conditioning_scale_slider,
|
|
control_image,
|
|
preprocessor_radio,
|
|
],
|
|
outputs=[enabled_checkbox],
|
|
)
|
|
control_image.change(
|
|
fn=on_user_input,
|
|
inputs=[
|
|
enabled_checkbox,
|
|
model_dropdown,
|
|
conditioning_scale_slider,
|
|
control_image,
|
|
preprocessor_radio,
|
|
],
|
|
outputs=[enabled_checkbox],
|
|
)
|
|
preprocessor_radio.change(
|
|
fn=on_user_input,
|
|
inputs=[
|
|
enabled_checkbox,
|
|
model_dropdown,
|
|
conditioning_scale_slider,
|
|
control_image,
|
|
preprocessor_radio,
|
|
],
|
|
outputs=[enabled_checkbox],
|
|
)
|
|
conditioning_scale_slider.change(
|
|
on_change_conditioning_scale, conditioning_scale_slider
|
|
)
|
|
|