| import gradio as gr |
| from PIL import Image |
| from backend.lora import get_lora_models |
| from state import get_settings, get_context |
| 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_controlnet_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): |
| app_settings.settings.lcm_diffusion_setting.controlnet.conditioning_scale = ( |
| float(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 |
| ) |
|
|