Path: blob/master/scripts/loopback.py
3055 views
import math12import gradio as gr3import modules.scripts as scripts4from modules import deepbooru, images, processing, shared5from modules.processing import Processed6from modules.shared import opts, state789class Script(scripts.Script):10def title(self):11return "Loopback"1213def show(self, is_img2img):14return is_img2img1516def ui(self, is_img2img):17loops = gr.Slider(minimum=1, maximum=32, step=1, label='Loops', value=4, elem_id=self.elem_id("loops"))18final_denoising_strength = gr.Slider(minimum=0, maximum=1, step=0.01, label='Final denoising strength', value=0.5, elem_id=self.elem_id("final_denoising_strength"))19denoising_curve = gr.Dropdown(label="Denoising strength curve", choices=["Aggressive", "Linear", "Lazy"], value="Linear")20append_interrogation = gr.Dropdown(label="Append interrogated prompt at each iteration", choices=["None", "CLIP", "DeepBooru"], value="None")2122return [loops, final_denoising_strength, denoising_curve, append_interrogation]2324def run(self, p, loops, final_denoising_strength, denoising_curve, append_interrogation):25processing.fix_seed(p)26batch_count = p.n_iter27p.extra_generation_params = {28"Final denoising strength": final_denoising_strength,29"Denoising curve": denoising_curve30}3132p.batch_size = 133p.n_iter = 13435info = None36initial_seed = None37initial_info = None38initial_denoising_strength = p.denoising_strength3940grids = []41all_images = []42original_init_image = p.init_images43original_prompt = p.prompt44original_inpainting_fill = p.inpainting_fill45state.job_count = loops * batch_count4647initial_color_corrections = [processing.setup_color_correction(p.init_images[0])]4849def calculate_denoising_strength(loop):50strength = initial_denoising_strength5152if loops == 1:53return strength5455progress = loop / (loops - 1)56if denoising_curve == "Aggressive":57strength = math.sin((progress) * math.pi * 0.5)58elif denoising_curve == "Lazy":59strength = 1 - math.cos((progress) * math.pi * 0.5)60else:61strength = progress6263change = (final_denoising_strength - initial_denoising_strength) * strength64return initial_denoising_strength + change6566history = []6768for n in range(batch_count):69# Reset to original init image at the start of each batch70p.init_images = original_init_image7172# Reset to original denoising strength73p.denoising_strength = initial_denoising_strength7475last_image = None7677for i in range(loops):78p.n_iter = 179p.batch_size = 180p.do_not_save_grid = True8182if opts.img2img_color_correction:83p.color_corrections = initial_color_corrections8485if append_interrogation != "None":86p.prompt = f"{original_prompt}, " if original_prompt else ""87if append_interrogation == "CLIP":88p.prompt += shared.interrogator.interrogate(p.init_images[0])89elif append_interrogation == "DeepBooru":90p.prompt += deepbooru.model.tag(p.init_images[0])9192state.job = f"Iteration {i + 1}/{loops}, batch {n + 1}/{batch_count}"9394processed = processing.process_images(p)9596# Generation cancelled.97if state.interrupted or state.stopping_generation:98break99100if initial_seed is None:101initial_seed = processed.seed102initial_info = processed.info103104p.seed = processed.seed + 1105p.denoising_strength = calculate_denoising_strength(i + 1)106107if state.skipped:108break109110last_image = processed.images[0]111p.init_images = [last_image]112p.inpainting_fill = 1 # Set "masked content" to "original" for next loop.113114if batch_count == 1:115history.append(last_image)116all_images.append(last_image)117118if batch_count > 1 and not state.skipped and not state.interrupted:119history.append(last_image)120all_images.append(last_image)121122p.inpainting_fill = original_inpainting_fill123124if state.interrupted or state.stopping_generation:125break126127if len(history) > 1:128grid = images.image_grid(history, rows=1)129if opts.grid_save:130images.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)131132if opts.return_grid:133grids.append(grid)134135all_images = grids + all_images136137processed = Processed(p, all_images, initial_seed, initial_info)138139return processed140141142