multimodalart HF staff commited on
Commit
b888bcf
1 Parent(s): f1f7ebd
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .vscode
app.py CHANGED
@@ -1,39 +1,40 @@
1
- import gradio as gr
2
  import torch
3
  from diffusers import StableDiffusionXLPipeline, AutoencoderKL
4
  from huggingface_hub import hf_hub_download
5
  import lora
6
  from time import sleep
7
  import copy
 
8
 
9
- sdxl_loras = [
10
- ("pixel-art-xl.jpeg", "Pixel Art XL", "nerijs/pixel-art-xl", "pixel art", "pixel-art-xl.safetensors", True),
11
- ("papercut_SDXL.jpeg", "Papercut SDXL", "TheLastBen/Papercut_SDXL", "papercut", "papercut.safetensors", False),
12
- ("lego-minifig-xl.jpeg", "Lego Minifig XL", "nerijs/lego-minifig-xl", "lego minifig", "legominifig-v1.0-000003.safetensors", True),
13
- ("embroid.png","Embroidery Style","ostris/embroidery_style_lora_sdxl","","embroidered_style_v1_sdxl.safetensors",False),
14
- ("3d_style_4.jpeg", "3D Render Style", "goofyai/3d_render_style_xl", "3d style", "3d_render_style_xl.safetensors", True),
15
- ("LogoRedmond-LogoLoraForSDXL.jpeg","Logo.Redmond", "artificialguybr/LogoRedmond-LogoLoraForSDXL", "LogoRedAF", "LogoRedmond_LogoRedAF.safetensors", True),
16
- ("LineAni.Redmond.png", "LinearManga.Redmond", "artificialguybr/LineAniRedmond-LinearMangaSDXL", "LineAniAF", "LineAniRedmond-LineAniAF.safetensors", True),
17
- ("watercolor.png","Watercolor Style","ostris/watercolor_style_lora_sdxl","","watercolor_v1_sdxl.safetensors",False),
18
- ("dog.png", "Cyborg Style", "goofyai/cyborg_style_xl", "cyborg style", "cyborg_style_xl-off.safetensors", True),
19
- ("ToyRedmond-ToyLoraForSDXL10.png","Toy.Redmond", "artificialguybr/ToyRedmond-ToyLoraForSDXL10", "FnkRedmAF", "ToyRedmond-FnkRedmAF.safetensors", True),
20
- ("voxel-xl-lora.png", "Voxel XL", "Fictiverse/Voxel_XL_Lora", "voxel style", "VoxelXL_v1.safetensors", True),
21
- ("crayon.png","Crayon Style","ostris/crayon_style_lora_sdxl","","crayons_v1_sdxl.safetensors",False),
22
- ("pikachu.webp", "Pikachu XL", "TheLastBen/Pikachu_SDXL", "pikachu", "pikachu.safetensors", False),
23
- ("william_eggleston.webp", "William Eggleston Style", "TheLastBen/William_Eggleston_Style_SDXL", "by william eggleston", "wegg.safetensors", False),
24
- ("josef_koudelka.webp", "Josef Koudelka Style", "TheLastBen/Josef_Koudelka_Style_SDXL", "by josef koudelka", "koud.safetensors", False),
25
- ("corgi_brick.jpeg", "Lego BrickHeadz", "nerijs/lego-brickheadz-xl", "lego brickheadz", "legobrickheadz-v1.0-000004.safetensors", True)
26
  ]
27
 
28
- saved_names = [hf_hub_download(repo_id, filename) for _, _, repo_id, _, filename, _ in sdxl_loras]
29
-
30
  def update_selection(selected_state: gr.SelectData):
31
  lora_repo = sdxl_loras[selected_state.index][2]
32
  instance_prompt = sdxl_loras[selected_state.index][3]
33
  updated_text = f"### Selected: [{lora_repo}](https://huggingface.co/{lora_repo})"
34
  return updated_text, instance_prompt, selected_state
35
 
36
- vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)
 
 
 
37
  pipe = StableDiffusionXLPipeline.from_pretrained(
38
  "stabilityai/stable-diffusion-xl-base-1.0",
39
  vae=vae,
@@ -45,24 +46,25 @@ pipe.to("cuda")
45
  last_lora = ""
46
  last_merged = False
47
 
 
48
  def run_lora(prompt, negative, weight, selected_state):
49
  global last_lora, last_merged, pipe
50
- if(not selected_state):
51
  raise gr.Error("You must select a LoRA")
52
  repo_name = sdxl_loras[selected_state.index][2]
53
  weight_name = sdxl_loras[selected_state.index][4]
54
  full_path_lora = saved_names[selected_state.index]
55
  cross_attention_kwargs = None
56
- if(last_lora != repo_name):
57
- if(last_merged):
58
  pipe = copy.deepcopy(original_pipe)
59
  pipe.to("cuda")
60
  else:
61
  pipe.unload_lora_weights()
62
  is_compatible = sdxl_loras[selected_state.index][5]
63
- if(is_compatible):
64
  pipe.load_lora_weights(full_path_lora)
65
- cross_attention_kwargs={"scale": weight}
66
  else:
67
  for weights_file in [full_path_lora]:
68
  if ";" in weights_file:
@@ -72,17 +74,31 @@ def run_lora(prompt, negative, weight, selected_state):
72
  multiplier = 1.0
73
 
74
  lora_model, weights_sd = lora.create_network_from_weights(
75
- multiplier, full_path_lora, pipe.vae, pipe.text_encoder, pipe.unet, for_inference=True
 
 
 
 
 
 
 
 
 
76
  )
77
- lora_model.merge_to(pipe.text_encoder, pipe.unet, weights_sd, torch.float16, "cuda")
78
  last_merged = True
79
-
80
  image = pipe(
81
- prompt=prompt, negative_prompt=negative, num_inference_steps=20, guidance_scale=7.5, cross_attention_kwargs=cross_attention_kwargs).images[0]
 
 
 
 
 
82
  last_lora = repo_name
83
  return image
84
-
85
- css = '''
 
86
  #title{text-align: center;margin-bottom: 0.5em}
87
  #title h1{font-size: 3em}
88
  #prompt textarea{width: calc(100% - 160px);border-top-right-radius: 0px;border-bottom-right-radius: 0px;}
@@ -90,19 +106,22 @@ css = '''
90
  border-top-left-radius: 0px;}
91
  #gallery{display:flex}
92
  #gallery .grid-wrap{min-height: 100%;}
93
- '''
94
 
95
  with gr.Blocks(css=css) as demo:
96
  title = gr.Markdown("# LoRA the Explorer 🔎", elem_id="title")
97
  with gr.Row():
98
- gallery = gr.Gallery(value=[(a, b) for a, b, _, _, _, _ in sdxl_loras],
99
- label="SDXL LoRA Gallery",
100
- allow_preview=False,
101
- columns=3,
102
- elem_id="gallery"
103
- )
 
104
  with gr.Column():
105
- prompt_title = gr.Markdown(value="### Click on a LoRA in the gallery to select it", visible=True)
 
 
106
  with gr.Row():
107
  prompt = gr.Textbox(label="Prompt", elem_id="prompt")
108
  button = gr.Button("Run", elem_id="run_button")
@@ -111,20 +130,29 @@ with gr.Blocks(css=css) as demo:
111
  negative = gr.Textbox(label="Negative Prompt")
112
  weight = gr.Slider(0, 1, value=1, step=0.1, label="LoRA weight")
113
  with gr.Column():
114
- gr.Markdown("Use it with:")
115
- with gr.Row():
116
- with gr.Accordion("🧨 diffusers", open=False):
117
- gr.Markdown("")
118
- with gr.Accordion("ComfyUI", open=False):
119
- gr.Markdown("")
120
- with gr.Accordion("Invoke AI", open=False):
121
- gr.Markdown("")
122
- with gr.Accordion("SD.Next (AUTO1111 fork)", open=False):
123
- gr.Markdown("")
124
  selected_state = gr.State()
125
- gallery.select(update_selection, outputs=[prompt_title, prompt, selected_state], queue=False, show_progress=False)
126
- prompt.submit(fn=run_lora, inputs=[prompt, negative, weight, selected_state], outputs=result)
127
- button.click(fn=run_lora, inputs=[prompt, negative, weight, selected_state], outputs=result)
128
-
129
-
130
- demo.launch()
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
  import torch
3
  from diffusers import StableDiffusionXLPipeline, AutoencoderKL
4
  from huggingface_hub import hf_hub_download
5
  import lora
6
  from time import sleep
7
  import copy
8
+ import json
9
 
10
+ with open("sdxl_loras.json", "r") as file:
11
+ sdxl_loras = [
12
+ (
13
+ item["image"],
14
+ item["title"],
15
+ item["repo"],
16
+ item["trigger_word"],
17
+ item["weights"],
18
+ item["is_compatible"],
19
+ )
20
+ for item in json.load(file)
21
+ ]
22
+
23
+ saved_names = [
24
+ hf_hub_download(repo_id, filename) for _, _, repo_id, _, filename, _ in sdxl_loras
 
 
25
  ]
26
 
27
+
 
28
  def update_selection(selected_state: gr.SelectData):
29
  lora_repo = sdxl_loras[selected_state.index][2]
30
  instance_prompt = sdxl_loras[selected_state.index][3]
31
  updated_text = f"### Selected: [{lora_repo}](https://huggingface.co/{lora_repo})"
32
  return updated_text, instance_prompt, selected_state
33
 
34
+
35
+ vae = AutoencoderKL.from_pretrained(
36
+ "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
37
+ )
38
  pipe = StableDiffusionXLPipeline.from_pretrained(
39
  "stabilityai/stable-diffusion-xl-base-1.0",
40
  vae=vae,
 
46
  last_lora = ""
47
  last_merged = False
48
 
49
+
50
  def run_lora(prompt, negative, weight, selected_state):
51
  global last_lora, last_merged, pipe
52
+ if not selected_state:
53
  raise gr.Error("You must select a LoRA")
54
  repo_name = sdxl_loras[selected_state.index][2]
55
  weight_name = sdxl_loras[selected_state.index][4]
56
  full_path_lora = saved_names[selected_state.index]
57
  cross_attention_kwargs = None
58
+ if last_lora != repo_name:
59
+ if last_merged:
60
  pipe = copy.deepcopy(original_pipe)
61
  pipe.to("cuda")
62
  else:
63
  pipe.unload_lora_weights()
64
  is_compatible = sdxl_loras[selected_state.index][5]
65
+ if is_compatible:
66
  pipe.load_lora_weights(full_path_lora)
67
+ cross_attention_kwargs = {"scale": weight}
68
  else:
69
  for weights_file in [full_path_lora]:
70
  if ";" in weights_file:
 
74
  multiplier = 1.0
75
 
76
  lora_model, weights_sd = lora.create_network_from_weights(
77
+ multiplier,
78
+ full_path_lora,
79
+ pipe.vae,
80
+ pipe.text_encoder,
81
+ pipe.unet,
82
+ for_inference=True,
83
+ )
84
+ lora_model.apply_to(pipe.text_encoder, pipe.unet)
85
+ lora_model.merge_to(
86
+ pipe.text_encoder, pipe.unet, weights_sd, torch.float16, "cuda"
87
  )
 
88
  last_merged = True
89
+
90
  image = pipe(
91
+ prompt=prompt,
92
+ negative_prompt=negative,
93
+ num_inference_steps=20,
94
+ guidance_scale=7.5,
95
+ cross_attention_kwargs=cross_attention_kwargs,
96
+ ).images[0]
97
  last_lora = repo_name
98
  return image
99
+
100
+
101
+ css = """
102
  #title{text-align: center;margin-bottom: 0.5em}
103
  #title h1{font-size: 3em}
104
  #prompt textarea{width: calc(100% - 160px);border-top-right-radius: 0px;border-bottom-right-radius: 0px;}
 
106
  border-top-left-radius: 0px;}
107
  #gallery{display:flex}
108
  #gallery .grid-wrap{min-height: 100%;}
109
+ """
110
 
111
  with gr.Blocks(css=css) as demo:
112
  title = gr.Markdown("# LoRA the Explorer 🔎", elem_id="title")
113
  with gr.Row():
114
+ gallery = gr.Gallery(
115
+ value=[(a, b) for a, b, _, _, _, _ in sdxl_loras],
116
+ label="SDXL LoRA Gallery",
117
+ allow_preview=False,
118
+ columns=3,
119
+ elem_id="gallery",
120
+ )
121
  with gr.Column():
122
+ prompt_title = gr.Markdown(
123
+ value="### Click on a LoRA in the gallery to select it", visible=True
124
+ )
125
  with gr.Row():
126
  prompt = gr.Textbox(label="Prompt", elem_id="prompt")
127
  button = gr.Button("Run", elem_id="run_button")
 
130
  negative = gr.Textbox(label="Negative Prompt")
131
  weight = gr.Slider(0, 1, value=1, step=0.1, label="LoRA weight")
132
  with gr.Column():
133
+ gr.Markdown("Use it with:")
134
+ with gr.Row():
135
+ with gr.Accordion("🧨 diffusers", open=False):
136
+ gr.Markdown("")
137
+ with gr.Accordion("ComfyUI", open=False):
138
+ gr.Markdown("")
139
+ with gr.Accordion("Invoke AI", open=False):
140
+ gr.Markdown("")
141
+ with gr.Accordion("SD.Next (AUTO1111 fork)", open=False):
142
+ gr.Markdown("")
143
  selected_state = gr.State()
144
+ gallery.select(
145
+ update_selection,
146
+ outputs=[prompt_title, prompt, selected_state],
147
+ queue=False,
148
+ show_progress=False,
149
+ )
150
+ prompt.submit(
151
+ fn=run_lora, inputs=[prompt, negative, weight, selected_state], outputs=result
152
+ )
153
+ button.click(
154
+ fn=run_lora, inputs=[prompt, negative, weight, selected_state], outputs=result
155
+ )
156
+
157
+
158
+ demo.launch()
3d_style_4.jpeg → images/3d_style_4.jpeg RENAMED
File without changes
LineAni.Redmond.png → images/LineAni.Redmond.png RENAMED
File without changes
LogoRedmond-LogoLoraForSDXL.jpeg → images/LogoRedmond-LogoLoraForSDXL.jpeg RENAMED
File without changes
ToyRedmond-ToyLoraForSDXL10.png → images/ToyRedmond-ToyLoraForSDXL10.png RENAMED
File without changes
corgi_brick.jpeg → images/corgi_brick.jpeg RENAMED
File without changes
crayon.png → images/crayon.png RENAMED
File without changes
dog.png → images/dog.png RENAMED
File without changes
embroid.png → images/embroid.png RENAMED
File without changes
josef_koudelka.webp → images/josef_koudelka.webp RENAMED
File without changes
lego-minifig-xl.jpeg → images/lego-minifig-xl.jpeg RENAMED
File without changes
papercut_SDXL.jpeg → images/papercut_SDXL.jpeg RENAMED
File without changes
pikachu.webp → images/pikachu.webp RENAMED
File without changes
pixel-art-xl.jpeg → images/pixel-art-xl.jpeg RENAMED
File without changes
voxel-xl-lora.png → images/voxel-xl-lora.png RENAMED
File without changes
watercolor.png → images/watercolor.png RENAMED
File without changes
william_eggleston.webp → images/william_eggleston.webp RENAMED
File without changes
sdxl_loras.json ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "image": "images/pixel-art-xl.jpeg",
4
+ "title": "Pixel Art XL",
5
+ "repo": "nerijs/pixel-art-xl",
6
+ "trigger_word": "pixel art",
7
+ "weights": "pixel-art-xl.safetensors",
8
+ "is_compatible": true
9
+ },
10
+ {
11
+ "image": "images/papercut_SDXL.jpeg",
12
+ "title": "Papercut SDXL",
13
+ "repo": "TheLastBen/Papercut_SDXL",
14
+ "trigger_word": "papercut",
15
+ "weights": "papercut.safetensors",
16
+ "is_compatible": false
17
+ },
18
+ {
19
+ "image": "images/lego-minifig-xl.jpeg",
20
+ "title": "Lego Minifig XL",
21
+ "repo": "nerijs/lego-minifig-xl",
22
+ "trigger_word": "lego minifig",
23
+ "weights": "legominifig-v1.0-000003.safetensors",
24
+ "is_compatible": true
25
+ },
26
+ {
27
+ "image": "images/embroid.png",
28
+ "title": "Embroidery Style",
29
+ "repo": "ostris/embroidery_style_lora_sdxl",
30
+ "trigger_word": "",
31
+ "weights": "embroidered_style_v1_sdxl.safetensors",
32
+ "is_compatible": false
33
+ },
34
+ {
35
+ "image": "images/3d_style_4.jpeg",
36
+ "title": "3D Render Style",
37
+ "repo": "goofyai/3d_render_style_xl",
38
+ "trigger_word": "3d style",
39
+ "weights": "3d_render_style_xl.safetensors",
40
+ "is_compatible": true
41
+ },
42
+ {
43
+ "image": "images/LogoRedmond-LogoLoraForSDXL.jpeg",
44
+ "title": "Logo.Redmond",
45
+ "repo": "artificialguybr/LogoRedmond-LogoLoraForSDXL",
46
+ "trigger_word": "LogoRedAF",
47
+ "weights": "LogoRedmond_LogoRedAF.safetensors",
48
+ "is_compatible": true
49
+ },
50
+ {
51
+ "image": "images/LineAni.Redmond.png",
52
+ "title": "LinearManga.Redmond",
53
+ "repo": "artificialguybr/LineAniRedmond-LinearMangaSDXL",
54
+ "trigger_word": "LineAniAF",
55
+ "weights": "LineAniRedmond-LineAniAF.safetensors",
56
+ "is_compatible": true
57
+ },
58
+ {
59
+ "image": "images/watercolor.png",
60
+ "title": "Watercolor Style",
61
+ "repo": "ostris/watercolor_style_lora_sdxl",
62
+ "trigger_word": "",
63
+ "weights": "watercolor_v1_sdxl.safetensors",
64
+ "is_compatible": false
65
+ },
66
+ {
67
+ "image": "images/dog.png",
68
+ "title": "Cyborg Style",
69
+ "repo": "goofyai/cyborg_style_xl",
70
+ "trigger_word": "cyborg style",
71
+ "weights": "cyborg_style_xl-off.safetensors",
72
+ "is_compatible": true
73
+ },
74
+ {
75
+ "image": "images/ToyRedmond-ToyLoraForSDXL10.png",
76
+ "title": "Toy.Redmond",
77
+ "repo": "artificialguybr/ToyRedmond-ToyLoraForSDXL10",
78
+ "trigger_word": "FnkRedmAF",
79
+ "weights": "ToyRedmond-FnkRedmAF.safetensors",
80
+ "is_compatible": true
81
+ },
82
+ {
83
+ "image": "images/voxel-xl-lora.png",
84
+ "title": "Voxel XL",
85
+ "repo": "Fictiverse/Voxel_XL_Lora",
86
+ "trigger_word": "voxel style",
87
+ "weights": "VoxelXL_v1.safetensors",
88
+ "is_compatible": true
89
+ },
90
+ {
91
+ "image": "images/crayon.png",
92
+ "title": "Crayon Style",
93
+ "repo": "ostris/crayon_style_lora_sdxl",
94
+ "trigger_word": "",
95
+ "weights": "crayons_v1_sdxl.safetensors",
96
+ "is_compatible": false
97
+ },
98
+ {
99
+ "image": "images/pikachu.webp",
100
+ "title": "Pikachu XL",
101
+ "repo": "TheLastBen/Pikachu_SDXL",
102
+ "trigger_word": "pikachu",
103
+ "weights": "pikachu.safetensors",
104
+ "is_compatible": false
105
+ },
106
+ {
107
+ "image": "images/william_eggleston.webp",
108
+ "title": "William Eggleston Style",
109
+ "repo": "TheLastBen/William_Eggleston_Style_SDXL",
110
+ "trigger_word": "by william eggleston",
111
+ "weights": "wegg.safetensors",
112
+ "is_compatible": false
113
+ },
114
+ {
115
+ "image": "images/josef_koudelka.webp",
116
+ "title": "Josef Koudelka Style",
117
+ "repo": "TheLastBen/Josef_Koudelka_Style_SDXL",
118
+ "trigger_word": "by josef koudelka",
119
+ "weights": "koud.safetensors",
120
+ "is_compatible": false
121
+ },
122
+ {
123
+ "image": "images/corgi_brick.jpeg",
124
+ "title": "Lego BrickHeadz",
125
+ "repo": "nerijs/lego-brickheadz-xl",
126
+ "trigger_word": "lego brickheadz",
127
+ "weights": "legobrickheadz-v1.0-000004.safetensors",
128
+ "is_compatible": true
129
+ }
130
+ ]