Guest User

Untitled

a guest
Mar 2nd, 2023
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.90 KB | None | 0 0
  1. import os
  2. import torch
  3.  
  4. import gradio as gr
  5.  
  6. from modules import script_callbacks, scripts, shared
  7.  
  8.  
  9. class CLIPBlend:
  10.     def __init__(self):
  11.         self.process_tokens = None
  12.  
  13.     def __call__(self, remade_batch_tokens, multipliers):
  14.         if shared.opts.clip_blend_enabled:
  15.             ratio1 = shared.opts.clip_blend_ratio1
  16.             ratio2 = shared.opts.clip_blend_ratio2
  17.  
  18.             CLIP_original = shared.opts.CLIP_stop_at_last_layers
  19.            
  20.             shared.opts.CLIP_stop_at_last_layers = 1
  21.             z1 = self.process_tokens(remade_batch_tokens, multipliers) # type: ignore
  22.             shared.opts.CLIP_stop_at_last_layers = 2
  23.             z2 = self.process_tokens(remade_batch_tokens, multipliers) # type: ignore
  24.  
  25.             shared.opts.CLIP_stop_at_last_layers = CLIP_original
  26.  
  27.             blend1 = z1*(1.-ratio1)+z2*ratio1
  28.  
  29.             if shared.opts.clip_blend_concat:
  30.                 blend2 = z1*(1.-ratio2)+z2*ratio2
  31.                 return torch.hstack([blend1,blend2])
  32.             return blend1
  33.        
  34.         z = self.process_tokens(remade_batch_tokens, multipliers) # type: ignore
  35.         return z
  36.  
  37. clip_blend = CLIPBlend()
  38.  
  39. def on_model_loaded(sd_model):
  40.     clip_blend.process_tokens = sd_model.cond_stage_model.process_tokens
  41.     sd_model.cond_stage_model.process_tokens = clip_blend
  42.  
  43. def on_script_unloaded():
  44.     cond_stage_model = shared.sd_model.cond_stage_model # type: ignore
  45.     if type(cond_stage_model.process_tokens) == CLIPBlend:
  46.         cond_stage_model.process_tokens = cond_stage_model.process_tokens.process_tokens
  47.  
  48. def on_ui_settings():
  49.     section = ('clip_blend', 'CLIP Blend')
  50.     shared.opts.add_option('clip_blend_enabled', shared.OptionInfo(
  51.         False, 'Enable CLIP Blend', section=section
  52.     ))
  53.     shared.opts.add_option("clip_blend_ratio1", shared.OptionInfo(
  54.         0, "Blend Ratio (R1) - The result is calculated as Z1 * (1 - R1) + Z2 * R1. Set to 0 to get CLIP skip=1; set to 1 to get CLIP skip=2", gr.Slider, {"minimum": -1, "maximum": 2, "step": 0.1}, section=section
  55.     ))
  56.     shared.opts.add_option("clip_blend_concat", shared.OptionInfo(
  57.         False, "Concatenate second CLIP Blend", section=section
  58.     ))
  59.     shared.opts.add_option("clip_blend_ratio2", shared.OptionInfo(
  60.         1, "Blend Ratio (R2) - The result is calculated as Z1 * (1 - R2) + Z2 * R2. Set to 0 to get CLIP skip=1; set to 1 to get CLIP skip=2", gr.Slider, {"minimum": -1, "maximum": 2, "step": 0.1}, section=section
  61.     ))
  62.  
  63. def format_bool(x):
  64.     return not x.lower().strip() in ['0', 'false']
  65.  
  66. def apply_override(p, opt, x, is_bool=False):
  67.     getattr(p, 'override_settings')[opt] = format_bool(x) if is_bool else x
  68.  
  69. def apply_label(label, x, is_bool=False):
  70.     return f"{label + (': ' if label else '')}{str(format_bool(x)) if is_bool else x}"
  71.  
  72. for scriptDataTuple in scripts.scripts_data:
  73.     if os.path.basename(scriptDataTuple.path) == "xyz_grid.py":
  74.         xy_grid = scriptDataTuple.module
  75.         blend_enabled = xy_grid.AxisOption(
  76.             "[CLIP Blend] Blend Enabled",
  77.             str,
  78.             lambda p, field, _: apply_override(p, 'clip_blend_enabled', field, is_bool=True),
  79.             format_value=lambda p, opt, x: apply_label('CLIP Blend Enabled', x, is_bool=True)
  80.         )
  81.         xy_grid.axis_options.extend([blend_enabled])
  82.  
  83.         ratio1 = xy_grid.AxisOption(
  84.             "[CLIP Blend] Blend Ratio (R1)",
  85.             float,
  86.             lambda p, field, _: apply_override(p, 'clip_blend_ratio1', field, is_bool=False)
  87.         )
  88.         xy_grid.axis_options.extend([ratio1])
  89.  
  90.         concat_enabled = xy_grid.AxisOption(
  91.             "[CLIP Blend] Concatenate Second Blend",
  92.             str,
  93.             lambda p, field, _: apply_override(p, 'clip_blend_concat', field, is_bool=True),
  94.             format_value=lambda p, opt, x: apply_label('Concatenated Second CLIP Blend', x, is_bool=True)
  95.         )
  96.         xy_grid.axis_options.extend([concat_enabled])
  97.  
  98.         ratio2 = xy_grid.AxisOption(
  99.             "[CLIP Blend] Blend Ratio (R2)",
  100.             float,
  101.             lambda p, field, _: apply_override(p, 'clip_blend_ratio2', field, is_bool=False)
  102.         )
  103.         xy_grid.axis_options.extend([ratio2])
  104.  
  105. script_callbacks.on_script_unloaded(on_script_unloaded)
  106. script_callbacks.on_model_loaded(on_model_loaded)
  107. script_callbacks.on_ui_settings(on_ui_settings)
Advertisement
Add Comment
Please, Sign In to add comment