diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..39e8d884f7faacfee085b4968b0e6ab1ad8f2fd2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +extensions/sd-webui-vectorscope-cc/samples/scaling.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/config.json b/config.json new file mode 100644 index 0000000000000000000000000000000000000000..41c4ae59b135ad72a65e1eeec5cfa4f4b75fa084 --- /dev/null +++ b/config.json @@ -0,0 +1,14 @@ +{ + "sd_checkpoint_hash": "c87b5758c5319c1d30190b576a43f248fea100eb07553c1f79cedc4da94d1e52", + "sd_model_checkpoint": "ntrMIXIllustriousXL_v21.safetensors [c87b5758c5]", + "CLIP_stop_at_last_layers": 2, + "samples_format": "webp", + "grid_format": "webp", + "sd_vae": "sdxl_vae.safetensors", + "quicksettings_list": [ + "sd_model_checkpoint", + "skip_early_cond" + ], + "randn_source": "NV", + "emphasis": "No norm" +} \ No newline at end of file diff --git a/extensions/a.txt b/extensions/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-detail-daemon/.gitattributes b/extensions/sd-webui-detail-daemon/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..f13e053bf0ebf99d69b8e28c0f02eb346dcfe15e --- /dev/null +++ b/extensions/sd-webui-detail-daemon/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/extensions/sd-webui-detail-daemon/.gitignore b/extensions/sd-webui-detail-daemon/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..58200d4d732e9786e50a0cf3f6f8c4e8bb6b820e --- /dev/null +++ b/extensions/sd-webui-detail-daemon/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/extensions/sd-webui-detail-daemon/LICENSE b/extensions/sd-webui-detail-daemon/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..c378f9f37f5c3175db474ea1f637d009576c5fe3 --- /dev/null +++ b/extensions/sd-webui-detail-daemon/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Sahand Ahmadian + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/sd-webui-detail-daemon/README.md b/extensions/sd-webui-detail-daemon/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5efbbc3d6da737791a5ec5df80ae35ca77ffb5ba --- /dev/null +++ b/extensions/sd-webui-detail-daemon/README.md @@ -0,0 +1,82 @@ +# Detail Daemon +This is an extension for [Stable Diffusion Web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui), which allows users to adjust the amount of detail/smoothness in an image, during the sampling steps. + +It uses no LORAs, ControlNets, etc., and as a result its performance is not biased towards any certain style and it introduces no new stylistic or semantic features of its own into the generation. This also means that it can work with any model and on any type of image. + +*Model: SSD-1B*
+![a close up portrait of a cyberpunk knight-1Lv-0](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/561c33d9-9a5d-4cfc-bee8-de9126b280c1) +*Left: Less detail, Middle: Original, Right: More detail*
+ +*Model: SD 1.5 (finetuned)*
+![face of a cute cat love heart symbol-Zn6-0](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/9fbfb39f-81fb-4951-8f32-20eab410020a) +*Left: Less detail, Middle: Original, Right: More detail*
+ + +## How It Works +Detail Daemon works by manipulating the original noise levels at every sampling step, according to a customizable schedule. + +### In Theory +The noise levels (sigmas, i.e. the standard deviation of the noise) tell the model how much noise it should expect, and try to remove, at each denoising step. A higher sigma value at a certain denoising step tells the model to denoise more aggressively at that step and vice versa. + +With a common sigmas schedule, the sigmas start at very high values at the beginning of the denoising process, then quickly fall to low values in the middle, and to very low values towards the end of the process. This curve (along with the timesteps schedule, but that's a story for another day) is what makes it so that larger features (low frequencies) of the image are defined at the earlier steps, and towards the end of the process you can only see minor changes in the smaller features (high frequencies). We'll get back to this later. + +Now, if we pass the model a sigmas schedule with values lower than the original, at each step the model will denoise less, resulting a noisier output latent at that step. But then in the steps after that, the model does its best to make sense of this extra noise and turn it into image features. So in theory, *when done in modesty*, this would result in a more detailed image. If you push it too hard, the model won't be able to handle the extra noise added at each step and the end result will devolve into pure noise. So modesty is key. + +### But in Practice +Modesty only gets you so far! Also, wtf are those? As the examples below show, you can't really add that much detail to the image before it either breaks down, and/or becomes a totally different thing. + +*SD 1.5*
+![Modesty](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/2f011a28-0948-48f8-b171-350add6fdd67) +Original sigmas (left) multiplied by .9, .85, .8
+ +*SDXL*
+![1](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/eff2356e-a6dd-4a4e-9c7e-861dec7713eb) +Original sigmas (left) multiplied by .95, .9, .85, .875, .8
+ +That's because: +1. We're constantly adding noise and not giving the model enough time to deal with it +2. We are manipulating the early steps where the low frequency features of the image (color, composition, etc.) are defined + +### Enter the Schedule +What we usually mean by "detail" falls within the mid to high frequency range, which correspond to the middle to late steps in the sampling process. So if we skip the early steps to leave the main features of the image intact, and the late steps to give the model some time to turn the extra noise into useful detail, we'll have something like this: + +![3](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/cd47e882-8b56-4321-8c47-c0d689562780) + +Then we could make our schedule a bit fancier and have it target specific steps corresponding to different sized details: + +![4](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/ea5027d2-3359-4733-afb4-5ae4a1218f38) + +Which steps correspond to which exact frequency range depends on the model you're using, the sampler, your prompt (specially if you're using Prompt Editing and stuff), and probably a bunch of other things. There are also fancier things you can (and should) do with the schedule, like pushing the sigmas too low for some heavy extra noise and then too high to clean up the excess and leave some nice details. So you need to do some tweaking to figure out the best schedule for each image you generate, or at least the ones that need their level of detail adjusted. But ideally you should be spending countless hours of your life sculpting the perfect detail adjustment schedule for every image, cuz that's why we're here. + +I'll soon provide specific examples addressing different scenarios and some of the techniques I've come up with. (note to self: move these to the wiki page) + +## Installation +Open SD WebUI > Go to Extensions tab > Go to Available tab > Click Load from: > Find Detail Daemon > Click Install + +Or Go to Install from URL tab > Paste this repo's URL into the first field > Click Install + +Or go to your WebUI folder and manually clone this repo into your extensions folder: + +`git clone "https://github.com/muerrilla/sd-webui-detail-daemon" extensions/sd-webui-detail-daemon` + +## Getting Started +After installation you can find the extension in your txt2img and img2img tabs. +![2024-07-08 01_43_21-011366](https://github.com/muerrilla/sd-webui-detail-daemon/assets/48160881/045574cb-465c-4991-83c4-d02f803a330b) +### Sliders: +The sliders (and that one checkbox) set the amount of adjustment (positive values → add detail, negative values → remove detail) and the sampling steps during which it is applied (i.e. the schedule). So the X axis of the graph is your sampling steps, normalized to the (0,1) range, and the Y axis is the amount of adjustment. The rest is pretty self-explanatory I think. Just drag things and look at the graph for changes. +### Numbers: +The three number inputs at the buttom are provided because sometimes the slider max/mins are too limiting. +### Modes: +The `cond` and `uncond` modes affect only their respective latents, while `both` affects both (duh!). The `cond` and `uncond` modes are less intense and also allow changes to be applied at earlier steps without diverging too far from the original generation, since the other latent stays intact. + +There's also a minor twist: in the `both` mode if `detail amount` is positive both cond and uncond latents become more detailed. So the more detailed cond latent will try to push the generation towards more detail, while the more detailed uncond latent will try to push towards less detail. This causes more new features/artifacts to pop into the image in this mode. + +### Tips: +I'll write up some proper docs on how best to set the parameters, as soon as possible. For now you gotta play around with the sliders and figure out how the shape of the schedule affects the image. I suggest you set your live preview update period to every frame, or every other frame, so you could see clearly what's going on at every step of the sampling process and how Detail Daemon affects it, till you get a good grasp of how this thing works. + +## Notes: +- Doesn't support Compositional Diffusion (i.e. the AND syntax) properly. Specially if you have a batch size > 1 or negative weights in your prompts, and the mode is set to `cond` or `uncond`. +- It's probably impossible to use or very hard to control with few-step models (Turbo, Lightning, etc.). Edit: It's managable. +- It works with Forge (`cond` and `uncond` modes are not supported). +- It's not the same as AlignYourSteps, FreeU, etc. +- It is similar (in what it sets out to do, not in how it does it) to the [ReSharpen Extension](https://github.com/Haoming02/sd-webui-resharpen) by Haoming. diff --git a/extensions/sd-webui-detail-daemon/a.txt b/extensions/sd-webui-detail-daemon/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-detail-daemon/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-detail-daemon/scripts/__pycache__/a.txt b/extensions/sd-webui-detail-daemon/scripts/__pycache__/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-detail-daemon/scripts/__pycache__/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-detail-daemon/scripts/__pycache__/detail_daemon.cpython-310.pyc b/extensions/sd-webui-detail-daemon/scripts/__pycache__/detail_daemon.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89fba1d459e140b765c306ab978a1f4c2005e8ba Binary files /dev/null and b/extensions/sd-webui-detail-daemon/scripts/__pycache__/detail_daemon.cpython-310.pyc differ diff --git a/extensions/sd-webui-detail-daemon/scripts/a.txt b/extensions/sd-webui-detail-daemon/scripts/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-detail-daemon/scripts/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-detail-daemon/scripts/detail_daemon.py b/extensions/sd-webui-detail-daemon/scripts/detail_daemon.py new file mode 100644 index 0000000000000000000000000000000000000000..d31b2b539d20c3fa8e6dfc182c96f4ae637c09c8 --- /dev/null +++ b/extensions/sd-webui-detail-daemon/scripts/detail_daemon.py @@ -0,0 +1,313 @@ +import os +import gradio as gr +import numpy as np +from tqdm import tqdm + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt + +import modules.scripts as scripts +from modules.script_callbacks import on_cfg_denoiser, remove_callbacks_for_function, on_infotext_pasted +from modules.ui_components import InputAccordion + + +def parse_infotext(infotext, params): + try: + d = {} + for s in params['Detail Daemon'].split(','): + k, _, v = s.partition(':') + d[k.strip()] = v.strip() + params['Detail Daemon'] = d + except Exception: + pass + + +on_infotext_pasted(parse_infotext) + + +class Script(scripts.Script): + + def title(self): + return "Detail Daemon" + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def ui(self, is_img2img): + with InputAccordion(False, label="Detail Daemon", elem_id=self.elem_id('detail-daemon')) as gr_enabled: + with gr.Row(): + with gr.Column(scale=2): + gr_amount_slider = gr.Slider(minimum=-1.00, maximum=1.00, step=.01, value=0.10, label="Detail Amount") + gr_start = gr.Slider(minimum=0.0, maximum=1.0, step=.01, value=0.2, label="Start") + gr_end = gr.Slider(minimum=0.0, maximum=1.0, step=.01, value=0.8, label="End") + gr_bias = gr.Slider(minimum=0.0, maximum=1.0, step=.01, value=0.5, label="Bias") + with gr.Column(scale=1, min_width=275): + preview = self.visualize(False, 0.2, 0.8, 0.5, 0.1, 1, 0, 0, 0, True) + gr_vis = gr.Plot(value=preview, elem_classes=['detail-daemon-vis'], show_label=False) + with gr.Accordion("More Knobs:", elem_classes=['detail-daemon-more-accordion'], open=False): + with gr.Row(): + with gr.Column(scale=2): + with gr.Row(): + gr_start_offset_slider = gr.Slider(minimum=-1.00, maximum=1.00, step=.01, value=0.00, label="Start Offset", min_width=60) + gr_end_offset_slider = gr.Slider(minimum=-1.00, maximum=1.00, step=.01, value=0.00, label="End Offset", min_width=60) + with gr.Row(): + gr_exponent = gr.Slider(minimum=0.0, maximum=10.0, step=.05, value=1.0, label="Exponent", min_width=60) + gr_fade = gr.Slider(minimum=0.0, maximum=1.0, step=.05, value=0.0, label="Fade", min_width=60) + # Because the slider max and min are sometimes too limiting: + with gr.Row(): + gr_amount = gr.Number(value=0.10, precision=4, step=.01, label="Amount", min_width=60) + gr_start_offset = gr.Number(value=0.0, precision=4, step=.01, label="Start Offset", min_width=60) + gr_end_offset = gr.Number(value=0.0, precision=4, step=.01, label="End Offset", min_width=60) + with gr.Column(scale=1, min_width=275): + gr_mode = gr.Dropdown(["both", "cond", "uncond"], value="uncond", label="Mode", show_label=True, min_width=60, elem_classes=['detail-daemon-mode']) + gr_smooth = gr.Checkbox(label="Smooth", value=True, min_width=60, elem_classes=['detail-daemon-smooth']) + gr.Markdown("## [Ⓗ Help](https://github.com/muerrilla/sd-webui-detail-daemon)", elem_classes=['detail-daemon-help']) + + gr_amount_slider.release(None, gr_amount_slider, gr_amount, _js="(x) => x") + gr_amount.change(None, gr_amount, gr_amount_slider, _js="(x) => x") + + gr_start_offset_slider.release(None, gr_start_offset_slider, gr_start_offset, _js="(x) => x") + gr_start_offset.change(None, gr_start_offset, gr_start_offset_slider, _js="(x) => x") + + gr_end_offset_slider.release(None, gr_end_offset_slider, gr_end_offset, _js="(x) => x") + gr_end_offset.change(None, gr_end_offset, gr_end_offset_slider, _js="(x) => x") + + vis_args = [gr_enabled, gr_start, gr_end, gr_bias, gr_amount, gr_exponent, gr_start_offset, gr_end_offset, gr_fade, gr_smooth] + for vis_arg in vis_args: + if isinstance(vis_arg, gr.components.Slider): + vis_arg.release(fn=self.visualize, show_progress=False, inputs=vis_args, outputs=[gr_vis]) + else: + vis_arg.change(fn=self.visualize, show_progress=False, inputs=vis_args, outputs=[gr_vis]) + + def extract_infotext(d: dict, key, old_key): + if 'Detail Daemon' in d: + return d['Detail Daemon'].get(key) + return d.get(old_key) + + self.infotext_fields = [ + (gr_enabled, lambda d: True if ('Detail Daemon' in d or 'DD_enabled' in d) else False), + (gr_mode, lambda d: extract_infotext(d, 'mode', 'DD_mode')), + (gr_amount, lambda d: extract_infotext(d, 'amount', 'DD_amount')), + (gr_start, lambda d: extract_infotext(d, 'st', 'DD_start')), + (gr_end, lambda d: extract_infotext(d, 'ed', 'DD_end')), + (gr_bias, lambda d: extract_infotext(d, 'bias', 'DD_bias')), + (gr_exponent, lambda d: extract_infotext(d, 'exp', 'DD_exponent')), + (gr_start_offset, lambda d: extract_infotext(d, 'st_offset', 'DD_start_offset')), + (gr_end_offset, lambda d: extract_infotext(d, 'ed_offset', 'DD_end_offset')), + (gr_fade, lambda d: extract_infotext(d, 'fade', 'DD_fade')), + (gr_smooth, lambda d: extract_infotext(d, 'smooth', 'DD_smooth')), + ] + return [gr_enabled, gr_mode, gr_start, gr_end, gr_bias, gr_amount, gr_exponent, gr_start_offset, gr_end_offset, gr_fade, gr_smooth] + + def process(self, p, enabled, mode, start, end, bias, amount, exponent, start_offset, end_offset, fade, smooth): + + enabled = getattr(p, "DD_enabled", enabled) + mode = getattr(p, "DD_mode", mode) + amount = getattr(p, "DD_amount", amount) + start = getattr(p, "DD_start", start) + end = getattr(p, "DD_end", end) + bias = getattr(p, "DD_bias", bias) + exponent = getattr(p, "DD_exponent", exponent) + start_offset = getattr(p, "DD_start_offset", start_offset) + end_offset = getattr(p, "DD_end_offset", end_offset) + fade = getattr(p, "DD_fade", fade) + smooth = getattr(p, "DD_smooth", smooth) + + if enabled: + if p.sampler_name == "DPM adaptive": + tqdm.write(f'\033[33mWARNING:\033[0m Detail Daemon does not work with {p.sampler_name}') + return + # Restart can be handled better, later maybe + + actual_steps = (p.steps * 2 - 1) if p.sampler_name in ['DPM++ SDE', 'DPM++ 2S a', 'Heun', 'DPM2', 'DPM2 a', 'Restart'] else p.steps + self.schedule = self.make_schedule(actual_steps, start, end, bias, amount, exponent, start_offset, end_offset, fade, smooth) + self.mode = mode + self.cfg_scale = p.cfg_scale + self.batch_size = p.batch_size + on_cfg_denoiser(self.denoiser_callback) + self.callback_added = True + p.extra_generation_params['Detail Daemon'] = f'mode:{mode},amount:{amount},st:{start},ed:{end},bias:{bias},exp:{exponent},st_offset:{start_offset},ed_offset:{end_offset},fade:{fade},smooth:{1 if smooth else 0}' + tqdm.write('\033[32mINFO:\033[0m Detail Daemon is enabled') + else: + if hasattr(self, 'callback_added'): + remove_callbacks_for_function(self.denoiser_callback) + delattr(self, 'callback_added') + # tqdm.write('\033[90mINFO: Detail Daemon callback removed\033[0m') + + def before_process_batch(self, p, *args, **kwargs): + self.is_hires = False + + def postprocess(self, p, processed, *args): + if hasattr(self, 'callback_added'): + remove_callbacks_for_function(self.denoiser_callback) + delattr(self, 'callback_added') + # tqdm.write('\033[90mINFO: Detail Daemon callback removed\033[0m') + + def before_hr(self, p, *args): + self.is_hires = True + enabled = args[0] + if enabled: + tqdm.write(f'\033[33mINFO:\033[0m Detail Daemon does not work during Hires Fix') + + def denoiser_callback(self, params): + if self.is_hires: + return + idx = params.denoiser.step + multiplier = self.schedule[idx] * .1 + mode = self.mode + if params.sigma.size(0) == 1: + mode = "both" + if idx == 0: + tqdm.write(f'\033[33mWARNING:\033[0m Forge does not support `cond` and `uncond` modes, using `both` instead') + if mode == "cond": + for i in range(self.batch_size): + params.sigma[i] *= 1 - multiplier + elif mode == "uncond": + for i in range(self.batch_size): + params.sigma[self.batch_size + i] *= 1 + multiplier + else: + params.sigma *= 1 - multiplier * self.cfg_scale + + def make_schedule(self, steps, start, end, bias, amount, exponent, start_offset, end_offset, fade, smooth): + start = min(start, end) + mid = start + bias * (end - start) + multipliers = np.zeros(steps) + + start_idx, mid_idx, end_idx = [int(round(x * (steps - 1))) for x in [start, mid, end]] + + start_values = np.linspace(0, 1, mid_idx - start_idx + 1) + if smooth: + start_values = 0.5 * (1 - np.cos(start_values * np.pi)) + start_values = start_values ** exponent + if start_values.any(): + start_values *= (amount - start_offset) + start_values += start_offset + + end_values = np.linspace(1, 0, end_idx - mid_idx + 1) + if smooth: + end_values = 0.5 * (1 - np.cos(end_values * np.pi)) + end_values = end_values ** exponent + if end_values.any(): + end_values *= (amount - end_offset) + end_values += end_offset + + multipliers[start_idx:mid_idx+1] = start_values + multipliers[mid_idx:end_idx+1] = end_values + multipliers[:start_idx] = start_offset + multipliers[end_idx+1:] = end_offset + multipliers *= 1 - fade + + return multipliers + + def visualize(self, enabled, start, end, bias, amount, exponent, start_offset, end_offset, fade, smooth): + try: + steps = 50 + values = self.make_schedule(steps, start, end, bias, amount, exponent, start_offset, end_offset, fade, smooth) + mean = sum(values)/steps + peak = np.clip(max(abs(values)), -1, 1) + if start > end: + start = end + mid = start + bias * (end - start) + opacity = .1 + (1 - fade) * 0.7 + plot_color = (0.5, 0.5, 0.5, opacity) if not enabled else ((1 - peak)**2, 1, 0, opacity) if mean >= 0 else (1, (1 - peak)**2, 0, opacity) + plt.rcParams.update({ + "text.color": plot_color, + "axes.labelcolor": plot_color, + "axes.edgecolor": plot_color, + "figure.facecolor": (0.0, 0.0, 0.0, 0.0), + "axes.facecolor": (0.0, 0.0, 0.0, 0.0), + "ytick.labelsize": 6, + "ytick.labelcolor": plot_color, + "ytick.color": plot_color, + }) + fig, ax = plt.subplots(figsize=(2.15, 2.00), layout="constrained") + ax.plot(range(steps), values, color=plot_color) + ax.axhline(y=0, color=plot_color, linestyle='dotted') + ax.axvline(x=mid * (steps - 1), color=plot_color, linestyle='dotted') + ax.tick_params(right=False, color=plot_color) + ax.set_xticks([i * (steps - 1) / 10 for i in range(10)][1:]) + ax.set_xticklabels([]) + ax.set_ylim([-1, 1]) + ax.set_xlim([0, steps-1]) + plt.close() + self.last_vis = fig + return fig + except Exception: + if self.last_vis is not None: + return self.last_vis + return + + +def xyz_support(): + for scriptDataTuple in scripts.scripts_data: + if os.path.basename(scriptDataTuple.path) == 'xyz_grid.py': + xy_grid = scriptDataTuple.module + + def confirm_mode(p, xs): + for x in xs: + if x not in ['both', 'cond', 'uncond']: + raise RuntimeError(f'Invalid Detail Daemon Mode: {x}') + mode = xy_grid.AxisOption( + '[Detail Daemon] Mode', + str, + xy_grid.apply_field('DD_mode'), + confirm=confirm_mode + ) + amount = xy_grid.AxisOption( + '[Detail Daemon] Amount', + float, + xy_grid.apply_field('DD_amount') + ) + start = xy_grid.AxisOption( + '[Detail Daemon] Start', + float, + xy_grid.apply_field('DD_start') + ) + end = xy_grid.AxisOption( + '[Detail Daemon] End', + float, + xy_grid.apply_field('DD_end') + ) + bias = xy_grid.AxisOption( + '[Detail Daemon] Bias', + float, + xy_grid.apply_field('DD_bias') + ) + exponent = xy_grid.AxisOption( + '[Detail Daemon] Exponent', + float, + xy_grid.apply_field('DD_exponent') + ) + start_offset = xy_grid.AxisOption( + '[Detail Daemon] Start Offset', + float, + xy_grid.apply_field('DD_start_offset') + ) + end_offset = xy_grid.AxisOption( + '[Detail Daemon] End Offset', + float, + xy_grid.apply_field('DD_end_offset') + ) + fade = xy_grid.AxisOption( + '[Detail Daemon] Fade', + float, + xy_grid.apply_field('DD_fade') + ) + xy_grid.axis_options.extend([ + mode, + amount, + start, + end, + bias, + exponent, + start_offset, + end_offset, + fade, + ]) + + +try: + xyz_support() +except Exception as e: + print(f'Error trying to add XYZ plot options for Detail Daemon', e) diff --git a/extensions/sd-webui-detail-daemon/style.css b/extensions/sd-webui-detail-daemon/style.css new file mode 100644 index 0000000000000000000000000000000000000000..9f1d073f448c887e9171172ac496dddd9f9e7d14 --- /dev/null +++ b/extensions/sd-webui-detail-daemon/style.css @@ -0,0 +1,20 @@ +.detail-daemon-more-accordion { + margin-top: 1em !important; +} + +.detail-daemon-mode { + margin-left: 3em !important; + width: 75% !important; +} + +.detail-daemon-smooth { + margin-left: 3em !important; +} + +.detail-daemon-vis { + margin: auto !important; +} + +.detail-daemon-help { + margin: auto 1.5em !important; +} diff --git a/extensions/sd-webui-vectorscope-cc/.github/FUNDING.yml b/extensions/sd-webui-vectorscope-cc/.github/FUNDING.yml new file mode 100644 index 0000000000000000000000000000000000000000..a31919098aad0871877d59d66e8c7a496b111fec --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: haoming diff --git a/extensions/sd-webui-vectorscope-cc/.github/a.txt b/extensions/sd-webui-vectorscope-cc/.github/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/.github/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/.gitignore b/extensions/sd-webui-vectorscope-cc/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ccf5d0f5222e392d031b500f890a6e6b1f40460c --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +styles.json diff --git a/extensions/sd-webui-vectorscope-cc/CHANGELOG.md b/extensions/sd-webui-vectorscope-cc/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..4466d58713ab8a4fc5254ebf87544d3f8faf49b0 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/CHANGELOG.md @@ -0,0 +1,145 @@ +### v2.3.2 - 2024 Nov.06 +- Linting *(`internal`)* + +### v2.3.1 - 2024 Nov.04 +- Implement **Range** Settings + +### v2.3.0 - 2024 Sep.20 +- Refactor + +### v2.2.6 - 2024 Sep.18 +- Allow disabling `do_not_save_to_config` to use **Defaults** + +### v2.2.5 - 2024 Aug.30 +- Correct Y'CbCr **Conversion**? + +### v2.2.4 - 2024 Aug.28 +- Optimization *(`internal`)* +- Improve Color **Accuracy** ~~Slightly~~ + +### v2.2.3 - 2024 Aug.27 +- Lib *(`internal`)* + +### v2.2.2 - 2024 Aug.27 +- Fix **Color Picker** for Gradio **4** + +### v2.2.1 - 2024 Aug.02 +- `@torch.inference_mode()` + +### v2.2.0 - 2024 Jul.03 +- Add `Adv.` in **Styles Presets** +- Improve **Consts** Logics *(`internal`)* + +### v2.1.0 - 2024 Jul.03 +- Support **Randomize** Forever + +### v2.0.3 - 2024 Jun.25 +- Format + +### v2.0.2 - 2024 Jun.24 +- Bug Fix + +### v2.0.1 - 2024 Mar.07 +- Support **ADetailer** + +### v2.0.0 - 2024 Mar.05 +- Improved Logics + +### v2.0.epsilon - 2024 Mar.04 +- Improved Logics + +### v2.0.delta - 2024 Mar.04 +- Support **SDXL** + +### v2.0.gamma - 2024 Mar.01 +- Major **Rewrite** & **Optimization** + +### v2.0.beta - 2024 Feb.29 +- Revert Sampler **Hook** *(`internal`)* + +### v2.0.alpha - 2024 Feb.29 +- Changed Sampler **Hook** *(`internal`)* +- Removed **LFS** *(`GitHub`)* + +### v1.5.1 - 2023 Dec.03 +- Bug Fix by. **catboxanon** + +### v1.5.0 - 2023 Nov.08 +- Rewrote **Callback** logic *(`internal`)* + +### v1.4.10 - 2023 Nov.01 +- Better **Hires. fix** logic + +### v1.4.9 - 2023 Nov.01 +- Improve Sliders values refresh + +### v1.4.8 - 2023 Nov.01 +- Removed "**magic numbers**" + +### v1.4.7 - 2023 Nov.01 +- Removed **Skip** parameter + +### v1.4.6 - 2023 Sep.19 +- Add **HDR** Script + +### v1.4.5 - 2023 Sep.13 +- Bug Fix for Color Wheel in `img2img` +- Minor Formatting + +### v1.4.4 - 2023 Sep.13 +- Add **Infotext** Support by. **catboxanon** + +### v1.4.3 - 2023 Sep.13 +- Improve **Color Wheel** Functionality by. **catboxanon** + +### v1.4.2 - 2023 Sep.11 +- Fix the Reset and Randomize buttons for the new Contrast algorithm + +### v1.4.1 - 2023 Sep.11 +- New **Contrast** algorithm + +### v1.4.0 - 2023 Jul.11 +- Implement **Scaling** algorithm + +### v1.3.5 - 2023 Jul.11 +- Implement **Color Picker** + +### v1.3.4 - 2023 Jul.08 +- Implement **Metadata** + +### v1.3.3 - 2023 Jul.07 +- Color Wheel now works at (0, 0, 0) +- Style/Randomize/Reset now updates Color Wheel + +### v1.3.2 - 2023 Jul.07 +- Implement **Color Wheel** +- Finally added `changelog` + +### v1.3.1 - 2023 Jul.06 +- Bug Fix + +### v1.3.0 - 2023 Jul.06 +- Implement **Style Presets** +- Separate logics into different scripts + +### v1.2.1 - 2023 Jul.05 +- Add **Randomize** function +- Add **Reset** function + +### v1.2.0 - 2023 Jul.03 +- Implement multiple **Noise** algorithms + +### v1.1.3 - 2023 Jun.26 +- Automatically refresh outdated Sliders values + +### v1.1.2 - 2023 Jun.23 +- Bug Fix + +### v1.1.1 - 2023 Jun.22 +- **Batch** Support + +### v1.1.0 - 2023 Jun.21 +- **X/Y/Z Plot** Support + +### v1.0.0 - 2023 Jun.20 +- Extension **Released**! \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/LICENSE b/extensions/sd-webui-vectorscope-cc/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a484656feb8c87f7173f1c93174071825ad9bb38 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Haoming + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/sd-webui-vectorscope-cc/README.md b/extensions/sd-webui-vectorscope-cc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d5034e481fcd84ec1f9ab6f1dabfac8ef5193932 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/README.md @@ -0,0 +1,375 @@ +# SD Webui Vectorscope CC +This is an Extension for the [Automatic1111 Webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui), which performs a kind of **Offset Noise** natively during inference, allowing you to adjust the brightness, contrast, and color of the generations. + +> Also supports both old & new [Forge](https://github.com/lllyasviel/stable-diffusion-webui-forge) + +## Example Images + +

+
+Base Image w/o Extension +

+ +
+Infotext + +- **Checkpoint:** [realisticVisionV51](https://civitai.com/models/4201?modelVersionId=130072) +- **Positive Prompt:** `(high quality, best quality), a 4k cinematic photo of a gentleman in suit, street in a city at night, (depth of field, bokeh)` +- **Negative Prompt:** `(low quality, worst quality:1.2), [EasyNegative, EasyNegativeV2]` + +```cpp +Steps: 32, Sampler: DPM++ 2M Karras, CFG scale: 7.5, Seed: 3709157017, Size: 512x512, Denoising strength: 0.5 +Clip skip: 2, Token merging ratio: 0.2, Token merging ratio hr: 0.2, RNG: CPU, NGMS: 4 +Hires upscale: 2, Hires steps: 16, Hires upscaler: 2xNomosUni_esrgan_multijpg +``` + +
+ + + + + + + + + + + + + + + + + + + + + +
VibrantCold"Movie when Mexico"
+
    +
  • Alt: True
  • +
  • Saturation: 1.75
  • +
  • Noise: Ones
  • +
  • Scaling: 1 - Cos
  • +
+
+
    +
  • Brightness: -5.0
  • +
  • Contrast: 2.5
  • +
  • Saturation: 0.75
  • +
  • R: -3.0
  • +
  • B: 3.0
  • +
  • Noise: Ones
  • +
  • Scaling: 1 - Sin
  • +
+
+
    +
  • Brightness: 2.5
  • +
  • Contrast: -2.5
  • +
  • Saturation: 1.25
  • +
  • R: 1.5
  • +
  • G: 3.0
  • +
  • B: -4.0
  • +
  • Noise: Ones
  • +
  • Scaling: 1 - Sin
  • +
+
+ +## How to Use + +> **Note:** Since this Extension modifies the underlying latent tensor, the composition may change drastically depending on the parameters + +### Basic Parameters + +- **Enable:** Enable the Extension 💀 +- **Alt:** Cause the Extension effects to be stronger + +
+ Technical Detail + + - This parameter makes the Extension modify the `denoised` Tensor instead of the `x` Tensor + +
+ +- **Brightness**, **Contrast**, **Saturation**: Adjust the overall `brightness` / `contrast` / `saturation` of the image + +#### Color Channels + + + + + + + + + + + + + + + + + + + + + + + + + + +
ChannelLowerHigher
RCyanRed
GMagentaGreen
BYellowBlue
+ +- The Extension also comes with a Color Wheel for visualization, which you can also click on to pick a color directly + +> The color picker isn't 100% accurate due to multiple layers of conversions... + +#### Style Presets +- To apply a Style, select from the `Dropdown` then click **Apply Style** +- To save a Style, enter a name in the `Textbox` then click **Save Style** +- To delete a Style, enter the name in the `Textbox` then click **Delete Style** + - *Style that was deleted is still in the `styles.json` in case you wish to retrieve it* +- Click **Refresh Style** to update the `Dropdown` if you edited the `styles.json` manually + +
+ You can also find pre-made Styles by the community available online
+ +
+ +### Advanced Parameters + +- **Process Hires. fix:** Enable this option to process during the **Hires. fix** phase too + - By default, this Extension only functions during the regular phase of the `txt2img` mode +- **Process ADetailer:** Enable this option to process during the **[ADetailer](https://github.com/Bing-su/adetailer)** phase too + - Will usually cause a square of inconsistent colors +- **Randomize using Seed:** Enable this option to use the current generation `seed` to randomize the basic parameters + - Randomized results will be printed in the console + +#### Noise Settings +> let **`x`** denote the latent Tensor ; let **`y`** denote the operations + +- **Straight:** All operations are calculated on the same Tensor + - `x += x * y` +- **Cross:** All operations are calculated on the Tensor opposite of the `Alt.` setting + - `x += x' * y` +- **Ones:** All operations are calculated on a Tensor filled with ones + - `x += 1 * y` +- **N.Random:** All operations are calculated on a Tensor filled with random values in normal distribution + - `x += randn() * y` +- **U.Random:** All operations are calculated on a Tensor filled with random values in uniform distribution + - `x += rand() * y` +- **Multi-Res:** All operations are calculated on a Tensor generated with multi-res noise algorithm + - `x += multires() * y` +- **Abs:** Calculate using the absolute values of the chosen Tensors instead + - `x += abs(F) * y` + +

+ +

+ +
+Infotext + +- **Checkpoint:** [realisticVisionV51](https://civitai.com/models/4201?modelVersionId=130072) +- **Positive Prompt:** `(high quality, best quality), a 4k photo of a cute dog running in the snow, mountains, day, (depth of field, bokeh)` +- **Negative Prompt:** `(low quality, worst quality:1.2), [EasyNegative, EasyNegativeV2]` +- **Brightness:** `2.5` +- **Contrast:** `2.5` +- **Alt:** `True` +- **Scaling:** `1 - Cos` + +```cpp +Steps: 24, Sampler: DPM++ 2M Karras, CFG scale: 7.5, Seed: 1257068736, Size: 512x512, Denoising strength: 0.5 +Clip skip: 2, Token merging ratio: 0.2, Token merging ratio hr: 0.2, RNG: CPU, NGMS: 4 +Hires upscale: 1.5, Hires steps: 16, Hires upscaler: 2xNomosUni_esrgan_multijpg +``` + +
+ +#### Scaling Settings +By default, this Extension offsets the noise by the same amount every step. But depending on the `Sampler` and `Scheduler` used, and whether `Alt.` was enabled or not, the effects might be too strong during the early or the later phase of the process, which in turn causes artifacts. + +- **Flat:** Default behavior +- **Cos:** Cosine scaling `(High -> Low)` +- **Sin:** Sine scaling `(Low -> High)` +- **1 - Cos:** `(Low -> High)` +- **1 - Sin:** `(High -> Low)` + +

+ +

+ +
+Infotext + +- **Checkpoint:** [realisticVisionV51](https://civitai.com/models/4201?modelVersionId=130072) +- **Positive Prompt:** `(high quality, best quality), a 4k photo of a cute cat standing at a flower field in a park, day, (depth of field, bokeh)` +- **Negative Prompt:** `(low quality, worst quality:1.2), [EasyNegative, EasyNegativeV2]` +- **Alt:** `True` +- **Noise:** `Straight Abs.` + +```cpp +Steps: 24, Sampler: DPM++ 2M Karras, CFG scale: 7.5, Seed: 3515074713, Size: 512x512, Denoising strength: 0.5 +Clip skip: 2, Token merging ratio: 0.2, Token merging ratio hr: 0.2, RNG: CPU, NGMS: 4 +Hires upscale: 1.5, Hires steps: 12, Hires upscaler: 2xNomosUni_esrgan_multijpg +``` + +
+ +### Buttons +- **Reset:** Reset all `Basic` and `Advanced` parameters to the default values +- **Randomize:** Randomize the `Brightness`, `Contrast`, `Saturation`, `R`, `G`, `B` parameters + +## Settings +> The following settings are in the **Vectorscope CC** section under the **Stable Diffusion** category of the **Settings** tab + +- Append the parameters to the infotext +- Disable `do_not_save_to_config` to use the Webui **Defaults** functionality +- Set the `minimum` and `maximum` range for each parameter + +## Roadmap +- [X] Extension Released! +- [X] Add Support for **X/Y/Z Plot** +- [X] Implement different **Noise** functions +- [X] Implement **Randomize** button +- [X] Implement **Style** Presets +- [X] Implement **Color Wheel** & **Color Picker** +- [X] Implement better scaling algorithms +- [X] Add API Docs +- [X] Append Parameters to Infotext +- [X] Improved Infotext Support *(by. [catboxanon](https://github.com/catboxanon))* +- [X] Add **HDR** Script +- [X] Add Support for **SDXL** +- [ ] Implement Gradient features + +## API +You can use this Extension via [API](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/API) by adding an entry to the `alwayson_scripts` of your payload. An [example](samples/api_example.json) is provided. The `args` are sent in the following order in an `array`: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterType
Enablebool
Alt.bool
Brightnessfloat
Contrastfloat
Saturationfloat
Rfloat
Gfloat
Bfloat
Hires. fixbool
ADetailerbool
Randomizebool
Noise Methodstr
Scalingstr
+ +## Known Issues +- In rare occasions, this Extension has little effects when used with certain **LoRA**s +- Works better / worse with certain `Samplers` + + +## HDR + +> [Discussion Thread](https://github.com/Haoming02/sd-webui-vectorscope-cc/issues/16) + +In the **Script** `Dropdown` at the bottom, there is now a new **`High Dynamic Range`** option: + +- This script will generate multiple images *("Brackets")* of varying brightness, then merge them into 1 HDR image +- **(Recommended)** Use a deterministic sampler and high enough steps. `Euler` *(**not** `Euler a`)* works well in my experience + +#### Options +- **Brackets:** The numer of images to generate +- **Gaps:** The brightness difference between each image +- **Automatically Merge:** When enabled, this will merge the images using an `OpenCV` algorithm and save to the `HDR` folder in the `outputs` folder + - Disable this if you want to merge them yourself using better external program + +
+ +
+Offset Noise TL;DR + +The most common *version* of **Offset Noise** you may have heard of is from this [blog post](https://www.crosslabs.org/blog/diffusion-with-offset-noise), where it was discovered that the noise functions used during **training** were flawed, causing `Stable Diffusion` to always generate images with an average of `0.5` *(**ie.** grey)*. + +> **ie.** Even if you prompt for dark/night or bright/snow, the average of the image is still "grey" + +> [Technical Explanations](https://youtu.be/cVxQmbf3q7Q) + +However, this Extension instead tries to offset the latent noise during the **inference** phase. Therefore, you do not need to use models that were specially trained, as this can work on any model. +
+ +
+How does this work? + +After reading through and messing around with the code, I found out that it is possible to directly modify the Tensors representing the latent noise used by the Stable Diffusion process. + +The dimensions of the Tensors is `(X, 4, H / 8, W / 8)`, which represents **X** batch of noise images, with **4** channels, each with **(W / 8) x (H / 8)** values + +> **eg.** Generating a single 512x768 image will create a Tensor of size (1, 4, 96, 64) + +Then, I tried to play around with the values of each channel and ended up discovering these relationships. Essentially, the 4 channels correspond to the **CMYK** color format for `SD1` *(**Y'CbCr** for `SDXL`)*, hence why you can control the brightness as well as the colors. + +
+ +
+ +#### Vectorscope? +The Extension is named this way because the color interactions remind me of the `Vectorscope` found in **Premiere Pro**'s **Lumetri Color**. Those who are experienced in Color Correction should be rather familiar with this Extension. + +

+ +~~Yes. I'm aware that it's just how digital colors work in general.~~ + +~~We've come full **circle** *(\*ba dum tss)* now that a Color Wheel is actually added.~~ diff --git a/extensions/sd-webui-vectorscope-cc/a.txt b/extensions/sd-webui-vectorscope-cc/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/javascript/a.txt b/extensions/sd-webui-vectorscope-cc/javascript/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/javascript/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/javascript/vec_cc.js b/extensions/sd-webui-vectorscope-cc/javascript/vec_cc.js new file mode 100644 index 0000000000000000000000000000000000000000..b19e62696fb1ee26e1a4486f726925b74d93fa3d --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/javascript/vec_cc.js @@ -0,0 +1,128 @@ +class VectorscopeCC { + + static dot = { 'txt': undefined, 'img': undefined }; + + /** + * @param {number} r @param {number} g @param {number} b + * @param {string} mode "txt" | "img" + */ + static updateCursor(r, g, b, mode) { + const mag = Math.abs(r) + Math.abs(g) + Math.abs(b); + let condX, condY; + + if (mag < Number.EPSILON) { + condX = 0.0; + condY = 0.0; + } else { + condX = 25 * Math.sqrt(r * r + g * g + b * b) * (r * -0.5 + g * -0.5 + b * 1.0) / mag; + condY = 25 * Math.sqrt(r * r + g * g + b * b) * (r * -0.866 + g * 0.866 + b * 0.0) / mag; + } + + this.dot[mode].style.left = `calc(50% + ${condX - 12}px)`; + this.dot[mode].style.top = `calc(50% + ${condY - 12}px)`; + } + + /** + * @param {HTMLImageElement} wheel + * @param {HTMLInputElement[]} sliders + * @param {HTMLImageElement} dot + */ + static registerPicker(wheel, sliders, dot) { + ['mousemove', 'click'].forEach((event) => { + wheel.addEventListener(event, (e) => { + e.preventDefault(); + if (e.type === 'mousemove' && e.buttons != 1) + return; + + const rect = e.target.getBoundingClientRect(); + const p_rect = e.target.parentNode.getBoundingClientRect(); + + const shift = (p_rect.width - rect.width) / 2.0; + dot.style.left = `calc(${e.clientX - rect.left}px - 12px + ${shift}px)`; + dot.style.top = `calc(${e.clientY - rect.top}px - 12px)`; + + const x = ((e.clientX - rect.left) - 100.0) / 25; + const y = ((e.clientY - rect.top) - 100.0) / 25; + + let r = -0.077 * (4.33 * x + 7.5 * y); + let g = y / 0.866 + r; + let b = x + 0.5 * r + 0.5 * g; + + const mag = Math.sqrt(r * r + g * g + b * b); + const len = Math.abs(r) + Math.abs(g) + Math.abs(b); + + r = (r / mag * len).toFixed(2); + g = (g / mag * len).toFixed(2); + b = (b / mag * len).toFixed(2); + + sliders[0][0].value = r; + sliders[0][1].value = r; + sliders[1][0].value = g; + sliders[1][1].value = g; + sliders[2][0].value = b; + sliders[2][1].value = b; + }); + }); + + ['mouseleave', 'mouseup'].forEach((event) => { + wheel.addEventListener(event, () => { + updateInput(sliders[0][0]); + updateInput(sliders[1][0]); + updateInput(sliders[2][0]); + }); + }); + } + +} + +onUiLoaded(() => { + + ['txt', 'img'].forEach((mode) => { + const container = document.getElementById(`cc-colorwheel-${mode}`); + container.style.height = '200px'; + container.style.width = '200px'; + + const wheel = container.querySelector('img'); + container.insertBefore(wheel, container.firstChild); + + while (container.firstChild !== container.lastChild) + container.lastChild.remove(); + + wheel.ondragstart = (e) => { e.preventDefault(); return false; }; + wheel.id = `cc-img-${mode}`; + + const sliders = [ + document.getElementById(`cc-r-${mode}`).querySelectorAll('input'), + document.getElementById(`cc-g-${mode}`).querySelectorAll('input'), + document.getElementById(`cc-b-${mode}`).querySelectorAll('input'), + ]; + + const temp = document.getElementById(`cc-temp-${mode}`); + + const dot = temp.querySelector('img'); + dot.style.left = 'calc(50% - 12px)'; + dot.style.top = 'calc(50% - 12px)'; + dot.id = `cc-dot-${mode}`; + + container.appendChild(dot); + temp.remove(); + + VectorscopeCC.dot[mode] = dot; + VectorscopeCC.registerPicker(wheel, sliders, dot); + }); + + const config = document.getElementById("setting_cc_no_defaults").querySelector('input[type=checkbox]'); + if (config.checked) + return; + + setTimeout(() => { + ['txt', 'img'].forEach((mode) => { + const r = document.getElementById(`cc-r-${mode}`).querySelector("input").value; + const g = document.getElementById(`cc-g-${mode}`).querySelector("input").value; + const b = document.getElementById(`cc-b-${mode}`).querySelector("input").value; + + VectorscopeCC.updateCursor(r, g, b, mode); + }); + }, 100); + +}); diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/__init__.py b/extensions/sd-webui-vectorscope-cc/lib_cc/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b1215e3e60e88bae6f3c8625d83befe90c508610 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/__init__.py @@ -0,0 +1,4 @@ +""" +Author: Haoming02 +License: MIT +""" diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/a.txt b/extensions/sd-webui-vectorscope-cc/lib_cc/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/callback.py b/extensions/sd-webui-vectorscope-cc/lib_cc/callback.py new file mode 100644 index 0000000000000000000000000000000000000000..c8f610989a2a4cbb1980196cf854427f738f53d3 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/callback.py @@ -0,0 +1,180 @@ +from modules.sd_samplers_kdiffusion import KDiffusionSampler +from modules.script_callbacks import on_script_unloaded, on_ui_settings +from functools import wraps +from random import random +import torch + +from .scaling import apply_scaling +from .settings import settings + + +class NoiseMethods: + + @staticmethod + def get_delta(latent: torch.Tensor) -> torch.Tensor: + mean = torch.mean(latent) + return torch.sub(latent, mean) + + @staticmethod + def to_abs(latent: torch.Tensor) -> torch.Tensor: + return torch.abs(latent) + + @staticmethod + def zeros(latent: torch.Tensor) -> torch.Tensor: + return torch.zeros_like(latent) + + @staticmethod + def ones(latent: torch.Tensor) -> torch.Tensor: + return torch.ones_like(latent) + + @staticmethod + def gaussian_noise(latent: torch.Tensor) -> torch.Tensor: + return torch.rand_like(latent) + + @staticmethod + def normal_noise(latent: torch.Tensor) -> torch.Tensor: + return torch.randn_like(latent) + + @staticmethod + @torch.inference_mode() + def multires_noise( + latent: torch.Tensor, + use_zero: bool, + iterations: int = 10, + discount: float = 0.8, + ): + """ + Credit: Kohya_SS + https://github.com/kohya-ss/sd-scripts/blob/v0.8.5/library/custom_train_functions.py#L448 + """ + + noise = NoiseMethods.zeros(latent) if use_zero else NoiseMethods.ones(latent) + device = latent.device + + b, c, w, h = noise.shape + upsampler = torch.nn.Upsample(size=(w, h), mode="bilinear").to(device) + + for i in range(iterations): + r = random() * 2 + 2 + + wn = max(1, int(w / (r**i))) + hn = max(1, int(h / (r**i))) + + noise += upsampler(torch.randn(b, c, wn, hn).to(device)) * discount**i + + if wn == 1 or hn == 1: + break + + return noise / noise.std() + + +def RGB2CbCr(r: float, g: float, b: float) -> tuple[float, float]: + """Convert RGB channels into YCbCr for SDXL""" + cb = -0.17 * r - 0.33 * g + 0.5 * b + cr = 0.5 * r - 0.42 * g - 0.08 * b + + return cb, cr + + +original_callback = KDiffusionSampler.callback_state + + +@torch.no_grad() +@torch.inference_mode() +@wraps(original_callback) +def cc_callback(self, d): + if not self.vec_cc["enable"]: + return original_callback(self, d) + + if getattr(self.p, "is_hr_pass", False) and not self.vec_cc["doHR"]: + return original_callback(self, d) + + if getattr(self.p, "_ad_inner", False) and not self.vec_cc["doAD"]: + return original_callback(self, d) + + is_xl: bool = self.p.sd_model.is_sdxl + + mode = str(self.vec_cc["mode"]) + method = str(self.vec_cc["method"]) + source: torch.Tensor = d[mode] + target = None + + if "Straight" in method: + target = d[mode].detach().clone() + elif "Cross" in method: + target = d["x" if mode == "denoised" else "denoised"].detach().clone() + elif "Multi-Res" in method: + target = NoiseMethods.multires_noise(d[mode], "Abs" in method) + elif method == "Ones": + target = NoiseMethods.ones(d[mode]) + elif method == "N.Random": + target = NoiseMethods.normal_noise(d[mode]) + elif method == "U.Random": + target = NoiseMethods.gaussian_noise(d[mode]) + else: + raise ValueError + + if "Abs" in method: + target = NoiseMethods.to_abs(target) + + batchSize = int(d[mode].size(0)) + + bri, con, sat, r, g, b = apply_scaling( + self.vec_cc["scaling"], + d["i"], + self.vec_cc["step"], + self.vec_cc["bri"], + self.vec_cc["con"], + self.vec_cc["sat"], + self.vec_cc["r"], + self.vec_cc["g"], + self.vec_cc["b"], + ) + + if not is_xl: + for i in range(batchSize): + # Brightness + source[i][0] += target[i][0] * bri + # Contrast + source[i][0] += NoiseMethods.get_delta(source[i][0]) * con + + # R + source[i][2] -= target[i][2] * r + # G + source[i][1] += target[i][1] * g + # B + source[i][3] -= target[i][3] * b + + # Saturation + source[i][2] *= sat + source[i][1] *= sat + source[i][3] *= sat + + else: + cb, cr = RGB2CbCr(r, g, b) + + for i in range(batchSize): + # Brightness + source[i][0] += target[i][0] * bri + # Contrast + source[i][0] += NoiseMethods.get_delta(source[i][0]) * con + + # CbCr + source[i][1] -= target[i][1] * cr + source[i][2] -= target[i][2] * cb + + # Saturation + source[i][1] *= sat + source[i][2] *= sat + + return original_callback(self, d) + + +def restore_callback(): + KDiffusionSampler.callback_state = original_callback + + +def hook_callbacks(): + KDiffusionSampler.callback_state = cc_callback + on_script_unloaded(restore_callback) + on_ui_settings(settings) diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/colorpicker.py b/extensions/sd-webui-vectorscope-cc/lib_cc/colorpicker.py new file mode 100644 index 0000000000000000000000000000000000000000..51b56e0ed17080a4f28199597b232e8f43f997b9 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/colorpicker.py @@ -0,0 +1,27 @@ +from modules import scripts +import gradio as gr +import os + +WHEEL = os.path.join(scripts.basedir(), "scripts", "vectorscope.png") +DOT = os.path.join(scripts.basedir(), "scripts", "dot.png") + + +def create_colorpicker(is_img: bool): + m: str = "img" if is_img else "txt" + + whl = gr.Image( + value=WHEEL, + interactive=False, + container=False, + elem_id=f"cc-colorwheel-{m}", + ) + + dot = gr.Image( + value=DOT, + interactive=False, + container=False, + elem_id=f"cc-temp-{m}", + ) + + whl.do_not_save_to_config = True + dot.do_not_save_to_config = True diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/const.py b/extensions/sd-webui-vectorscope-cc/lib_cc/const.py new file mode 100644 index 0000000000000000000000000000000000000000..6a44b0ee5e7e549b40214a0f3190296357b4f304 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/const.py @@ -0,0 +1,49 @@ +from modules.shared import opts +import random + + +class Param: + + def __init__(self, minimum: float, maximum: float, default: float): + self.minimum = minimum + self.maximum = maximum + self.default = default + + def rand(self) -> float: + return round(random.uniform(self.minimum, self.maximum), 2) + + +Brightness: Param +Contrast: Param +Saturation: Param +Color: Param + + +def init(): + global Brightness + Brightness = Param( + getattr(opts, "cc_brightness_min", -5.0), + getattr(opts, "cc_brightness_max", 5.0), + 0.0, + ) + + global Contrast + Contrast = Param( + getattr(opts, "cc_contrast_min", -5.0), + getattr(opts, "cc_contrast_max", 5.0), + 0.0, + ) + + global Saturation + Saturation = Param( + getattr(opts, "cc_saturation_min", 0.25), + getattr(opts, "cc_saturation_max", 1.75), + 1.0, + ) + + global Color + Color = Param( + getattr(opts, "cc_color_min", -4.0), + getattr(opts, "cc_color_max", 4.0), + 0.0, + ) diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/scaling.py b/extensions/sd-webui-vectorscope-cc/lib_cc/scaling.py new file mode 100644 index 0000000000000000000000000000000000000000..cf1c6d49b2a1ef328fd59074bd0263cd86c28f4e --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/scaling.py @@ -0,0 +1,32 @@ +from math import cos, sin, pi + + +def apply_scaling( + alg: str, + current_step: int, + total_steps: int, + bri: float, + con: float, + sat: float, + r: float, + g: float, + b: float, +) -> list: + + mod = 1.0 + + if alg != "Flat": + ratio = float(current_step / total_steps) + rad = ratio * pi / 2 + + match alg: + case "Cos": + mod = cos(rad) + case "Sin": + mod = sin(rad) + case "1 - Cos": + mod = 1 - cos(rad) + case "1 - Sin": + mod = 1 - sin(rad) + + return [bri * mod, con * mod, (sat - 1.0) * mod + 1.0, r * mod, g * mod, b * mod] diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/settings.py b/extensions/sd-webui-vectorscope-cc/lib_cc/settings.py new file mode 100644 index 0000000000000000000000000000000000000000..39cd8006d1bc4e8bcc5f6a103ec64ba476363952 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/settings.py @@ -0,0 +1,79 @@ +from modules.shared import OptionInfo, opts +from modules import scripts +from json import load, dump +from gradio import Slider +import os + +section = ("cc", "Vectorscope CC") + + +def settings(): + opts.add_option( + "cc_metadata", + OptionInfo( + True, + "Append Vectorscope CC parameters to generation infotext", + section=section, + category_id="sd", + ), + ) + + opts.add_option( + "cc_no_defaults", + OptionInfo( + True, + 'Add the "do_not_save_to_config" flag to all components', + section=section, + category_id="sd", + onchange=reset_ui_config, + ) + .info("uncheck this option if you wish to use the built-in Defaults function") + .info("enable again if the extension is not working correctly after an update") + .needs_reload_ui(), + ) + + for lbl, minVal, maxVal in [ + ("Brightness", (-5.0, 0.0), (0.0, 5.0)), + ("Contrast", (-5.0, 0.0), (0.0, 5.0)), + ("Saturation", (0.25, 1.0), (1.0, 1.75)), + ("Color", (-4.0, 0.0), (0.0, 4.0)), + ]: + + opts.add_option( + f"cc_{lbl.lower()}_min", + OptionInfo( + minVal[0], + f"{lbl} - Min", + Slider, + {"step": 0.05, "minimum": minVal[0], "maximum": minVal[1]}, + section=section, + category_id="sd", + ).needs_reload_ui(), + ) + + opts.add_option( + f"cc_{lbl.lower()}_max", + OptionInfo( + maxVal[1], + f"{lbl} - Max", + Slider, + {"step": 0.05, "minimum": maxVal[0], "maximum": maxVal[1]}, + section=section, + category_id="sd", + ).needs_reload_ui(), + ) + + +def reset_ui_config(): + extension = "cc.py" + ui_config = os.path.join(scripts.basedir(), "ui-config.json") + + with open(ui_config, "r", encoding="utf-8") as json_file: + configs = load(json_file) + + cleaned_configs = { + key: value for key, value in configs.items() if extension not in key + } + + with open(ui_config, "w", encoding="utf-8") as json_file: + dump(cleaned_configs, json_file) diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/style.py b/extensions/sd-webui-vectorscope-cc/lib_cc/style.py new file mode 100644 index 0000000000000000000000000000000000000000..f8b95945fc7bacd2132a5a11b5cab40c77e0ccf5 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/style.py @@ -0,0 +1,108 @@ +from modules import scripts +import gradio as gr +import json +import os + + +STYLE_FILE = os.path.join(scripts.basedir(), "styles.json") +EMPTY_STYLE = {"styles": {}, "deleted": {}} + + +class StyleManager: + + def __init__(self): + self.STYLE_SHEET: dict = {} + + def load_styles(self): + if os.path.isfile(STYLE_FILE): + with open(STYLE_FILE, "r", encoding="utf-8") as json_file: + self.STYLE_SHEET = json.load(json_file) + print("[Vec. CC] Style Sheet Loaded...") + + else: + with open(STYLE_FILE, "w+", encoding="utf-8") as json_file: + self.STYLE_SHEET = EMPTY_STYLE + json.dump(self.STYLE_SHEET, json_file) + print("[Vec. CC] Creating Empty Style Sheet...") + + return self.list_style() + + def list_style(self) -> list[str]: + return list(self.STYLE_SHEET["styles"].keys()) + + def get_style(self, style_name: str) -> tuple[bool | str | float]: + style: dict = self.STYLE_SHEET["styles"].get(style_name, None) + + if not style: + print(f'\n[Error] No Style of name "{style_name}" was found!\n') + return [gr.update()] * 12 + + return ( + style.get("alt", gr.update()), + style.get("brightness", gr.update()), + style.get("contrast", gr.update()), + style.get("saturation", gr.update()), + *style.get("rgb", (gr.update(), gr.update(), gr.update())), + style.get("hr", gr.update()), + style.get("ad", gr.update()), + style.get("rn", gr.update()), + style.get("noise", gr.update()), + style.get("scaling", gr.update()), + ) + + def save_style( + self, + style_name: str, + latent: bool, + bri: float, + con: float, + sat: float, + r: float, + g: float, + b: float, + hr: bool, + ad: bool, + rn: bool, + noise: str, + scaling: str, + ): + if style_name in self.STYLE_SHEET["styles"]: + print(f'\n[Error] Duplicated Style Name: "{style_name}" Detected!') + print("Values were not saved!\n") + return self.list_style() + + new_style = { + "alt": latent, + "brightness": bri, + "contrast": con, + "saturation": sat, + "rgb": [r, g, b], + "hr": hr, + "ad": ad, + "rn": rn, + "noise": noise, + "scaling": scaling, + } + + self.STYLE_SHEET["styles"].update({style_name: new_style}) + + with open(STYLE_FILE, "w+") as json_file: + json.dump(self.STYLE_SHEET, json_file) + + print(f'\nStyle of Name "{style_name}" Saved!\n') + return self.list_style() + + def delete_style(self, style_name: str): + if style_name not in self.STYLE_SHEET["styles"]: + print(f'\n[Error] No Style of name "{style_name}" was found!\n') + return self.list_style() + + style: dict = self.STYLE_SHEET["styles"].get(style_name) + self.STYLE_SHEET["deleted"].update({style_name: style}) + del self.STYLE_SHEET["styles"][style_name] + + with open(STYLE_FILE, "w+") as json_file: + json.dump(self.STYLE_SHEET, json_file) + + print(f'\nStyle of name "{style_name}" was deleted!\n') + return self.list_style() diff --git a/extensions/sd-webui-vectorscope-cc/lib_cc/xyz.py b/extensions/sd-webui-vectorscope-cc/lib_cc/xyz.py new file mode 100644 index 0000000000000000000000000000000000000000..b0af399eb955cafe4d36219976d766502f7d1717 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/lib_cc/xyz.py @@ -0,0 +1,70 @@ +from modules import scripts + + +def _grid_reference(): + for data in scripts.scripts_data: + if data.script_class.__module__ in ( + "scripts.xyz_grid", + "xyz_grid.py", + ) and hasattr(data, "module"): + return data.module + + raise SystemError("Could not find X/Y/Z Plot...") + + +def xyz_support(cache: dict): + + def apply_field(field): + def _(p, x, xs): + cache.update({field: x}) + + return _ + + def choices_bool(): + return ["False", "True"] + + def choices_method(): + return [ + "Disabled", + "Straight", + "Straight Abs.", + "Cross", + "Cross Abs.", + "Ones", + "N.Random", + "U.Random", + "Multi-Res", + "Multi-Res Abs.", + ] + + def choices_scaling(): + return ["Flat", "Cos", "Sin", "1 - Cos", "1 - Sin"] + + xyz_grid = _grid_reference() + + extra_axis_options = [ + xyz_grid.AxisOption( + "[Vec.CC] Enable", str, apply_field("Enable"), choices=choices_bool + ), + xyz_grid.AxisOption( + "[Vec.CC] Alt.", str, apply_field("Alt"), choices=choices_bool + ), + xyz_grid.AxisOption("[Vec.CC] Brightness", float, apply_field("Brightness")), + xyz_grid.AxisOption("[Vec.CC] Contrast", float, apply_field("Contrast")), + xyz_grid.AxisOption("[Vec.CC] Saturation", float, apply_field("Saturation")), + xyz_grid.AxisOption("[Vec.CC] R", float, apply_field("R")), + xyz_grid.AxisOption("[Vec.CC] G", float, apply_field("G")), + xyz_grid.AxisOption("[Vec.CC] B", float, apply_field("B")), + xyz_grid.AxisOption( + "[Adv.CC] Proc. H.Fix", str, apply_field("DoHR"), choices=choices_bool + ), + xyz_grid.AxisOption( + "[Adv.CC] Method", str, apply_field("Method"), choices=choices_method + ), + xyz_grid.AxisOption( + "[Adv.CC] Scaling", str, apply_field("Scaling"), choices=choices_scaling + ), + xyz_grid.AxisOption("[Adv.CC] Randomize", int, apply_field("Random")), + ] + + xyz_grid.axis_options.extend(extra_axis_options) diff --git a/extensions/sd-webui-vectorscope-cc/samples/00.jpg b/extensions/sd-webui-vectorscope-cc/samples/00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee9b46498938aae32501d8a73f4efa7875ba37a1 Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/samples/00.jpg differ diff --git a/extensions/sd-webui-vectorscope-cc/samples/01.jpg b/extensions/sd-webui-vectorscope-cc/samples/01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2ae199decc07e696801b425f3e9c5ce8eec96a7 Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/samples/01.jpg differ diff --git a/extensions/sd-webui-vectorscope-cc/samples/02.jpg b/extensions/sd-webui-vectorscope-cc/samples/02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..271413a4c61310c9e9f578614e6d95e17d4fa74c Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/samples/02.jpg differ diff --git a/extensions/sd-webui-vectorscope-cc/samples/03.jpg b/extensions/sd-webui-vectorscope-cc/samples/03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37a86739c5c0c07b5b2cc29770b4b28723ba9616 Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/samples/03.jpg differ diff --git a/extensions/sd-webui-vectorscope-cc/samples/a.txt b/extensions/sd-webui-vectorscope-cc/samples/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/samples/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/samples/api_example.json b/extensions/sd-webui-vectorscope-cc/samples/api_example.json new file mode 100644 index 0000000000000000000000000000000000000000..344e31e70685f90a74a57d864cd6bea9530582e4 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/samples/api_example.json @@ -0,0 +1,31 @@ +{ + "prompt": "a photo of a dog", + "negative_prompt": "(low quality, worst quality)", + "sampler_name": "Euler a", + "sampler_index": "euler", + "steps": 24, + "cfg_scale": 6.0, + "batch_size": 1, + "seed": -1, + "width": 512, + "height": 512, + "alwayson_scripts": { + "vectorscope cc": { + "args": [ + true, + true, + -2.5, + 1.5, + 0.85, + 0.0, + 0.0, + 1.0, + false, + false, + false, + "Straight Abs.", + "Flat" + ] + } + } +} diff --git a/extensions/sd-webui-vectorscope-cc/samples/method.jpg b/extensions/sd-webui-vectorscope-cc/samples/method.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8eefce47f79169ac5787bd3547ad4ca67bfc519 Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/samples/method.jpg differ diff --git a/extensions/sd-webui-vectorscope-cc/samples/scaling.jpg b/extensions/sd-webui-vectorscope-cc/samples/scaling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b44c0c6ec4413edbf5118a01a722c79c871253cb --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/samples/scaling.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d9a6ff91a7633122644e2ac5c48d21d5b2e706460dd185c7a7c25eaf7ee0ec1 +size 1171808 diff --git a/extensions/sd-webui-vectorscope-cc/scripts/a.txt b/extensions/sd-webui-vectorscope-cc/scripts/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/scripts/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/extensions/sd-webui-vectorscope-cc/scripts/cc.py b/extensions/sd-webui-vectorscope-cc/scripts/cc.py new file mode 100644 index 0000000000000000000000000000000000000000..97fa1214103b94c4ae5193d60a2c494dcf9af216 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/scripts/cc.py @@ -0,0 +1,430 @@ +from modules.sd_samplers_kdiffusion import KDiffusionSampler +from modules.shared import opts +from modules import scripts + +from lib_cc.colorpicker import create_colorpicker +from lib_cc.callback import hook_callbacks +from lib_cc.style import StyleManager +from lib_cc.xyz import xyz_support +from lib_cc import const + +from random import seed +import gradio as gr + + +VERSION = "2.3.2" + + +style_manager = StyleManager() +style_manager.load_styles() +hook_callbacks() +const.init() + + +class VectorscopeCC(scripts.Script): + + def __init__(self): + self.xyzCache = {} + xyz_support(self.xyzCache) + + def title(self): + return "Vectorscope CC" + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def ui(self, is_img2img): + mode: str = "img" if is_img2img else "txt" + m: str = f'"{mode}"' + + with gr.Accordion( + f"Vectorscope CC v{VERSION}", elem_id=f"vec-cc-{mode}", open=False + ): + + with gr.Row(): + enable = gr.Checkbox(label="Enable") + latent = gr.Checkbox(label="Alt. (Stronger Effects)") + + with gr.Row(): + bri = gr.Slider( + label="Brightness", + value=const.Brightness.default, + minimum=const.Brightness.minimum, + maximum=const.Brightness.maximum, + step=0.05, + ) + con = gr.Slider( + label="Contrast", + value=const.Contrast.default, + minimum=const.Contrast.minimum, + maximum=const.Contrast.maximum, + step=0.05, + ) + sat = gr.Slider( + label="Saturation", + value=const.Saturation.default, + minimum=const.Saturation.minimum, + maximum=const.Saturation.maximum, + step=0.05, + ) + + with gr.Row(): + with gr.Column(): + r = gr.Slider( + label="R", + info="Cyan | Red", + value=const.Color.default, + minimum=const.Color.minimum, + maximum=const.Color.maximum, + step=0.05, + elem_id=f"cc-r-{mode}", + ) + g = gr.Slider( + label="G", + info="Magenta | Green", + value=const.Color.default, + minimum=const.Color.minimum, + maximum=const.Color.maximum, + step=0.05, + elem_id=f"cc-g-{mode}", + ) + b = gr.Slider( + label="B", + info="Yellow | Blue", + value=const.Color.default, + minimum=const.Color.minimum, + maximum=const.Color.maximum, + step=0.05, + elem_id=f"cc-b-{mode}", + ) + + for c in (r, g, b): + c.input( + None, + inputs=[r, g, b], + _js=f"(r, g, b) => {{ VectorscopeCC.updateCursor(r, g, b, {m}); }}", + ) + + create_colorpicker(is_img2img) + + with gr.Accordion("Styles", open=False): + + with gr.Row(elem_classes="style-rows"): + style_choice = gr.Dropdown( + label="CC Styles", choices=style_manager.list_style(), scale=3 + ) + apply_btn = gr.Button( + value="Apply Style", elem_id=f"cc-apply-{mode}", scale=2 + ) + refresh_btn = gr.Button(value="Refresh Style", scale=2) + + with gr.Row(elem_classes="style-rows"): + style_name = gr.Textbox( + label="Style Name", lines=1, max_lines=1, scale=3 + ) + save_btn = gr.Button( + value="Save Style", elem_id=f"cc-save-{mode}", scale=2 + ) + delete_btn = gr.Button(value="Delete Style", scale=2) + + if getattr(opts, "cc_no_defaults", True): + style_choice.do_not_save_to_config = True + + [ + setattr(comp, "do_not_save_to_config", True) + for comp in ( + apply_btn, + refresh_btn, + style_name, + save_btn, + delete_btn, + ) + ] + + with gr.Accordion("Advanced Settings", open=False): + with gr.Row(): + doHR = gr.Checkbox( + label="Process Hires. fix", + visible=(not is_img2img), + ) + doAD = gr.Checkbox(label="Process Adetailer") + doRN = gr.Checkbox(label="Randomize using Seed") + + method = gr.Radio( + choices=( + "Straight", + "Straight Abs.", + "Cross", + "Cross Abs.", + "Ones", + "N.Random", + "U.Random", + "Multi-Res", + "Multi-Res Abs.", + ), + label="Noise Settings", + value="Straight Abs.", + ) + + scaling = gr.Radio( + choices=("Flat", "Cos", "Sin", "1 - Cos", "1 - Sin"), + label="Scaling Settings", + value="Flat", + ) + + comps: tuple[gr.components.Component] = ( + latent, + bri, + con, + sat, + r, + g, + b, + doHR, + doAD, + doRN, + method, + scaling, + ) + + apply_btn.click( + fn=style_manager.get_style, + inputs=[style_choice], + outputs=[*comps], + ).then( + None, + inputs=[r, g, b], + _js=f"(r, g, b) => {{ VectorscopeCC.updateCursor(r, g, b, {m}); }}", + ) + + save_btn.click( + fn=lambda *args: gr.update(choices=style_manager.save_style(*args)), + inputs=[style_name, *comps], + outputs=[style_choice], + ) + + delete_btn.click( + fn=lambda name: gr.update(choices=style_manager.delete_style(name)), + inputs=[style_name], + outputs=[style_choice], + ) + + refresh_btn.click( + fn=lambda: gr.update(choices=style_manager.load_styles()), + outputs=[style_choice], + ) + + with gr.Row(): + reset_btn = gr.Button(value="Reset") + random_btn = gr.Button(value="Randomize") + + def on_reset(): + return [ + gr.update(value=False), + gr.update(value=const.Brightness.default), + gr.update(value=const.Contrast.default), + gr.update(value=const.Saturation.default), + gr.update(value=const.Color.default), + gr.update(value=const.Color.default), + gr.update(value=const.Color.default), + gr.update(value=False), + gr.update(value=False), + gr.update(value=False), + gr.update(value="Straight Abs."), + gr.update(value="Flat"), + ] + + def on_random(): + return [ + gr.update(value=const.Brightness.rand()), + gr.update(value=const.Contrast.rand()), + gr.update(value=const.Saturation.rand()), + gr.update(value=const.Color.rand()), + gr.update(value=const.Color.rand()), + gr.update(value=const.Color.rand()), + ] + + reset_btn.click( + fn=on_reset, + outputs=[*comps], + show_progress="hidden", + ).then( + fn=None, + inputs=[r, g, b], + _js=f"(r, g, b) => {{ VectorscopeCC.updateCursor(r, g, b, {m}); }}", + ) + + random_btn.click( + fn=on_random, + outputs=[bri, con, sat, r, g, b], + show_progress="hidden", + ).then( + fn=None, + inputs=[r, g, b], + _js=f"(r, g, b) => {{ VectorscopeCC.updateCursor(r, g, b, {m}); }}", + ) + + self.paste_field_names = [] + self.infotext_fields = [ + (enable, "Vec CC Enabled"), + (latent, "Vec CC Alt"), + (bri, "Vec CC Brightness"), + (con, "Vec CC Contrast"), + (sat, "Vec CC Saturation"), + (r, "Vec CC R"), + (g, "Vec CC G"), + (b, "Vec CC B"), + (method, "Vec CC Noise"), + (doHR, "Vec CC Proc HrF"), + (doAD, "Vec CC Proc Ade"), + (doRN, "Vec CC Seed Randomize"), + (scaling, "Vec CC Scaling"), + ] + + for comp, name in self.infotext_fields: + if getattr(opts, "cc_no_defaults", True): + comp.do_not_save_to_config = True + self.paste_field_names.append(name) + + return [enable, *comps] + + def process_batch( + self, + p, + enable: bool, + latent: bool, + bri: float, + con: float, + sat: float, + r: float, + g: float, + b: float, + doHR: bool, + doAD: bool, + doRN: bool, + method: str, + scaling: str, + batch_number: int, + prompts: list[str], + seeds: list[int], + subseeds: list[int], + ): + + enable = self.xyzCache.pop("Enable", str(enable)).lower().strip() == "true" + + if not enable: + if len(self.xyzCache) > 0: + print("\n[Vec.CC] x [X/Y/Z Plot] Extension is not Enabled!\n") + self.xyzCache.clear() + + setattr(KDiffusionSampler, "vec_cc", {"enable": False}) + return p + + method = str(self.xyzCache.pop("Method", method)) + + if method == "Disabled": + setattr(KDiffusionSampler, "vec_cc", {"enable": False}) + return p + + if "Random" in self.xyzCache.keys(): + print("[X/Y/Z Plot] x [Vec.CC] Randomize is Enabled.") + if len(self.xyzCache) > 1: + print("Some parameters will be overridden!") + + cc_seed = int(self.xyzCache.pop("Random")) + else: + cc_seed = int(seeds[0]) if doRN else None + + latent = self.xyzCache.pop("Alt", str(latent)).lower().strip() == "true" + doHR = self.xyzCache.pop("DoHR", str(doHR)).lower().strip() == "true" + scaling = str(self.xyzCache.pop("Scaling", scaling)) + + bri = float(self.xyzCache.pop("Brightness", bri)) + con = float(self.xyzCache.pop("Contrast", con)) + sat = float(self.xyzCache.pop("Saturation", sat)) + + r = float(self.xyzCache.pop("R", r)) + g = float(self.xyzCache.pop("G", g)) + b = float(self.xyzCache.pop("B", b)) + + assert len(self.xyzCache) == 0 + + if cc_seed: + seed(cc_seed) + + bri = const.Brightness.rand() + con = const.Contrast.rand() + sat = const.Saturation.rand() + + r = const.Color.rand() + g = const.Color.rand() + b = const.Color.rand() + + print(f"\n[Seed: {cc_seed}]") + print(f"> Brightness: {bri}") + print(f"> Contrast: {con}") + print(f"> Saturation: {sat}") + print(f"> R: {r}") + print(f"> G: {g}") + print(f"> B: {b}\n") + + if getattr(opts, "cc_metadata", True): + p.extra_generation_params.update( + { + "Vec CC Enabled": enable, + "Vec CC Alt": latent, + "Vec CC Brightness": bri, + "Vec CC Contrast": con, + "Vec CC Saturation": sat, + "Vec CC R": r, + "Vec CC G": g, + "Vec CC B": b, + "Vec CC Noise": method, + "Vec CC Proc HrF": doHR, + "Vec CC Proc Ade": doAD, + "Vec CC Seed Randomize": doRN, + "Vec CC Scaling": scaling, + "Vec CC Version": VERSION, + } + ) + + steps: int = getattr(p, "firstpass_steps", None) or p.steps + + bri /= steps + con /= steps + sat = pow(sat, 1.0 / steps) + r /= steps + g /= steps + b /= steps + + mode: str = "x" if latent else "denoised" + + setattr( + KDiffusionSampler, + "vec_cc", + { + "enable": True, + "mode": mode, + "bri": bri, + "con": con, + "sat": sat, + "r": r, + "g": g, + "b": b, + "method": method, + "doHR": doHR, + "doAD": doAD, + "scaling": scaling, + "step": steps, + }, + ) + + return p + + def before_hr(self, p, enable: bool, *args, **kwargs): + + if enable: + steps: int = getattr(p, "hr_second_pass_steps", None) or p.steps + KDiffusionSampler.vec_cc["step"] = steps + + return p diff --git a/extensions/sd-webui-vectorscope-cc/scripts/cc_hdr.py b/extensions/sd-webui-vectorscope-cc/scripts/cc_hdr.py new file mode 100644 index 0000000000000000000000000000000000000000..c9f06d6df836a106c29044154ee200ec26e78613 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/scripts/cc_hdr.py @@ -0,0 +1,142 @@ +from modules.processing import process_images, get_fixed_seed +from modules.shared import state +from modules import scripts +from copy import copy +import gradio as gr +import numpy as np +import cv2 as cv + + +def mergeHDR(imgs: list, path: str, depth: str, fmt: str, gamma: float): + """https://docs.opencv.org/4.8.0/d2/df0/tutorial_py_hdr.html""" + + import datetime + import math + import os + + out_dir = os.path.join(os.path.dirname(path), "hdr") + os.makedirs(out_dir, exist_ok=True) + print(f'\nSaving HDR Outputs to "{out_dir}"\n') + + imgs_np = [np.asarray(img, dtype=np.uint8) for img in imgs] + + merge = cv.createMergeMertens() + hdr = merge.process(imgs_np) + + # shift min to 0.0 + hdr += math.ceil(0.0 - np.min(hdr) * 1000) / 1000 + # print(f"({np.min(hdr)}, {np.max(hdr)}") + + target = 65535 if depth == "16bpc" else 255 + precision = np.uint16 if depth == "16bpc" else np.uint8 + + hdr = np.power(hdr, (1 / gamma)) + + ldr = np.clip(hdr * target, 0, target).astype(precision) + rgb = cv.cvtColor(ldr, cv.COLOR_BGR2RGB) + + time = datetime.datetime.now().strftime("%H-%M-%S") + cv.imwrite(os.path.join(out_dir, f"{time}{fmt}"), rgb) + + +class VectorHDR(scripts.Script): + + def title(self): + return "High Dynamic Range" + + def show(self, is_img2img): + return True + + def ui(self, is_img2img): + + with gr.Row(): + count = gr.Slider( + label="Brackets", + minimum=3, + maximum=9, + step=2, + value=5, + ) + + gap = gr.Slider( + label="Gaps", + minimum=0.50, + maximum=2.50, + step=0.25, + value=1.25, + ) + + with gr.Accordion( + "Merge Options", + elem_id=f'vec-hdr-{"img" if is_img2img else "txt"}', + open=False, + ): + + auto = gr.Checkbox(label="Automatically Merge", value=True) + + with gr.Row(): + depth = gr.Radio(["16bpc", "8bpc"], label="Bit Depth", value="16bpc") + fmt = gr.Radio([".tiff", ".png"], label="Image Format", value=".tiff") + + gamma = gr.Slider( + label="Gamma", + info="Lower: Darker | Higher: Brighter", + minimum=0.2, + maximum=2.2, + step=0.2, + value=1.2, + ) + + for comp in (count, gap, auto, depth, fmt, gamma): + comp.do_not_save_to_config = True + + return [count, gap, auto, depth, fmt, gamma] + + def run( + self, p, count: int, gap: float, auto: bool, depth: str, fmt: str, gamma: float + ): + center: int = count // 2 + brackets = brightness_brackets(count, gap) + + p.seed = get_fixed_seed(p.seed) + p.scripts.script("vectorscope cc").xyzCache.update({"Enable": "False"}) + + baseline = process_images(p) + pc = copy(p) + + imgs = [None] * count + imgs[center] = baseline.images[0] + + for it in range(count): + + if state.skipped or state.interrupted or state.stopping_generation: + print("HDR Process Skipped...") + return baseline + + if it == center: + continue + + pc.scripts.script("vectorscope cc").xyzCache.update( + { + "Enable": "True", + "Alt": "True", + "Brightness": brackets[it], + "DoHR": "False", + "Method": "Ones", + "Scaling": "1 - Cos", + } + ) + + proc = process_images(pc) + imgs[it] = proc.images[0] + + if auto: + mergeHDR(imgs, p.outpath_samples, depth, fmt, gamma) + + baseline.images = imgs + return baseline + + +def brightness_brackets(count: int, gap: float) -> list[float]: + half = count // 2 + return [gap * (i - half) for i in range(count)] diff --git a/extensions/sd-webui-vectorscope-cc/scripts/dot.png b/extensions/sd-webui-vectorscope-cc/scripts/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..42aba1c225bb17b8d93df769492640f9e0cd5d3f Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/scripts/dot.png differ diff --git a/extensions/sd-webui-vectorscope-cc/scripts/vectorscope.png b/extensions/sd-webui-vectorscope-cc/scripts/vectorscope.png new file mode 100644 index 0000000000000000000000000000000000000000..473678997066e6978bc47d9951fbef9a0fb4037c Binary files /dev/null and b/extensions/sd-webui-vectorscope-cc/scripts/vectorscope.png differ diff --git a/extensions/sd-webui-vectorscope-cc/style.css b/extensions/sd-webui-vectorscope-cc/style.css new file mode 100644 index 0000000000000000000000000000000000000000..f6ac79b45d7b011d671f7c36c525310d6a71e7a4 --- /dev/null +++ b/extensions/sd-webui-vectorscope-cc/style.css @@ -0,0 +1,39 @@ +#cc-dot-txt, #cc-dot-img { + position: absolute; + width: 24px; + height: 24px; + pointer-events: none; +} + +#cc-img-txt, #cc-img-img { + cursor: pointer; + height: 100%; + width: auto; + margin: auto; +} + +#vec-cc-txt, #vec-cc-img { + user-select: none; +} + +#vec-cc-txt button, #vec-cc-txt label { + border-radius: 0.5em; +} + +#vec-cc-img button, #vec-cc-img label { + border-radius: 0.5em; +} + +#vec-cc-txt .style-rows { + align-items: end; + gap: 1em; +} + +#vec-cc-img .style-rows { + align-items: end; + gap: 1em; +} + +#vec-hdr-txt label, #vec-hdr-img label { + border-radius: 0.5em; +} diff --git a/models/Codeformer/a.txt b/models/Codeformer/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/Codeformer/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/ControlNet/a.txt b/models/ControlNet/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/ControlNet/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/ControlNetPreprocessor/a.txt b/models/ControlNetPreprocessor/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/ControlNetPreprocessor/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/ControlNetPreprocessor/clip_vision/a.txt b/models/ControlNetPreprocessor/clip_vision/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/ControlNetPreprocessor/clip_vision/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/GFPGAN/a.txt b/models/GFPGAN/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/GFPGAN/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/Lora/Namako-000018.safetensors b/models/Lora/Namako-000018.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..cb14a0579678c02e8325306449808ff4528b65df --- /dev/null +++ b/models/Lora/Namako-000018.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04bcdd7f8e72afdfc9cf1e1636874317d36f103b2a1181893725ee17f3593286 +size 228458972 diff --git a/models/Lora/X-ray_cum_inflation.safetensors b/models/Lora/X-ray_cum_inflation.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..954f9dbc9a5dc6ede9917a1704239f6fed16a2c5 --- /dev/null +++ b/models/Lora/X-ray_cum_inflation.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41d926120155c12f688f24633dab1390851e15b0bf3adc136dce608efe9897cd +size 228457324 diff --git a/models/Lora/a.txt b/models/Lora/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/Lora/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/Lora/belly_kicks.safetensors b/models/Lora/belly_kicks.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..d502a5433e1fcad8c4a97ab8ede07442d909fb19 --- /dev/null +++ b/models/Lora/belly_kicks.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c791770f83c59fce9b7b1de7563ba862153d3563a17e854fae798f9067d757c4 +size 228458908 diff --git a/models/Lora/deal360acv_illustrious_006.safetensors b/models/Lora/deal360acv_illustrious_006.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..a1be7c5078913380c1fc640457c45eef6dc4225e --- /dev/null +++ b/models/Lora/deal360acv_illustrious_006.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4aa48e14eede80417420de462ad08a7062b48e683e866708ca77dc258b91279 +size 144843892 diff --git a/models/Lora/dj_sloppa_ill_v2.safetensors b/models/Lora/dj_sloppa_ill_v2.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..9cbb79e4700eb15e08880c6ae3ffa378ea92b8b9 --- /dev/null +++ b/models/Lora/dj_sloppa_ill_v2.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1adc1cfa6443f67989ac18ee38877956b98be8812fcad5a893707830388036c +size 127752476 diff --git a/models/Lora/extreme_bukkake_v0.1-pony.safetensors b/models/Lora/extreme_bukkake_v0.1-pony.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..323e6c4d3451aab0b96aec56835246f6171dd22b --- /dev/null +++ b/models/Lora/extreme_bukkake_v0.1-pony.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a3717bc9e033c7922034ea2932570bef140b2fee753bbbda5e7af6c123b0bdb +size 57434460 diff --git a/models/Lora/intestine_bulge_v2.safetensors b/models/Lora/intestine_bulge_v2.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..caf4da3b4cf8e81bf8bdc4ffbaa18c67f1678232 --- /dev/null +++ b/models/Lora/intestine_bulge_v2.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3434781066d8a9d6bc514f753b545d214daf7937979886c5e90e72bc066b9a7 +size 57441108 diff --git a/models/Lora/nyalia.safetensors b/models/Lora/nyalia.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..1425214d745b206ca1b7c1b8df0085fc74cb054e --- /dev/null +++ b/models/Lora/nyalia.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c4fcdf8148a47789e5ab6bf919127e7e366da2c4d7d0768110d26800361c413 +size 509567615 diff --git a/models/Stable-diffusion/a.txt b/models/Stable-diffusion/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/Stable-diffusion/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/VAE/a.txt b/models/VAE/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/VAE/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/VAE/sdxl_vae.safetensors b/models/VAE/sdxl_vae.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..5c5bfd44fb0132b3cbd9d122244f502a7cd2bb24 --- /dev/null +++ b/models/VAE/sdxl_vae.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63aeecb90ff7bc1c115395962d3e803571385b61938377bc7089b36e81e92e2e +size 334641164 diff --git a/models/a.txt b/models/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/diffusers/a.txt b/models/diffusers/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/diffusers/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/diffusers/version.txt b/models/diffusers/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/diffusers/version.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/diffusers/version_diffusers_cache.txt b/models/diffusers/version_diffusers_cache.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/diffusers/version_diffusers_cache.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/hypernetworks/a.txt b/models/hypernetworks/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/hypernetworks/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/svd/a.txt b/models/svd/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/svd/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/models/z123/a.txt b/models/z123/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/models/z123/a.txt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/ui-config.json b/ui-config.json new file mode 100644 index 0000000000000000000000000000000000000000..acf52176fbc7a6547293adae04cff442cf0ef8ad --- /dev/null +++ b/ui-config.json @@ -0,0 +1,1696 @@ +{ + "txt2img/Prompt/visible": true, + "txt2img/Prompt/value": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest\n\n,1girl, alternate costume, s.a.t.8 \\(girls' frontline\\)\n\n,indoors\n\n,masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest", + "txt2img/Negative prompt/visible": true, + "txt2img/Negative prompt/value": "lowres, (worst quality, bad quality:1.2), bad anatomy, sketch, jpeg artifacts, signature, watermark, old, oldest, censored, bar_censor, (pregnant), chibi, loli, simple background, conjoined", + "txt2img/Interrupt/visible": true, + "txt2img/Skip/visible": true, + "txt2img/Interrupting.../visible": true, + "txt2img/Generate/visible": true, + "txt2img/↙️/visible": true, + "txt2img/🗑️/visible": true, + "txt2img/📋/visible": true, + "txt2img/Styles/visible": true, + "txt2img/Styles/value": [], + "txt2img/🖌️/visible": true, + "txt2img/🔄/visible": true, + "txt2img/📝/visible": true, + "txt2img/Close/visible": true, + "txt2img/Tabs@txt2img_extra_tabs/selected": null, + "customscript/sampler.py/txt2img/Sampling method/visible": true, + "customscript/sampler.py/txt2img/Sampling method/value": "Euler a", + "customscript/sampler.py/txt2img/Schedule type/visible": true, + "customscript/sampler.py/txt2img/Schedule type/value": "SGM Uniform", + "customscript/sampler.py/txt2img/Sampling steps/visible": true, + "customscript/sampler.py/txt2img/Sampling steps/value": 30, + "customscript/sampler.py/txt2img/Sampling steps/minimum": 1, + "customscript/sampler.py/txt2img/Sampling steps/maximum": 150, + "customscript/sampler.py/txt2img/Sampling steps/step": 1, + "txt2img/Hires. fix/visible": true, + "txt2img/Hires. fix/value": false, + "txt2img/Upscaler/visible": true, + "txt2img/Upscaler/value": "Latent", + "txt2img/Hires steps/visible": true, + "txt2img/Hires steps/value": 0, + "txt2img/Hires steps/minimum": 0, + "txt2img/Hires steps/maximum": 150, + "txt2img/Hires steps/step": 1, + "txt2img/Denoising strength/visible": true, + "txt2img/Denoising strength/value": 0.7, + "txt2img/Denoising strength/minimum": 0.0, + "txt2img/Denoising strength/maximum": 1.0, + "txt2img/Denoising strength/step": 0.01, + "txt2img/Upscale by/visible": true, + "txt2img/Upscale by/value": 2.0, + "txt2img/Upscale by/minimum": 1.0, + "txt2img/Upscale by/maximum": 4.0, + "txt2img/Upscale by/step": 0.05, + "txt2img/Resize width to/visible": true, + "txt2img/Resize width to/value": 0, + "txt2img/Resize width to/minimum": 0, + "txt2img/Resize width to/maximum": 2048, + "txt2img/Resize width to/step": 8, + "txt2img/Resize height to/visible": true, + "txt2img/Resize height to/value": 0, + "txt2img/Resize height to/minimum": 0, + "txt2img/Resize height to/maximum": 2048, + "txt2img/Resize height to/step": 8, + "txt2img/Checkpoint/visible": true, + "txt2img/Checkpoint/value": "Use same checkpoint", + "txt2img/Hires sampling method/visible": true, + "txt2img/Hires sampling method/value": "Use same sampler", + "txt2img/Hires schedule type/visible": true, + "txt2img/Hires schedule type/value": "Use same scheduler", + "txt2img/Hires prompt/visible": true, + "txt2img/Hires prompt/value": "", + "txt2img/Hires negative prompt/visible": true, + "txt2img/Hires negative prompt/value": "", + "customscript/refiner.py/txt2img/Refiner/visible": true, + "customscript/refiner.py/txt2img/Refiner/value": false, + "customscript/refiner.py/txt2img/Checkpoint/visible": true, + "customscript/refiner.py/txt2img/Checkpoint/value": "", + "customscript/refiner.py/txt2img/Switch at/visible": true, + "customscript/refiner.py/txt2img/Switch at/value": 0.8, + "customscript/refiner.py/txt2img/Switch at/minimum": 0.01, + "customscript/refiner.py/txt2img/Switch at/maximum": 1.0, + "customscript/refiner.py/txt2img/Switch at/step": 0.01, + "txt2img/Width/visible": true, + "txt2img/Width/value": 1024, + "txt2img/Width/minimum": 64, + "txt2img/Width/maximum": 2048, + "txt2img/Width/step": 8, + "txt2img/Height/visible": true, + "txt2img/Height/value": 1024, + "txt2img/Height/minimum": 64, + "txt2img/Height/maximum": 2048, + "txt2img/Height/step": 8, + "txt2img/⇅/visible": true, + "txt2img/Batch count/visible": true, + "txt2img/Batch count/value": 1, + "txt2img/Batch count/minimum": 1, + "txt2img/Batch count/maximum": 100, + "txt2img/Batch count/step": 1, + "txt2img/Batch size/visible": true, + "txt2img/Batch size/value": 1, + "txt2img/Batch size/minimum": 1, + "txt2img/Batch size/maximum": 8, + "txt2img/Batch size/step": 1, + "txt2img/CFG Scale/visible": true, + "txt2img/CFG Scale/value": 5.0, + "txt2img/CFG Scale/minimum": 1.0, + "txt2img/CFG Scale/maximum": 30.0, + "txt2img/CFG Scale/step": 0.5, + "customscript/seed.py/txt2img/Seed/visible": true, + "customscript/seed.py/txt2img/Seed/value": -1, + "txt2img/🎲️/visible": true, + "txt2img/♻️/visible": true, + "customscript/seed.py/txt2img/Extra/visible": true, + "customscript/seed.py/txt2img/Extra/value": false, + "customscript/seed.py/txt2img/Variation seed/visible": true, + "customscript/seed.py/txt2img/Variation seed/value": -1, + "customscript/seed.py/txt2img/Variation strength/visible": true, + "customscript/seed.py/txt2img/Variation strength/value": 0.0, + "customscript/seed.py/txt2img/Variation strength/minimum": 0, + "customscript/seed.py/txt2img/Variation strength/maximum": 1, + "customscript/seed.py/txt2img/Variation strength/step": 0.01, + "customscript/seed.py/txt2img/Resize seed from width/visible": true, + "customscript/seed.py/txt2img/Resize seed from width/value": 0, + "customscript/seed.py/txt2img/Resize seed from width/minimum": 0, + "customscript/seed.py/txt2img/Resize seed from width/maximum": 2048, + "customscript/seed.py/txt2img/Resize seed from width/step": 8, + "customscript/seed.py/txt2img/Resize seed from height/visible": true, + "customscript/seed.py/txt2img/Resize seed from height/value": 0, + "customscript/seed.py/txt2img/Resize seed from height/minimum": 0, + "customscript/seed.py/txt2img/Resize seed from height/maximum": 2048, + "customscript/seed.py/txt2img/Resize seed from height/step": 8, + "txt2img/Override settings/value": null, + "customscript/loractl.py/txt2img/Enable Dynamic Lora Weights/visible": true, + "customscript/loractl.py/txt2img/Enable Dynamic Lora Weights/value": false, + "customscript/loractl.py/txt2img/Plot the LoRA weight in all steps/visible": true, + "customscript/loractl.py/txt2img/Plot the LoRA weight in all steps/value": false, + "customscript/random_res_script.py/txt2img/Enable random resolution/visible": true, + "customscript/random_res_script.py/txt2img/Enable random resolution/value": false, + "customscript/random_res_script.py/txt2img/Model Type/visible": true, + "customscript/random_res_script.py/txt2img/Model Type/value": "SDXL", + "customscript/random_res_script.py/txt2img/Resolution Weight Mode/visible": true, + "customscript/random_res_script.py/txt2img/Resolution Weight Mode/value": "Equal Weights", + "customscript/random_res_script.py/txt2img/Minimum Dimension/visible": true, + "customscript/random_res_script.py/txt2img/Minimum Dimension/value": 832, + "customscript/random_res_script.py/txt2img/Minimum Dimension/minimum": 256, + "customscript/random_res_script.py/txt2img/Minimum Dimension/maximum": 3072, + "customscript/random_res_script.py/txt2img/Minimum Dimension/step": 8, + "customscript/random_res_script.py/txt2img/Maximum Dimension/visible": true, + "customscript/random_res_script.py/txt2img/Maximum Dimension/value": 1216, + "customscript/random_res_script.py/txt2img/Maximum Dimension/minimum": 256, + "customscript/random_res_script.py/txt2img/Maximum Dimension/maximum": 3072, + "customscript/random_res_script.py/txt2img/Maximum Dimension/step": 8, + "customscript/random_res_script.py/txt2img/Current Resolutions (width,height format)/visible": true, + "customscript/random_res_script.py/txt2img/Current Resolutions (width,height format)/value": "", + "txt2img/New Width/visible": true, + "txt2img/New Width/value": null, + "txt2img/New Height/visible": true, + "txt2img/New Height/value": null, + "txt2img/Add Resolution/visible": true, + "txt2img/Add from Aspect Ratio Preset/visible": true, + "txt2img/Add from Aspect Ratio Preset/value": null, + "txt2img/Target Megapixels/visible": true, + "txt2img/Target Megapixels/value": 0.5, + "txt2img/Target Megapixels/minimum": 0.1, + "txt2img/Target Megapixels/maximum": 2.0, + "txt2img/Target Megapixels/step": 0.1, + "txt2img/Add Preset Resolution/visible": true, + "txt2img/Reset to Defaults/visible": true, + "txt2img/Clear All/visible": true, + "txt2img/Sort by Size/visible": true, + "txt2img/Remove Resolutions > 1MP/visible": true, + "txt2img/Remove Resolutions < 0.3MP/visible": true, + "txt2img/ControlNet Unit 0/visible": true, + "txt2img/ControlNet Unit 0/value": false, + "txt2img/Input Directory/visible": true, + "txt2img/Input Directory/value": "", + "txt2img/Mask Directory/value": "", + "txt2img/Clear Images/visible": true, + "txt2img/New Canvas Width/visible": true, + "txt2img/New Canvas Width/value": 512, + "txt2img/New Canvas Width/minimum": 256, + "txt2img/New Canvas Width/maximum": 1024, + "txt2img/New Canvas Width/step": 64, + "txt2img/New Canvas Height/visible": true, + "txt2img/New Canvas Height/value": 512, + "txt2img/New Canvas Height/minimum": 256, + "txt2img/New Canvas Height/maximum": 1024, + "txt2img/New Canvas Height/step": 64, + "txt2img/Create New Canvas/visible": true, + "txt2img/Cancel/visible": true, + "txt2img/Enable/visible": true, + "txt2img/Enable/value": false, + "txt2img/Pixel Perfect/visible": true, + "txt2img/Pixel Perfect/value": false, + "txt2img/Allow Preview/visible": true, + "txt2img/Allow Preview/value": false, + "txt2img/Use Mask/visible": true, + "txt2img/Use Mask/value": false, + "txt2img/Preview as Input/value": false, + "txt2img/Control Type/visible": true, + "txt2img/Control Type/value": "All", + "txt2img/Preprocessor/visible": true, + "txt2img/Preprocessor/value": "None", + "txt2img/Model/visible": true, + "txt2img/Model/value": "None", + "txt2img/Control Weight/visible": true, + "txt2img/Control Weight/value": 1.0, + "txt2img/Control Weight/minimum": 0.0, + "txt2img/Control Weight/maximum": 2.0, + "txt2img/Control Weight/step": 0.05, + "txt2img/Starting Control Step/visible": true, + "txt2img/Starting Control Step/value": 0.0, + "txt2img/Starting Control Step/minimum": 0.0, + "txt2img/Starting Control Step/maximum": 1.0, + "txt2img/Starting Control Step/step": 0.01, + "txt2img/Ending Control Step/visible": true, + "txt2img/Ending Control Step/value": 1.0, + "txt2img/Ending Control Step/minimum": 0.0, + "txt2img/Ending Control Step/maximum": 1.0, + "txt2img/Ending Control Step/step": 0.01, + "txt2img/Preprocessor resolution/value": -1, + "txt2img/Preprocessor resolution/minimum": 64, + "txt2img/Preprocessor resolution/maximum": 2048, + "txt2img/Preprocessor resolution/step": 10, + "txt2img/Threshold A/value": -1, + "txt2img/Threshold A/minimum": 64, + "txt2img/Threshold A/maximum": 1024, + "txt2img/Threshold A/step": 1, + "txt2img/Threshold B/value": -1, + "txt2img/Threshold B/minimum": 64, + "txt2img/Threshold B/maximum": 1024, + "txt2img/Threshold B/step": 1, + "txt2img/Control Mode/visible": true, + "txt2img/Control Mode/value": "Balanced", + "txt2img/Resize Mode/visible": true, + "txt2img/Resize Mode/value": "Crop and Resize", + "txt2img/Hires-Fix Option/value": "Both", + "txt2img/Presets/visible": true, + "txt2img/Presets/value": "New Preset", + "txt2img/Preset name/visible": true, + "txt2img/Preset name/value": "", + "txt2img/ControlNet Unit 1/visible": true, + "txt2img/ControlNet Unit 1/value": false, + "txt2img/ControlNet Unit 2/visible": true, + "txt2img/ControlNet Unit 2/value": false, + "customscript/forge_dynamic_thresholding.py/txt2img/Enabled/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Enabled/value": false, + "customscript/forge_dynamic_thresholding.py/txt2img/Simple Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Simple Mode/value": false, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale/value": 7.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale/step": 0.5, + "customscript/forge_dynamic_thresholding.py/txt2img/Threshold Percentile/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Threshold Percentile/value": 1.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Threshold Percentile/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Threshold Percentile/maximum": 1.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Threshold Percentile/step": 0.01, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Mode/value": "Constant", + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale Min/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale Min/value": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale Min/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale Min/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Mimic Scale Min/step": 0.5, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Mode/value": "Constant", + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Scale Min/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Scale Min/value": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Scale Min/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Scale Min/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Cfg Scale Min/step": 0.5, + "customscript/forge_dynamic_thresholding.py/txt2img/Sched Val/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Sched Val/value": 1.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Sched Val/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Sched Val/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Sched Val/step": 0.01, + "customscript/forge_dynamic_thresholding.py/txt2img/Separate Feature Channels/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Separate Feature Channels/value": "enable", + "customscript/forge_dynamic_thresholding.py/txt2img/Scaling Startpoint/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Scaling Startpoint/value": "MEAN", + "customscript/forge_dynamic_thresholding.py/txt2img/Variability Measure/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Variability Measure/value": "AD", + "customscript/forge_dynamic_thresholding.py/txt2img/Interpolate Phi/visible": true, + "customscript/forge_dynamic_thresholding.py/txt2img/Interpolate Phi/value": 1.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Interpolate Phi/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Interpolate Phi/maximum": 1.0, + "customscript/forge_dynamic_thresholding.py/txt2img/Interpolate Phi/step": 0.01, + "customscript/forge_freeu.py/txt2img/Enabled/visible": true, + "customscript/forge_freeu.py/txt2img/Enabled/value": false, + "customscript/forge_freeu.py/txt2img/B1/visible": true, + "customscript/forge_freeu.py/txt2img/B1/value": 1.01, + "customscript/forge_freeu.py/txt2img/B1/minimum": 0, + "customscript/forge_freeu.py/txt2img/B1/maximum": 2, + "customscript/forge_freeu.py/txt2img/B1/step": 0.01, + "customscript/forge_freeu.py/txt2img/B2/visible": true, + "customscript/forge_freeu.py/txt2img/B2/value": 1.02, + "customscript/forge_freeu.py/txt2img/B2/minimum": 0, + "customscript/forge_freeu.py/txt2img/B2/maximum": 2, + "customscript/forge_freeu.py/txt2img/B2/step": 0.01, + "customscript/forge_freeu.py/txt2img/S1/visible": true, + "customscript/forge_freeu.py/txt2img/S1/value": 0.99, + "customscript/forge_freeu.py/txt2img/S1/minimum": 0, + "customscript/forge_freeu.py/txt2img/S1/maximum": 4, + "customscript/forge_freeu.py/txt2img/S1/step": 0.01, + "customscript/forge_freeu.py/txt2img/S2/visible": true, + "customscript/forge_freeu.py/txt2img/S2/value": 0.95, + "customscript/forge_freeu.py/txt2img/S2/minimum": 0, + "customscript/forge_freeu.py/txt2img/S2/maximum": 4, + "customscript/forge_freeu.py/txt2img/S2/step": 0.01, + "customscript/forge_sag.py/txt2img/Enabled/visible": true, + "customscript/forge_sag.py/txt2img/Enabled/value": false, + "customscript/forge_sag.py/txt2img/Scale/visible": true, + "customscript/forge_sag.py/txt2img/Scale/value": 0.5, + "customscript/forge_sag.py/txt2img/Scale/minimum": -2.0, + "customscript/forge_sag.py/txt2img/Scale/maximum": 5.0, + "customscript/forge_sag.py/txt2img/Scale/step": 0.01, + "customscript/forge_sag.py/txt2img/Blur Sigma/visible": true, + "customscript/forge_sag.py/txt2img/Blur Sigma/value": 2.0, + "customscript/forge_sag.py/txt2img/Blur Sigma/minimum": 0.0, + "customscript/forge_sag.py/txt2img/Blur Sigma/maximum": 10.0, + "customscript/forge_sag.py/txt2img/Blur Sigma/step": 0.01, + "customscript/forge_hypertile.py/txt2img/Enabled/visible": true, + "customscript/forge_hypertile.py/txt2img/Enabled/value": false, + "customscript/forge_hypertile.py/txt2img/Tile Size/visible": true, + "customscript/forge_hypertile.py/txt2img/Tile Size/value": 256, + "customscript/forge_hypertile.py/txt2img/Tile Size/minimum": 1, + "customscript/forge_hypertile.py/txt2img/Tile Size/maximum": 2048, + "customscript/forge_hypertile.py/txt2img/Tile Size/step": 1, + "customscript/forge_hypertile.py/txt2img/Swap Size/visible": true, + "customscript/forge_hypertile.py/txt2img/Swap Size/value": 2, + "customscript/forge_hypertile.py/txt2img/Swap Size/minimum": 1, + "customscript/forge_hypertile.py/txt2img/Swap Size/maximum": 128, + "customscript/forge_hypertile.py/txt2img/Swap Size/step": 1, + "customscript/forge_hypertile.py/txt2img/Max Depth/visible": true, + "customscript/forge_hypertile.py/txt2img/Max Depth/value": 0, + "customscript/forge_hypertile.py/txt2img/Max Depth/minimum": 0, + "customscript/forge_hypertile.py/txt2img/Max Depth/maximum": 10, + "customscript/forge_hypertile.py/txt2img/Max Depth/step": 1, + "customscript/forge_hypertile.py/txt2img/Scale Depth/visible": true, + "customscript/forge_hypertile.py/txt2img/Scale Depth/value": false, + "customscript/kohya_hrfix.py/txt2img/Enabled/visible": true, + "customscript/kohya_hrfix.py/txt2img/Enabled/value": false, + "customscript/kohya_hrfix.py/txt2img/Block Number/visible": true, + "customscript/kohya_hrfix.py/txt2img/Block Number/value": 3, + "customscript/kohya_hrfix.py/txt2img/Block Number/minimum": 1, + "customscript/kohya_hrfix.py/txt2img/Block Number/maximum": 32, + "customscript/kohya_hrfix.py/txt2img/Block Number/step": 1, + "customscript/kohya_hrfix.py/txt2img/Downscale Factor/visible": true, + "customscript/kohya_hrfix.py/txt2img/Downscale Factor/value": 2.0, + "customscript/kohya_hrfix.py/txt2img/Downscale Factor/minimum": 0.1, + "customscript/kohya_hrfix.py/txt2img/Downscale Factor/maximum": 9.0, + "customscript/kohya_hrfix.py/txt2img/Downscale Factor/step": 0.001, + "customscript/kohya_hrfix.py/txt2img/Start Percent/visible": true, + "customscript/kohya_hrfix.py/txt2img/Start Percent/value": 0.0, + "customscript/kohya_hrfix.py/txt2img/Start Percent/minimum": 0.0, + "customscript/kohya_hrfix.py/txt2img/Start Percent/maximum": 1.0, + "customscript/kohya_hrfix.py/txt2img/Start Percent/step": 0.001, + "customscript/kohya_hrfix.py/txt2img/End Percent/visible": true, + "customscript/kohya_hrfix.py/txt2img/End Percent/value": 0.35, + "customscript/kohya_hrfix.py/txt2img/End Percent/minimum": 0.0, + "customscript/kohya_hrfix.py/txt2img/End Percent/maximum": 1.0, + "customscript/kohya_hrfix.py/txt2img/End Percent/step": 0.001, + "customscript/kohya_hrfix.py/txt2img/Downscale After Skip/visible": true, + "customscript/kohya_hrfix.py/txt2img/Downscale After Skip/value": true, + "customscript/kohya_hrfix.py/txt2img/Downscale Method/visible": true, + "customscript/kohya_hrfix.py/txt2img/Downscale Method/value": "bicubic", + "customscript/kohya_hrfix.py/txt2img/Upscale Method/visible": true, + "customscript/kohya_hrfix.py/txt2img/Upscale Method/value": "bicubic", + "customscript/APG_CFGGuidance_script.py/txt2img/Enable APG/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/Enable APG/value": false, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Momentum/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Momentum/value": 0.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Momentum/minimum": -2.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Momentum/maximum": 2.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Momentum/step": 0.01, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Adaptive Momentum/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Adaptive Momentum/value": 0.18, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Adaptive Momentum/minimum": -2.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Adaptive Momentum/maximum": 2.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Adaptive Momentum/step": 0.01, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Norm Threshold/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Norm Threshold/value": 15.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Norm Threshold/minimum": 0.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Norm Threshold/maximum": 100.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Norm Threshold/step": 0.5, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Eta/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Eta/value": 1.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Eta/minimum": 0.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Eta/maximum": 2.0, + "customscript/APG_CFGGuidance_script.py/txt2img/APG Eta/step": 0.1, + "customscript/APG_CFGGuidance_script.py/txt2img/Enable Guidance Limiter/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/Enable Guidance Limiter/value": false, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma Start/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma Start/value": 5.42, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma Start/minimum": -1.0, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma Start/maximum": 10000.0, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma Start/step": 0.01, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma End/visible": true, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma End/value": 0.28, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma End/minimum": -1.0, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma End/maximum": 10000.0, + "customscript/APG_CFGGuidance_script.py/txt2img/Guidance Sigma End/step": 0.01, + "customscript/advanced_model_sampling_script.py/txt2img/Enable RescaleCFG/visible": true, + "customscript/advanced_model_sampling_script.py/txt2img/Enable RescaleCFG/value": false, + "customscript/advanced_model_sampling_script.py/txt2img/RescaleCFG Multiplier/visible": true, + "customscript/advanced_model_sampling_script.py/txt2img/RescaleCFG Multiplier/value": 0.7, + "customscript/advanced_model_sampling_script.py/txt2img/RescaleCFG Multiplier/minimum": 0.0, + "customscript/advanced_model_sampling_script.py/txt2img/RescaleCFG Multiplier/maximum": 1.0, + "customscript/advanced_model_sampling_script.py/txt2img/RescaleCFG Multiplier/step": 0.01, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Enable Advanced Model Sampling/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Enable Advanced Model Sampling/value": false, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sampling Mode/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sampling Mode/value": "Discrete", + "customscript/advanced_model_sampling_script_backported.py/txt2img/Discrete Sampling Type/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Discrete Sampling Type/value": "v_prediction", + "customscript/advanced_model_sampling_script_backported.py/txt2img/Zero SNR/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Zero SNR/value": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Continuous EDM Sampling Type/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Continuous EDM Sampling Type/value": "v_prediction", + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Max/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Max/value": 120.0, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Max/minimum": 0.0, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Max/maximum": 1000.0, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Max/step": 0.001, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Min/visible": true, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Min/value": 0.002, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Min/minimum": 0.0, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Min/maximum": 1000.0, + "customscript/advanced_model_sampling_script_backported.py/txt2img/Sigma Min/step": 0.001, + "customscript/forge_multidiffusion.py/txt2img/Enabled/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Enabled/value": false, + "customscript/forge_multidiffusion.py/txt2img/Method/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Method/value": "MultiDiffusion", + "customscript/forge_multidiffusion.py/txt2img/Tile Width/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Tile Width/value": 768, + "customscript/forge_multidiffusion.py/txt2img/Tile Width/minimum": 16, + "customscript/forge_multidiffusion.py/txt2img/Tile Width/maximum": 8192, + "customscript/forge_multidiffusion.py/txt2img/Tile Width/step": 16, + "customscript/forge_multidiffusion.py/txt2img/Tile Height/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Tile Height/value": 768, + "customscript/forge_multidiffusion.py/txt2img/Tile Height/minimum": 16, + "customscript/forge_multidiffusion.py/txt2img/Tile Height/maximum": 8192, + "customscript/forge_multidiffusion.py/txt2img/Tile Height/step": 16, + "customscript/forge_multidiffusion.py/txt2img/Tile Overlap/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Tile Overlap/value": 64, + "customscript/forge_multidiffusion.py/txt2img/Tile Overlap/minimum": 0, + "customscript/forge_multidiffusion.py/txt2img/Tile Overlap/maximum": 2048, + "customscript/forge_multidiffusion.py/txt2img/Tile Overlap/step": 32, + "customscript/forge_multidiffusion.py/txt2img/Tile Batch Size/visible": true, + "customscript/forge_multidiffusion.py/txt2img/Tile Batch Size/value": 4, + "customscript/forge_multidiffusion.py/txt2img/Tile Batch Size/minimum": 1, + "customscript/forge_multidiffusion.py/txt2img/Tile Batch Size/maximum": 8192, + "customscript/forge_multidiffusion.py/txt2img/Tile Batch Size/step": 1, + "customscript/forge_never_oom.py/txt2img/Enabled for UNet (always maximize offload)/visible": true, + "customscript/forge_never_oom.py/txt2img/Enabled for UNet (always maximize offload)/value": false, + "customscript/forge_never_oom.py/txt2img/Enabled for VAE (always tiled)/visible": true, + "customscript/forge_never_oom.py/txt2img/Enabled for VAE (always tiled)/value": false, + "txt2img/Script/visible": true, + "txt2img/Script/value": "None", + "customscript/prompt_matrix.py/txt2img/Put variable parts at start of prompt/visible": true, + "customscript/prompt_matrix.py/txt2img/Put variable parts at start of prompt/value": false, + "customscript/prompt_matrix.py/txt2img/Use different seed for each picture/visible": true, + "customscript/prompt_matrix.py/txt2img/Use different seed for each picture/value": false, + "customscript/prompt_matrix.py/txt2img/Select prompt/visible": true, + "customscript/prompt_matrix.py/txt2img/Select prompt/value": "positive", + "customscript/prompt_matrix.py/txt2img/Select joining char/visible": true, + "customscript/prompt_matrix.py/txt2img/Select joining char/value": "comma", + "customscript/prompt_matrix.py/txt2img/Grid margins (px)/visible": true, + "customscript/prompt_matrix.py/txt2img/Grid margins (px)/value": 0, + "customscript/prompt_matrix.py/txt2img/Grid margins (px)/minimum": 0, + "customscript/prompt_matrix.py/txt2img/Grid margins (px)/maximum": 500, + "customscript/prompt_matrix.py/txt2img/Grid margins (px)/step": 2, + "customscript/prompts_from_file.py/txt2img/Iterate seed every line/visible": true, + "customscript/prompts_from_file.py/txt2img/Iterate seed every line/value": false, + "customscript/prompts_from_file.py/txt2img/Use same random seed for all lines/visible": true, + "customscript/prompts_from_file.py/txt2img/Use same random seed for all lines/value": false, + "customscript/prompts_from_file.py/txt2img/Insert prompts at the/visible": true, + "customscript/prompts_from_file.py/txt2img/Insert prompts at the/value": "start", + "customscript/prompts_from_file.py/txt2img/List of prompt inputs/visible": true, + "customscript/prompts_from_file.py/txt2img/List of prompt inputs/value": "", + "customscript/xyz_grid.py/txt2img/X type/visible": true, + "customscript/xyz_grid.py/txt2img/X type/value": "Seed", + "customscript/xyz_grid.py/txt2img/X values/visible": true, + "customscript/xyz_grid.py/txt2img/X values/value": "", + "customscript/xyz_grid.py/txt2img/Y type/visible": true, + "customscript/xyz_grid.py/txt2img/Y type/value": "Nothing", + "customscript/xyz_grid.py/txt2img/Y values/visible": true, + "customscript/xyz_grid.py/txt2img/Y values/value": "", + "customscript/xyz_grid.py/txt2img/Z type/visible": true, + "customscript/xyz_grid.py/txt2img/Z type/value": "Nothing", + "customscript/xyz_grid.py/txt2img/Z values/visible": true, + "customscript/xyz_grid.py/txt2img/Z values/value": "", + "customscript/xyz_grid.py/txt2img/Draw legend/visible": true, + "customscript/xyz_grid.py/txt2img/Draw legend/value": true, + "customscript/xyz_grid.py/txt2img/Draw individual labels/visible": true, + "customscript/xyz_grid.py/txt2img/Draw individual labels/value": false, + "customscript/xyz_grid.py/txt2img/Items per grid (0 = default), for sequential grid generation./visible": true, + "customscript/xyz_grid.py/txt2img/Items per grid (0 = default), for sequential grid generation./value": 0, + "customscript/xyz_grid.py/txt2img/Items per grid (0 = default), for sequential grid generation./minimum": 0, + "customscript/xyz_grid.py/txt2img/Items per grid (0 = default), for sequential grid generation./maximum": 200, + "customscript/xyz_grid.py/txt2img/Items per grid (0 = default), for sequential grid generation./step": 1, + "customscript/xyz_grid.py/txt2img/Keep -1 for seeds/visible": true, + "customscript/xyz_grid.py/txt2img/Keep -1 for seeds/value": false, + "customscript/xyz_grid.py/txt2img/Vary seeds for X/visible": true, + "customscript/xyz_grid.py/txt2img/Vary seeds for X/value": false, + "customscript/xyz_grid.py/txt2img/Vary seeds for Y/visible": true, + "customscript/xyz_grid.py/txt2img/Vary seeds for Y/value": false, + "customscript/xyz_grid.py/txt2img/Vary seeds for Z/visible": true, + "customscript/xyz_grid.py/txt2img/Vary seeds for Z/value": false, + "customscript/xyz_grid.py/txt2img/Include Sub Images/visible": true, + "customscript/xyz_grid.py/txt2img/Include Sub Images/value": false, + "customscript/xyz_grid.py/txt2img/Include Sub Grids/visible": true, + "customscript/xyz_grid.py/txt2img/Include Sub Grids/value": false, + "customscript/xyz_grid.py/txt2img/Use text inputs instead of dropdowns/visible": true, + "customscript/xyz_grid.py/txt2img/Use text inputs instead of dropdowns/value": false, + "customscript/xyz_grid.py/txt2img/Grid margins (px)/visible": true, + "customscript/xyz_grid.py/txt2img/Grid margins (px)/value": 0, + "customscript/xyz_grid.py/txt2img/Grid margins (px)/minimum": 0, + "customscript/xyz_grid.py/txt2img/Grid margins (px)/maximum": 500, + "customscript/xyz_grid.py/txt2img/Grid margins (px)/step": 2, + "txt2img/Swap X/Y axes/visible": true, + "txt2img/Swap Y/Z axes/visible": true, + "txt2img/Swap X/Z axes/visible": true, + "txt2img/📂/visible": true, + "txt2img/💾/visible": true, + "txt2img/🗃️/visible": true, + "txt2img/🖼️/visible": true, + "txt2img/🎨️/visible": true, + "txt2img/📐/visible": true, + "txt2img/🎬/visible": true, + "txt2img/✨/visible": true, + "txt2img/Description/visible": true, + "txt2img/Description/value": "", + "txt2img/Replace preview/visible": true, + "txt2img/Save/visible": true, + "txt2img/Preferred VAE/visible": true, + "txt2img/Preferred VAE/value": "None", + "txt2img/Stable Diffusion version/visible": true, + "txt2img/Stable Diffusion version/value": "Unknown", + "txt2img/Activation text/visible": true, + "txt2img/Activation text/value": "", + "txt2img/Preferred weight/visible": true, + "txt2img/Preferred weight/value": 0.0, + "txt2img/Preferred weight/minimum": 0.0, + "txt2img/Preferred weight/maximum": 2.0, + "txt2img/Preferred weight/step": 0.01, + "txt2img/Random prompt/visible": true, + "txt2img/Random prompt/value": "", + "img2img/Prompt/visible": true, + "img2img/Prompt/value": "", + "img2img/Negative prompt/visible": true, + "img2img/Negative prompt/value": "", + "img2img/Interrupt/visible": true, + "img2img/Skip/visible": true, + "img2img/Interrupting.../visible": true, + "img2img/Generate/visible": true, + "img2img/↙️/visible": true, + "img2img/🗑️/visible": true, + "img2img/📋/visible": true, + "img2img/📎/visible": true, + "img2img/📦/visible": true, + "img2img/Styles/visible": true, + "img2img/Styles/value": [], + "img2img/🖌️/visible": true, + "img2img/🔄/visible": true, + "img2img/📝/visible": true, + "img2img/Close/visible": true, + "img2img/Tabs@img2img_extra_tabs/selected": null, + "img2img/Tabs@mode_img2img/selected": null, + "img2img/img2img/visible": true, + "img2img/sketch/visible": true, + "img2img/inpaint/visible": true, + "img2img/inpaint sketch/visible": true, + "img2img/Input directory/visible": true, + "img2img/Input directory/value": "", + "img2img/Output directory/visible": true, + "img2img/Output directory/value": "", + "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/visible": true, + "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/value": "", + "img2img/Controlnet input directory/visible": true, + "img2img/Controlnet input directory/value": "", + "img2img/Append png info to prompts/visible": true, + "img2img/Append png info to prompts/value": false, + "img2img/PNG info directory/visible": true, + "img2img/PNG info directory/value": "", + "img2img/Resize mode/visible": true, + "img2img/Resize mode/value": "Just resize", + "img2img/Mask blur/visible": true, + "img2img/Mask blur/value": 4, + "img2img/Mask blur/minimum": 0, + "img2img/Mask blur/maximum": 64, + "img2img/Mask blur/step": 1, + "img2img/Mask transparency/value": 0, + "img2img/Mask transparency/minimum": 0, + "img2img/Mask transparency/maximum": 100, + "img2img/Mask transparency/step": 1, + "img2img/Mask mode/visible": true, + "img2img/Mask mode/value": "Inpaint masked", + "img2img/Masked content/visible": true, + "img2img/Masked content/value": "original", + "img2img/Inpaint area/visible": true, + "img2img/Inpaint area/value": "Whole picture", + "img2img/Only masked padding, pixels/visible": true, + "img2img/Only masked padding, pixels/value": 32, + "img2img/Only masked padding, pixels/minimum": 0, + "img2img/Only masked padding, pixels/maximum": 256, + "img2img/Only masked padding, pixels/step": 4, + "customscript/soft_inpainting.py/img2img/Soft inpainting/visible": true, + "customscript/soft_inpainting.py/img2img/Soft inpainting/value": false, + "customscript/soft_inpainting.py/img2img/Schedule bias/visible": true, + "customscript/soft_inpainting.py/img2img/Schedule bias/value": 1, + "customscript/soft_inpainting.py/img2img/Schedule bias/minimum": 0, + "customscript/soft_inpainting.py/img2img/Schedule bias/maximum": 8, + "customscript/soft_inpainting.py/img2img/Schedule bias/step": 0.1, + "customscript/soft_inpainting.py/img2img/Preservation strength/visible": true, + "customscript/soft_inpainting.py/img2img/Preservation strength/value": 0.5, + "customscript/soft_inpainting.py/img2img/Preservation strength/minimum": 0, + "customscript/soft_inpainting.py/img2img/Preservation strength/maximum": 8, + "customscript/soft_inpainting.py/img2img/Preservation strength/step": 0.05, + "customscript/soft_inpainting.py/img2img/Transition contrast boost/visible": true, + "customscript/soft_inpainting.py/img2img/Transition contrast boost/value": 4, + "customscript/soft_inpainting.py/img2img/Transition contrast boost/minimum": 1, + "customscript/soft_inpainting.py/img2img/Transition contrast boost/maximum": 32, + "customscript/soft_inpainting.py/img2img/Transition contrast boost/step": 0.5, + "customscript/soft_inpainting.py/img2img/Mask influence/visible": true, + "customscript/soft_inpainting.py/img2img/Mask influence/value": 0, + "customscript/soft_inpainting.py/img2img/Mask influence/minimum": 0, + "customscript/soft_inpainting.py/img2img/Mask influence/maximum": 1, + "customscript/soft_inpainting.py/img2img/Mask influence/step": 0.05, + "customscript/soft_inpainting.py/img2img/Difference threshold/visible": true, + "customscript/soft_inpainting.py/img2img/Difference threshold/value": 0.5, + "customscript/soft_inpainting.py/img2img/Difference threshold/minimum": 0, + "customscript/soft_inpainting.py/img2img/Difference threshold/maximum": 8, + "customscript/soft_inpainting.py/img2img/Difference threshold/step": 0.25, + "customscript/soft_inpainting.py/img2img/Difference contrast/visible": true, + "customscript/soft_inpainting.py/img2img/Difference contrast/value": 2, + "customscript/soft_inpainting.py/img2img/Difference contrast/minimum": 0, + "customscript/soft_inpainting.py/img2img/Difference contrast/maximum": 8, + "customscript/soft_inpainting.py/img2img/Difference contrast/step": 0.25, + "customscript/sampler.py/img2img/Sampling method/visible": true, + "customscript/sampler.py/img2img/Sampling method/value": "DPM++ 2M", + "customscript/sampler.py/img2img/Schedule type/visible": true, + "customscript/sampler.py/img2img/Schedule type/value": "Automatic", + "customscript/sampler.py/img2img/Sampling steps/visible": true, + "customscript/sampler.py/img2img/Sampling steps/value": 20, + "customscript/sampler.py/img2img/Sampling steps/minimum": 1, + "customscript/sampler.py/img2img/Sampling steps/maximum": 150, + "customscript/sampler.py/img2img/Sampling steps/step": 1, + "customscript/refiner.py/img2img/Refiner/visible": true, + "customscript/refiner.py/img2img/Refiner/value": false, + "customscript/refiner.py/img2img/Checkpoint/visible": true, + "customscript/refiner.py/img2img/Checkpoint/value": "", + "customscript/refiner.py/img2img/Switch at/visible": true, + "customscript/refiner.py/img2img/Switch at/value": 0.8, + "customscript/refiner.py/img2img/Switch at/minimum": 0.01, + "customscript/refiner.py/img2img/Switch at/maximum": 1.0, + "customscript/refiner.py/img2img/Switch at/step": 0.01, + "img2img/Tabs@img2img_tabs_resize/selected": null, + "img2img/Width/visible": true, + "img2img/Width/value": 512, + "img2img/Width/minimum": 64, + "img2img/Width/maximum": 2048, + "img2img/Width/step": 8, + "img2img/Height/visible": true, + "img2img/Height/value": 512, + "img2img/Height/minimum": 64, + "img2img/Height/maximum": 2048, + "img2img/Height/step": 8, + "img2img/⇅/visible": true, + "img2img/📐/visible": true, + "img2img/Scale/visible": true, + "img2img/Scale/value": 1.0, + "img2img/Scale/minimum": 0.05, + "img2img/Scale/maximum": 4.0, + "img2img/Scale/step": 0.05, + "img2img/Unused/visible": true, + "img2img/Unused/value": 0, + "img2img/Unused/minimum": 0, + "img2img/Unused/maximum": 100, + "img2img/Unused/step": 1, + "img2img/Batch count/visible": true, + "img2img/Batch count/value": 1, + "img2img/Batch count/minimum": 1, + "img2img/Batch count/maximum": 100, + "img2img/Batch count/step": 1, + "img2img/Batch size/visible": true, + "img2img/Batch size/value": 1, + "img2img/Batch size/minimum": 1, + "img2img/Batch size/maximum": 8, + "img2img/Batch size/step": 1, + "img2img/CFG Scale/visible": true, + "img2img/CFG Scale/value": 7.0, + "img2img/CFG Scale/minimum": 1.0, + "img2img/CFG Scale/maximum": 30.0, + "img2img/CFG Scale/step": 0.5, + "img2img/Image CFG Scale/value": 1.5, + "img2img/Image CFG Scale/minimum": 0, + "img2img/Image CFG Scale/maximum": 3.0, + "img2img/Image CFG Scale/step": 0.05, + "img2img/Denoising strength/visible": true, + "img2img/Denoising strength/value": 0.75, + "img2img/Denoising strength/minimum": 0.0, + "img2img/Denoising strength/maximum": 1.0, + "img2img/Denoising strength/step": 0.01, + "customscript/seed.py/img2img/Seed/visible": true, + "customscript/seed.py/img2img/Seed/value": -1, + "img2img/🎲️/visible": true, + "img2img/♻️/visible": true, + "customscript/seed.py/img2img/Extra/visible": true, + "customscript/seed.py/img2img/Extra/value": false, + "customscript/seed.py/img2img/Variation seed/visible": true, + "customscript/seed.py/img2img/Variation seed/value": -1, + "customscript/seed.py/img2img/Variation strength/visible": true, + "customscript/seed.py/img2img/Variation strength/value": 0.0, + "customscript/seed.py/img2img/Variation strength/minimum": 0, + "customscript/seed.py/img2img/Variation strength/maximum": 1, + "customscript/seed.py/img2img/Variation strength/step": 0.01, + "customscript/seed.py/img2img/Resize seed from width/visible": true, + "customscript/seed.py/img2img/Resize seed from width/value": 0, + "customscript/seed.py/img2img/Resize seed from width/minimum": 0, + "customscript/seed.py/img2img/Resize seed from width/maximum": 2048, + "customscript/seed.py/img2img/Resize seed from width/step": 8, + "customscript/seed.py/img2img/Resize seed from height/visible": true, + "customscript/seed.py/img2img/Resize seed from height/value": 0, + "customscript/seed.py/img2img/Resize seed from height/minimum": 0, + "customscript/seed.py/img2img/Resize seed from height/maximum": 2048, + "customscript/seed.py/img2img/Resize seed from height/step": 8, + "img2img/Override settings/value": null, + "customscript/loractl.py/img2img/Enable Dynamic Lora Weights/visible": true, + "customscript/loractl.py/img2img/Enable Dynamic Lora Weights/value": false, + "customscript/loractl.py/img2img/Plot the LoRA weight in all steps/visible": true, + "customscript/loractl.py/img2img/Plot the LoRA weight in all steps/value": false, + "customscript/random_res_script.py/img2img/Enable random resolution/visible": true, + "customscript/random_res_script.py/img2img/Enable random resolution/value": false, + "customscript/random_res_script.py/img2img/Model Type/visible": true, + "customscript/random_res_script.py/img2img/Model Type/value": "SDXL", + "customscript/random_res_script.py/img2img/Resolution Weight Mode/visible": true, + "customscript/random_res_script.py/img2img/Resolution Weight Mode/value": "Equal Weights", + "customscript/random_res_script.py/img2img/Minimum Dimension/visible": true, + "customscript/random_res_script.py/img2img/Minimum Dimension/value": 832, + "customscript/random_res_script.py/img2img/Minimum Dimension/minimum": 256, + "customscript/random_res_script.py/img2img/Minimum Dimension/maximum": 3072, + "customscript/random_res_script.py/img2img/Minimum Dimension/step": 8, + "customscript/random_res_script.py/img2img/Maximum Dimension/visible": true, + "customscript/random_res_script.py/img2img/Maximum Dimension/value": 1216, + "customscript/random_res_script.py/img2img/Maximum Dimension/minimum": 256, + "customscript/random_res_script.py/img2img/Maximum Dimension/maximum": 3072, + "customscript/random_res_script.py/img2img/Maximum Dimension/step": 8, + "customscript/random_res_script.py/img2img/Current Resolutions (width,height format)/visible": true, + "customscript/random_res_script.py/img2img/Current Resolutions (width,height format)/value": "", + "img2img/New Width/visible": true, + "img2img/New Width/value": null, + "img2img/New Height/visible": true, + "img2img/New Height/value": null, + "img2img/Add Resolution/visible": true, + "img2img/Add from Aspect Ratio Preset/visible": true, + "img2img/Add from Aspect Ratio Preset/value": null, + "img2img/Target Megapixels/visible": true, + "img2img/Target Megapixels/value": 0.5, + "img2img/Target Megapixels/minimum": 0.1, + "img2img/Target Megapixels/maximum": 2.0, + "img2img/Target Megapixels/step": 0.1, + "img2img/Add Preset Resolution/visible": true, + "img2img/Reset to Defaults/visible": true, + "img2img/Clear All/visible": true, + "img2img/Sort by Size/visible": true, + "img2img/Remove Resolutions > 1MP/visible": true, + "img2img/Remove Resolutions < 0.3MP/visible": true, + "img2img/ControlNet Unit 0/visible": true, + "img2img/ControlNet Unit 0/value": false, + "img2img/Input Directory/visible": true, + "img2img/Input Directory/value": "", + "img2img/Mask Directory/value": "", + "img2img/Clear Images/visible": true, + "img2img/New Canvas Width/visible": true, + "img2img/New Canvas Width/value": 512, + "img2img/New Canvas Width/minimum": 256, + "img2img/New Canvas Width/maximum": 1024, + "img2img/New Canvas Width/step": 64, + "img2img/New Canvas Height/visible": true, + "img2img/New Canvas Height/value": 512, + "img2img/New Canvas Height/minimum": 256, + "img2img/New Canvas Height/maximum": 1024, + "img2img/New Canvas Height/step": 64, + "img2img/Create New Canvas/visible": true, + "img2img/Cancel/visible": true, + "img2img/Enable/visible": true, + "img2img/Enable/value": false, + "img2img/Pixel Perfect/visible": true, + "img2img/Pixel Perfect/value": false, + "img2img/Allow Preview/value": false, + "img2img/Use Mask/value": false, + "img2img/Preview as Input/value": false, + "img2img/Upload independent control image/visible": true, + "img2img/Upload independent control image/value": false, + "img2img/Control Type/visible": true, + "img2img/Control Type/value": "All", + "img2img/Preprocessor/visible": true, + "img2img/Preprocessor/value": "None", + "img2img/Model/visible": true, + "img2img/Model/value": "None", + "img2img/Control Weight/visible": true, + "img2img/Control Weight/value": 1.0, + "img2img/Control Weight/minimum": 0.0, + "img2img/Control Weight/maximum": 2.0, + "img2img/Control Weight/step": 0.05, + "img2img/Starting Control Step/visible": true, + "img2img/Starting Control Step/value": 0.0, + "img2img/Starting Control Step/minimum": 0.0, + "img2img/Starting Control Step/maximum": 1.0, + "img2img/Starting Control Step/step": 0.01, + "img2img/Ending Control Step/visible": true, + "img2img/Ending Control Step/value": 1.0, + "img2img/Ending Control Step/minimum": 0.0, + "img2img/Ending Control Step/maximum": 1.0, + "img2img/Ending Control Step/step": 0.01, + "img2img/Preprocessor resolution/value": -1, + "img2img/Preprocessor resolution/minimum": 64, + "img2img/Preprocessor resolution/maximum": 2048, + "img2img/Preprocessor resolution/step": 10, + "img2img/Threshold A/value": -1, + "img2img/Threshold A/minimum": 64, + "img2img/Threshold A/maximum": 1024, + "img2img/Threshold A/step": 1, + "img2img/Threshold B/value": -1, + "img2img/Threshold B/minimum": 64, + "img2img/Threshold B/maximum": 1024, + "img2img/Threshold B/step": 1, + "img2img/Control Mode/visible": true, + "img2img/Control Mode/value": "Balanced", + "img2img/Resize Mode/value": "Crop and Resize", + "img2img/Hires-Fix Option/value": "Both", + "img2img/Presets/visible": true, + "img2img/Presets/value": "New Preset", + "img2img/Preset name/visible": true, + "img2img/Preset name/value": "", + "img2img/ControlNet Unit 1/visible": true, + "img2img/ControlNet Unit 1/value": false, + "img2img/ControlNet Unit 2/visible": true, + "img2img/ControlNet Unit 2/value": false, + "customscript/forge_dynamic_thresholding.py/img2img/Enabled/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Enabled/value": false, + "customscript/forge_dynamic_thresholding.py/img2img/Simple Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Simple Mode/value": false, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale/value": 7.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale/step": 0.5, + "customscript/forge_dynamic_thresholding.py/img2img/Threshold Percentile/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Threshold Percentile/value": 1.0, + "customscript/forge_dynamic_thresholding.py/img2img/Threshold Percentile/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Threshold Percentile/maximum": 1.0, + "customscript/forge_dynamic_thresholding.py/img2img/Threshold Percentile/step": 0.01, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Mode/value": "Constant", + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale Min/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale Min/value": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale Min/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale Min/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/img2img/Mimic Scale Min/step": 0.5, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Mode/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Mode/value": "Constant", + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Scale Min/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Scale Min/value": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Scale Min/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Scale Min/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/img2img/Cfg Scale Min/step": 0.5, + "customscript/forge_dynamic_thresholding.py/img2img/Sched Val/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Sched Val/value": 1.0, + "customscript/forge_dynamic_thresholding.py/img2img/Sched Val/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Sched Val/maximum": 100.0, + "customscript/forge_dynamic_thresholding.py/img2img/Sched Val/step": 0.01, + "customscript/forge_dynamic_thresholding.py/img2img/Separate Feature Channels/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Separate Feature Channels/value": "enable", + "customscript/forge_dynamic_thresholding.py/img2img/Scaling Startpoint/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Scaling Startpoint/value": "MEAN", + "customscript/forge_dynamic_thresholding.py/img2img/Variability Measure/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Variability Measure/value": "AD", + "customscript/forge_dynamic_thresholding.py/img2img/Interpolate Phi/visible": true, + "customscript/forge_dynamic_thresholding.py/img2img/Interpolate Phi/value": 1.0, + "customscript/forge_dynamic_thresholding.py/img2img/Interpolate Phi/minimum": 0.0, + "customscript/forge_dynamic_thresholding.py/img2img/Interpolate Phi/maximum": 1.0, + "customscript/forge_dynamic_thresholding.py/img2img/Interpolate Phi/step": 0.01, + "customscript/forge_freeu.py/img2img/Enabled/visible": true, + "customscript/forge_freeu.py/img2img/Enabled/value": false, + "customscript/forge_freeu.py/img2img/B1/visible": true, + "customscript/forge_freeu.py/img2img/B1/value": 1.01, + "customscript/forge_freeu.py/img2img/B1/minimum": 0, + "customscript/forge_freeu.py/img2img/B1/maximum": 2, + "customscript/forge_freeu.py/img2img/B1/step": 0.01, + "customscript/forge_freeu.py/img2img/B2/visible": true, + "customscript/forge_freeu.py/img2img/B2/value": 1.02, + "customscript/forge_freeu.py/img2img/B2/minimum": 0, + "customscript/forge_freeu.py/img2img/B2/maximum": 2, + "customscript/forge_freeu.py/img2img/B2/step": 0.01, + "customscript/forge_freeu.py/img2img/S1/visible": true, + "customscript/forge_freeu.py/img2img/S1/value": 0.99, + "customscript/forge_freeu.py/img2img/S1/minimum": 0, + "customscript/forge_freeu.py/img2img/S1/maximum": 4, + "customscript/forge_freeu.py/img2img/S1/step": 0.01, + "customscript/forge_freeu.py/img2img/S2/visible": true, + "customscript/forge_freeu.py/img2img/S2/value": 0.95, + "customscript/forge_freeu.py/img2img/S2/minimum": 0, + "customscript/forge_freeu.py/img2img/S2/maximum": 4, + "customscript/forge_freeu.py/img2img/S2/step": 0.01, + "customscript/forge_sag.py/img2img/Enabled/visible": true, + "customscript/forge_sag.py/img2img/Enabled/value": false, + "customscript/forge_sag.py/img2img/Scale/visible": true, + "customscript/forge_sag.py/img2img/Scale/value": 0.5, + "customscript/forge_sag.py/img2img/Scale/minimum": -2.0, + "customscript/forge_sag.py/img2img/Scale/maximum": 5.0, + "customscript/forge_sag.py/img2img/Scale/step": 0.01, + "customscript/forge_sag.py/img2img/Blur Sigma/visible": true, + "customscript/forge_sag.py/img2img/Blur Sigma/value": 2.0, + "customscript/forge_sag.py/img2img/Blur Sigma/minimum": 0.0, + "customscript/forge_sag.py/img2img/Blur Sigma/maximum": 10.0, + "customscript/forge_sag.py/img2img/Blur Sigma/step": 0.01, + "customscript/forge_hypertile.py/img2img/Enabled/visible": true, + "customscript/forge_hypertile.py/img2img/Enabled/value": false, + "customscript/forge_hypertile.py/img2img/Tile Size/visible": true, + "customscript/forge_hypertile.py/img2img/Tile Size/value": 256, + "customscript/forge_hypertile.py/img2img/Tile Size/minimum": 1, + "customscript/forge_hypertile.py/img2img/Tile Size/maximum": 2048, + "customscript/forge_hypertile.py/img2img/Tile Size/step": 1, + "customscript/forge_hypertile.py/img2img/Swap Size/visible": true, + "customscript/forge_hypertile.py/img2img/Swap Size/value": 2, + "customscript/forge_hypertile.py/img2img/Swap Size/minimum": 1, + "customscript/forge_hypertile.py/img2img/Swap Size/maximum": 128, + "customscript/forge_hypertile.py/img2img/Swap Size/step": 1, + "customscript/forge_hypertile.py/img2img/Max Depth/visible": true, + "customscript/forge_hypertile.py/img2img/Max Depth/value": 0, + "customscript/forge_hypertile.py/img2img/Max Depth/minimum": 0, + "customscript/forge_hypertile.py/img2img/Max Depth/maximum": 10, + "customscript/forge_hypertile.py/img2img/Max Depth/step": 1, + "customscript/forge_hypertile.py/img2img/Scale Depth/visible": true, + "customscript/forge_hypertile.py/img2img/Scale Depth/value": false, + "customscript/kohya_hrfix.py/img2img/Enabled/visible": true, + "customscript/kohya_hrfix.py/img2img/Enabled/value": false, + "customscript/kohya_hrfix.py/img2img/Block Number/visible": true, + "customscript/kohya_hrfix.py/img2img/Block Number/value": 3, + "customscript/kohya_hrfix.py/img2img/Block Number/minimum": 1, + "customscript/kohya_hrfix.py/img2img/Block Number/maximum": 32, + "customscript/kohya_hrfix.py/img2img/Block Number/step": 1, + "customscript/kohya_hrfix.py/img2img/Downscale Factor/visible": true, + "customscript/kohya_hrfix.py/img2img/Downscale Factor/value": 2.0, + "customscript/kohya_hrfix.py/img2img/Downscale Factor/minimum": 0.1, + "customscript/kohya_hrfix.py/img2img/Downscale Factor/maximum": 9.0, + "customscript/kohya_hrfix.py/img2img/Downscale Factor/step": 0.001, + "customscript/kohya_hrfix.py/img2img/Start Percent/visible": true, + "customscript/kohya_hrfix.py/img2img/Start Percent/value": 0.0, + "customscript/kohya_hrfix.py/img2img/Start Percent/minimum": 0.0, + "customscript/kohya_hrfix.py/img2img/Start Percent/maximum": 1.0, + "customscript/kohya_hrfix.py/img2img/Start Percent/step": 0.001, + "customscript/kohya_hrfix.py/img2img/End Percent/visible": true, + "customscript/kohya_hrfix.py/img2img/End Percent/value": 0.35, + "customscript/kohya_hrfix.py/img2img/End Percent/minimum": 0.0, + "customscript/kohya_hrfix.py/img2img/End Percent/maximum": 1.0, + "customscript/kohya_hrfix.py/img2img/End Percent/step": 0.001, + "customscript/kohya_hrfix.py/img2img/Downscale After Skip/visible": true, + "customscript/kohya_hrfix.py/img2img/Downscale After Skip/value": true, + "customscript/kohya_hrfix.py/img2img/Downscale Method/visible": true, + "customscript/kohya_hrfix.py/img2img/Downscale Method/value": "bicubic", + "customscript/kohya_hrfix.py/img2img/Upscale Method/visible": true, + "customscript/kohya_hrfix.py/img2img/Upscale Method/value": "bicubic", + "customscript/APG_CFGGuidance_script.py/img2img/Enable APG/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/Enable APG/value": false, + "customscript/APG_CFGGuidance_script.py/img2img/APG Momentum/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/APG Momentum/value": 0.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Momentum/minimum": -2.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Momentum/maximum": 2.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Momentum/step": 0.01, + "customscript/APG_CFGGuidance_script.py/img2img/APG Adaptive Momentum/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/APG Adaptive Momentum/value": 0.18, + "customscript/APG_CFGGuidance_script.py/img2img/APG Adaptive Momentum/minimum": -2.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Adaptive Momentum/maximum": 2.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Adaptive Momentum/step": 0.01, + "customscript/APG_CFGGuidance_script.py/img2img/APG Norm Threshold/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/APG Norm Threshold/value": 15.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Norm Threshold/minimum": 0.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Norm Threshold/maximum": 100.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Norm Threshold/step": 0.5, + "customscript/APG_CFGGuidance_script.py/img2img/APG Eta/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/APG Eta/value": 1.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Eta/minimum": 0.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Eta/maximum": 2.0, + "customscript/APG_CFGGuidance_script.py/img2img/APG Eta/step": 0.1, + "customscript/APG_CFGGuidance_script.py/img2img/Enable Guidance Limiter/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/Enable Guidance Limiter/value": false, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma Start/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma Start/value": 5.42, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma Start/minimum": -1.0, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma Start/maximum": 10000.0, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma Start/step": 0.01, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma End/visible": true, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma End/value": 0.28, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma End/minimum": -1.0, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma End/maximum": 10000.0, + "customscript/APG_CFGGuidance_script.py/img2img/Guidance Sigma End/step": 0.01, + "customscript/advanced_model_sampling_script.py/img2img/Enable RescaleCFG/visible": true, + "customscript/advanced_model_sampling_script.py/img2img/Enable RescaleCFG/value": false, + "customscript/advanced_model_sampling_script.py/img2img/RescaleCFG Multiplier/visible": true, + "customscript/advanced_model_sampling_script.py/img2img/RescaleCFG Multiplier/value": 0.7, + "customscript/advanced_model_sampling_script.py/img2img/RescaleCFG Multiplier/minimum": 0.0, + "customscript/advanced_model_sampling_script.py/img2img/RescaleCFG Multiplier/maximum": 1.0, + "customscript/advanced_model_sampling_script.py/img2img/RescaleCFG Multiplier/step": 0.01, + "customscript/advanced_model_sampling_script_backported.py/img2img/Enable Advanced Model Sampling/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Enable Advanced Model Sampling/value": false, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sampling Mode/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sampling Mode/value": "Discrete", + "customscript/advanced_model_sampling_script_backported.py/img2img/Discrete Sampling Type/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Discrete Sampling Type/value": "v_prediction", + "customscript/advanced_model_sampling_script_backported.py/img2img/Zero SNR/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Zero SNR/value": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Continuous EDM Sampling Type/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Continuous EDM Sampling Type/value": "v_prediction", + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Max/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Max/value": 120.0, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Max/minimum": 0.0, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Max/maximum": 1000.0, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Max/step": 0.001, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Min/visible": true, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Min/value": 0.002, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Min/minimum": 0.0, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Min/maximum": 1000.0, + "customscript/advanced_model_sampling_script_backported.py/img2img/Sigma Min/step": 0.001, + "customscript/forge_multidiffusion.py/img2img/Enabled/visible": true, + "customscript/forge_multidiffusion.py/img2img/Enabled/value": false, + "customscript/forge_multidiffusion.py/img2img/Method/visible": true, + "customscript/forge_multidiffusion.py/img2img/Method/value": "MultiDiffusion", + "customscript/forge_multidiffusion.py/img2img/Tile Width/visible": true, + "customscript/forge_multidiffusion.py/img2img/Tile Width/value": 768, + "customscript/forge_multidiffusion.py/img2img/Tile Width/minimum": 16, + "customscript/forge_multidiffusion.py/img2img/Tile Width/maximum": 8192, + "customscript/forge_multidiffusion.py/img2img/Tile Width/step": 16, + "customscript/forge_multidiffusion.py/img2img/Tile Height/visible": true, + "customscript/forge_multidiffusion.py/img2img/Tile Height/value": 768, + "customscript/forge_multidiffusion.py/img2img/Tile Height/minimum": 16, + "customscript/forge_multidiffusion.py/img2img/Tile Height/maximum": 8192, + "customscript/forge_multidiffusion.py/img2img/Tile Height/step": 16, + "customscript/forge_multidiffusion.py/img2img/Tile Overlap/visible": true, + "customscript/forge_multidiffusion.py/img2img/Tile Overlap/value": 64, + "customscript/forge_multidiffusion.py/img2img/Tile Overlap/minimum": 0, + "customscript/forge_multidiffusion.py/img2img/Tile Overlap/maximum": 2048, + "customscript/forge_multidiffusion.py/img2img/Tile Overlap/step": 32, + "customscript/forge_multidiffusion.py/img2img/Tile Batch Size/visible": true, + "customscript/forge_multidiffusion.py/img2img/Tile Batch Size/value": 4, + "customscript/forge_multidiffusion.py/img2img/Tile Batch Size/minimum": 1, + "customscript/forge_multidiffusion.py/img2img/Tile Batch Size/maximum": 8192, + "customscript/forge_multidiffusion.py/img2img/Tile Batch Size/step": 1, + "customscript/forge_never_oom.py/img2img/Enabled for UNet (always maximize offload)/visible": true, + "customscript/forge_never_oom.py/img2img/Enabled for UNet (always maximize offload)/value": false, + "customscript/forge_never_oom.py/img2img/Enabled for VAE (always tiled)/visible": true, + "customscript/forge_never_oom.py/img2img/Enabled for VAE (always tiled)/value": false, + "img2img/Script/visible": true, + "img2img/Script/value": "None", + "customscript/img2imgalt.py/img2img/Override `Sampling method` to Euler?(this method is built for it)/visible": true, + "customscript/img2imgalt.py/img2img/Override `Sampling method` to Euler?(this method is built for it)/value": true, + "customscript/img2imgalt.py/img2img/Override `prompt` to the same value as `original prompt`?(and `negative prompt`)/visible": true, + "customscript/img2imgalt.py/img2img/Override `prompt` to the same value as `original prompt`?(and `negative prompt`)/value": true, + "customscript/img2imgalt.py/img2img/Original prompt/visible": true, + "customscript/img2imgalt.py/img2img/Original prompt/value": "", + "customscript/img2imgalt.py/img2img/Original negative prompt/visible": true, + "customscript/img2imgalt.py/img2img/Original negative prompt/value": "", + "customscript/img2imgalt.py/img2img/Override `Sampling Steps` to the same value as `Decode steps`?/visible": true, + "customscript/img2imgalt.py/img2img/Override `Sampling Steps` to the same value as `Decode steps`?/value": true, + "customscript/img2imgalt.py/img2img/Decode steps/visible": true, + "customscript/img2imgalt.py/img2img/Decode steps/value": 50, + "customscript/img2imgalt.py/img2img/Decode steps/minimum": 1, + "customscript/img2imgalt.py/img2img/Decode steps/maximum": 150, + "customscript/img2imgalt.py/img2img/Decode steps/step": 1, + "customscript/img2imgalt.py/img2img/Override `Denoising strength` to 1?/visible": true, + "customscript/img2imgalt.py/img2img/Override `Denoising strength` to 1?/value": true, + "customscript/img2imgalt.py/img2img/Decode CFG scale/visible": true, + "customscript/img2imgalt.py/img2img/Decode CFG scale/value": 1.0, + "customscript/img2imgalt.py/img2img/Decode CFG scale/minimum": 0.0, + "customscript/img2imgalt.py/img2img/Decode CFG scale/maximum": 15.0, + "customscript/img2imgalt.py/img2img/Decode CFG scale/step": 0.1, + "customscript/img2imgalt.py/img2img/Randomness/visible": true, + "customscript/img2imgalt.py/img2img/Randomness/value": 0.0, + "customscript/img2imgalt.py/img2img/Randomness/minimum": 0.0, + "customscript/img2imgalt.py/img2img/Randomness/maximum": 1.0, + "customscript/img2imgalt.py/img2img/Randomness/step": 0.01, + "customscript/img2imgalt.py/img2img/Sigma adjustment for finding noise for image/visible": true, + "customscript/img2imgalt.py/img2img/Sigma adjustment for finding noise for image/value": false, + "customscript/loopback.py/img2img/Loops/visible": true, + "customscript/loopback.py/img2img/Loops/value": 4, + "customscript/loopback.py/img2img/Loops/minimum": 1, + "customscript/loopback.py/img2img/Loops/maximum": 32, + "customscript/loopback.py/img2img/Loops/step": 1, + "customscript/loopback.py/img2img/Final denoising strength/visible": true, + "customscript/loopback.py/img2img/Final denoising strength/value": 0.5, + "customscript/loopback.py/img2img/Final denoising strength/minimum": 0, + "customscript/loopback.py/img2img/Final denoising strength/maximum": 1, + "customscript/loopback.py/img2img/Final denoising strength/step": 0.01, + "customscript/loopback.py/img2img/Denoising strength curve/visible": true, + "customscript/loopback.py/img2img/Denoising strength curve/value": "Linear", + "customscript/loopback.py/img2img/Append interrogated prompt at each iteration/visible": true, + "customscript/loopback.py/img2img/Append interrogated prompt at each iteration/value": "None", + "customscript/outpainting_mk_2.py/img2img/Pixels to expand/visible": true, + "customscript/outpainting_mk_2.py/img2img/Pixels to expand/value": 128, + "customscript/outpainting_mk_2.py/img2img/Pixels to expand/minimum": 8, + "customscript/outpainting_mk_2.py/img2img/Pixels to expand/maximum": 256, + "customscript/outpainting_mk_2.py/img2img/Pixels to expand/step": 8, + "customscript/outpainting_mk_2.py/img2img/Mask blur/visible": true, + "customscript/outpainting_mk_2.py/img2img/Mask blur/value": 8, + "customscript/outpainting_mk_2.py/img2img/Mask blur/minimum": 0, + "customscript/outpainting_mk_2.py/img2img/Mask blur/maximum": 64, + "customscript/outpainting_mk_2.py/img2img/Mask blur/step": 1, + "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/visible": true, + "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/value": 1.0, + "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/minimum": 0.0, + "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/maximum": 4.0, + "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/step": 0.01, + "customscript/outpainting_mk_2.py/img2img/Color variation/visible": true, + "customscript/outpainting_mk_2.py/img2img/Color variation/value": 0.05, + "customscript/outpainting_mk_2.py/img2img/Color variation/minimum": 0.0, + "customscript/outpainting_mk_2.py/img2img/Color variation/maximum": 1.0, + "customscript/outpainting_mk_2.py/img2img/Color variation/step": 0.01, + "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/visible": true, + "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/value": 128, + "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/minimum": 8, + "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/maximum": 256, + "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/step": 8, + "customscript/poor_mans_outpainting.py/img2img/Mask blur/visible": true, + "customscript/poor_mans_outpainting.py/img2img/Mask blur/value": 4, + "customscript/poor_mans_outpainting.py/img2img/Mask blur/minimum": 0, + "customscript/poor_mans_outpainting.py/img2img/Mask blur/maximum": 64, + "customscript/poor_mans_outpainting.py/img2img/Mask blur/step": 1, + "customscript/poor_mans_outpainting.py/img2img/Masked content/visible": true, + "customscript/poor_mans_outpainting.py/img2img/Masked content/value": "fill", + "customscript/prompt_matrix.py/img2img/Put variable parts at start of prompt/visible": true, + "customscript/prompt_matrix.py/img2img/Put variable parts at start of prompt/value": false, + "customscript/prompt_matrix.py/img2img/Use different seed for each picture/visible": true, + "customscript/prompt_matrix.py/img2img/Use different seed for each picture/value": false, + "customscript/prompt_matrix.py/img2img/Select prompt/visible": true, + "customscript/prompt_matrix.py/img2img/Select prompt/value": "positive", + "customscript/prompt_matrix.py/img2img/Select joining char/visible": true, + "customscript/prompt_matrix.py/img2img/Select joining char/value": "comma", + "customscript/prompt_matrix.py/img2img/Grid margins (px)/visible": true, + "customscript/prompt_matrix.py/img2img/Grid margins (px)/value": 0, + "customscript/prompt_matrix.py/img2img/Grid margins (px)/minimum": 0, + "customscript/prompt_matrix.py/img2img/Grid margins (px)/maximum": 500, + "customscript/prompt_matrix.py/img2img/Grid margins (px)/step": 2, + "customscript/prompts_from_file.py/img2img/Iterate seed every line/visible": true, + "customscript/prompts_from_file.py/img2img/Iterate seed every line/value": false, + "customscript/prompts_from_file.py/img2img/Use same random seed for all lines/visible": true, + "customscript/prompts_from_file.py/img2img/Use same random seed for all lines/value": false, + "customscript/prompts_from_file.py/img2img/Insert prompts at the/visible": true, + "customscript/prompts_from_file.py/img2img/Insert prompts at the/value": "start", + "customscript/prompts_from_file.py/img2img/List of prompt inputs/visible": true, + "customscript/prompts_from_file.py/img2img/List of prompt inputs/value": "", + "customscript/sd_upscale.py/img2img/Tile overlap/visible": true, + "customscript/sd_upscale.py/img2img/Tile overlap/value": 64, + "customscript/sd_upscale.py/img2img/Tile overlap/minimum": 0, + "customscript/sd_upscale.py/img2img/Tile overlap/maximum": 256, + "customscript/sd_upscale.py/img2img/Tile overlap/step": 16, + "customscript/sd_upscale.py/img2img/Scale Factor/visible": true, + "customscript/sd_upscale.py/img2img/Scale Factor/value": 2.0, + "customscript/sd_upscale.py/img2img/Scale Factor/minimum": 1.0, + "customscript/sd_upscale.py/img2img/Scale Factor/maximum": 4.0, + "customscript/sd_upscale.py/img2img/Scale Factor/step": 0.05, + "customscript/sd_upscale.py/img2img/Upscaler/visible": true, + "customscript/sd_upscale.py/img2img/Upscaler/value": "None", + "customscript/xyz_grid.py/img2img/X type/visible": true, + "customscript/xyz_grid.py/img2img/X type/value": "Seed", + "customscript/xyz_grid.py/img2img/X values/visible": true, + "customscript/xyz_grid.py/img2img/X values/value": "", + "customscript/xyz_grid.py/img2img/Y type/visible": true, + "customscript/xyz_grid.py/img2img/Y type/value": "Nothing", + "customscript/xyz_grid.py/img2img/Y values/visible": true, + "customscript/xyz_grid.py/img2img/Y values/value": "", + "customscript/xyz_grid.py/img2img/Z type/visible": true, + "customscript/xyz_grid.py/img2img/Z type/value": "Nothing", + "customscript/xyz_grid.py/img2img/Z values/visible": true, + "customscript/xyz_grid.py/img2img/Z values/value": "", + "customscript/xyz_grid.py/img2img/Draw legend/visible": true, + "customscript/xyz_grid.py/img2img/Draw legend/value": true, + "customscript/xyz_grid.py/img2img/Draw individual labels/visible": true, + "customscript/xyz_grid.py/img2img/Draw individual labels/value": false, + "customscript/xyz_grid.py/img2img/Items per grid (0 = default), for sequential grid generation./visible": true, + "customscript/xyz_grid.py/img2img/Items per grid (0 = default), for sequential grid generation./value": 0, + "customscript/xyz_grid.py/img2img/Items per grid (0 = default), for sequential grid generation./minimum": 0, + "customscript/xyz_grid.py/img2img/Items per grid (0 = default), for sequential grid generation./maximum": 200, + "customscript/xyz_grid.py/img2img/Items per grid (0 = default), for sequential grid generation./step": 1, + "customscript/xyz_grid.py/img2img/Keep -1 for seeds/visible": true, + "customscript/xyz_grid.py/img2img/Keep -1 for seeds/value": false, + "customscript/xyz_grid.py/img2img/Vary seeds for X/visible": true, + "customscript/xyz_grid.py/img2img/Vary seeds for X/value": false, + "customscript/xyz_grid.py/img2img/Vary seeds for Y/visible": true, + "customscript/xyz_grid.py/img2img/Vary seeds for Y/value": false, + "customscript/xyz_grid.py/img2img/Vary seeds for Z/visible": true, + "customscript/xyz_grid.py/img2img/Vary seeds for Z/value": false, + "customscript/xyz_grid.py/img2img/Include Sub Images/visible": true, + "customscript/xyz_grid.py/img2img/Include Sub Images/value": false, + "customscript/xyz_grid.py/img2img/Include Sub Grids/visible": true, + "customscript/xyz_grid.py/img2img/Include Sub Grids/value": false, + "customscript/xyz_grid.py/img2img/Use text inputs instead of dropdowns/visible": true, + "customscript/xyz_grid.py/img2img/Use text inputs instead of dropdowns/value": false, + "customscript/xyz_grid.py/img2img/Grid margins (px)/visible": true, + "customscript/xyz_grid.py/img2img/Grid margins (px)/value": 0, + "customscript/xyz_grid.py/img2img/Grid margins (px)/minimum": 0, + "customscript/xyz_grid.py/img2img/Grid margins (px)/maximum": 500, + "customscript/xyz_grid.py/img2img/Grid margins (px)/step": 2, + "img2img/Swap X/Y axes/visible": true, + "img2img/Swap Y/Z axes/visible": true, + "img2img/Swap X/Z axes/visible": true, + "img2img/📂/visible": true, + "img2img/💾/visible": true, + "img2img/🗃️/visible": true, + "img2img/🖼️/visible": true, + "img2img/🎨️/visible": true, + "img2img/🎬/visible": true, + "img2img/Description/visible": true, + "img2img/Description/value": "", + "img2img/Replace preview/visible": true, + "img2img/Save/visible": true, + "img2img/Preferred VAE/visible": true, + "img2img/Preferred VAE/value": "None", + "img2img/Stable Diffusion version/visible": true, + "img2img/Stable Diffusion version/value": "Unknown", + "img2img/Activation text/visible": true, + "img2img/Activation text/value": "", + "img2img/Preferred weight/visible": true, + "img2img/Preferred weight/value": 0.0, + "img2img/Preferred weight/minimum": 0.0, + "img2img/Preferred weight/maximum": 2.0, + "img2img/Preferred weight/step": 0.01, + "img2img/Random prompt/visible": true, + "img2img/Random prompt/value": "", + "extras/Tabs@mode_extras/selected": null, + "extras/Input directory/visible": true, + "extras/Input directory/value": "", + "extras/Output directory/visible": true, + "extras/Output directory/value": "", + "extras/Show result images/visible": true, + "extras/Show result images/value": true, + "customscript/postprocessing_upscale.py/extras/Upscale/visible": true, + "customscript/postprocessing_upscale.py/extras/Upscale/value": true, + "customscript/postprocessing_upscale.py/extras/Upscaler 1/visible": true, + "customscript/postprocessing_upscale.py/extras/Upscaler 1/value": "None", + "customscript/postprocessing_upscale.py/extras/Upscaler 2/visible": true, + "customscript/postprocessing_upscale.py/extras/Upscaler 2/value": "None", + "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/visible": true, + "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/value": 0.0, + "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/minimum": 0.0, + "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/maximum": 1.0, + "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/step": 0.001, + "extras/Tabs@extras_resize_mode/selected": null, + "customscript/postprocessing_upscale.py/extras/Resize/visible": true, + "customscript/postprocessing_upscale.py/extras/Resize/value": 4, + "customscript/postprocessing_upscale.py/extras/Resize/minimum": 1.0, + "customscript/postprocessing_upscale.py/extras/Resize/maximum": 8.0, + "customscript/postprocessing_upscale.py/extras/Resize/step": 0.05, + "customscript/postprocessing_upscale.py/extras/Max side length/visible": true, + "customscript/postprocessing_upscale.py/extras/Max side length/value": 0.0, + "customscript/postprocessing_upscale.py/extras/Width/visible": true, + "customscript/postprocessing_upscale.py/extras/Width/value": 512, + "customscript/postprocessing_upscale.py/extras/Width/minimum": 64, + "customscript/postprocessing_upscale.py/extras/Width/maximum": 8192, + "customscript/postprocessing_upscale.py/extras/Width/step": 8, + "customscript/postprocessing_upscale.py/extras/Height/visible": true, + "customscript/postprocessing_upscale.py/extras/Height/value": 512, + "customscript/postprocessing_upscale.py/extras/Height/minimum": 64, + "customscript/postprocessing_upscale.py/extras/Height/maximum": 8192, + "customscript/postprocessing_upscale.py/extras/Height/step": 8, + "extras/⇅/visible": true, + "customscript/postprocessing_upscale.py/extras/Crop to fit/visible": true, + "customscript/postprocessing_upscale.py/extras/Crop to fit/value": true, + "customscript/postprocessing_gfpgan.py/extras/GFPGAN/visible": true, + "customscript/postprocessing_gfpgan.py/extras/GFPGAN/value": false, + "customscript/postprocessing_gfpgan.py/extras/Visibility/visible": true, + "customscript/postprocessing_gfpgan.py/extras/Visibility/value": 1.0, + "customscript/postprocessing_gfpgan.py/extras/Visibility/minimum": 0.0, + "customscript/postprocessing_gfpgan.py/extras/Visibility/maximum": 1.0, + "customscript/postprocessing_gfpgan.py/extras/Visibility/step": 0.001, + "customscript/postprocessing_codeformer.py/extras/CodeFormer/visible": true, + "customscript/postprocessing_codeformer.py/extras/CodeFormer/value": false, + "customscript/postprocessing_codeformer.py/extras/Visibility/visible": true, + "customscript/postprocessing_codeformer.py/extras/Visibility/value": 1.0, + "customscript/postprocessing_codeformer.py/extras/Visibility/minimum": 0.0, + "customscript/postprocessing_codeformer.py/extras/Visibility/maximum": 1.0, + "customscript/postprocessing_codeformer.py/extras/Visibility/step": 0.001, + "customscript/postprocessing_codeformer.py/extras/Weight (0 = maximum effect, 1 = minimum effect)/visible": true, + "customscript/postprocessing_codeformer.py/extras/Weight (0 = maximum effect, 1 = minimum effect)/value": 0, + "customscript/postprocessing_codeformer.py/extras/Weight (0 = maximum effect, 1 = minimum effect)/minimum": 0.0, + "customscript/postprocessing_codeformer.py/extras/Weight (0 = maximum effect, 1 = minimum effect)/maximum": 1.0, + "customscript/postprocessing_codeformer.py/extras/Weight (0 = maximum effect, 1 = minimum effect)/step": 0.001, + "customscript/postprocessing_split_oversized.py/extras/Split oversized images/visible": true, + "customscript/postprocessing_split_oversized.py/extras/Split oversized images/value": false, + "customscript/postprocessing_split_oversized.py/extras/Threshold/visible": true, + "customscript/postprocessing_split_oversized.py/extras/Threshold/value": 0.5, + "customscript/postprocessing_split_oversized.py/extras/Threshold/minimum": 0.0, + "customscript/postprocessing_split_oversized.py/extras/Threshold/maximum": 1.0, + "customscript/postprocessing_split_oversized.py/extras/Threshold/step": 0.05, + "customscript/postprocessing_split_oversized.py/extras/Overlap ratio/visible": true, + "customscript/postprocessing_split_oversized.py/extras/Overlap ratio/value": 0.2, + "customscript/postprocessing_split_oversized.py/extras/Overlap ratio/minimum": 0.0, + "customscript/postprocessing_split_oversized.py/extras/Overlap ratio/maximum": 0.9, + "customscript/postprocessing_split_oversized.py/extras/Overlap ratio/step": 0.05, + "customscript/postprocessing_focal_crop.py/extras/Auto focal point crop/visible": true, + "customscript/postprocessing_focal_crop.py/extras/Auto focal point crop/value": false, + "customscript/postprocessing_focal_crop.py/extras/Focal point face weight/visible": true, + "customscript/postprocessing_focal_crop.py/extras/Focal point face weight/value": 0.9, + "customscript/postprocessing_focal_crop.py/extras/Focal point face weight/minimum": 0.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point face weight/maximum": 1.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point face weight/step": 0.05, + "customscript/postprocessing_focal_crop.py/extras/Focal point entropy weight/visible": true, + "customscript/postprocessing_focal_crop.py/extras/Focal point entropy weight/value": 0.15, + "customscript/postprocessing_focal_crop.py/extras/Focal point entropy weight/minimum": 0.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point entropy weight/maximum": 1.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point entropy weight/step": 0.05, + "customscript/postprocessing_focal_crop.py/extras/Focal point edges weight/visible": true, + "customscript/postprocessing_focal_crop.py/extras/Focal point edges weight/value": 0.5, + "customscript/postprocessing_focal_crop.py/extras/Focal point edges weight/minimum": 0.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point edges weight/maximum": 1.0, + "customscript/postprocessing_focal_crop.py/extras/Focal point edges weight/step": 0.05, + "customscript/postprocessing_focal_crop.py/extras/Create debug image/visible": true, + "customscript/postprocessing_focal_crop.py/extras/Create debug image/value": false, + "customscript/processing_autosized_crop.py/extras/Auto-sized crop/visible": true, + "customscript/processing_autosized_crop.py/extras/Auto-sized crop/value": false, + "customscript/processing_autosized_crop.py/extras/Dimension lower bound/visible": true, + "customscript/processing_autosized_crop.py/extras/Dimension lower bound/value": 384, + "customscript/processing_autosized_crop.py/extras/Dimension lower bound/minimum": 64, + "customscript/processing_autosized_crop.py/extras/Dimension lower bound/maximum": 2048, + "customscript/processing_autosized_crop.py/extras/Dimension lower bound/step": 8, + "customscript/processing_autosized_crop.py/extras/Dimension upper bound/visible": true, + "customscript/processing_autosized_crop.py/extras/Dimension upper bound/value": 768, + "customscript/processing_autosized_crop.py/extras/Dimension upper bound/minimum": 64, + "customscript/processing_autosized_crop.py/extras/Dimension upper bound/maximum": 2048, + "customscript/processing_autosized_crop.py/extras/Dimension upper bound/step": 8, + "customscript/processing_autosized_crop.py/extras/Area lower bound/visible": true, + "customscript/processing_autosized_crop.py/extras/Area lower bound/value": 4096, + "customscript/processing_autosized_crop.py/extras/Area lower bound/minimum": 4096, + "customscript/processing_autosized_crop.py/extras/Area lower bound/maximum": 4194304, + "customscript/processing_autosized_crop.py/extras/Area lower bound/step": 1, + "customscript/processing_autosized_crop.py/extras/Area upper bound/visible": true, + "customscript/processing_autosized_crop.py/extras/Area upper bound/value": 409600, + "customscript/processing_autosized_crop.py/extras/Area upper bound/minimum": 4096, + "customscript/processing_autosized_crop.py/extras/Area upper bound/maximum": 4194304, + "customscript/processing_autosized_crop.py/extras/Area upper bound/step": 1, + "customscript/processing_autosized_crop.py/extras/Resizing objective/visible": true, + "customscript/processing_autosized_crop.py/extras/Resizing objective/value": "Maximize area", + "customscript/processing_autosized_crop.py/extras/Error threshold/visible": true, + "customscript/processing_autosized_crop.py/extras/Error threshold/value": 0.1, + "customscript/processing_autosized_crop.py/extras/Error threshold/minimum": 0, + "customscript/processing_autosized_crop.py/extras/Error threshold/maximum": 1, + "customscript/processing_autosized_crop.py/extras/Error threshold/step": 0.01, + "customscript/postprocessing_create_flipped_copies.py/extras/Create flipped copies/visible": true, + "customscript/postprocessing_create_flipped_copies.py/extras/Create flipped copies/value": false, + "customscript/postprocessing_caption.py/extras/Caption/visible": true, + "customscript/postprocessing_caption.py/extras/Caption/value": false, + "extras/Interrupt/visible": true, + "extras/Skip/visible": true, + "extras/Interrupting.../visible": true, + "extras/Generate/visible": true, + "extras/📂/visible": true, + "extras/🖼️/visible": true, + "extras/🎨️/visible": true, + "extras/📐/visible": true, + "extras/🎬/visible": true, + "pnginfo/Send to txt2img/visible": true, + "pnginfo/Send to img2img/visible": true, + "pnginfo/Send to inpaint/visible": true, + "pnginfo/Send to extras/visible": true, + "modelmerger/Primary model (A)/visible": true, + "modelmerger/Primary model (A)/value": null, + "modelmerger/🔄/visible": true, + "modelmerger/Secondary model (B)/visible": true, + "modelmerger/Secondary model (B)/value": null, + "modelmerger/Tertiary model (C)/visible": true, + "modelmerger/Tertiary model (C)/value": null, + "modelmerger/Custom Name (Optional)/visible": true, + "modelmerger/Custom Name (Optional)/value": "", + "modelmerger/Multiplier (M) - set to 0 to get model A/visible": true, + "modelmerger/Multiplier (M) - set to 0 to get model A/value": 0.3, + "modelmerger/Multiplier (M) - set to 0 to get model A/minimum": 0.0, + "modelmerger/Multiplier (M) - set to 0 to get model A/maximum": 1.0, + "modelmerger/Multiplier (M) - set to 0 to get model A/step": 0.05, + "modelmerger/Interpolation Method/visible": true, + "modelmerger/Interpolation Method/value": "Weighted sum", + "modelmerger/Checkpoint format/visible": true, + "modelmerger/Checkpoint format/value": "safetensors", + "modelmerger/Save as float16/visible": true, + "modelmerger/Save as float16/value": false, + "modelmerger/Copy config from/visible": true, + "modelmerger/Copy config from/value": "A, B or C", + "modelmerger/Bake in VAE/visible": true, + "modelmerger/Bake in VAE/value": "None", + "modelmerger/Discard weights with matching name/visible": true, + "modelmerger/Discard weights with matching name/value": "", + "modelmerger/Save metadata/visible": true, + "modelmerger/Save metadata/value": true, + "modelmerger/Add merge recipe metadata/visible": true, + "modelmerger/Add merge recipe metadata/value": true, + "modelmerger/Copy metadata from merged models/visible": true, + "modelmerger/Copy metadata from merged models/value": true, + "modelmerger/Read metadata from selected checkpoints/visible": true, + "modelmerger/Merge/visible": true, + "train/Tabs@train_tabs/selected": null, + "train/Name/visible": true, + "train/Name/value": "", + "train/Initialization text/visible": true, + "train/Initialization text/value": "*", + "train/Number of vectors per token/visible": true, + "train/Number of vectors per token/value": 1, + "train/Number of vectors per token/minimum": 1, + "train/Number of vectors per token/maximum": 75, + "train/Number of vectors per token/step": 1, + "train/Overwrite Old Embedding/visible": true, + "train/Overwrite Old Embedding/value": false, + "train/Create embedding/visible": true, + "train/Enter hypernetwork layer structure/visible": true, + "train/Enter hypernetwork layer structure/value": "1, 2, 1", + "train/Select activation function of hypernetwork. Recommended : Swish / Linear(none)/visible": true, + "train/Select activation function of hypernetwork. Recommended : Swish / Linear(none)/value": "linear", + "train/Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise/visible": true, + "train/Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise/value": "Normal", + "train/Add layer normalization/visible": true, + "train/Add layer normalization/value": false, + "train/Use dropout/visible": true, + "train/Use dropout/value": false, + "train/Enter hypernetwork Dropout structure (or empty). Recommended : 0~0.35 incrementing sequence: 0, 0.05, 0.15/visible": true, + "train/Enter hypernetwork Dropout structure (or empty). Recommended : 0~0.35 incrementing sequence: 0, 0.05, 0.15/value": "0, 0, 0", + "train/Overwrite Old Hypernetwork/visible": true, + "train/Overwrite Old Hypernetwork/value": false, + "train/Create hypernetwork/visible": true, + "train/Embedding/visible": true, + "train/Embedding/value": null, + "train/🔄/visible": true, + "train/Hypernetwork/visible": true, + "train/Hypernetwork/value": null, + "train/Embedding Learning rate/visible": true, + "train/Embedding Learning rate/value": "0.005", + "train/Hypernetwork Learning rate/visible": true, + "train/Hypernetwork Learning rate/value": "0.00001", + "train/Gradient Clipping/visible": true, + "train/Gradient Clipping/value": "disabled", + "train/Batch size/visible": true, + "train/Batch size/value": 1, + "train/Gradient accumulation steps/visible": true, + "train/Gradient accumulation steps/value": 1, + "train/Dataset directory/visible": true, + "train/Dataset directory/value": "", + "train/Log directory/visible": true, + "train/Log directory/value": "textual_inversion", + "train/Prompt template/visible": true, + "train/Prompt template/value": "style_filewords.txt", + "train/Width/visible": true, + "train/Width/value": 512, + "train/Width/minimum": 64, + "train/Width/maximum": 2048, + "train/Width/step": 8, + "train/Height/visible": true, + "train/Height/value": 512, + "train/Height/minimum": 64, + "train/Height/maximum": 2048, + "train/Height/step": 8, + "train/Do not resize images/visible": true, + "train/Do not resize images/value": false, + "train/Max steps/visible": true, + "train/Max steps/value": 100000, + "train/Save an image to log directory every N steps, 0 to disable/visible": true, + "train/Save an image to log directory every N steps, 0 to disable/value": 500, + "train/Save a copy of embedding to log directory every N steps, 0 to disable/visible": true, + "train/Save a copy of embedding to log directory every N steps, 0 to disable/value": 500, + "train/Use PNG alpha channel as loss weight/visible": true, + "train/Use PNG alpha channel as loss weight/value": false, + "train/Save images with embedding in PNG chunks/visible": true, + "train/Save images with embedding in PNG chunks/value": true, + "train/Read parameters (prompt, etc...) from txt2img tab when making previews/visible": true, + "train/Read parameters (prompt, etc...) from txt2img tab when making previews/value": false, + "train/Shuffle tags by ',' when creating prompts./visible": true, + "train/Shuffle tags by ',' when creating prompts./value": false, + "train/Drop out tags when creating prompts./visible": true, + "train/Drop out tags when creating prompts./value": 0, + "train/Drop out tags when creating prompts./minimum": 0, + "train/Drop out tags when creating prompts./maximum": 1, + "train/Drop out tags when creating prompts./step": 0.1, + "train/Choose latent sampling method/visible": true, + "train/Choose latent sampling method/value": "once", + "train/Train Embedding/visible": true, + "train/Interrupt/visible": true, + "train/Train Hypernetwork/visible": true, + "svd/SVD Checkpoint Filename/visible": true, + "svd/SVD Checkpoint Filename/value": null, + "svd/🔄/visible": true, + "svd/Width/visible": true, + "svd/Width/value": 1024, + "svd/Width/minimum": 16, + "svd/Width/maximum": 8192, + "svd/Width/step": 8, + "svd/Height/visible": true, + "svd/Height/value": 576, + "svd/Height/minimum": 16, + "svd/Height/maximum": 8192, + "svd/Height/step": 8, + "svd/Video Frames/visible": true, + "svd/Video Frames/value": 14, + "svd/Video Frames/minimum": 1, + "svd/Video Frames/maximum": 4096, + "svd/Video Frames/step": 1, + "svd/Motion Bucket Id/visible": true, + "svd/Motion Bucket Id/value": 127, + "svd/Motion Bucket Id/minimum": 1, + "svd/Motion Bucket Id/maximum": 1023, + "svd/Motion Bucket Id/step": 1, + "svd/Fps/visible": true, + "svd/Fps/value": 6, + "svd/Fps/minimum": 1, + "svd/Fps/maximum": 1024, + "svd/Fps/step": 1, + "svd/Augmentation Level/visible": true, + "svd/Augmentation Level/value": 0.0, + "svd/Augmentation Level/minimum": 0.0, + "svd/Augmentation Level/maximum": 10.0, + "svd/Augmentation Level/step": 0.01, + "svd/Sampling Steps/visible": true, + "svd/Sampling Steps/value": 20, + "svd/Sampling Steps/minimum": 1, + "svd/Sampling Steps/maximum": 200, + "svd/Sampling Steps/step": 1, + "svd/CFG Scale/visible": true, + "svd/CFG Scale/value": 2.5, + "svd/CFG Scale/minimum": 0.0, + "svd/CFG Scale/maximum": 50.0, + "svd/CFG Scale/step": 0.1, + "svd/Sampling Denoise/visible": true, + "svd/Sampling Denoise/value": 1.0, + "svd/Sampling Denoise/minimum": 0.0, + "svd/Sampling Denoise/maximum": 1.0, + "svd/Sampling Denoise/step": 0.01, + "svd/Guidance Min Cfg/visible": true, + "svd/Guidance Min Cfg/value": 1.0, + "svd/Guidance Min Cfg/minimum": 0.0, + "svd/Guidance Min Cfg/maximum": 100.0, + "svd/Guidance Min Cfg/step": 0.5, + "svd/Sampler Name/visible": true, + "svd/Sampler Name/value": "euler", + "svd/Scheduler/visible": true, + "svd/Scheduler/value": "karras", + "svd/Seed/visible": true, + "svd/Seed/value": 12345, + "svd/Generate/visible": true, + "z123/Zero123 Checkpoint Filename/visible": true, + "z123/Zero123 Checkpoint Filename/value": null, + "z123/🔄/visible": true, + "z123/Width/visible": true, + "z123/Width/value": 256, + "z123/Width/minimum": 16, + "z123/Width/maximum": 8192, + "z123/Width/step": 8, + "z123/Height/visible": true, + "z123/Height/value": 256, + "z123/Height/minimum": 16, + "z123/Height/maximum": 8192, + "z123/Height/step": 8, + "z123/Batch Size/visible": true, + "z123/Batch Size/value": 4, + "z123/Batch Size/minimum": 1, + "z123/Batch Size/maximum": 4096, + "z123/Batch Size/step": 1, + "z123/Elevation/visible": true, + "z123/Elevation/value": 10.0, + "z123/Elevation/minimum": -180.0, + "z123/Elevation/maximum": 180.0, + "z123/Elevation/step": 0.001, + "z123/Azimuth/visible": true, + "z123/Azimuth/value": 142.0, + "z123/Azimuth/minimum": -180.0, + "z123/Azimuth/maximum": 180.0, + "z123/Azimuth/step": 0.001, + "z123/Sampling Denoise/visible": true, + "z123/Sampling Denoise/value": 1.0, + "z123/Sampling Denoise/minimum": 0.0, + "z123/Sampling Denoise/maximum": 1.0, + "z123/Sampling Denoise/step": 0.01, + "z123/Sampling Steps/visible": true, + "z123/Sampling Steps/value": 20, + "z123/Sampling Steps/minimum": 1, + "z123/Sampling Steps/maximum": 10000, + "z123/Sampling Steps/step": 1, + "z123/CFG Scale/visible": true, + "z123/CFG Scale/value": 5.0, + "z123/CFG Scale/minimum": 0.0, + "z123/CFG Scale/maximum": 100.0, + "z123/CFG Scale/step": 0.1, + "z123/Sampler Name/visible": true, + "z123/Sampler Name/value": "euler", + "z123/Sampling Scheduler/visible": true, + "z123/Sampling Scheduler/value": "sgm_uniform", + "z123/Seed/visible": true, + "z123/Seed/value": 12345, + "z123/Generate/visible": true, + "webui/Tabs@tabs/selected": null, + "customscript/detail_daemon.py/txt2img/Detail Daemon/visible": true, + "customscript/detail_daemon.py/txt2img/Detail Daemon/value": false, + "txt2img/Detail Amount/visible": true, + "txt2img/Detail Amount/value": 0.1, + "txt2img/Detail Amount/minimum": -1.0, + "txt2img/Detail Amount/maximum": 1.0, + "txt2img/Detail Amount/step": 0.01, + "customscript/detail_daemon.py/txt2img/Start/visible": true, + "customscript/detail_daemon.py/txt2img/Start/value": 0.2, + "customscript/detail_daemon.py/txt2img/Start/minimum": 0.0, + "customscript/detail_daemon.py/txt2img/Start/maximum": 1.0, + "customscript/detail_daemon.py/txt2img/Start/step": 0.01, + "customscript/detail_daemon.py/txt2img/End/visible": true, + "customscript/detail_daemon.py/txt2img/End/value": 0.8, + "customscript/detail_daemon.py/txt2img/End/minimum": 0.0, + "customscript/detail_daemon.py/txt2img/End/maximum": 1.0, + "customscript/detail_daemon.py/txt2img/End/step": 0.01, + "customscript/detail_daemon.py/txt2img/Bias/visible": true, + "customscript/detail_daemon.py/txt2img/Bias/value": 0.5, + "customscript/detail_daemon.py/txt2img/Bias/minimum": 0.0, + "customscript/detail_daemon.py/txt2img/Bias/maximum": 1.0, + "customscript/detail_daemon.py/txt2img/Bias/step": 0.01, + "txt2img/Start Offset/visible": true, + "txt2img/Start Offset/value": 0.0, + "txt2img/Start Offset/minimum": -1.0, + "txt2img/Start Offset/maximum": 1.0, + "txt2img/Start Offset/step": 0.01, + "txt2img/End Offset/visible": true, + "txt2img/End Offset/value": 0.0, + "txt2img/End Offset/minimum": -1.0, + "txt2img/End Offset/maximum": 1.0, + "txt2img/End Offset/step": 0.01, + "customscript/detail_daemon.py/txt2img/Exponent/visible": true, + "customscript/detail_daemon.py/txt2img/Exponent/value": 1.0, + "customscript/detail_daemon.py/txt2img/Exponent/minimum": 0.0, + "customscript/detail_daemon.py/txt2img/Exponent/maximum": 10.0, + "customscript/detail_daemon.py/txt2img/Exponent/step": 0.05, + "customscript/detail_daemon.py/txt2img/Fade/visible": true, + "customscript/detail_daemon.py/txt2img/Fade/value": 0.0, + "customscript/detail_daemon.py/txt2img/Fade/minimum": 0.0, + "customscript/detail_daemon.py/txt2img/Fade/maximum": 1.0, + "customscript/detail_daemon.py/txt2img/Fade/step": 0.05, + "customscript/detail_daemon.py/txt2img/Amount/visible": true, + "customscript/detail_daemon.py/txt2img/Amount/value": 0.1, + "customscript/detail_daemon.py/txt2img/Start Offset/visible": true, + "customscript/detail_daemon.py/txt2img/Start Offset/value": 0.0, + "customscript/detail_daemon.py/txt2img/End Offset/visible": true, + "customscript/detail_daemon.py/txt2img/End Offset/value": 0.0, + "customscript/detail_daemon.py/txt2img/Mode/visible": true, + "customscript/detail_daemon.py/txt2img/Mode/value": "uncond", + "customscript/detail_daemon.py/txt2img/Smooth/visible": true, + "customscript/detail_daemon.py/txt2img/Smooth/value": true, + "customscript/detail_daemon.py/img2img/Detail Daemon/visible": true, + "customscript/detail_daemon.py/img2img/Detail Daemon/value": false, + "img2img/Detail Amount/visible": true, + "img2img/Detail Amount/value": 0.1, + "img2img/Detail Amount/minimum": -1.0, + "img2img/Detail Amount/maximum": 1.0, + "img2img/Detail Amount/step": 0.01, + "customscript/detail_daemon.py/img2img/Start/visible": true, + "customscript/detail_daemon.py/img2img/Start/value": 0.2, + "customscript/detail_daemon.py/img2img/Start/minimum": 0.0, + "customscript/detail_daemon.py/img2img/Start/maximum": 1.0, + "customscript/detail_daemon.py/img2img/Start/step": 0.01, + "customscript/detail_daemon.py/img2img/End/visible": true, + "customscript/detail_daemon.py/img2img/End/value": 0.8, + "customscript/detail_daemon.py/img2img/End/minimum": 0.0, + "customscript/detail_daemon.py/img2img/End/maximum": 1.0, + "customscript/detail_daemon.py/img2img/End/step": 0.01, + "customscript/detail_daemon.py/img2img/Bias/visible": true, + "customscript/detail_daemon.py/img2img/Bias/value": 0.5, + "customscript/detail_daemon.py/img2img/Bias/minimum": 0.0, + "customscript/detail_daemon.py/img2img/Bias/maximum": 1.0, + "customscript/detail_daemon.py/img2img/Bias/step": 0.01, + "img2img/Start Offset/visible": true, + "img2img/Start Offset/value": 0.0, + "img2img/Start Offset/minimum": -1.0, + "img2img/Start Offset/maximum": 1.0, + "img2img/Start Offset/step": 0.01, + "img2img/End Offset/visible": true, + "img2img/End Offset/value": 0.0, + "img2img/End Offset/minimum": -1.0, + "img2img/End Offset/maximum": 1.0, + "img2img/End Offset/step": 0.01, + "customscript/detail_daemon.py/img2img/Exponent/visible": true, + "customscript/detail_daemon.py/img2img/Exponent/value": 1.0, + "customscript/detail_daemon.py/img2img/Exponent/minimum": 0.0, + "customscript/detail_daemon.py/img2img/Exponent/maximum": 10.0, + "customscript/detail_daemon.py/img2img/Exponent/step": 0.05, + "customscript/detail_daemon.py/img2img/Fade/visible": true, + "customscript/detail_daemon.py/img2img/Fade/value": 0.0, + "customscript/detail_daemon.py/img2img/Fade/minimum": 0.0, + "customscript/detail_daemon.py/img2img/Fade/maximum": 1.0, + "customscript/detail_daemon.py/img2img/Fade/step": 0.05, + "customscript/detail_daemon.py/img2img/Amount/visible": true, + "customscript/detail_daemon.py/img2img/Amount/value": 0.1, + "customscript/detail_daemon.py/img2img/Start Offset/visible": true, + "customscript/detail_daemon.py/img2img/Start Offset/value": 0.0, + "customscript/detail_daemon.py/img2img/End Offset/visible": true, + "customscript/detail_daemon.py/img2img/End Offset/value": 0.0, + "customscript/detail_daemon.py/img2img/Mode/visible": true, + "customscript/detail_daemon.py/img2img/Mode/value": "uncond", + "customscript/detail_daemon.py/img2img/Smooth/visible": true, + "customscript/detail_daemon.py/img2img/Smooth/value": true +} \ No newline at end of file