|
import logging
|
|
from PIL import Image
|
|
from diffusers import ControlNetModel
|
|
from backend.models.lcmdiffusion_setting import (
|
|
DiffusionTask,
|
|
ControlNetSetting,
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
use_safetensors=True,
|
|
)
|
|
controlnet_args["controlnet"] = controlnet_adapter
|
|
return controlnet_args
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
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
|
|
|