From fa833a5221526b30625514a9a5e460bbc386608a Mon Sep 17 00:00:00 2001 From: AI-Casanova <54461896+AI-Casanova@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:06:52 -0600 Subject: [PATCH 1/3] Draft: XYZ only --- modules/ipadapter.py | 2 +- modules/processing_diffusers.py | 10 ++++++++++ scripts/xyz_grid.py | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/ipadapter.py b/modules/ipadapter.py index 00bc714c8..41e336573 100644 --- a/modules/ipadapter.py +++ b/modules/ipadapter.py @@ -103,7 +103,7 @@ def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapt adapter_images = p.ip_adapter_images adapter_images = get_images(adapter_images) adapter_scales = get_scales(adapter_scales, adapter_images) - + p.ip_adapter_scales = adapter_scales # init code if pipe is None: return False diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 1cfa62ef1..081e37991 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -66,6 +66,16 @@ def process_diffusers(p: processing.StableDiffusionProcessing): time.sleep(0.1) if kwargs.get('latents', None) is None: return kwargs + if True: # TODO: IP adapter active + ip_adapter_scales = p.ip_adapter_scales + ip_adapter_end = shared.opts.data.get("ip_adapter_end", 1) + ip_adapter_end = ip_adapter_end if isinstance(ip_adapter_end, list) else [ip_adapter_end] * len(ip_adapter_scales) + if any(end != 1 for end in ip_adapter_end): + for i, end in enumerate(ip_adapter_end): + if step >= int(pipe.num_timesteps * end): + ip_adapter_scales[i] = 0 + if ip_adapter_scales != p.ip_adapter_scales: + pipe.set_ip_adapter_scale(ip_adapter_scales) if step != pipe.num_timesteps: kwargs = processing_correction.correction_callback(p, timestep, kwargs) if p.scheduled_prompt and 'prompt_embeds' in kwargs and 'negative_prompt_embeds' in kwargs: diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index bb28c7e8a..b10b6b1bb 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -275,6 +275,7 @@ axis_options = [ AxisOption("[FreeU] 2nd stage skip factor", float, apply_setting('freeu_s2')), AxisOption("[IP adapter] Name", str, apply_field('ip_adapter_names'), cost=1.0, choices=lambda: list(ipadapter.ADAPTERS)), AxisOption("[IP adapter] Scale", float, apply_field('ip_adapter_scales')), + AxisOption("[IP adapter] End", float, apply_setting('ip_adapter_end')), ] From 7021ffb5400c5d45be847c904ced75da5c11216b Mon Sep 17 00:00:00 2001 From: AI-Casanova <54461896+AI-Casanova@users.noreply.github.com> Date: Sun, 11 Feb 2024 22:13:11 -0600 Subject: [PATCH 2/3] Add UI controls --- modules/ipadapter.py | 15 +++++++++++++-- modules/processing_class.py | 2 ++ modules/processing_diffusers.py | 15 +++++++-------- scripts/ipadapter.py | 11 ++++++++++- scripts/xyz_grid.py | 3 ++- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/modules/ipadapter.py b/modules/ipadapter.py index 41e336573..9bffa05a7 100644 --- a/modules/ipadapter.py +++ b/modules/ipadapter.py @@ -81,7 +81,7 @@ def unapply(pipe): # pylint: disable=arguments-differ pass -def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapter_scales=[1.0], adapter_images=[]): +def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapter_scales=[1.0], adapter_starts=[0.0], adapter_ends=[1.0], adapter_images=[]): global clip_loaded # pylint: disable=global-statement # overrides if hasattr(p, 'ip_adapter_names'): @@ -99,11 +99,19 @@ def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapt return False if hasattr(p, 'ip_adapter_scales'): adapter_scales = p.ip_adapter_scales + if hasattr(p, 'ip_adapter_starts'): + adapter_starts = p.ip_adapter_starts + if hasattr(p, 'ip_adapter_ends'): + adapter_ends = p.ip_adapter_ends if hasattr(p, 'ip_adapter_images'): adapter_images = p.ip_adapter_images adapter_images = get_images(adapter_images) adapter_scales = get_scales(adapter_scales, adapter_images) - p.ip_adapter_scales = adapter_scales + p.ip_adapter_scales = adapter_scales.copy() + adapter_starts = get_scales(adapter_starts, adapter_images) + p.ip_adapter_starts = adapter_starts.copy() + adapter_ends = get_scales(adapter_ends, adapter_images) + p.ip_adapter_ends = adapter_ends.copy() # init code if pipe is None: return False @@ -160,6 +168,9 @@ def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapt ip_subfolder = 'models' if shared.sd_model_type == 'sd' else 'sdxl_models' try: pipe.load_ip_adapter([base_repo], subfolder=[ip_subfolder], weight_name=adapters) + for i in range(len(adapter_scales)): + if adapter_starts[i] > 0: + adapter_scales[i] = 0.00 pipe.set_ip_adapter_scale(adapter_scales) p.task_args['ip_adapter_image'] = adapter_images p.extra_generation_params["IP Adapter"] = ';'.join([f'{os.path.splitext(adapter)[0]}:{scale}' for adapter, scale in zip(adapter_names, adapter_scales)]) diff --git a/modules/processing_class.py b/modules/processing_class.py index 63e082091..ad2e22d6d 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -118,6 +118,8 @@ class StableDiffusionProcessing: self.ip_adapter_names = None self.ip_adapter_scales = 0.0 self.ip_adapter_images = None + self.ip_adapter_starts = None + self.ip_adapter_ends = None # hdr self.hdr_mode=hdr_mode self.hdr_brightness=hdr_brightness diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 081e37991..c0d52bce2 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -67,14 +67,13 @@ def process_diffusers(p: processing.StableDiffusionProcessing): if kwargs.get('latents', None) is None: return kwargs if True: # TODO: IP adapter active - ip_adapter_scales = p.ip_adapter_scales - ip_adapter_end = shared.opts.data.get("ip_adapter_end", 1) - ip_adapter_end = ip_adapter_end if isinstance(ip_adapter_end, list) else [ip_adapter_end] * len(ip_adapter_scales) - if any(end != 1 for end in ip_adapter_end): - for i, end in enumerate(ip_adapter_end): - if step >= int(pipe.num_timesteps * end): - ip_adapter_scales[i] = 0 - if ip_adapter_scales != p.ip_adapter_scales: + ip_adapter_scales = list(p.ip_adapter_scales) + ip_adapter_starts = list(p.ip_adapter_starts) + ip_adapter_ends = list(p.ip_adapter_ends) + if any(end != 1 for end in ip_adapter_ends) or any(start != 0 for start in ip_adapter_starts): + for i in range(len(ip_adapter_scales)): + ip_adapter_scales[i] = 0 if step <= int(pipe.num_timesteps * ip_adapter_starts[i]) else ip_adapter_scales[i] # TODO: Convert to bool list? + ip_adapter_scales[i] = 0 if step >= int(pipe.num_timesteps * ip_adapter_ends[i]) else ip_adapter_scales[i] pipe.set_ip_adapter_scale(ip_adapter_scales) if step != pipe.num_timesteps: kwargs = processing_correction.correction_callback(p, timestep, kwargs) diff --git a/scripts/ipadapter.py b/scripts/ipadapter.py index 17f3e8cc9..3d03d784f 100644 --- a/scripts/ipadapter.py +++ b/scripts/ipadapter.py @@ -43,6 +43,8 @@ class Script(scripts.Script): units = [] adapters = [] scales = [] + starts = [] + ends = [] files = [] galleries = [] with gr.Row(): @@ -52,6 +54,9 @@ class Script(scripts.Script): with gr.Row(): adapters.append(gr.Dropdown(label='Adapter', choices=list(ipadapter.ADAPTERS), value='None')) scales.append(gr.Slider(label='Scale', minimum=0.0, maximum=1.0, step=0.01, value=0.5)) + with gr.Row(): + starts.append(gr.Slider(label='Start', minimum=0.0, maximum=1.0, step=0.1, value=0)) + ends.append(gr.Slider(label='End', minimum=0.0, maximum=1.0, step=0.1, value=1)) with gr.Row(): files.append(gr.File(label='Input images', file_count='multiple', file_types=['image'], type='file', interactive=True, height=100)) with gr.Row(): @@ -59,7 +64,7 @@ class Script(scripts.Script): files[i].change(fn=self.load_images, inputs=[files[i]], outputs=[galleries[i]]) units.append(unit) num_adapters.change(fn=self.display_units, inputs=[num_adapters], outputs=units) - return [num_adapters] + adapters + scales + files + return [num_adapters] + adapters + scales + files + starts + ends def process(self, p: processing.StableDiffusionProcessing, *args): # pylint: disable=arguments-differ if shared.backend != shared.Backend.DIFFUSERS: @@ -72,4 +77,8 @@ class Script(scripts.Script): p.ip_adapter_scales = args[MAX_ADAPTERS:MAX_ADAPTERS*2][:units] if p.ip_adapter_images is None: p.ip_adapter_images = args[MAX_ADAPTERS*2:MAX_ADAPTERS*3][:units] + if p.ip_adapter_starts is None: + p.ip_adapter_starts = args[MAX_ADAPTERS*3:MAX_ADAPTERS*4][:units] + if p.ip_adapter_ends is None: + p.ip_adapter_ends = args[MAX_ADAPTERS*4:MAX_ADAPTERS*5][:units] # ipadapter.apply(shared.sd_model, p, adapter_name, scale, image) # called directly from processing.process_images_inner diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index b10b6b1bb..b296bb732 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -275,7 +275,8 @@ axis_options = [ AxisOption("[FreeU] 2nd stage skip factor", float, apply_setting('freeu_s2')), AxisOption("[IP adapter] Name", str, apply_field('ip_adapter_names'), cost=1.0, choices=lambda: list(ipadapter.ADAPTERS)), AxisOption("[IP adapter] Scale", float, apply_field('ip_adapter_scales')), - AxisOption("[IP adapter] End", float, apply_setting('ip_adapter_end')), + AxisOption("[IP adapter] Starts", float, apply_field('ip_adapter_starts')), + AxisOption("[IP adapter] Ends", float, apply_field('ip_adapter_ends')), ] From 3d9e5465d131283b955116cc54bbbb8d4ad72e2c Mon Sep 17 00:00:00 2001 From: AI-Casanova <54461896+AI-Casanova@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:50:37 -0600 Subject: [PATCH 3/3] Finish TODO fix script --- modules/processing_diffusers.py | 7 ++++--- scripts/ipadapter.py | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index c0d52bce2..f761f07a4 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -66,14 +66,15 @@ def process_diffusers(p: processing.StableDiffusionProcessing): time.sleep(0.1) if kwargs.get('latents', None) is None: return kwargs - if True: # TODO: IP adapter active + if getattr(p, "ip_adapter_names", ["None"])[0] != "None": ip_adapter_scales = list(p.ip_adapter_scales) ip_adapter_starts = list(p.ip_adapter_starts) ip_adapter_ends = list(p.ip_adapter_ends) if any(end != 1 for end in ip_adapter_ends) or any(start != 0 for start in ip_adapter_starts): for i in range(len(ip_adapter_scales)): - ip_adapter_scales[i] = 0 if step <= int(pipe.num_timesteps * ip_adapter_starts[i]) else ip_adapter_scales[i] # TODO: Convert to bool list? - ip_adapter_scales[i] = 0 if step >= int(pipe.num_timesteps * ip_adapter_ends[i]) else ip_adapter_scales[i] + ip_adapter_scales[i] *= float(step >= pipe.num_timesteps * ip_adapter_starts[i]) + ip_adapter_scales[i] *= float(step <= pipe.num_timesteps * ip_adapter_ends[i]) + debug(f"Callback: IP Adapter scales={ip_adapter_scales}") pipe.set_ip_adapter_scale(ip_adapter_scales) if step != pipe.num_timesteps: kwargs = processing_correction.correction_callback(p, timestep, kwargs) diff --git a/scripts/ipadapter.py b/scripts/ipadapter.py index 3d03d784f..ebe273654 100644 --- a/scripts/ipadapter.py +++ b/scripts/ipadapter.py @@ -71,14 +71,14 @@ class Script(scripts.Script): return args = list(args) units = args.pop(0) - if p.ip_adapter_names is None: + if p.ip_adapter_names == []: p.ip_adapter_names = args[:MAX_ADAPTERS][:units] - if p.ip_adapter_scales == 0.0: + if p.ip_adapter_scales == [0.0]: p.ip_adapter_scales = args[MAX_ADAPTERS:MAX_ADAPTERS*2][:units] - if p.ip_adapter_images is None: + if p.ip_adapter_images == []: p.ip_adapter_images = args[MAX_ADAPTERS*2:MAX_ADAPTERS*3][:units] - if p.ip_adapter_starts is None: + if p.ip_adapter_starts == [0.0]: p.ip_adapter_starts = args[MAX_ADAPTERS*3:MAX_ADAPTERS*4][:units] - if p.ip_adapter_ends is None: + if p.ip_adapter_ends == [1.0]: p.ip_adapter_ends = args[MAX_ADAPTERS*4:MAX_ADAPTERS*5][:units] # ipadapter.apply(shared.sd_model, p, adapter_name, scale, image) # called directly from processing.process_images_inner