import modules.scripts as scripts import gradio as gr import io import json import matplotlib.pyplot as plt from PIL import Image import numpy as np import inspect import torch from modules import prompt_parser, devices, sd_samplers_common import re from modules.shared import opts, state import modules.shared as shared from modules.script_callbacks import CFGDenoiserParams, cfg_denoiser_callback from modules.script_callbacks import CFGDenoisedParams, cfg_denoised_callback from modules.script_callbacks import AfterCFGCallbackParams, cfg_after_cfg_callback import k_diffusion.utils as utils from k_diffusion.external import CompVisVDenoiser, CompVisDenoiser from modules.sd_samplers_timesteps import CompVisTimestepsDenoiser, CompVisTimestepsVDenoiser from modules.sd_samplers_cfg_denoiser import CFGDenoiser, catenate_conds, subscript_cond, pad_cond from modules import script_callbacks def CHGdenoiserConstruct(): CHGDenoiserStr = ''' class CHGDenoiser(CFGDenoiser): def __init__(self, sampler): super().__init__(sampler) ''' CHGDenoiserStr += inspect.getsource(CFGDenoiser.forward) hijack_breakpoints = ["\s+if shared.opts.batch_cond_uncond:", "\s+denoised_image_indexes = \[x\[0\]\[0\] for x in conds_list\]"] breakpoint1 = [m.start() for m in re.finditer(hijack_breakpoints[0], CHGDenoiserStr)] breakpoint2 = [m.start() for m in re.finditer(hijack_breakpoints[1], CHGDenoiserStr)] if len(breakpoint1) != 1 or len(breakpoint2) != 1: print( "Characteristic Guidance detected multiple hijack break point. This is caused by version incompatibility. Please report this issue." ) bp1 = breakpoint1[0] bp2 = breakpoint2[0] CHGDenoiserStr1 = CHGDenoiserStr[:bp1] CHGDenoiserStr2 = CHGDenoiserStr[bp1:bp2] CHGDenoiserStr3 = CHGDenoiserStr[bp2:] CHGhijackStr = """ if shared.opts.batch_cond_uncond: x_out = Chara_iteration(self, None, x_in, sigma_in, tensor, uncond, cond_scale, image_cond_in, is_edit_model, skip_uncond, make_condition_dict, shared.opts.batch_cond_uncond, batch_size, cond_in=cond_in, x_out = None) else: x_out = Chara_iteration(self, None, x_in, sigma_in, tensor, uncond, cond_scale, image_cond_in, is_edit_model, skip_uncond, make_condition_dict, shared.opts.batch_cond_uncond, batch_size, cond_in=cond_in, x_out = None) else: x_out = Chara_iteration(self, None, x_in, sigma_in, tensor, uncond, cond_scale, image_cond_in, is_edit_model, skip_uncond, make_condition_dict, shared.opts.batch_cond_uncond, batch_size, cond_in=None, x_out = None) """ CHGDenoiserStr = CHGDenoiserStr1+CHGhijackStr+CHGDenoiserStr3 return CHGDenoiserStr