Files
smthemex-ComfyUI_HiDiffusio…/Hidiffusion_node.py
T
2024-07-27 15:18:04 +08:00

670 lines
35 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# !/usr/bin/env python
# -*- coding: UTF-8 -*-
import cv2
import torch
import os
from PIL import Image
import numpy as np
import sys
from diffusers import (StableDiffusionXLPipeline, DiffusionPipeline, DDIMScheduler, ControlNetModel,
KDPM2AncestralDiscreteScheduler, LMSDiscreteScheduler,
AutoPipelineForInpainting, DPMSolverMultistepScheduler, DPMSolverSinglestepScheduler,
EulerDiscreteScheduler, HeunDiscreteScheduler, UNet2DConditionModel,
StableDiffusionXLImg2ImgPipeline, AutoPipelineForImage2Image,
AutoPipelineForText2Image, StableDiffusionXLControlNetImg2ImgPipeline, KDPM2DiscreteScheduler,
EulerAncestralDiscreteScheduler, UniPCMultistepScheduler, AutoencoderKL,
StableDiffusionXLControlNetPipeline, DDPMScheduler, TCDScheduler, LCMScheduler,
StableDiffusionPipeline, StableDiffusionControlNetPipeline, StableDiffusionXLInpaintPipeline)
from diffusers.models.unets import unet_2d_condition
from huggingface_hub import hf_hub_download
from .hidiffusion.hidiffusion import apply_hidiffusion,remove_hidiffusion
import folder_paths
from safetensors.torch import load_file, load
import yaml
import diffusers
import random
dif_version = str(diffusers.__version__)
dif_version_int = int(dif_version.split(".")[1])
if dif_version_int >= 28:
from diffusers.models.unets.unet_2d_condition import UNet2DConditionModel
else:
from diffusers.models.unet_2d_condition import UNet2DConditionModel
from comfy.utils import common_upscale
from .guided_filter import FastGuidedFilter
from .ip_adapter import IPAdapterXL,IPAdapter
dir_path = os.path.dirname(os.path.abspath(__file__))
path_dir = os.path.dirname(dir_path)
file_path = os.path.dirname(path_dir)
scheduler_list = ["DDIM",
"Euler",
"Euler a",
"DDPM",
"DPM++ 2M",
"DPM++ 2M Karras",
"DPM++ 2M SDE",
"DPM++ 2M SDE Karras",
"DPM++ SDE",
"DPM++ SDE Karras",
"DPM2",
"DPM2 Karras",
"DPM2 a",
"DPM2 a Karras",
"Heun",
"LCM",
"LMS",
"LMS Karras",
"UniPC",
]
fs = open(os.path.join(dir_path, "model.yaml"), encoding="UTF-8")
datas = yaml.load(fs, Loader=yaml.FullLoader)
normal_model_list = datas["surport_model"]
sdxl_lightning_list = datas["lightning_unet"]
controlnet_suport = datas["surport_controlnet"]
xl_model_support = datas["sdxl_model"]
lightning_lora=datas["lightning_lora"]
lightning_xl_lora=datas["lightning_xl_lora"]
lcm_unet = ["dmd2_sdxl_4step_unet_fp16.bin", "dmd2_sdxl_1step_unet_fp16.bin", "lcm-sdxl-base-1.0.safetensors",
"Hyper-SDXL-1step-Unet.safetensors"]
def tensor_to_image(tensor):
#tensor = tensor.cpu()
image_np = tensor.squeeze().mul(255).clamp(0, 255).byte().numpy()
image = Image.fromarray(image_np, mode='RGB')
return image
def nomarl_upscale(img_tensor, width, height):
samples = img_tensor.movedim(-1, 1)
img = common_upscale(samples, width, height, "nearest-exact", "center")
samples = img.movedim(1, -1)
img_pil = tensor_to_image(samples)
return img_pil
def resize_image_control(control_image, resolution):
HH, WW, _ = control_image.shape
crop_h = random.randint(0, HH - resolution[1])
crop_w = random.randint(0, WW - resolution[0])
crop_image = control_image[crop_h:crop_h+resolution[1], crop_w:crop_w+resolution[0], :]
return crop_image, crop_w, crop_h
def apply_gaussian_blur(image_np, ksize=5, sigmaX=1.0):
if ksize % 2 == 0:
ksize += 1 # ksize must be odd
blurred_image = cv2.GaussianBlur(image_np, (ksize, ksize), sigmaX=sigmaX)
return blurred_image
def apply_guided_filter(image_np, radius, eps, scale):
filter = FastGuidedFilter(image_np, radius, eps, scale)
return filter.filter(image_np)
def input_size_adaptation_output(img_tensor,base_in, width, height):
#basein=1024
if width == height:
img_pil = nomarl_upscale(img_tensor, base_in, base_in) # 2pil
else:
if min(1,width/ height)==1: #高
r=height/base_in
img_pil = nomarl_upscale(img_tensor, round(width/r), base_in) # 2pil
else: #宽
r=width/base_in
img_pil = nomarl_upscale(img_tensor, base_in, round(height/r)) # 2pil
return img_pil
def get_sheduler(name):
scheduler = False
if name == "Euler":
scheduler = EulerDiscreteScheduler()
elif name == "Euler a":
scheduler = EulerAncestralDiscreteScheduler()
elif name == "DDIM":
scheduler = DDIMScheduler()
elif name == "DDPM":
scheduler = DDPMScheduler()
elif name == "DPM++ 2M":
scheduler = DPMSolverMultistepScheduler()
elif name == "DPM++ 2M Karras":
scheduler = DPMSolverMultistepScheduler(use_karras_sigmas=True)
elif name == "DPM++ 2M SDE":
scheduler = DPMSolverMultistepScheduler(algorithm_type="sde-dpmsolver++")
elif name == "DPM++ 2M SDE Karras":
scheduler = DPMSolverMultistepScheduler(use_karras_sigmas=True, algorithm_type="sde-dpmsolver++")
elif name == "DPM++ SDE":
scheduler = DPMSolverSinglestepScheduler()
elif name == "DPM++ SDE Karras":
scheduler = DPMSolverSinglestepScheduler(use_karras_sigmas=True)
elif name == "DPM2":
scheduler = KDPM2DiscreteScheduler()
elif name == "DPM2 Karras":
scheduler = KDPM2DiscreteScheduler(use_karras_sigmas=True)
elif name == "DPM2 a":
scheduler = KDPM2AncestralDiscreteScheduler()
elif name == "DPM2 a Karras":
scheduler = KDPM2AncestralDiscreteScheduler(use_karras_sigmas=True)
elif name == "Heun":
scheduler = HeunDiscreteScheduler()
elif name == "LCM":
scheduler = LCMScheduler()
elif name == "LMS":
scheduler = LMSDiscreteScheduler()
elif name == "LMS Karras":
scheduler = LMSDiscreteScheduler(use_karras_sigmas=True)
elif name == "UniPC":
scheduler = UniPCMultistepScheduler()
return scheduler
def get_local_path(file_path, model_path):
path = os.path.join(file_path, "models", "diffusers", model_path)
model_path = os.path.normpath(path)
if sys.platform == 'win32':
model_path = model_path.replace('\\', "/")
return model_path
def get_instance_path(path):
instance_path = os.path.normpath(path)
if sys.platform == 'win32':
instance_path = instance_path.replace('\\', "/")
return instance_path
def instance_path(path, repo):
if repo == "":
if path == "none":
repo = "none"
else:
model_path = get_local_path(file_path, path)
repo = get_instance_path(model_path)
return repo
class HI_Diffusers_Model_Loader:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"repo_id": ("STRING", {"default":""}),
"vae_id": ("STRING", {"default": ""}),
"controlnet_repo_id": ("STRING", {"default": ""}),
"model_category": (["sdxl","sd15","sd21","xl_turbo","inpainting","ghibli","playground"],),
"function_choice": (["txt2img", "img2img", ],),
"ckpt_name": (folder_paths.get_filename_list("checkpoints"),),
"unet_model": (["none"] + folder_paths.get_filename_list("unet"),),
"controlnet_model": (["none"] + folder_paths.get_filename_list("controlnet"),),
"lora": (["none"] + folder_paths.get_filename_list("loras"),),
"lora_scale": ("FLOAT", {"default": 0.8, "min": 0.1, "max": 1.0, "step": 0.1}),
"trigger_words": ("STRING", {"default": "best quality"}),
"scheduler": (scheduler_list,),
"apply_window_attn":("BOOLEAN", {"default": False},),
"ip_adapter": ("BOOLEAN", {"default": False},),
}
}
RETURN_TYPES = ("MODEL", "STRING",)
RETURN_NAMES = ("model", "model_info",)
FUNCTION = "loader_models"
CATEGORY = "Hidiffusion_Pro"
def loader_models(self, repo_id,vae_id,controlnet_repo_id,model_category,function_choice,ckpt_name,unet_model, controlnet_model,
lora,lora_scale,trigger_words,scheduler,apply_window_attn,ip_adapter):
ckpt_path = folder_paths.get_full_path("checkpoints", ckpt_name)
controlnet_single_model=folder_paths.get_full_path("controlnet", controlnet_model)
scheduler_used = get_sheduler(scheduler)
ip_path = os.path.join(folder_paths.models_dir, "photomaker")
sdxl_models_pre = os.path.join(ip_path, "sdxl_models", "image_encoder")
if not os.path.exists(sdxl_models_pre):
os.makedirs(sdxl_models_pre)
sd_models_pre = os.path.join(ip_path, "models", "image_encoder")
if not os.path.exists(sd_models_pre):
os.makedirs(sd_models_pre)
if controlnet_repo_id:
control_model_type = controlnet_repo_id.rsplit("/")[-1]
else:
control_model_type = "none"
if controlnet_single_model:
control_model_type=controlnet_model
if model_category=="sd15" or model_category=="sd21" :
model_type="stable-diffusion-v1-5"
if not repo_id: # using single model
original_config_file = os.path.join(folder_paths.models_dir, "configs", "v1-inference.yaml")
if dif_version_int >= 28:
model = StableDiffusionPipeline.from_single_file(
ckpt_path, original_config=original_config_file, torch_dtype=torch.float16).to("cuda")
else:
model = StableDiffusionPipeline.from_single_file(
ckpt_path, original_config_file=original_config_file, torch_dtype=torch.float16).to("cuda")
else:
model = DiffusionPipeline.from_pretrained(repo_id,torch_dtype=torch.float16).to("cuda")
elif model_category=="ghibli":
model_type = "stable-diffusion-xl-base-1.0"
if not repo_id:
model = StableDiffusionPipeline.from_single_file(ckpt_path,torch_dtype=torch.float16, ).to("cuda")
else:
model = StableDiffusionPipeline.from_pretrained(repo_id, torch_dtype=torch.float16, ).to("cuda")
elif model_category=="xl_turbo":
model_type = "sdxl-turbo"
if not repo_id:
original_config_file = os.path.join(dir_path, "weights", "sd_xl_base.yaml")
if dif_version_int >= 28:
model = StableDiffusionXLPipeline.from_single_file(
ckpt_path, original_config=original_config_file, torch_dtype=torch.float16).to("cuda")
else:
model = StableDiffusionXLPipeline.from_single_file(
ckpt_path, original_config_file=original_config_file, torch_dtype=torch.float16).to("cuda")
else:
if function_choice == "img2img":
model = AutoPipelineForImage2Image.from_pretrained(repo_id, torch_dtype=torch.float16,
).to('cuda')
else:
model = AutoPipelineForText2Image.from_pretrained(repo_id, torch_dtype=torch.float16,
).to('cuda')
elif model_category=="playground":
model_type = "playground-v2-1024px-aesthetic"
if not repo_id:
model = StableDiffusionXLPipeline.from_single_file(ckpt_path,torch_dtype=torch.float16).to("cuda")
else:
model = DiffusionPipeline.from_pretrained(repo_id,torch_dtype=torch.float16,).to("cuda")
elif model_category == "inpainting":
model_type = "stable-diffusion-xl-1.0-inpainting-0.1"
control_model_type="stable-diffusion-xl-1.0-inpainting-0.1"
if not controlnet_repo_id:
original_config_file = os.path.join(dir_path, "weights", "sd_xl_base.yaml")
if controlnet_model!="none" and "inpaint" in controlnet_model :
if dif_version_int >= 28:
model = StableDiffusionXLInpaintPipeline.from_single_file(ckpt_path,
original_config=original_config_file,
torch_dtype=torch.float16,
)
else:
model = StableDiffusionXLInpaintPipeline.from_single_file(ckpt_path,
original_config_file=original_config_file,
torch_dtype=torch.float16,
)
else:
raise "need inpaiting model"
else:
model = AutoPipelineForInpainting.from_pretrained(controlnet_repo_id, torch_dtype=torch.float16,
)
if unet_model in sdxl_lightning_list:
ckpt = folder_paths.get_full_path("unet", unet_model)
if unet_model.rsplit('.', 1)[-1] == "bin":
model.unet.load_state_dict(torch.load(ckpt),strict=False,)
else:
model.unet.load_state_dict(load_file(ckpt), strict=False, )
else:
model_type = "stable-diffusion-xl-base-1.0"
if not repo_id:
original_config_file = os.path.join(dir_path, "weights", "sd_xl_base.yaml")
if dif_version_int >= 28:
model = StableDiffusionXLPipeline.from_single_file(
ckpt_path, original_config=original_config_file, torch_dtype=torch.float16)
else:
model = StableDiffusionXLPipeline.from_single_file(
ckpt_path, original_config_file=original_config_file, torch_dtype=torch.float16)
if control_model_type!="none":
if not controlnet_repo_id:
controlnet = ControlNetModel.from_unet(model.unet)
cn_state_dict = load_file( controlnet_single_model)
controlnet.load_state_dict(cn_state_dict, strict=False)
else:
controlnet = ControlNetModel.from_pretrained(controlnet_repo_id, torch_dtype=torch.float16,
)
if function_choice == "img2img":
model = StableDiffusionXLControlNetImg2ImgPipeline.from_pipe(model,controlnet=controlnet,
torch_dtype=torch.float16,
)
else:
model = StableDiffusionXLControlNetPipeline.from_pipe(
model, controlnet=controlnet,
torch_dtype=torch.float16)
else:
if function_choice == "img2img":
model = StableDiffusionXLImg2ImgPipeline.from_pretrained(repo_id,
torch_dtype=torch.float16,
)
else:
model = StableDiffusionXLPipeline.from_pretrained(repo_id,
torch_dtype=torch.float16,
)
if control_model_type != "none":
if not controlnet_repo_id:
controlnet = ControlNetModel.from_unet(model.unet)
cn_state_dict = load_file(controlnet_single_model)
controlnet.load_state_dict(cn_state_dict, strict=False)
else:
controlnet = ControlNetModel.from_pretrained(controlnet_repo_id, torch_dtype=torch.float16,
)
if function_choice == "img2img":
model = StableDiffusionXLControlNetImg2ImgPipeline.from_pipe(model, controlnet=controlnet,
torch_dtype=torch.float16,
)
else:
model = StableDiffusionXLControlNetPipeline.from_pipe(
model, controlnet=controlnet,
torch_dtype=torch.float16)
if unet_model in sdxl_lightning_list:
ckpt = folder_paths.get_full_path("unet", unet_model)
if unet_model.rsplit('.', 1)[-1] == "bin":
model.unet.load_state_dict(torch.load(ckpt), strict=False,)
else:
model.unet.load_state_dict(load_file(ckpt), strict=False, )
if vae_id != "":
model.vae = AutoencoderKL.from_pretrained(vae_id, torch_dtype=torch.float16).to("cuda")
if control_model_type == "stable-diffusion-xl-1.0-inpainting-0.1":
model.scheduler =scheduler_used.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler")
else:
model.scheduler = scheduler_used.from_config(model.scheduler.config, timestep_spacing="trailing")
if lora!="none":
lora_path = folder_paths.get_full_path("loras", lora)
lora_path = get_instance_path(lora_path)
model.load_lora_weights(lora_path, adapter_name=trigger_words)
model.fuse_lora(lora_scale=lora_scale, adapter_names=[trigger_words,])
model.enable_xformers_memory_efficient_attention()
model.enable_vae_tiling()
apply_hidiffusion(model,apply_window_attn=apply_window_attn,model_type_str=model_type)
model.enable_model_cpu_offload() # need below apply_hidiffusion(model)
adapter_info = "none"
if ip_adapter:
model.enable_freeu(s1=0.6, s2=0.4, b1=1.1, b2=1.2)
ip_model_dir_origin = get_instance_path(ip_path)
device = "cuda"
if model_type == "stable-diffusion-xl-base-1.0": # #ip-adapter_sdxl.bin
ip_model_path_xl = os.path.join(ip_path, "sdxl_models", "ip-adapter_sdxl.bin")
if not os.path.exists(ip_model_path_xl):
adapter_path_xl = hf_hub_download(
repo_id="h94/IP-Adapter",
subfolder="sdxl_models",
filename="ip-adapter_sdxl.bin",
local_dir=ip_model_dir_origin,
)
else:
adapter_path_xl = get_instance_path(ip_model_path_xl)
image_encoder_path_xl = get_instance_path(
os.path.join(ip_path, "sdxl_models", "image_encoder", "model.safetensors"))
if not os.path.exists(ip_model_path_xl):
os.makedirs(ip_model_path_xl)
ip_model_path_dir = get_instance_path(os.path.join(ip_path, "sdxl_models", "image_encoder"))
if not os.path.exists(image_encoder_path_xl):
adapter_encoder_xl = hf_hub_download(
repo_id="h94/IP-Adapter",
subfolder="sdxl_models/image_encoder",
local_dir=ip_model_dir_origin,
)
else:
adapter_encoder_xl = get_instance_path(ip_model_path_dir)
model = IPAdapterXL(model, adapter_encoder_xl, adapter_path_xl, device,
target_blocks=["up_blocks.0.attentions.1"])
adapter_info = "ture"
elif model_type == "stable-diffusion-v1-5": # SD1.5 ip-adapter_sd15.bin
# sd1.5
ip_model_path = os.path.join(ip_path, "models", "ip-adapter_sd15.bin")
if not os.path.exists(ip_model_path):
adapter_path_sd = hf_hub_download(
repo_id="h94/IP-Adapter",
subfolder="models",
filename="ip-adapter_sd15.bin",
local_dir=ip_model_dir_origin,
)
else:
adapter_path_sd = get_instance_path(ip_model_path)
image_encoder_path = get_instance_path(
os.path.join(ip_path, "models", "image_encoder", "model.safetensors"))
ip_model_encoder_dir = get_instance_path(os.path.join(ip_path, "models", "image_encoder"))
if not os.path.exists(image_encoder_path):
adapter_encoder = hf_hub_download(
repo_id="h94/IP-Adapter",
subfolder="models/image_encoder",
filename="model.safetensors",
local_dir=ip_model_dir_origin,
)
else:
adapter_encoder = get_instance_path(ip_model_encoder_dir)
model = IPAdapter(model, adapter_encoder, adapter_path_sd, device, target_blocks=["block"])
adapter_info = "ture"
else:
adapter_info = "none"
torch.cuda.empty_cache()
torch.cuda.empty_cache()
model_info = ";".join([model_type, unet_model, control_model_type, function_choice,lora,trigger_words, adapter_info])
torch.cuda.empty_cache()
return (model, model_info,)
class Hi_Sampler:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"model": ("MODEL",),
"model_info": ("STRING", {"forceInput": True}),
"prompt": ("STRING", {"multiline": True,
"default": "a girl,8k,smile,best quality"}),
"negative_prompt": ("STRING", {"multiline": True,
"default": "text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry"}),
"controlnet_scale": ("FLOAT", {"default": 0.5, "min": 0.1, "max": 1.0, "step": 0.1}),
"clip_skip": ("INT", {"default": 1, "min": -5, "max": 100,"step": 1}),
"pre_input": ("INT", {"default": 512, "min": 256, "max": 1024, "step": 64}),
"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
"steps": ("INT", {"default": 30, "min": 1, "max": 10000}),
"cfg": ("FLOAT", {"default": 7.5, "min": 0.0, "max": 100.0, "step": 0.1, "round": 0.01}),
"width": ("INT", {"default": 2048, "min": 64, "max": 8192, "step": 64, "display": "number"}),
"height": ("INT", {"default": 2048, "min": 64, "max": 8192, "step": 64, "display": "number"}),
"adapter_scale": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.1,}),
},
"optional": {"image": ("IMAGE",),
"control_image": ("IMAGE",),
"ip_image": ("IMAGE",)}
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("image",)
FUNCTION = "hi_sampler"
CATEGORY = "Hidiffusion_Pro"
def hi_sampler(self, model, model_info, prompt, negative_prompt,controlnet_scale,clip_skip,pre_input,
seed,steps, cfg, width,height,adapter_scale,**kwargs):
model_type, unet_model, control_net, function_choice, lora, trigger_words, adapter_info = model_info.split(";")
# control_image = np.transpose(control_image, (
# # 0, 3, 1, 2)) # 将comfy输入的(batch_size,channels,rows,cols)改成条件需求的(3通道,16输出,3,1 ,pading=1)
if adapter_info!="none":
ip_image = kwargs.get("ip_image")
ip_image = input_size_adaptation_output(ip_image, pre_input, width, height)
if lora != "none":
prompt = prompt + " " + trigger_words
# print(model_type, unet_model, control_net, function_choice)
if control_net == "none":
if function_choice == "img2img":
image = kwargs.get("image")
image = input_size_adaptation_output(image, pre_input, width, height)
images = \
model.generate(prompt=prompt, negative_prompt=negative_prompt,pil_image=ip_image, image=image, scale=adapter_scale,num_inference_steps=steps,
guidance_scale=cfg, clip_skip=clip_skip,
height=height, width=width, seed=seed, )
else:
images = \
model.generate(pil_image=ip_image,prompt=prompt, negative_prompt=negative_prompt,scale=adapter_scale, num_inference_steps=steps,
guidance_scale=cfg, clip_skip=clip_skip,
height=height, width=width, seed=seed, )
else:
control_image = kwargs.get("control_image")
if "tile" in control_net:
control_image = input_size_adaptation_output(control_image, pre_input, width, height)
controlnet_img = cv2.cvtColor(np.asarray(control_image), cv2.COLOR_RGB2BGR)
new_height, new_width, _ = controlnet_img.shape
ratio = np.sqrt(1024. * 1024. / (new_width * new_height))
W, H = int(new_width * ratio), int(new_height * ratio)
crop_w, crop_h = 0, 0
controlnet_img = cv2.resize(controlnet_img, (W, H))
blur_strength = random.sample([i / 10. for i in range(10, 201, 2)], k=1)[0]
radius = random.sample([i for i in range(1, 40, 2)], k=1)[0]
eps = random.sample([i / 1000. for i in range(1, 101, 2)], k=1)[0]
scale_factor = random.sample([i / 10. for i in range(10, 181, 5)], k=1)[0]
if random.random() > 0.5:
controlnet_img = apply_gaussian_blur(controlnet_img, ksize=int(blur_strength),
sigmaX=blur_strength / 2)
if random.random() > 0.5:
# Apply Guided Filter
controlnet_img = apply_guided_filter(controlnet_img, radius, eps, scale_factor)
# Resize image
controlnet_img = cv2.resize(controlnet_img, (int(W / scale_factor), int(H / scale_factor)),
interpolation=cv2.INTER_AREA)
controlnet_img = cv2.resize(controlnet_img, (W, H), interpolation=cv2.INTER_CUBIC)
controlnet_img = cv2.cvtColor(controlnet_img, cv2.COLOR_BGR2RGB)
control_image = Image.fromarray(controlnet_img)
else:
control_image = input_size_adaptation_output(control_image, pre_input, width, height)
if function_choice == "img2img":
image = kwargs["image"]
image = input_size_adaptation_output(image, pre_input, width, height)
if control_net == "stable-diffusion-xl-1.0-inpainting-0.1":
images = model.generate(prompt=prompt, negative_prompt=negative_prompt, image=image,pil_image=ip_image, scale=adapter_scale,mask_image=control_image,
num_inference_steps=steps, guidance_scale=cfg, height=height, clip_skip=clip_skip,
width=width, controlnet_conditioning_scale=controlnet_scale,
seed=seed, )
else:
images = model.generate(prompt=prompt, negative_prompt=negative_prompt, image=image, pil_image=ip_image,scale=adapter_scale,control_image=control_image,
num_inference_steps=steps, guidance_scale=cfg, height=height, width=width,
clip_skip=clip_skip,
controlnet_conditioning_scale=controlnet_scale,
seed=seed, )
else:
images = model.generate(prompt=prompt, negative_prompt=negative_prompt, pil_image=ip_image,scale=adapter_scale,control_image=control_image,
num_inference_steps=steps, guidance_scale=cfg, height=height, width=width,
clip_skip=clip_skip,
controlnet_conditioning_scale=controlnet_scale,
seed=seed, )
images = images[0]
else:
if lora != "none":
prompt = prompt + " " + trigger_words
# print(model_type, unet_model, control_net, function_choice)
if control_net == "none":
if function_choice == "img2img":
image = kwargs["image"]
image = input_size_adaptation_output(image, pre_input, width, height)
images = \
model(prompt, negative_prompt=negative_prompt, image=image, num_inference_steps=steps,
guidance_scale=cfg, clip_skip=clip_skip,
height=height, width=width, seed=seed, ).images[0]
else:
images = \
model(prompt, negative_prompt=negative_prompt, num_inference_steps=steps,
guidance_scale=cfg, clip_skip=clip_skip,
height=height, width=width, seed=seed, ).images[0]
else:
control_image = kwargs["control_image"]
if "tile" in control_net:
control_image = input_size_adaptation_output(control_image, pre_input, width, height)
controlnet_img = cv2.cvtColor(np.asarray(control_image), cv2.COLOR_RGB2BGR)
new_height, new_width, _ = controlnet_img.shape
ratio = np.sqrt(1024. * 1024. / (new_width * new_height))
W, H = int(new_width * ratio), int(new_height * ratio)
crop_w, crop_h = 0, 0
controlnet_img = cv2.resize(controlnet_img, (W, H))
blur_strength = random.sample([i / 10. for i in range(10, 201, 2)], k=1)[0]
radius = random.sample([i for i in range(1, 40, 2)], k=1)[0]
eps = random.sample([i / 1000. for i in range(1, 101, 2)], k=1)[0]
scale_factor = random.sample([i / 10. for i in range(10, 181, 5)], k=1)[0]
if random.random() > 0.5:
controlnet_img = apply_gaussian_blur(controlnet_img, ksize=int(blur_strength),
sigmaX=blur_strength / 2)
if random.random() > 0.5:
# Apply Guided Filter
controlnet_img = apply_guided_filter(controlnet_img, radius, eps, scale_factor)
# Resize image
controlnet_img = cv2.resize(controlnet_img, (int(W / scale_factor), int(H / scale_factor)),
interpolation=cv2.INTER_AREA)
controlnet_img = cv2.resize(controlnet_img, (W, H), interpolation=cv2.INTER_CUBIC)
controlnet_img = cv2.cvtColor(controlnet_img, cv2.COLOR_BGR2RGB)
control_image = Image.fromarray(controlnet_img)
else:
control_image = input_size_adaptation_output(control_image, pre_input, width, height)
if function_choice == "img2img":
image = kwargs["image"]
image = input_size_adaptation_output(image, pre_input, width, height)
if control_net == "stable-diffusion-xl-1.0-inpainting-0.1":
print("controlnet inpainting")
images = \
model(prompt, negative_prompt=negative_prompt, image=image, mask_image=control_image,
num_inference_steps=steps, guidance_scale=cfg, height=height, clip_skip=clip_skip,
width=width, controlnet_conditioning_scale=controlnet_scale,
seed=seed, ).images[0]
else:
print("controlnet img2img")
images = model(prompt, negative_prompt=negative_prompt, image=image, control_image=control_image,
num_inference_steps=steps, guidance_scale=cfg, height=height, width=width,
clip_skip=clip_skip,
controlnet_conditioning_scale=controlnet_scale,
seed=seed, ).images[0]
else:
print("controlnet txt2img")
images = model(prompt,control_image=control_image, negative_prompt=negative_prompt,
num_inference_steps=steps, guidance_scale=cfg, height=height, width=width,
clip_skip=clip_skip,
controlnet_conditioning_scale=controlnet_scale,
seed=seed, ).images[0]
output_image = torch.from_numpy(np.array(images).astype(np.float32) / 255.0).unsqueeze(0)
if lora != "none":
if adapter_info=="none":
model.unfuse_lora()
torch.cuda.empty_cache()
return (output_image,)
NODE_CLASS_MAPPINGS = {
"HI_Diffusers_Model_Loader": HI_Diffusers_Model_Loader,
"Hi_Sampler": Hi_Sampler
}
NODE_DISPLAY_NAME_MAPPINGS = {
"HI_Diffusers_Model_Loader": "HI_Diffusers_Model_Loader",
"Hi_Hi_Sampler": "Hi_Sampler"
}