diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/img2imgalt.py | 37 | ||||
-rw-r--r-- | scripts/loopback.py | 81 | ||||
-rw-r--r-- | scripts/prompt_matrix.py | 2 | ||||
-rw-r--r-- | scripts/prompts_from_file.py | 2 | ||||
-rw-r--r-- | scripts/xy_grid.py | 39 |
5 files changed, 138 insertions, 23 deletions
diff --git a/scripts/img2imgalt.py b/scripts/img2imgalt.py index 16a2fdf6..7813bbcc 100644 --- a/scripts/img2imgalt.py +++ b/scripts/img2imgalt.py @@ -1,10 +1,12 @@ +from collections import namedtuple
+
import numpy as np
from tqdm import trange
import modules.scripts as scripts
import gradio as gr
-from modules import processing, shared, sd_samplers
+from modules import processing, shared, sd_samplers, prompt_parser
from modules.processing import Processed
from modules.sd_samplers import samplers
from modules.shared import opts, cmd_opts, state
@@ -56,9 +58,14 @@ def find_noise_for_image(p, cond, uncond, cfg_scale, steps): return x / x.std()
-cache = [None, None, None, None, None]
+
+Cached = namedtuple("Cached", ["noise", "cfg_scale", "steps", "latent", "original_prompt"])
+
class Script(scripts.Script):
+ def __init__(self):
+ self.cache = None
+
def title(self):
return "img2img alternative test"
@@ -67,7 +74,7 @@ class Script(scripts.Script): def ui(self, is_img2img):
original_prompt = gr.Textbox(label="Original prompt", lines=1)
- cfg = gr.Slider(label="Decode CFG scale", minimum=0.1, maximum=3.0, step=0.1, value=1.0)
+ cfg = gr.Slider(label="Decode CFG scale", minimum=0.0, maximum=15.0, step=0.1, value=1.0)
st = gr.Slider(label="Decode steps", minimum=1, maximum=150, step=1, value=50)
return [original_prompt, cfg, st]
@@ -77,19 +84,19 @@ class Script(scripts.Script): p.batch_count = 1
def sample_extra(x, conditioning, unconditional_conditioning):
- lat = tuple([int(x*10) for x in p.init_latent.cpu().numpy().flatten().tolist()])
+ lat = (p.init_latent.cpu().numpy() * 10).astype(int)
+
+ same_params = self.cache is not None and self.cache.cfg_scale == cfg and self.cache.steps == st and self.cache.original_prompt == original_prompt
+ same_everything = same_params and self.cache.latent.shape == lat.shape and np.abs(self.cache.latent-lat).sum() < 100
- if cache[0] is not None and cache[1] == cfg and cache[2] == st and len(cache[3]) == len(lat) and sum(np.array(cache[3])-np.array(lat)) < 100 and cache[4] == original_prompt:
- noise = cache[0]
+ if same_everything:
+ noise = self.cache.noise
else:
shared.state.job_count += 1
cond = p.sd_model.get_learned_conditioning(p.batch_size * [original_prompt])
- noise = find_noise_for_image(p, cond, unconditional_conditioning, cfg, st)
- cache[0] = noise
- cache[1] = cfg
- cache[2] = st
- cache[3] = lat
- cache[4] = original_prompt
+ uncond = p.sd_model.get_learned_conditioning(p.batch_size * [""])
+ noise = find_noise_for_image(p, cond, uncond, cfg, st)
+ self.cache = Cached(noise, cfg, st, lat, original_prompt)
sampler = samplers[p.sampler_index].constructor(p.sd_model)
@@ -98,6 +105,12 @@ class Script(scripts.Script): p.sample = sample_extra
+ p.extra_generation_params = {
+ "Decode prompt": original_prompt,
+ "Decode CFG scale": cfg,
+ "Decode steps": st,
+ }
+
processed = processing.process_images(p)
return processed
diff --git a/scripts/loopback.py b/scripts/loopback.py new file mode 100644 index 00000000..8aca61f3 --- /dev/null +++ b/scripts/loopback.py @@ -0,0 +1,81 @@ +import numpy as np
+from tqdm import trange
+
+import modules.scripts as scripts
+import gradio as gr
+
+from modules import processing, shared, sd_samplers, images
+from modules.processing import Processed
+from modules.sd_samplers import samplers
+from modules.shared import opts, cmd_opts, state
+
+class Script(scripts.Script):
+ def title(self):
+ return "Loopback"
+
+ def show(self, is_img2img):
+ return is_img2img
+
+ def ui(self, is_img2img):
+ loops = gr.Slider(minimum=1, maximum=32, step=1, label='Loops', value=4)
+ denoising_strength_change_factor = gr.Slider(minimum=0.9, maximum=1.1, step=0.01, label='Denoising strength change factor', value=1)
+
+ return [loops, denoising_strength_change_factor]
+
+ def run(self, p, loops, denoising_strength_change_factor):
+ processing.fix_seed(p)
+ batch_count = p.n_iter
+ p.extra_generation_params = {
+ "Denoising strength change factor": denoising_strength_change_factor,
+ }
+
+ p.batch_size = 1
+ p.n_iter = 1
+
+ output_images, info = None, None
+ initial_seed = None
+ initial_info = None
+
+ grids = []
+ all_images = []
+ state.job_count = loops * batch_count
+
+ if opts.img2img_color_correction:
+ p.color_corrections = [processing.setup_color_correction(p.init_images[0])]
+
+ for n in range(batch_count):
+ history = []
+
+ for i in range(loops):
+ p.n_iter = 1
+ p.batch_size = 1
+ p.do_not_save_grid = True
+
+ state.job = f"Iteration {i + 1}/{loops}, batch {n + 1}/{batch_count}"
+
+ processed = processing.process_images(p)
+
+ if initial_seed is None:
+ initial_seed = processed.seed
+ initial_info = processed.info
+
+ init_img = processed.images[0]
+
+ p.init_images = [init_img]
+ p.seed = processed.seed + 1
+ p.denoising_strength = min(max(p.denoising_strength * denoising_strength_change_factor, 0.1), 1)
+ history.append(processed.images[0])
+
+ grid = images.image_grid(history, rows=1)
+ if opts.grid_save:
+ images.save_image(grid, p.outpath_grids, "grid", initial_seed, p.prompt, opts.grid_format, info=info, short_filename=not opts.grid_extended_filename, grid=True, p=p)
+
+ grids.append(grid)
+ all_images += history
+
+ if opts.return_grid:
+ all_images = grids + all_images
+
+ processed = Processed(p, all_images, initial_seed, initial_info)
+
+ return processed
diff --git a/scripts/prompt_matrix.py b/scripts/prompt_matrix.py index aaece054..e49c9b20 100644 --- a/scripts/prompt_matrix.py +++ b/scripts/prompt_matrix.py @@ -82,6 +82,6 @@ class Script(scripts.Script): processed.images.insert(0, grid)
if opts.grid_save:
- images.save_image(processed.images[0], p.outpath_grids, "prompt_matrix", prompt=original_prompt, seed=processed.seed, p=p)
+ images.save_image(processed.images[0], p.outpath_grids, "prompt_matrix", prompt=original_prompt, seed=processed.seed, grid=True, p=p)
return processed
diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py index e0c7f1d2..d9b01c81 100644 --- a/scripts/prompts_from_file.py +++ b/scripts/prompts_from_file.py @@ -33,7 +33,7 @@ class Script(scripts.Script): images = []
for batch_no in range(batch_count):
- state.job = f"{batch_no} out of {batch_count * p.n_iter}"
+ state.job = f"{batch_no + 1} out of {batch_count * p.n_iter}"
p.prompt = lines[batch_no*p.batch_size:(batch_no+1)*p.batch_size] * p.n_iter
proc = process_images(p)
images += proc.images
diff --git a/scripts/xy_grid.py b/scripts/xy_grid.py index dd6db81c..eccfda87 100644 --- a/scripts/xy_grid.py +++ b/scripts/xy_grid.py @@ -78,7 +78,7 @@ axis_options = [ ]
-def draw_xy_grid(xs, ys, x_label, y_label, cell):
+def draw_xy_grid(p, xs, ys, x_label, y_label, cell, draw_legend):
res = []
ver_texts = [[images.GridAnnotation(y_label(y))] for y in ys]
@@ -86,7 +86,7 @@ def draw_xy_grid(xs, ys, x_label, y_label, cell): first_pocessed = None
- state.job_count = len(xs) * len(ys)
+ state.job_count = len(xs) * len(ys) * p.n_iter
for iy, y in enumerate(ys):
for ix, x in enumerate(xs):
@@ -99,7 +99,8 @@ def draw_xy_grid(xs, ys, x_label, y_label, cell): res.append(processed.images[0])
grid = images.image_grid(res, rows=len(ys))
- grid = images.draw_grid_annotations(grid, res[0].width, res[0].height, hor_texts, ver_texts)
+ if draw_legend:
+ grid = images.draw_grid_annotations(grid, res[0].width, res[0].height, hor_texts, ver_texts)
first_pocessed.images = [grid]
@@ -109,6 +110,9 @@ def draw_xy_grid(xs, ys, x_label, y_label, cell): re_range = re.compile(r"\s*([+-]?\s*\d+)\s*-\s*([+-]?\s*\d+)(?:\s*\(([+-]\d+)\s*\))?\s*")
re_range_float = re.compile(r"\s*([+-]?\s*\d+(?:.\d*)?)\s*-\s*([+-]?\s*\d+(?:.\d*)?)(?:\s*\(([+-]\d+(?:.\d*)?)\s*\))?\s*")
+re_range_count = re.compile(r"\s*([+-]?\s*\d+)\s*-\s*([+-]?\s*\d+)(?:\s*\[(\d+)\s*\])?\s*")
+re_range_count_float = re.compile(r"\s*([+-]?\s*\d+(?:.\d*)?)\s*-\s*([+-]?\s*\d+(?:.\d*)?)(?:\s*\[(\d+(?:.\d*)?)\s*\])?\s*")
+
class Script(scripts.Script):
def title(self):
return "X/Y plot"
@@ -123,13 +127,14 @@ class Script(scripts.Script): with gr.Row():
y_type = gr.Dropdown(label="Y type", choices=[x.label for x in current_axis_options], value=current_axis_options[4].label, visible=False, type="index", elem_id="y_type")
y_values = gr.Textbox(label="Y values", visible=False, lines=1)
+
+ draw_legend = gr.Checkbox(label='Draw legend', value=True)
+
+ return [x_type, x_values, y_type, y_values, draw_legend]
- return [x_type, x_values, y_type, y_values]
-
- def run(self, p, x_type, x_values, y_type, y_values):
+ def run(self, p, x_type, x_values, y_type, y_values, draw_legend):
modules.processing.fix_seed(p)
p.batch_size = 1
- p.batch_count = 1
def process_axis(opt, vals):
valslist = [x.strip() for x in vals.split(",")]
@@ -139,6 +144,7 @@ class Script(scripts.Script): for val in valslist:
m = re_range.fullmatch(val)
+ mc = re_range_count.fullmatch(val)
if m is not None:
start = int(m.group(1))
@@ -146,6 +152,12 @@ class Script(scripts.Script): step = int(m.group(3)) if m.group(3) is not None else 1
valslist_ext += list(range(start, end, step))
+ elif mc is not None:
+ start = int(mc.group(1))
+ end = int(mc.group(2))
+ num = int(mc.group(3)) if mc.group(3) is not None else 1
+
+ valslist_ext += [int(x) for x in np.linspace(start = start, stop = end, num = num).tolist()]
else:
valslist_ext.append(val)
@@ -155,12 +167,19 @@ class Script(scripts.Script): for val in valslist:
m = re_range_float.fullmatch(val)
+ mc = re_range_count_float.fullmatch(val)
if m is not None:
start = float(m.group(1))
end = float(m.group(2))
step = float(m.group(3)) if m.group(3) is not None else 1
valslist_ext += np.arange(start, end + step, step).tolist()
+ elif mc is not None:
+ start = float(mc.group(1))
+ end = float(mc.group(2))
+ num = int(mc.group(3)) if mc.group(3) is not None else 1
+
+ valslist_ext += np.linspace(start = start, stop = end, num = num).tolist()
else:
valslist_ext.append(val)
@@ -184,14 +203,16 @@ class Script(scripts.Script): return process_images(pc)
processed = draw_xy_grid(
+ p,
xs=xs,
ys=ys,
x_label=lambda x: x_opt.format_value(p, x_opt, x),
y_label=lambda y: y_opt.format_value(p, y_opt, y),
- cell=cell
+ cell=cell,
+ draw_legend=draw_legend
)
if opts.grid_save:
- images.save_image(processed.images[0], p.outpath_grids, "xy_grid", prompt=p.prompt, seed=processed.seed, p=p)
+ images.save_image(processed.images[0], p.outpath_grids, "xy_grid", prompt=p.prompt, seed=processed.seed, grid=True, p=p)
return processed
|