loopback.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import math
  2. import gradio as gr
  3. import modules.scripts as scripts
  4. from modules import deepbooru, images, processing, shared
  5. from modules.processing import Processed
  6. from modules.shared import opts, state
  7. class Script(scripts.Script):
  8. def title(self):
  9. return "Loopback"
  10. def show(self, is_img2img):
  11. return is_img2img
  12. def ui(self, is_img2img):
  13. loops = gr.Slider(minimum=1, maximum=32, step=1, label='Loops', value=4, elem_id=self.elem_id("loops"))
  14. final_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"))
  15. denoising_curve = gr.Dropdown(label="Denoising strength curve", choices=["Aggressive", "Linear", "Lazy"], value="Linear")
  16. append_interrogation = gr.Dropdown(label="Append interrogated prompt at each iteration", choices=["None", "CLIP", "DeepBooru"], value="None")
  17. return [loops, final_denoising_strength, denoising_curve, append_interrogation]
  18. def run(self, p, loops, final_denoising_strength, denoising_curve, append_interrogation):
  19. processing.fix_seed(p)
  20. batch_count = p.n_iter
  21. p.extra_generation_params = {
  22. "Final denoising strength": final_denoising_strength,
  23. "Denoising curve": denoising_curve
  24. }
  25. p.batch_size = 1
  26. p.n_iter = 1
  27. info = None
  28. initial_seed = None
  29. initial_info = None
  30. initial_denoising_strength = p.denoising_strength
  31. grids = []
  32. all_images = []
  33. original_init_image = p.init_images
  34. original_prompt = p.prompt
  35. original_inpainting_fill = p.inpainting_fill
  36. state.job_count = loops * batch_count
  37. initial_color_corrections = [processing.setup_color_correction(p.init_images[0])]
  38. def calculate_denoising_strength(loop):
  39. strength = initial_denoising_strength
  40. if loops == 1:
  41. return strength
  42. progress = loop / (loops - 1)
  43. if denoising_curve == "Aggressive":
  44. strength = math.sin((progress) * math.pi * 0.5)
  45. elif denoising_curve == "Lazy":
  46. strength = 1 - math.cos((progress) * math.pi * 0.5)
  47. else:
  48. strength = progress
  49. change = (final_denoising_strength - initial_denoising_strength) * strength
  50. return initial_denoising_strength + change
  51. history = []
  52. for n in range(batch_count):
  53. # Reset to original init image at the start of each batch
  54. p.init_images = original_init_image
  55. # Reset to original denoising strength
  56. p.denoising_strength = initial_denoising_strength
  57. last_image = None
  58. for i in range(loops):
  59. p.n_iter = 1
  60. p.batch_size = 1
  61. p.do_not_save_grid = True
  62. if opts.img2img_color_correction:
  63. p.color_corrections = initial_color_corrections
  64. if append_interrogation != "None":
  65. p.prompt = original_prompt + ", " if original_prompt != "" else ""
  66. if append_interrogation == "CLIP":
  67. p.prompt += shared.interrogator.interrogate(p.init_images[0])
  68. elif append_interrogation == "DeepBooru":
  69. p.prompt += deepbooru.model.tag(p.init_images[0])
  70. state.job = f"Iteration {i + 1}/{loops}, batch {n + 1}/{batch_count}"
  71. processed = processing.process_images(p)
  72. # Generation cancelled.
  73. if state.interrupted:
  74. break
  75. if initial_seed is None:
  76. initial_seed = processed.seed
  77. initial_info = processed.info
  78. p.seed = processed.seed + 1
  79. p.denoising_strength = calculate_denoising_strength(i + 1)
  80. if state.skipped:
  81. break
  82. last_image = processed.images[0]
  83. p.init_images = [last_image]
  84. p.inpainting_fill = 1 # Set "masked content" to "original" for next loop.
  85. if batch_count == 1:
  86. history.append(last_image)
  87. all_images.append(last_image)
  88. if batch_count > 1 and not state.skipped and not state.interrupted:
  89. history.append(last_image)
  90. all_images.append(last_image)
  91. p.inpainting_fill = original_inpainting_fill
  92. if state.interrupted:
  93. break
  94. if len(history) > 1:
  95. grid = images.image_grid(history, rows=1)
  96. if opts.grid_save:
  97. 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)
  98. if opts.return_grid:
  99. grids.append(grid)
  100. all_images = grids + all_images
  101. processed = Processed(p, all_images, initial_seed, initial_info)
  102. return processed