fastsdtest / backend /controlnet.py
bilegentile's picture
Upload folder using huggingface_hub
564df58 verified
raw
history blame
3.4 kB
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