import logging from PIL import Image from diffusers import ControlNetModel from backend.models.lcmdiffusion_setting import ( DiffusionTask, ControlNetSetting, ) # Prepares ControlNet adapters for use with FastSD CPU # # This function loads the ControlNet adapters defined by the # _lcm_diffusion_setting.controlnet_ object and returns a dictionary # with the pipeline arguments required to use the loaded adapters def load_controlnet_adapters(lcm_diffusion_setting) -> dict: controlnet_args = {} if ( lcm_diffusion_setting.controlnet is None or not lcm_diffusion_setting.controlnet.enabled ): return controlnet_args logging.info("Loading ControlNet adapter") controlnet_adapter = ControlNetModel.from_single_file( lcm_diffusion_setting.controlnet.adapter_path, # local_files_only=True, use_safetensors=True, ) controlnet_args["controlnet"] = controlnet_adapter return controlnet_args # Updates the ControlNet pipeline arguments to use for image generation # # This function uses the contents of the _lcm_diffusion_setting.controlnet_ # object to generate a dictionary with the corresponding pipeline arguments # to be used for image generation; in particular, it sets the ControlNet control # image and conditioning scale def update_controlnet_arguments(lcm_diffusion_setting) -> dict: controlnet_args = {} if ( lcm_diffusion_setting.controlnet is None or not lcm_diffusion_setting.controlnet.enabled ): return controlnet_args controlnet_args["controlnet_conditioning_scale"] = ( lcm_diffusion_setting.controlnet.conditioning_scale ) if lcm_diffusion_setting.diffusion_task == DiffusionTask.text_to_image.value: controlnet_args["image"] = lcm_diffusion_setting.controlnet._control_image elif lcm_diffusion_setting.diffusion_task == DiffusionTask.image_to_image.value: controlnet_args["control_image"] = ( lcm_diffusion_setting.controlnet._control_image ) return controlnet_args # Helper function to adjust ControlNet settings from a dictionary def controlnet_settings_from_dict( lcm_diffusion_setting, dictionary, ) -> None: if lcm_diffusion_setting is None or dictionary is None: logging.error("Invalid arguments!") return if ( "controlnet" not in dictionary or dictionary["controlnet"] is None or len(dictionary["controlnet"]) == 0 ): logging.warning("ControlNet settings not found, ControlNet will be disabled") lcm_diffusion_setting.controlnet = None return controlnet = ControlNetSetting() controlnet.enabled = dictionary["controlnet"][0]["enabled"] controlnet.conditioning_scale = dictionary["controlnet"][0]["conditioning_scale"] controlnet.adapter_path = dictionary["controlnet"][0]["adapter_path"] controlnet._control_image = None image_path = dictionary["controlnet"][0]["control_image"] if controlnet.enabled: try: controlnet._control_image = Image.open(image_path) except (AttributeError, FileNotFoundError) as err: print(err) if controlnet._control_image is None: logging.error("Wrong ControlNet control image! Disabling ControlNet") controlnet.enabled = False lcm_diffusion_setting.controlnet = controlnet