| from modules.sd_samplers_kdiffusion import KDiffusionSampler |
| from modules import shared, scripts, script_callbacks |
| import gradio as gr |
|
|
| from scripts.cg_xyz import xyz_support |
|
|
| VERSION = "v1.1.0" |
|
|
| DYNAMIC_RANGE = [3.25, 2.5, 2.5, 2.5] |
|
|
| Default_LUTs = {"C": 0.01, "M": 0.5, "Y": -0.13, "K": 0} |
|
|
|
|
| def normalize_tensor(x, r): |
| X = x.detach().clone() |
|
|
| ratio = r / max(abs(float(X.min())), abs(float(X.max()))) |
| X *= max(ratio, 0.99) |
|
|
| return X |
|
|
|
|
| original_callback = KDiffusionSampler.callback_state |
|
|
|
|
| def center_callback(self, d): |
| if not self.diffcg_enable or getattr(self.p, "_ad_inner", False): |
| return original_callback(self, d) |
|
|
| X = d["denoised"].detach().clone() |
| batchSize = X.size(0) |
| channels = len(self.LUTs) |
|
|
| for b in range(batchSize): |
| for c in range(channels): |
|
|
| if self.diffcg_recenter_strength > 0.0: |
| d["denoised"][b][c] += ( |
| self.LUTs[c] - X[b][c].mean() |
| ) * self.diffcg_recenter_strength |
|
|
| if self.diffcg_normalize and (d["i"] + 1) > self.diffcg_last_step // 2: |
| d["denoised"][b][c] = normalize_tensor(X[b][c], DYNAMIC_RANGE[c]) |
|
|
| return original_callback(self, d) |
|
|
|
|
| KDiffusionSampler.callback_state = center_callback |
|
|
|
|
| |
| ac = getattr(shared.opts, "always_center", "None") |
| an = getattr(shared.opts, "always_normalize", "None") |
| def_sd = getattr(shared.opts, "default_arch", "1.5") |
| adv_opt = getattr(shared.opts, "show_center_opt", False) |
|
|
| c_t2i = ac in ("txt2img", "Both") |
| c_i2i = ac in ("img2img", "Both") |
| n_t2i = an in ("txt2img", "Both") |
| n_i2i = an in ("img2img", "Both") |
|
|
|
|
| class DiffusionCG(scripts.Script): |
| def __init__(self): |
| self.xyzCache = {} |
| xyz_support(self.xyzCache) |
|
|
| def title(self): |
| return "DiffusionCG" |
|
|
| def show(self, is_img2img): |
| return scripts.AlwaysVisible |
|
|
| def ui(self, is_img2img): |
| with gr.Accordion(f"Diffusion CG {VERSION}", open=False): |
| with gr.Row(): |
| enableG = gr.Checkbox( |
| label="Enable (Global)", |
| value=( |
| ((not is_img2img) and (c_t2i or n_t2i)) |
| or (is_img2img and (c_i2i or n_i2i)) |
| ), |
| ) |
| sd_ver = gr.Radio( |
| ["1.5", "XL"], value=def_sd, label="Stable Diffusion Version" |
| ) |
|
|
| with gr.Row(): |
| with gr.Group(): |
| gr.Markdown('<h3 align="center">Recenter</h3>') |
|
|
| if not is_img2img: |
| v = 1.0 if c_t2i else 0.0 |
| else: |
| v = 1.0 if c_i2i else 0.0 |
|
|
| rc_str = gr.Slider( |
| label="Effect Strength", |
| minimum=0.0, |
| maximum=1.0, |
| step=0.2, |
| value=v, |
| ) |
|
|
| with gr.Group(): |
| gr.Markdown('<h3 align="center">Normalization</h3>') |
| enableN = gr.Checkbox( |
| label="Activate", |
| value=(((not is_img2img) and n_t2i) or (is_img2img and n_i2i)), |
| ) |
|
|
| with gr.Accordion("Recenter Settings", visible=adv_opt, open=False): |
| with gr.Group(visible=(def_sd == "1.5")) as setting15: |
| C = gr.Slider( |
| label="C", |
| minimum=-1.00, |
| maximum=1.00, |
| step=0.01, |
| value=Default_LUTs["C"], |
| ) |
| M = gr.Slider( |
| label="M", |
| minimum=-1.00, |
| maximum=1.00, |
| step=0.01, |
| value=Default_LUTs["M"], |
| ) |
| Y = gr.Slider( |
| label="Y", |
| minimum=-1.00, |
| maximum=1.00, |
| step=0.01, |
| value=Default_LUTs["Y"], |
| ) |
| K = gr.Slider( |
| label="K", |
| minimum=-1.00, |
| maximum=1.00, |
| step=0.01, |
| value=Default_LUTs["K"], |
| ) |
|
|
| with gr.Group(visible=(def_sd == "XL")) as settingXL: |
| L = gr.Slider( |
| label="L", minimum=-1.00, maximum=1.00, step=0.01, value=0.0 |
| ) |
| a = gr.Slider( |
| label="a", minimum=-1.00, maximum=1.00, step=0.01, value=0.0 |
| ) |
| b = gr.Slider( |
| label="b", minimum=-1.00, maximum=1.00, step=0.01, value=0.0 |
| ) |
|
|
| def on_radio_change(choice): |
| if choice == "1.5": |
| return [ |
| gr.Group.update(visible=True), |
| gr.Group.update(visible=False), |
| ] |
| else: |
| return [ |
| gr.Group.update(visible=False), |
| gr.Group.update(visible=True), |
| ] |
|
|
| sd_ver.change(on_radio_change, sd_ver, [setting15, settingXL]) |
|
|
| self.paste_field_names = [ |
| (rc_str, "ReCenter Str"), |
| (enableN, "Normalization"), |
| (sd_ver, "SD_ver"), |
| ] |
| self.infotext_fields = [ |
| (rc_str, "ReCenter Str"), |
| (enableN, "Normalization"), |
| (sd_ver, "SD_ver"), |
| ] |
|
|
| if adv_opt: |
| self.paste_field_names += [ |
| ( |
| C, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[0]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| M, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[1]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| Y, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[2]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| K, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[3]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| L, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[0]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ( |
| a, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[1]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ( |
| b, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[2]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ] |
| self.infotext_fields += [ |
| ( |
| C, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[0]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| M, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[1]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| Y, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[2]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| K, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[3]) |
| if len(d.get("LUTs", "").split(",")) == 4 |
| else gr.update() |
| ), |
| ), |
| ( |
| L, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[0]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ( |
| a, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[1]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ( |
| b, |
| lambda d: ( |
| float(d["LUTs"].strip("[]").split(",")[2]) |
| if len(d.get("LUTs", "").split(",")) == 3 |
| else gr.update() |
| ), |
| ), |
| ] |
|
|
| for comp in [enableG, sd_ver, rc_str, enableN, C, M, Y, K, L, a, b]: |
| comp.do_not_save_to_config = True |
|
|
| return [enableG, sd_ver, rc_str, enableN, C, M, Y, K, L, a, b] |
|
|
| def before_hr(self, p, *args): |
| KDiffusionSampler.diffcg_normalize = False |
|
|
| def process( |
| self, |
| p, |
| enableG: bool, |
| sd_ver: str, |
| rc_str: float, |
| enableN: bool, |
| C: float, |
| M: float, |
| Y: float, |
| K: float, |
| L: float, |
| a: float, |
| b: float, |
| ): |
|
|
| if "enableG" in self.xyzCache.keys(): |
| enableG = self.xyzCache["enableG"].lower().strip() == "true" |
| del self.xyzCache["enableG"] |
|
|
| KDiffusionSampler.diffcg_enable = enableG |
| if not enableG: |
| if len(self.xyzCache.keys()) > 0: |
| print("\n[Diff. CG] X [X/Y/Z Plot] Extension is not Enabled!\n") |
| self.xyzCache.clear() |
| return p |
|
|
| if "rc_str" in self.xyzCache.keys(): |
| rc_str = float(self.xyzCache["rc_str"]) |
| if "enableN" in self.xyzCache.keys(): |
| enableN = self.xyzCache["enableN"].lower().strip() == "true" |
|
|
| if adv_opt: |
| C = self.xyzCache.get("C", C) |
| M = self.xyzCache.get("M", M) |
| Y = self.xyzCache.get("Y", Y) |
| K = self.xyzCache.get("K", K) |
| L = self.xyzCache.get("L", L) |
| a = self.xyzCache.get("a", a) |
| b = self.xyzCache.get("b", b) |
|
|
| if sd_ver == "1.5": |
| KDiffusionSampler.LUTs = [-K, -M, C, Y] |
| else: |
| KDiffusionSampler.LUTs = [L, -a, b] |
|
|
| KDiffusionSampler.diffcg_recenter_strength = rc_str |
| KDiffusionSampler.diffcg_normalize = enableN |
|
|
| if ( |
| not hasattr(p, "enable_hr") |
| and not shared.opts.img2img_fix_steps |
| and getattr(p, "denoising_strength", 1.0) < 1.0 |
| ): |
| KDiffusionSampler.diffcg_last_step = int(p.steps * p.denoising_strength) + 1 |
| else: |
| KDiffusionSampler.diffcg_last_step = p.steps |
|
|
| p.extra_generation_params.update( |
| { |
| "ReCenter Str": rc_str, |
| "Normalization": enableN, |
| "SD_ver": sd_ver, |
| } |
| ) |
|
|
| if adv_opt: |
| if def_sd == "1.5": |
| p.extra_generation_params["LUTs"] = f"[{C}, {M}, {Y}, {K}]" |
| else: |
| p.extra_generation_params["LUTs"] = f"[{L}, {a}, {b}]" |
|
|
| self.xyzCache.clear() |
|
|
|
|
| def restore_callback(): |
| KDiffusionSampler.callback_state = original_callback |
|
|
|
|
| script_callbacks.on_script_unloaded(restore_callback) |
|
|