Files changed (6) hide show
  1. README.md +1 -3
  2. app.py +802 -458
  3. constants.py +0 -585
  4. image_processor.py +0 -130
  5. requirements.txt +2 -5
  6. utils.py +0 -485
README.md CHANGED
@@ -4,13 +4,11 @@ emoji: 🧩🖼️
4
  colorFrom: red
5
  colorTo: pink
6
  sdk: gradio
7
- sdk_version: 4.31.3
8
  app_file: app.py
9
  pinned: true
10
  license: mit
11
  short_description: Stunning images using stable diffusion.
12
- preload_from_hub:
13
- - madebyollin/sdxl-vae-fp16-fix config.json,diffusion_pytorch_model.safetensors
14
  ---
15
 
16
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
4
  colorFrom: red
5
  colorTo: pink
6
  sdk: gradio
7
+ sdk_version: 5.1.0
8
  app_file: app.py
9
  pinned: true
10
  license: mit
11
  short_description: Stunning images using stable diffusion.
 
 
12
  ---
13
 
14
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py CHANGED
@@ -1,258 +1,517 @@
1
  import spaces
2
  import os
3
- from stablepy import (
4
- Model_Diffusers,
5
- SCHEDULE_TYPE_OPTIONS,
6
- SCHEDULE_PREDICTION_TYPE_OPTIONS,
7
- check_scheduler_compatibility,
8
- TASK_AND_PREPROCESSORS,
9
- FACE_RESTORATION_MODELS,
10
- scheduler_names,
11
- )
12
- from constants import (
13
- DIRECTORY_MODELS,
14
- DIRECTORY_LORAS,
15
- DIRECTORY_VAES,
16
- DIRECTORY_EMBEDS,
17
- DIRECTORY_UPSCALERS,
18
- DOWNLOAD_MODEL,
19
- DOWNLOAD_VAE,
20
- DOWNLOAD_LORA,
21
- LOAD_DIFFUSERS_FORMAT_MODEL,
22
- DIFFUSERS_FORMAT_LORAS,
23
- DOWNLOAD_EMBEDS,
24
- CIVITAI_API_KEY,
25
- HF_TOKEN,
26
- TASK_STABLEPY,
27
- TASK_MODEL_LIST,
28
- UPSCALER_DICT_GUI,
29
- UPSCALER_KEYS,
30
- PROMPT_W_OPTIONS,
31
- WARNING_MSG_VAE,
32
- SDXL_TASK,
33
- MODEL_TYPE_TASK,
34
- POST_PROCESSING_SAMPLER,
35
- SUBTITLE_GUI,
36
- HELP_GUI,
37
- EXAMPLES_GUI_HELP,
38
- EXAMPLES_GUI,
39
- RESOURCES,
40
- DIFFUSERS_CONTROLNET_MODEL,
41
- IP_MODELS,
42
- MODE_IP_OPTIONS,
43
- )
44
  from stablepy.diffusers_vanilla.style_prompt_config import STYLE_NAMES
 
45
  import torch
46
  import re
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  import time
48
  from PIL import ImageFile
49
- from utils import (
50
- download_things,
51
- get_model_list,
52
- extract_parameters,
53
- get_my_lora,
54
- get_model_type,
55
- extract_exif_data,
56
- create_mask_now,
57
- download_diffuser_repo,
58
- get_used_storage_gb,
59
- delete_model,
60
- progress_step_bar,
61
- html_template_message,
62
- escape_html,
63
- )
64
- from image_processor import preprocessor_tab
65
- from datetime import datetime
66
- import gradio as gr
67
- import logging
68
- import diffusers
69
- import warnings
70
- from stablepy import logger
71
- from diffusers import FluxPipeline
72
  # import urllib.parse
73
- import subprocess
74
 
75
- subprocess.run("rm -rf /data-nvme/zerogpu-offload/*", env={}, shell=True)
76
  ImageFile.LOAD_TRUNCATED_IMAGES = True
77
- torch.backends.cuda.matmul.allow_tf32 = True
78
- # os.environ["PYTORCH_NO_CUDA_MEMORY_CACHING"] = "1"
79
  print(os.getenv("SPACES_ZERO_GPU"))
80
 
81
- directories = [DIRECTORY_MODELS, DIRECTORY_LORAS, DIRECTORY_VAES, DIRECTORY_EMBEDS, DIRECTORY_UPSCALERS]
82
- for directory in directories:
83
- os.makedirs(directory, exist_ok=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
  # Download stuffs
86
- for url in [url.strip() for url in DOWNLOAD_MODEL.split(',')]:
87
  if not os.path.exists(f"./models/{url.split('/')[-1]}"):
88
- download_things(DIRECTORY_MODELS, url, HF_TOKEN, CIVITAI_API_KEY)
89
- for url in [url.strip() for url in DOWNLOAD_VAE.split(',')]:
90
  if not os.path.exists(f"./vaes/{url.split('/')[-1]}"):
91
- download_things(DIRECTORY_VAES, url, HF_TOKEN, CIVITAI_API_KEY)
92
- for url in [url.strip() for url in DOWNLOAD_LORA.split(',')]:
93
  if not os.path.exists(f"./loras/{url.split('/')[-1]}"):
94
- download_things(DIRECTORY_LORAS, url, HF_TOKEN, CIVITAI_API_KEY)
95
 
96
  # Download Embeddings
97
- for url_embed in DOWNLOAD_EMBEDS:
 
 
 
 
 
 
 
 
98
  if not os.path.exists(f"./embedings/{url_embed.split('/')[-1]}"):
99
- download_things(DIRECTORY_EMBEDS, url_embed, HF_TOKEN, CIVITAI_API_KEY)
100
 
101
  # Build list models
102
- embed_list = get_model_list(DIRECTORY_EMBEDS)
103
- embed_list = [
104
- (os.path.splitext(os.path.basename(emb))[0], emb) for emb in embed_list
105
- ]
106
- single_file_model_list = get_model_list(DIRECTORY_MODELS)
107
- model_list = LOAD_DIFFUSERS_FORMAT_MODEL + single_file_model_list
108
- lora_model_list = get_model_list(DIRECTORY_LORAS)
109
  lora_model_list.insert(0, "None")
110
  lora_model_list = lora_model_list + DIFFUSERS_FORMAT_LORAS
111
- vae_model_list = get_model_list(DIRECTORY_VAES)
112
- vae_model_list.insert(0, "BakedVAE")
113
  vae_model_list.insert(0, "None")
114
 
115
  print('\033[33m🏁 Download and listing of valid models completed.\033[0m')
116
 
117
- flux_repo = "camenduru/FLUX.1-dev-diffusers"
118
- flux_pipe = FluxPipeline.from_pretrained(
119
- flux_repo,
120
- transformer=None,
121
- torch_dtype=torch.bfloat16,
122
- ).to("cuda")
123
- components = flux_pipe.components
124
- delete_model(flux_repo)
125
- # components = None
126
-
127
  #######################
128
  # GUI
129
  #######################
 
 
130
  logging.getLogger("diffusers").setLevel(logging.ERROR)
 
131
  diffusers.utils.logging.set_verbosity(40)
 
132
  warnings.filterwarnings(action="ignore", category=FutureWarning, module="diffusers")
133
  warnings.filterwarnings(action="ignore", category=UserWarning, module="diffusers")
134
  warnings.filterwarnings(action="ignore", category=FutureWarning, module="transformers")
 
 
135
  logger.setLevel(logging.DEBUG)
136
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  CSS = """
138
  .contain { display: flex; flex-direction: column; }
139
  #component-0 { height: 100%; }
140
  #gallery { flex-grow: 1; }
141
- #load_model { height: 50px; }
142
  """
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  class GuiSD:
146
  def __init__(self, stream=True):
147
  self.model = None
148
- self.status_loading = False
149
- self.sleep_loading = 4
150
- self.last_load = datetime.now()
151
- self.inventory = []
152
 
153
- def update_storage_models(self, storage_floor_gb=24, required_inventory_for_purge=3):
154
- while get_used_storage_gb() > storage_floor_gb:
155
- if len(self.inventory) < required_inventory_for_purge:
156
- break
157
- removal_candidate = self.inventory.pop(0)
158
- delete_model(removal_candidate)
159
-
160
- def update_inventory(self, model_name):
161
- if model_name not in single_file_model_list:
162
- self.inventory = [
163
- m for m in self.inventory if m != model_name
164
- ] + [model_name]
165
- print(self.inventory)
166
-
167
- def load_new_model(self, model_name, vae_model, task, controlnet_model, progress=gr.Progress(track_tqdm=True)):
168
 
169
- # download link model > model_name
170
 
171
- self.update_storage_models()
172
 
173
  vae_model = vae_model if vae_model != "None" else None
174
  model_type = get_model_type(model_name)
175
- dtype_model = torch.bfloat16 if model_type == "FLUX" else torch.float16
176
-
177
- if not os.path.exists(model_name):
178
- print("debug", model_name, vae_model, task, controlnet_model)
179
- _ = download_diffuser_repo(
180
- repo_name=model_name,
181
- model_type=model_type,
182
- revision="main",
183
- token=True,
184
- )
185
-
186
- self.update_inventory(model_name)
187
-
188
- for i in range(68):
189
- if not self.status_loading:
190
- self.status_loading = True
191
- if i > 0:
192
- time.sleep(self.sleep_loading)
193
- print("Previous model ops...")
194
- break
195
- time.sleep(0.5)
196
- print(f"Waiting queue {i}")
197
- yield "Waiting queue"
198
-
199
- self.status_loading = True
200
 
201
- yield f"Loading model: {model_name}"
202
-
203
- if vae_model == "BakedVAE":
204
- vae_model = model_name
205
- elif vae_model:
206
  vae_type = "SDXL" if "sdxl" in vae_model.lower() else "SD 1.5"
207
  if model_type != vae_type:
208
- gr.Warning(WARNING_MSG_VAE)
209
-
210
- print("Loading model...")
211
 
212
- try:
213
- start_time = time.time()
214
-
215
- if self.model is None:
216
- self.model = Model_Diffusers(
217
- base_model_id=model_name,
218
- task_name=TASK_STABLEPY[task],
219
- vae_model=vae_model,
220
- type_model_precision=dtype_model,
221
- retain_task_model_in_cache=False,
222
- controlnet_model=controlnet_model,
223
- device="cpu",
224
- env_components=components,
225
- )
226
- self.model.advanced_params(image_preprocessor_cuda_active=True)
227
- else:
228
- if self.model.base_model_id != model_name:
229
- load_now_time = datetime.now()
230
- elapsed_time = max((load_now_time - self.last_load).total_seconds(), 0)
231
-
232
- if elapsed_time <= 9:
233
- print("Waiting for the previous model's time ops...")
234
- time.sleep(9 - elapsed_time)
235
-
236
- self.model.device = torch.device("cpu")
237
- self.model.load_pipe(
238
- model_name,
239
- task_name=TASK_STABLEPY[task],
240
- vae_model=vae_model,
241
- type_model_precision=dtype_model,
242
- retain_task_model_in_cache=False,
243
- controlnet_model=controlnet_model,
244
- )
245
-
246
- end_time = time.time()
247
- self.sleep_loading = max(min(int(end_time - start_time), 10), 4)
248
- except Exception as e:
249
- self.last_load = datetime.now()
250
- self.status_loading = False
251
- self.sleep_loading = 4
252
- raise e
253
 
254
- self.last_load = datetime.now()
255
- self.status_loading = False
 
 
 
 
 
256
 
257
  yield f"Model loaded: {model_name}"
258
 
@@ -277,13 +536,7 @@ class GuiSD:
277
  lora_scale4,
278
  lora5,
279
  lora_scale5,
280
- lora6,
281
- lora_scale6,
282
- lora7,
283
- lora_scale7,
284
  sampler,
285
- schedule_type,
286
- schedule_prediction_type,
287
  img_height,
288
  img_width,
289
  model_name,
@@ -301,8 +554,6 @@ class GuiSD:
301
  high_threshold,
302
  value_threshold,
303
  distance_threshold,
304
- recolor_gamma_correction,
305
- tile_blur_sigma,
306
  controlnet_output_scaling_in_unet,
307
  controlnet_start_threshold,
308
  controlnet_stop_threshold,
@@ -310,8 +561,8 @@ class GuiSD:
310
  syntax_weights,
311
  upscaler_model_path,
312
  upscaler_increases_size,
313
- upscaler_tile_size,
314
- upscaler_tile_overlap,
315
  hires_steps,
316
  hires_denoising_strength,
317
  hires_sampler,
@@ -319,16 +570,12 @@ class GuiSD:
319
  hires_negative_prompt,
320
  hires_before_adetailer,
321
  hires_after_adetailer,
322
- hires_schedule_type,
323
- hires_guidance_scale,
324
- controlnet_model,
325
  loop_generation,
326
  leave_progress_bar,
327
  disable_progress_bar,
328
  image_previews,
329
  display_images,
330
  save_generated_images,
331
- filename_pattern,
332
  image_storage_location,
333
  retain_compel_previous_load,
334
  retain_detailfix_model_previous_load,
@@ -363,7 +610,6 @@ class GuiSD:
363
  mask_blur_b,
364
  mask_padding_b,
365
  retain_task_cache_gui,
366
- guidance_rescale,
367
  image_ip1,
368
  mask_ip1,
369
  model_ip1,
@@ -375,15 +621,10 @@ class GuiSD:
375
  mode_ip2,
376
  scale_ip2,
377
  pag_scale,
378
- face_restoration_model,
379
- face_restoration_visibility,
380
- face_restoration_weight,
381
  ):
382
- info_state = html_template_message("Navigating latent space...")
383
- yield info_state, gr.update(), gr.update()
384
 
385
  vae_model = vae_model if vae_model != "None" else None
386
- loras_list = [lora1, lora2, lora3, lora4, lora5, lora6, lora7]
387
  vae_msg = f"VAE: {vae_model}" if vae_model else ""
388
  msg_lora = ""
389
 
@@ -402,34 +643,35 @@ class GuiSD:
402
  (image_ip2, mask_ip2, model_ip2, mode_ip2, scale_ip2),
403
  ]
404
 
405
- if not hasattr(self.model.pipe, "transformer"):
406
- for imgip, mskip, modelip, modeip, scaleip in all_adapters:
407
- if imgip:
408
- params_ip_img.append(imgip)
409
- if mskip:
410
- params_ip_msk.append(mskip)
411
- params_ip_model.append(modelip)
412
- params_ip_mode.append(modeip)
413
- params_ip_scale.append(scaleip)
414
 
415
- concurrency = 5
416
- self.model.stream_config(concurrency=concurrency, latent_resize_by=1, vae_decoding=False)
417
 
418
  if task != "txt2img" and not image_control:
419
- raise ValueError("Reference image is required. Please upload one in 'Image ControlNet/Inpaint/Img2img'.")
420
 
421
- if task in ["inpaint", "repaint"] and not image_mask:
422
- raise ValueError("Mask image not found. Upload one in 'Image Mask' to proceed.")
423
 
424
- if "https://" not in str(UPSCALER_DICT_GUI[upscaler_model_path]):
425
  upscaler_model = upscaler_model_path
426
  else:
 
 
 
427
  url_upscaler = UPSCALER_DICT_GUI[upscaler_model_path]
428
 
429
- if not os.path.exists(f"./{DIRECTORY_UPSCALERS}/{url_upscaler.split('/')[-1]}"):
430
- download_things(DIRECTORY_UPSCALERS, url_upscaler, HF_TOKEN)
431
 
432
- upscaler_model = f"./{DIRECTORY_UPSCALERS}/{url_upscaler.split('/')[-1]}"
433
 
434
  logging.getLogger("ultralytics").setLevel(logging.INFO if adetailer_verbose else logging.ERROR)
435
 
@@ -483,8 +725,6 @@ class GuiSD:
483
  "high_threshold": high_threshold,
484
  "value_threshold": value_threshold,
485
  "distance_threshold": distance_threshold,
486
- "recolor_gamma_correction": float(recolor_gamma_correction),
487
- "tile_blur_sigma": int(tile_blur_sigma),
488
  "lora_A": lora1 if lora1 != "None" else None,
489
  "lora_scale_A": lora_scale1,
490
  "lora_B": lora2 if lora2 != "None" else None,
@@ -495,15 +735,9 @@ class GuiSD:
495
  "lora_scale_D": lora_scale4,
496
  "lora_E": lora5 if lora5 != "None" else None,
497
  "lora_scale_E": lora_scale5,
498
- "lora_F": lora6 if lora6 != "None" else None,
499
- "lora_scale_F": lora_scale6,
500
- "lora_G": lora7 if lora7 != "None" else None,
501
- "lora_scale_G": lora_scale7,
502
- "textual_inversion": embed_list if textual_inversion else [],
503
  "syntax_weights": syntax_weights, # "Classic"
504
  "sampler": sampler,
505
- "schedule_type": schedule_type,
506
- "schedule_prediction_type": schedule_prediction_type,
507
  "xformers_memory_efficient_attention": xformers_memory_efficient_attention,
508
  "gui_active": True,
509
  "loop_generation": loop_generation,
@@ -521,7 +755,6 @@ class GuiSD:
521
  "image_previews": image_previews,
522
  "display_images": display_images,
523
  "save_generated_images": save_generated_images,
524
- "filename_pattern": filename_pattern,
525
  "image_storage_location": image_storage_location,
526
  "retain_compel_previous_load": retain_compel_previous_load,
527
  "retain_detailfix_model_previous_load": retain_detailfix_model_previous_load,
@@ -531,8 +764,8 @@ class GuiSD:
531
  "t2i_adapter_conditioning_factor": float(t2i_adapter_conditioning_factor),
532
  "upscaler_model_path": upscaler_model,
533
  "upscaler_increases_size": upscaler_increases_size,
534
- "upscaler_tile_size": upscaler_tile_size,
535
- "upscaler_tile_overlap": upscaler_tile_overlap,
536
  "hires_steps": hires_steps,
537
  "hires_denoising_strength": hires_denoising_strength,
538
  "hires_prompt": hires_prompt,
@@ -540,41 +773,25 @@ class GuiSD:
540
  "hires_sampler": hires_sampler,
541
  "hires_before_adetailer": hires_before_adetailer,
542
  "hires_after_adetailer": hires_after_adetailer,
543
- "hires_schedule_type": hires_schedule_type,
544
- "hires_guidance_scale": hires_guidance_scale,
545
  "ip_adapter_image": params_ip_img,
546
  "ip_adapter_mask": params_ip_msk,
547
  "ip_adapter_model": params_ip_model,
548
  "ip_adapter_mode": params_ip_mode,
549
  "ip_adapter_scale": params_ip_scale,
550
- "face_restoration_model": face_restoration_model,
551
- "face_restoration_visibility": face_restoration_visibility,
552
- "face_restoration_weight": face_restoration_weight,
553
  }
554
 
555
- # kwargs for diffusers pipeline
556
- if guidance_rescale:
557
- pipe_params["guidance_rescale"] = guidance_rescale
558
-
559
  self.model.device = torch.device("cuda:0")
560
- if hasattr(self.model.pipe, "transformer") and loras_list != ["None"] * self.model.num_loras:
561
  self.model.pipe.transformer.to(self.model.device)
562
  print("transformer to cuda")
563
 
564
- actual_progress = 0
565
- info_images = gr.update()
566
- for img, [seed, image_path, metadata] in self.model(**pipe_params):
567
- info_state = progress_step_bar(actual_progress, steps)
568
- actual_progress += concurrency
569
  if image_path:
570
- info_images = f"Seeds: {str(seed)}"
571
  if vae_msg:
572
- info_images = info_images + "<br>" + vae_msg
573
-
574
- if "Cannot copy out of meta tensor; no data!" in self.model.last_lora_error:
575
- msg_ram = "Unable to process the LoRAs due to high RAM usage; please try again later."
576
- print(msg_ram)
577
- msg_lora += f"<br>{msg_ram}"
578
 
579
  for status, lora in zip(self.model.lora_status, self.model.lora_memory):
580
  if status:
@@ -583,9 +800,9 @@ class GuiSD:
583
  msg_lora += f"<br>Error with: {lora}"
584
 
585
  if msg_lora:
586
- info_images += msg_lora
587
 
588
- info_images = info_images + "<br>" + "GENERATION DATA:<br>" + escape_html(metadata[-1]) + "<br>-------<br>"
589
 
590
  download_links = "<br>".join(
591
  [
@@ -594,16 +811,22 @@ class GuiSD:
594
  ]
595
  )
596
  if save_generated_images:
597
- info_images += f"<br>{download_links}"
 
 
598
 
599
- info_state = "COMPLETE"
600
 
601
- yield info_state, img, info_images
 
 
 
 
 
 
602
 
603
 
604
  def dynamic_gpu_duration(func, duration, *args):
605
 
606
- # @torch.inference_mode()
607
  @spaces.GPU(duration=duration)
608
  def wrapped_func():
609
  yield from func(*args)
@@ -617,44 +840,35 @@ def dummy_gpu():
617
 
618
 
619
  def sd_gen_generate_pipeline(*args):
 
620
  gpu_duration_arg = int(args[-1]) if args[-1] else 59
621
  verbose_arg = int(args[-2])
622
  load_lora_cpu = args[-3]
623
  generation_args = args[:-3]
624
  lora_list = [
625
  None if item == "None" else item
626
- for item in [args[7], args[9], args[11], args[13], args[15], args[17], args[19]]
627
  ]
628
- lora_status = [None] * sd_gen.model.num_loras
629
 
630
  msg_load_lora = "Updating LoRAs in GPU..."
631
  if load_lora_cpu:
632
- msg_load_lora = "Updating LoRAs in CPU..."
633
 
634
- if lora_list != sd_gen.model.lora_memory and lora_list != [None] * sd_gen.model.num_loras:
635
- yield msg_load_lora, gr.update(), gr.update()
636
 
637
  # Load lora in CPU
638
  if load_lora_cpu:
639
- lora_status = sd_gen.model.load_lora_on_the_fly(
640
  lora_A=lora_list[0], lora_scale_A=args[8],
641
  lora_B=lora_list[1], lora_scale_B=args[10],
642
  lora_C=lora_list[2], lora_scale_C=args[12],
643
  lora_D=lora_list[3], lora_scale_D=args[14],
644
  lora_E=lora_list[4], lora_scale_E=args[16],
645
- lora_F=lora_list[5], lora_scale_F=args[18],
646
- lora_G=lora_list[6], lora_scale_G=args[20],
647
  )
648
  print(lora_status)
649
 
650
- sampler_name = args[21]
651
- schedule_type_name = args[22]
652
- _, _, msg_sampler = check_scheduler_compatibility(
653
- sd_gen.model.class_name, sampler_name, schedule_type_name
654
- )
655
- if msg_sampler:
656
- gr.Warning(msg_sampler)
657
-
658
  if verbose_arg:
659
  for status, lora in zip(lora_status, lora_list):
660
  if status:
@@ -662,21 +876,20 @@ def sd_gen_generate_pipeline(*args):
662
  elif status is not None:
663
  gr.Warning(f"Failed to load LoRA: {lora}")
664
 
665
- if lora_status == [None] * sd_gen.model.num_loras and sd_gen.model.lora_memory != [None] * sd_gen.model.num_loras and load_lora_cpu:
666
  lora_cache_msg = ", ".join(
667
  str(x) for x in sd_gen.model.lora_memory if x is not None
668
  )
669
  gr.Info(f"LoRAs in cache: {lora_cache_msg}")
670
 
671
- msg_request = f"Requesting {gpu_duration_arg}s. of GPU time.\nModel: {sd_gen.model.base_model_id}"
672
- if verbose_arg:
673
  gr.Info(msg_request)
674
  print(msg_request)
675
- yield msg_request.replace("\n", "<br>"), gr.update(), gr.update()
 
676
 
677
  start_time = time.time()
678
 
679
- # yield from sd_gen.generate_pipeline(*generation_args)
680
  yield from dynamic_gpu_duration(
681
  sd_gen.generate_pipeline,
682
  gpu_duration_arg,
@@ -684,46 +897,55 @@ def sd_gen_generate_pipeline(*args):
684
  )
685
 
686
  end_time = time.time()
687
- execution_time = end_time - start_time
688
- msg_task_complete = (
689
- f"GPU task complete in: {int(round(execution_time, 0) + 1)} seconds"
690
- )
691
 
692
  if verbose_arg:
 
 
 
 
693
  gr.Info(msg_task_complete)
694
  print(msg_task_complete)
695
 
696
- yield msg_task_complete, gr.update(), gr.update()
697
 
 
 
698
 
699
- @spaces.GPU(duration=15)
700
- def process_upscale(image, upscaler_name, upscaler_size):
701
- if image is None: return None
702
 
703
- from stablepy.diffusers_vanilla.utils import save_pil_image_with_metadata
704
- from stablepy import load_upscaler_model
 
 
 
 
 
 
705
 
706
- image = image.convert("RGB")
707
- exif_image = extract_exif_data(image)
708
 
709
- name_upscaler = UPSCALER_DICT_GUI[upscaler_name]
 
 
710
 
711
- if "https://" in str(name_upscaler):
 
712
 
713
- if not os.path.exists(f"./{DIRECTORY_UPSCALERS}/{name_upscaler.split('/')[-1]}"):
714
- download_things(DIRECTORY_UPSCALERS, name_upscaler, HF_TOKEN)
715
 
716
- name_upscaler = f"./{DIRECTORY_UPSCALERS}/{name_upscaler.split('/')[-1]}"
 
 
 
 
717
 
718
- scaler_beta = load_upscaler_model(model=name_upscaler, tile=0, tile_overlap=8, device="cuda", half=True)
719
- image_up = scaler_beta.upscale(image, upscaler_size, True)
720
 
721
  image_path = save_pil_image_with_metadata(image_up, f'{os.getcwd()}/up_images', exif_image)
722
 
723
  return image_path
724
 
725
 
726
- # https://huggingface.co/spaces/BestWishYsh/ConsisID-preview-Space/discussions/1#674969a022b99c122af5d407
727
  dynamic_gpu_duration.zerogpu = True
728
  sd_gen_generate_pipeline.zerogpu = True
729
  sd_gen = GuiSD()
@@ -736,18 +958,10 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
736
 
737
  with gr.Column(scale=2):
738
 
739
- def update_task_options(model_name, task_name):
740
- new_choices = MODEL_TYPE_TASK[get_model_type(model_name)]
741
-
742
- if task_name not in new_choices:
743
- task_name = "txt2img"
744
-
745
- return gr.update(value=task_name, choices=new_choices)
746
-
747
  task_gui = gr.Dropdown(label="Task", choices=SDXL_TASK, value=TASK_MODEL_LIST[0])
748
  model_name_gui = gr.Dropdown(label="Model", choices=model_list, value=model_list[0], allow_custom_value=True)
749
  prompt_gui = gr.Textbox(lines=5, placeholder="Enter prompt", label="Prompt")
750
- neg_prompt_gui = gr.Textbox(lines=3, placeholder="Enter Neg prompt", label="Negative prompt", value="lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, worst quality, low quality, very displeasing, (bad)")
751
  with gr.Row(equal_height=False):
752
  set_params_gui = gr.Button(value="↙️", variant="secondary", size="sm")
753
  clear_prompt_gui = gr.Button(value="🗑️", variant="secondary", size="sm")
@@ -760,7 +974,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
760
  [task_gui],
761
  )
762
 
763
- load_model_gui = gr.HTML(elem_id="load_model", elem_classes="contain")
764
 
765
  result_images = gr.Gallery(
766
  label="Generated images",
@@ -781,13 +995,12 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
781
  gpu_duration_gui = gr.Number(minimum=5, maximum=240, value=59, show_label=False, container=False, info="GPU time duration (seconds)")
782
  with gr.Column():
783
  verbose_info_gui = gr.Checkbox(value=False, container=False, label="Status info")
784
- load_lora_cpu_gui = gr.Checkbox(value=False, container=False, label="Load LoRAs on CPU")
785
 
786
  with gr.Column(scale=1):
787
- steps_gui = gr.Slider(minimum=1, maximum=100, step=1, value=28, label="Steps")
788
  cfg_gui = gr.Slider(minimum=0, maximum=30, step=0.5, value=7., label="CFG")
789
- sampler_gui = gr.Dropdown(label="Sampler", choices=scheduler_names, value="Euler")
790
- schedule_type_gui = gr.Dropdown(label="Schedule type", choices=SCHEDULE_TYPE_OPTIONS, value=SCHEDULE_TYPE_OPTIONS[0])
791
  img_width_gui = gr.Slider(minimum=64, maximum=4096, step=8, value=1024, label="Img Width")
792
  img_height_gui = gr.Slider(minimum=64, maximum=4096, step=8, value=1024, label="Img Height")
793
  seed_gui = gr.Number(minimum=-1, maximum=9999999999, value=-1, label="Seed")
@@ -806,26 +1019,14 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
806
  "width": gr.update(value=1024),
807
  "height": gr.update(value=1024),
808
  "Seed": gr.update(value=-1),
809
- "Sampler": gr.update(value="Euler"),
810
- "CFG scale": gr.update(value=7.), # cfg
811
- "Clip skip": gr.update(value=True),
812
  "Model": gr.update(value=name_model),
813
- "Schedule type": gr.update(value="Automatic"),
814
- "PAG": gr.update(value=.0),
815
- "FreeU": gr.update(value=False),
816
  }
817
  valid_keys = list(valid_receptors.keys())
818
 
819
  parameters = extract_parameters(base_prompt)
820
- # print(parameters)
821
-
822
- if "Sampler" in parameters:
823
- value_sampler = parameters["Sampler"]
824
- for s_type in SCHEDULE_TYPE_OPTIONS:
825
- if s_type in value_sampler:
826
- value_sampler = value_sampler.replace(s_type, "").strip()
827
- parameters["Sampler"] = value_sampler
828
- parameters["Schedule type"] = s_type
829
 
830
  for key, val in parameters.items():
831
  # print(val)
@@ -834,10 +1035,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
834
  if key == "Sampler":
835
  if val not in scheduler_names:
836
  continue
837
- if key == "Schedule type":
838
- if val not in SCHEDULE_TYPE_OPTIONS:
839
- val = "Automatic"
840
- elif key == "Clip skip":
841
  if "," in str(val):
842
  val = val.replace(",", "")
843
  if int(val) >= 2:
@@ -850,9 +1048,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
850
  val = re.sub(r'\s+', ' ', re.sub(r',+', ',', val)).strip()
851
  if key in ["Steps", "width", "height", "Seed"]:
852
  val = int(val)
853
- if key == "FreeU":
854
- val = True
855
- if key in ["CFG scale", "PAG"]:
856
  val = float(val)
857
  if key == "Model":
858
  filtered_models = [m for m in model_list if val in m]
@@ -881,9 +1077,6 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
881
  cfg_gui,
882
  clip_skip_gui,
883
  model_name_gui,
884
- schedule_type_gui,
885
- pag_scale_gui,
886
- free_u_gui,
887
  ],
888
  )
889
 
@@ -900,31 +1093,36 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
900
  )
901
 
902
  num_images_gui = gr.Slider(minimum=1, maximum=5, step=1, value=1, label="Images")
903
- prompt_syntax_gui = gr.Dropdown(label="Prompt Syntax", choices=PROMPT_W_OPTIONS, value=PROMPT_W_OPTIONS[1][1])
 
 
 
 
 
 
 
 
904
  vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list, value=vae_model_list[0])
905
 
906
  with gr.Accordion("Hires fix", open=False, visible=True):
907
 
908
  upscaler_model_path_gui = gr.Dropdown(label="Upscaler", choices=UPSCALER_KEYS, value=UPSCALER_KEYS[0])
909
  upscaler_increases_size_gui = gr.Slider(minimum=1.1, maximum=4., step=0.1, value=1.2, label="Upscale by")
910
- upscaler_tile_size_gui = gr.Slider(minimum=0, maximum=512, step=16, value=0, label="Upscaler Tile Size", info="0 = no tiling")
911
- upscaler_tile_overlap_gui = gr.Slider(minimum=0, maximum=48, step=1, value=8, label="Upscaler Tile Overlap")
912
  hires_steps_gui = gr.Slider(minimum=0, value=30, maximum=100, step=1, label="Hires Steps")
913
  hires_denoising_strength_gui = gr.Slider(minimum=0.1, maximum=1.0, step=0.01, value=0.55, label="Hires Denoising Strength")
914
  hires_sampler_gui = gr.Dropdown(label="Hires Sampler", choices=POST_PROCESSING_SAMPLER, value=POST_PROCESSING_SAMPLER[0])
915
- hires_schedule_list = ["Use same schedule type"] + SCHEDULE_TYPE_OPTIONS
916
- hires_schedule_type_gui = gr.Dropdown(label="Hires Schedule type", choices=hires_schedule_list, value=hires_schedule_list[0])
917
- hires_guidance_scale_gui = gr.Slider(minimum=-1., maximum=30., step=0.5, value=-1., label="Hires CFG", info="If the value is -1, the main CFG will be used")
918
  hires_prompt_gui = gr.Textbox(label="Hires Prompt", placeholder="Main prompt will be use", lines=3)
919
  hires_negative_prompt_gui = gr.Textbox(label="Hires Negative Prompt", placeholder="Main negative prompt will be use", lines=3)
920
 
921
  with gr.Accordion("LoRA", open=False, visible=True):
922
 
923
- def lora_dropdown(label, visible=True):
924
- return gr.Dropdown(label=label, choices=lora_model_list, value="None", allow_custom_value=True, visible=visible)
925
 
926
- def lora_scale_slider(label, visible=True):
927
- return gr.Slider(minimum=-2, maximum=2, step=0.01, value=0.33, label=label, visible=visible)
928
 
929
  lora1_gui = lora_dropdown("Lora1")
930
  lora_scale_1_gui = lora_scale_slider("Lora Scale 1")
@@ -936,37 +1134,21 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
936
  lora_scale_4_gui = lora_scale_slider("Lora Scale 4")
937
  lora5_gui = lora_dropdown("Lora5")
938
  lora_scale_5_gui = lora_scale_slider("Lora Scale 5")
939
- lora6_gui = lora_dropdown("Lora6", visible=False)
940
- lora_scale_6_gui = lora_scale_slider("Lora Scale 6", visible=False)
941
- lora7_gui = lora_dropdown("Lora7", visible=False)
942
- lora_scale_7_gui = lora_scale_slider("Lora Scale 7", visible=False)
943
 
944
  with gr.Accordion("From URL", open=False, visible=True):
945
- text_lora = gr.Textbox(
946
- label="LoRA's download URL",
947
- placeholder="https://civitai.com/api/download/models/28907",
948
- lines=1,
949
- info="It has to be .safetensors files, and you can also download them from Hugging Face.",
950
- )
951
- romanize_text = gr.Checkbox(value=False, label="Transliterate name", visible=False)
952
- button_lora = gr.Button("Get and Refresh the LoRA Lists")
953
- new_lora_status = gr.HTML()
954
  button_lora.click(
955
  get_my_lora,
956
- [text_lora, romanize_text],
957
- [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui, lora6_gui, lora7_gui, new_lora_status]
958
  )
959
 
960
- with gr.Accordion("Face restoration", open=False, visible=True):
961
-
962
- face_rest_options = [None] + FACE_RESTORATION_MODELS
963
-
964
- face_restoration_model_gui = gr.Dropdown(label="Face restoration model", choices=face_rest_options, value=face_rest_options[0])
965
- face_restoration_visibility_gui = gr.Slider(minimum=0., maximum=1., step=0.001, value=1., label="Visibility")
966
- face_restoration_weight_gui = gr.Slider(minimum=0., maximum=1., step=0.001, value=.5, label="Weight", info="(0 = maximum effect, 1 = minimum effect)")
967
-
968
  with gr.Accordion("IP-Adapter", open=False, visible=True):
969
 
 
 
 
970
  with gr.Accordion("IP-Adapter 1", open=False, visible=True):
971
  image_ip1 = gr.Image(label="IP Image", type="filepath")
972
  mask_ip1 = gr.Image(label="IP Mask", type="filepath")
@@ -985,38 +1167,32 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
985
  image_mask_gui = gr.Image(label="Image Mask", type="filepath")
986
  strength_gui = gr.Slider(
987
  minimum=0.01, maximum=1.0, step=0.01, value=0.55, label="Strength",
988
- info="This option adjusts the level of changes for img2img, repaint and inpaint."
989
  )
990
- image_resolution_gui = gr.Slider(
991
- minimum=64, maximum=2048, step=64, value=1024, label="Image Resolution",
992
- info="The maximum proportional size of the generated image based on the uploaded image."
993
- )
994
- controlnet_model_gui = gr.Dropdown(label="ControlNet model", choices=DIFFUSERS_CONTROLNET_MODEL, value=DIFFUSERS_CONTROLNET_MODEL[0], allow_custom_value=True)
995
- control_net_output_scaling_gui = gr.Slider(minimum=0, maximum=5.0, step=0.1, value=1, label="ControlNet Output Scaling in UNet")
996
- control_net_start_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=0, label="ControlNet Start Threshold (%)")
997
- control_net_stop_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=1, label="ControlNet Stop Threshold (%)")
998
- preprocessor_name_gui = gr.Dropdown(label="Preprocessor Name", choices=TASK_AND_PREPROCESSORS["canny"])
999
 
1000
  def change_preprocessor_choices(task):
1001
  task = TASK_STABLEPY[task]
1002
- if task in TASK_AND_PREPROCESSORS.keys():
1003
- choices_task = TASK_AND_PREPROCESSORS[task]
1004
  else:
1005
- choices_task = TASK_AND_PREPROCESSORS["canny"]
1006
  return gr.update(choices=choices_task, value=choices_task[0])
 
1007
  task_gui.change(
1008
  change_preprocessor_choices,
1009
  [task_gui],
1010
  [preprocessor_name_gui],
1011
  )
1012
-
1013
- preprocess_resolution_gui = gr.Slider(minimum=64, maximum=2048, step=64, value=512, label="Preprocessor Resolution")
1014
- low_threshold_gui = gr.Slider(minimum=1, maximum=255, step=1, value=100, label="'CANNY' low threshold")
1015
- high_threshold_gui = gr.Slider(minimum=1, maximum=255, step=1, value=200, label="'CANNY' high threshold")
1016
- value_threshold_gui = gr.Slider(minimum=1, maximum=2.0, step=0.01, value=0.1, label="'MLSD' Hough value threshold")
1017
- distance_threshold_gui = gr.Slider(minimum=1, maximum=20.0, step=0.01, value=0.1, label="'MLSD' Hough distance threshold")
1018
- recolor_gamma_correction_gui = gr.Number(minimum=0., maximum=25., value=1., step=0.001, label="'RECOLOR' gamma correction")
1019
- tile_blur_sigma_gui = gr.Number(minimum=0, maximum=100, value=9, step=1, label="'TILE' blur sigma")
1020
 
1021
  with gr.Accordion("T2I adapter", open=False, visible=False):
1022
  t2i_adapter_preprocessor_gui = gr.Checkbox(value=True, label="T2i Adapter Preprocessor")
@@ -1072,7 +1248,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1072
  negative_prompt_ad_a_gui = gr.Textbox(label="Negative prompt", placeholder="Main negative prompt will be use", lines=3)
1073
  strength_ad_a_gui = gr.Number(label="Strength:", value=0.35, step=0.01, minimum=0.01, maximum=1.0)
1074
  face_detector_ad_a_gui = gr.Checkbox(label="Face detector", value=True)
1075
- person_detector_ad_a_gui = gr.Checkbox(label="Person detector", value=False)
1076
  hand_detector_ad_a_gui = gr.Checkbox(label="Hand detector", value=False)
1077
  mask_dilation_a_gui = gr.Number(label="Mask dilation:", value=4, minimum=1)
1078
  mask_blur_a_gui = gr.Number(label="Mask blur:", value=4, minimum=1)
@@ -1084,7 +1260,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1084
  prompt_ad_b_gui = gr.Textbox(label="Main prompt", placeholder="Main prompt will be use", lines=3)
1085
  negative_prompt_ad_b_gui = gr.Textbox(label="Negative prompt", placeholder="Main negative prompt will be use", lines=3)
1086
  strength_ad_b_gui = gr.Number(label="Strength:", value=0.35, step=0.01, minimum=0.01, maximum=1.0)
1087
- face_detector_ad_b_gui = gr.Checkbox(label="Face detector", value=False)
1088
  person_detector_ad_b_gui = gr.Checkbox(label="Person detector", value=True)
1089
  hand_detector_ad_b_gui = gr.Checkbox(label="Hand detector", value=False)
1090
  mask_dilation_b_gui = gr.Number(label="Mask dilation:", value=4, minimum=1)
@@ -1092,10 +1268,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1092
  mask_padding_b_gui = gr.Number(label="Mask padding:", value=32, minimum=1)
1093
 
1094
  with gr.Accordion("Other settings", open=False, visible=True):
1095
- schedule_prediction_type_gui = gr.Dropdown(label="Discrete Sampling Type", choices=SCHEDULE_PREDICTION_TYPE_OPTIONS, value=SCHEDULE_PREDICTION_TYPE_OPTIONS[0])
1096
- guidance_rescale_gui = gr.Number(label="CFG rescale:", value=0., step=0.01, minimum=0., maximum=1.5)
1097
  save_generated_images_gui = gr.Checkbox(value=True, label="Create a download link for the images")
1098
- filename_pattern_gui = gr.Textbox(label="Filename pattern", value="model,seed", placeholder="model,seed,sampler,schedule_type,img_width,img_height,guidance_scale,num_steps,vae,prompt_section,neg_prompt_section", lines=1)
1099
  hires_before_adetailer_gui = gr.Checkbox(value=False, label="Hires Before Adetailer")
1100
  hires_after_adetailer_gui = gr.Checkbox(value=True, label="Hires After Adetailer")
1101
  generator_in_cpu_gui = gr.Checkbox(value=False, label="Generator in CPU")
@@ -1105,7 +1278,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1105
  retain_task_cache_gui = gr.Checkbox(value=False, label="Retain task model in cache")
1106
  leave_progress_bar_gui = gr.Checkbox(value=True, label="Leave Progress Bar")
1107
  disable_progress_bar_gui = gr.Checkbox(value=False, label="Disable Progress Bar")
1108
- display_images_gui = gr.Checkbox(value=False, label="Display Images")
1109
  image_previews_gui = gr.Checkbox(value=True, label="Image Previews")
1110
  image_storage_location_gui = gr.Textbox(value="./images", label="Image Storage Location")
1111
  retain_compel_previous_load_gui = gr.Checkbox(value=False, label="Retain Compel Previous Load")
@@ -1114,10 +1287,172 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1114
  xformers_memory_efficient_attention_gui = gr.Checkbox(value=False, label="Xformers Memory Efficient Attention")
1115
 
1116
  with gr.Accordion("Examples and help", open=False, visible=True):
1117
- gr.Markdown(HELP_GUI)
1118
- gr.Markdown(EXAMPLES_GUI_HELP)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1119
  gr.Examples(
1120
- examples=EXAMPLES_GUI,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1121
  fn=sd_gen.generate_pipeline,
1122
  inputs=[
1123
  prompt_gui,
@@ -1143,13 +1478,45 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1143
  gpu_duration_gui,
1144
  load_lora_cpu_gui,
1145
  ],
1146
- outputs=[load_model_gui, result_images, actual_task_info],
1147
  cache_examples=False,
1148
  )
1149
- gr.Markdown(RESOURCES)
 
 
 
 
 
1150
 
1151
  with gr.Tab("Inpaint mask maker", render=True):
1152
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1153
  with gr.Row():
1154
  with gr.Column(scale=2):
1155
  image_base = gr.ImageEditor(
@@ -1158,15 +1525,15 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1158
  # enable crop (or disable it)
1159
  # transforms=["crop"],
1160
  brush=gr.Brush(
1161
- default_size="16", # or leave it as 'auto'
1162
- color_mode="fixed", # 'fixed' hides the user swatches and colorpicker, 'defaults' shows it
1163
- # default_color="black", # html names are supported
1164
- colors=[
1165
- "rgba(0, 0, 0, 1)", # rgb(a)
1166
- "rgba(0, 0, 0, 0.1)",
1167
- "rgba(255, 255, 255, 0.1)",
1168
- # "hsl(360, 120, 120)" # in fact any valid colorstring
1169
- ]
1170
  ),
1171
  eraser=gr.Eraser(default_size="16")
1172
  )
@@ -1202,11 +1569,8 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1202
 
1203
  with gr.Row():
1204
  with gr.Column():
1205
-
1206
- USCALER_TAB_KEYS = [name for name in UPSCALER_KEYS[9:]]
1207
-
1208
  image_up_tab = gr.Image(label="Image", type="pil", sources=["upload"])
1209
- upscaler_tab = gr.Dropdown(label="Upscaler", choices=USCALER_TAB_KEYS, value=USCALER_TAB_KEYS[5])
1210
  upscaler_size_tab = gr.Slider(minimum=1., maximum=4., step=0.1, value=1.1, label="Upscale by")
1211
  generate_button_up_tab = gr.Button(value="START UPSCALE", variant="primary")
1212
 
@@ -1214,21 +1578,17 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1214
  result_up_tab = gr.Image(label="Result", type="pil", interactive=False, format="png")
1215
 
1216
  generate_button_up_tab.click(
1217
- fn=process_upscale,
1218
  inputs=[image_up_tab, upscaler_tab, upscaler_size_tab],
1219
  outputs=[result_up_tab],
1220
  )
1221
 
1222
- with gr.Tab("Preprocessor", render=True):
1223
- preprocessor_tab()
1224
-
1225
  generate_button.click(
1226
  fn=sd_gen.load_new_model,
1227
  inputs=[
1228
  model_name_gui,
1229
  vae_model_gui,
1230
- task_gui,
1231
- controlnet_model_gui,
1232
  ],
1233
  outputs=[load_model_gui],
1234
  queue=True,
@@ -1253,13 +1613,7 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1253
  lora_scale_4_gui,
1254
  lora5_gui,
1255
  lora_scale_5_gui,
1256
- lora6_gui,
1257
- lora_scale_6_gui,
1258
- lora7_gui,
1259
- lora_scale_7_gui,
1260
  sampler_gui,
1261
- schedule_type_gui,
1262
- schedule_prediction_type_gui,
1263
  img_height_gui,
1264
  img_width_gui,
1265
  model_name_gui,
@@ -1277,8 +1631,6 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1277
  high_threshold_gui,
1278
  value_threshold_gui,
1279
  distance_threshold_gui,
1280
- recolor_gamma_correction_gui,
1281
- tile_blur_sigma_gui,
1282
  control_net_output_scaling_gui,
1283
  control_net_start_threshold_gui,
1284
  control_net_stop_threshold_gui,
@@ -1286,8 +1638,8 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1286
  prompt_syntax_gui,
1287
  upscaler_model_path_gui,
1288
  upscaler_increases_size_gui,
1289
- upscaler_tile_size_gui,
1290
- upscaler_tile_overlap_gui,
1291
  hires_steps_gui,
1292
  hires_denoising_strength_gui,
1293
  hires_sampler_gui,
@@ -1295,16 +1647,12 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1295
  hires_negative_prompt_gui,
1296
  hires_before_adetailer_gui,
1297
  hires_after_adetailer_gui,
1298
- hires_schedule_type_gui,
1299
- hires_guidance_scale_gui,
1300
- controlnet_model_gui,
1301
  loop_generation_gui,
1302
  leave_progress_bar_gui,
1303
  disable_progress_bar_gui,
1304
  image_previews_gui,
1305
  display_images_gui,
1306
  save_generated_images_gui,
1307
- filename_pattern_gui,
1308
  image_storage_location_gui,
1309
  retain_compel_previous_load_gui,
1310
  retain_detailfix_model_previous_load_gui,
@@ -1339,7 +1687,6 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1339
  mask_blur_b_gui,
1340
  mask_padding_b_gui,
1341
  retain_task_cache_gui,
1342
- guidance_rescale_gui,
1343
  image_ip1,
1344
  mask_ip1,
1345
  model_ip1,
@@ -1351,14 +1698,11 @@ with gr.Blocks(theme="NoCrypt/miku", css=CSS) as app:
1351
  mode_ip2,
1352
  scale_ip2,
1353
  pag_scale_gui,
1354
- face_restoration_model_gui,
1355
- face_restoration_visibility_gui,
1356
- face_restoration_weight_gui,
1357
  load_lora_cpu_gui,
1358
  verbose_info_gui,
1359
  gpu_duration_gui,
1360
  ],
1361
- outputs=[load_model_gui, result_images, actual_task_info],
1362
  queue=True,
1363
  show_progress="minimal",
1364
  )
 
1
  import spaces
2
  import os
3
+ from stablepy import Model_Diffusers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  from stablepy.diffusers_vanilla.style_prompt_config import STYLE_NAMES
5
+ from stablepy.diffusers_vanilla.constants import FLUX_CN_UNION_MODES
6
  import torch
7
  import re
8
+ from huggingface_hub import HfApi
9
+ from stablepy import (
10
+ CONTROLNET_MODEL_IDS,
11
+ VALID_TASKS,
12
+ T2I_PREPROCESSOR_NAME,
13
+ FLASH_LORA,
14
+ SCHEDULER_CONFIG_MAP,
15
+ scheduler_names,
16
+ IP_ADAPTER_MODELS,
17
+ IP_ADAPTERS_SD,
18
+ IP_ADAPTERS_SDXL,
19
+ REPO_IMAGE_ENCODER,
20
+ ALL_PROMPT_WEIGHT_OPTIONS,
21
+ SD15_TASKS,
22
+ SDXL_TASKS,
23
+ )
24
  import time
25
  from PIL import ImageFile
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  # import urllib.parse
 
27
 
 
28
  ImageFile.LOAD_TRUNCATED_IMAGES = True
 
 
29
  print(os.getenv("SPACES_ZERO_GPU"))
30
 
31
+ # - **Download SD 1.5 Models**
32
+ download_model = "https://civitai.com/api/download/models/574369, https://huggingface.co/TechnoByte/MilkyWonderland/resolve/main/milkyWonderland_v40.safetensors"
33
+ # - **Download VAEs**
34
+ download_vae = "https://huggingface.co/nubby/blessed-sdxl-vae-fp16-fix/resolve/main/sdxl_vae-fp16fix-c-1.1-b-0.5.safetensors?download=true, https://huggingface.co/nubby/blessed-sdxl-vae-fp16-fix/resolve/main/sdxl_vae-fp16fix-blessed.safetensors?download=true, https://huggingface.co/digiplay/VAE/resolve/main/vividReal_v20.safetensors?download=true, https://huggingface.co/fp16-guy/anything_kl-f8-anime2_vae-ft-mse-840000-ema-pruned_blessed_clearvae_fp16_cleaned/resolve/main/vae-ft-mse-840000-ema-pruned_fp16.safetensors?download=true"
35
+ # - **Download LoRAs**
36
+ download_lora = "https://civitai.com/api/download/models/28907, https://huggingface.co/Leopain/color/resolve/main/Coloring_book_-_LineArt.safetensors, https://civitai.com/api/download/models/135867, https://civitai.com/api/download/models/145907, https://huggingface.co/Linaqruf/anime-detailer-xl-lora/resolve/main/anime-detailer-xl.safetensors?download=true, https://huggingface.co/Linaqruf/style-enhancer-xl-lora/resolve/main/style-enhancer-xl.safetensors?download=true, https://civitai.com/api/download/models/28609, https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-8steps-CFG-lora.safetensors?download=true, https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-8steps-CFG-lora.safetensors?download=true"
37
+ load_diffusers_format_model = [
38
+ 'stabilityai/stable-diffusion-xl-base-1.0',
39
+ 'black-forest-labs/FLUX.1-dev',
40
+ 'John6666/blue-pencil-flux1-v021-fp8-flux',
41
+ 'John6666/wai-ani-flux-v10forfp8-fp8-flux',
42
+ 'John6666/xe-anime-flux-v04-fp8-flux',
43
+ 'John6666/lyh-anime-flux-v2a1-fp8-flux',
44
+ 'John6666/carnival-unchained-v10-fp8-flux',
45
+ 'cagliostrolab/animagine-xl-3.1',
46
+ 'John6666/epicrealism-xl-v8kiss-sdxl',
47
+ 'misri/epicrealismXL_v7FinalDestination',
48
+ 'misri/juggernautXL_juggernautX',
49
+ 'misri/zavychromaxl_v80',
50
+ 'SG161222/RealVisXL_V4.0',
51
+ 'SG161222/RealVisXL_V5.0',
52
+ 'misri/newrealityxlAllInOne_Newreality40',
53
+ 'eienmojiki/Anything-XL',
54
+ 'eienmojiki/Starry-XL-v5.2',
55
+ 'gsdf/CounterfeitXL',
56
+ 'KBlueLeaf/Kohaku-XL-Zeta',
57
+ 'John6666/silvermoon-mix-01xl-v11-sdxl',
58
+ 'WhiteAiZ/autismmixSDXL_autismmixConfetti_diffusers',
59
+ 'kitty7779/ponyDiffusionV6XL',
60
+ 'GraydientPlatformAPI/aniverse-pony',
61
+ 'John6666/ras-real-anime-screencap-v1-sdxl',
62
+ 'John6666/duchaiten-pony-xl-no-score-v60-sdxl',
63
+ 'John6666/mistoon-anime-ponyalpha-sdxl',
64
+ 'John6666/3x3x3mixxl-v2-sdxl',
65
+ 'John6666/3x3x3mixxl-3dv01-sdxl',
66
+ 'John6666/ebara-mfcg-pony-mix-v12-sdxl',
67
+ 'John6666/t-ponynai3-v51-sdxl',
68
+ 'John6666/t-ponynai3-v65-sdxl',
69
+ 'John6666/prefect-pony-xl-v3-sdxl',
70
+ 'John6666/mala-anime-mix-nsfw-pony-xl-v5-sdxl',
71
+ 'John6666/wai-real-mix-v11-sdxl',
72
+ 'John6666/wai-c-v6-sdxl',
73
+ 'John6666/iniverse-mix-xl-sfwnsfw-pony-guofeng-v43-sdxl',
74
+ 'John6666/photo-realistic-pony-v5-sdxl',
75
+ 'John6666/pony-realism-v21main-sdxl',
76
+ 'John6666/pony-realism-v22main-sdxl',
77
+ 'John6666/cyberrealistic-pony-v63-sdxl',
78
+ 'John6666/cyberrealistic-pony-v64-sdxl',
79
+ 'GraydientPlatformAPI/realcartoon-pony-diffusion',
80
+ 'John6666/nova-anime-xl-pony-v5-sdxl',
81
+ 'John6666/autismmix-sdxl-autismmix-pony-sdxl',
82
+ 'John6666/aimz-dream-real-pony-mix-v3-sdxl',
83
+ 'John6666/duchaiten-pony-real-v11fix-sdxl',
84
+ 'John6666/duchaiten-pony-real-v20-sdxl',
85
+ 'yodayo-ai/kivotos-xl-2.0',
86
+ 'yodayo-ai/holodayo-xl-2.1',
87
+ 'yodayo-ai/clandestine-xl-1.0',
88
+ 'digiplay/majicMIX_sombre_v2',
89
+ 'digiplay/majicMIX_realistic_v6',
90
+ 'digiplay/majicMIX_realistic_v7',
91
+ 'digiplay/DreamShaper_8',
92
+ 'digiplay/BeautifulArt_v1',
93
+ 'digiplay/DarkSushi2.5D_v1',
94
+ 'digiplay/darkphoenix3D_v1.1',
95
+ 'digiplay/BeenYouLiteL11_diffusers',
96
+ 'Yntec/RevAnimatedV2Rebirth',
97
+ 'youknownothing/cyberrealistic_v50',
98
+ 'youknownothing/deliberate-v6',
99
+ 'GraydientPlatformAPI/deliberate-cyber3',
100
+ 'GraydientPlatformAPI/picx-real',
101
+ 'GraydientPlatformAPI/perfectworld6',
102
+ 'emilianJR/epiCRealism',
103
+ 'votepurchase/counterfeitV30_v30',
104
+ 'votepurchase/ChilloutMix',
105
+ 'Meina/MeinaMix_V11',
106
+ 'Meina/MeinaUnreal_V5',
107
+ 'Meina/MeinaPastel_V7',
108
+ 'GraydientPlatformAPI/realcartoon3d-17',
109
+ 'GraydientPlatformAPI/realcartoon-pixar11',
110
+ 'GraydientPlatformAPI/realcartoon-real17',
111
+ ]
112
+
113
+ DIFFUSERS_FORMAT_LORAS = [
114
+ "nerijs/animation2k-flux",
115
+ "XLabs-AI/flux-RealismLora",
116
+ ]
117
+
118
+ CIVITAI_API_KEY = os.environ.get("CIVITAI_API_KEY")
119
+ HF_TOKEN = os.environ.get("HF_READ_TOKEN")
120
+
121
+ PREPROCESSOR_CONTROLNET = {
122
+ "openpose": [
123
+ "Openpose",
124
+ "None",
125
+ ],
126
+ "scribble": [
127
+ "HED",
128
+ "PidiNet",
129
+ "None",
130
+ ],
131
+ "softedge": [
132
+ "PidiNet",
133
+ "HED",
134
+ "HED safe",
135
+ "PidiNet safe",
136
+ "None",
137
+ ],
138
+ "segmentation": [
139
+ "UPerNet",
140
+ "None",
141
+ ],
142
+ "depth": [
143
+ "DPT",
144
+ "Midas",
145
+ "None",
146
+ ],
147
+ "normalbae": [
148
+ "NormalBae",
149
+ "None",
150
+ ],
151
+ "lineart": [
152
+ "Lineart",
153
+ "Lineart coarse",
154
+ "Lineart (anime)",
155
+ "None",
156
+ "None (anime)",
157
+ ],
158
+ "lineart_anime": [
159
+ "Lineart",
160
+ "Lineart coarse",
161
+ "Lineart (anime)",
162
+ "None",
163
+ "None (anime)",
164
+ ],
165
+ "shuffle": [
166
+ "ContentShuffle",
167
+ "None",
168
+ ],
169
+ "canny": [
170
+ "Canny",
171
+ "None",
172
+ ],
173
+ "mlsd": [
174
+ "MLSD",
175
+ "None",
176
+ ],
177
+ "ip2p": [
178
+ "ip2p"
179
+ ],
180
+ "recolor": [
181
+ "Recolor luminance",
182
+ "Recolor intensity",
183
+ "None",
184
+ ],
185
+ "tile": [
186
+ "Mild Blur",
187
+ "Moderate Blur",
188
+ "Heavy Blur",
189
+ "None",
190
+ ],
191
+
192
+ }
193
+
194
+ TASK_STABLEPY = {
195
+ 'txt2img': 'txt2img',
196
+ 'img2img': 'img2img',
197
+ 'inpaint': 'inpaint',
198
+ # 'canny T2I Adapter': 'sdxl_canny_t2i', # NO HAVE STEP CALLBACK PARAMETERS SO NOT WORKS WITH DIFFUSERS 0.29.0
199
+ # 'sketch T2I Adapter': 'sdxl_sketch_t2i',
200
+ # 'lineart T2I Adapter': 'sdxl_lineart_t2i',
201
+ # 'depth-midas T2I Adapter': 'sdxl_depth-midas_t2i',
202
+ # 'openpose T2I Adapter': 'sdxl_openpose_t2i',
203
+ 'openpose ControlNet': 'openpose',
204
+ 'canny ControlNet': 'canny',
205
+ 'mlsd ControlNet': 'mlsd',
206
+ 'scribble ControlNet': 'scribble',
207
+ 'softedge ControlNet': 'softedge',
208
+ 'segmentation ControlNet': 'segmentation',
209
+ 'depth ControlNet': 'depth',
210
+ 'normalbae ControlNet': 'normalbae',
211
+ 'lineart ControlNet': 'lineart',
212
+ 'lineart_anime ControlNet': 'lineart_anime',
213
+ 'shuffle ControlNet': 'shuffle',
214
+ 'ip2p ControlNet': 'ip2p',
215
+ 'optical pattern ControlNet': 'pattern',
216
+ 'recolor ControlNet': 'recolor',
217
+ 'tile ControlNet': 'tile',
218
+ }
219
+
220
+ TASK_MODEL_LIST = list(TASK_STABLEPY.keys())
221
+
222
+ UPSCALER_DICT_GUI = {
223
+ None: None,
224
+ "Lanczos": "Lanczos",
225
+ "Nearest": "Nearest",
226
+ 'Latent': 'Latent',
227
+ 'Latent (antialiased)': 'Latent (antialiased)',
228
+ 'Latent (bicubic)': 'Latent (bicubic)',
229
+ 'Latent (bicubic antialiased)': 'Latent (bicubic antialiased)',
230
+ 'Latent (nearest)': 'Latent (nearest)',
231
+ 'Latent (nearest-exact)': 'Latent (nearest-exact)',
232
+ "RealESRGAN_x4plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth",
233
+ "RealESRNet_x4plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/RealESRNet_x4plus.pth",
234
+ "RealESRGAN_x4plus_anime_6B": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth",
235
+ "RealESRGAN_x2plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.1/RealESRGAN_x2plus.pth",
236
+ "realesr-animevideov3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-animevideov3.pth",
237
+ "realesr-general-x4v3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth",
238
+ "realesr-general-wdn-x4v3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-wdn-x4v3.pth",
239
+ "4x-UltraSharp": "https://huggingface.co/Shandypur/ESRGAN-4x-UltraSharp/resolve/main/4x-UltraSharp.pth",
240
+ "4x_foolhardy_Remacri": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri/resolve/main/4x_foolhardy_Remacri.pth",
241
+ "Remacri4xExtraSmoother": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/Remacri%204x%20ExtraSmoother.pth",
242
+ "AnimeSharp4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/AnimeSharp%204x.pth",
243
+ "lollypop": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/lollypop.pth",
244
+ "RealisticRescaler4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/RealisticRescaler%204x.pth",
245
+ "NickelbackFS4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/NickelbackFS%204x.pth"
246
+ }
247
+
248
+ UPSCALER_KEYS = list(UPSCALER_DICT_GUI.keys())
249
+
250
+
251
+ def download_things(directory, url, hf_token="", civitai_api_key=""):
252
+ url = url.strip()
253
+
254
+ if "drive.google.com" in url:
255
+ original_dir = os.getcwd()
256
+ os.chdir(directory)
257
+ os.system(f"gdown --fuzzy {url}")
258
+ os.chdir(original_dir)
259
+ elif "huggingface.co" in url:
260
+ url = url.replace("?download=true", "")
261
+ # url = urllib.parse.quote(url, safe=':/') # fix encoding
262
+ if "/blob/" in url:
263
+ url = url.replace("/blob/", "/resolve/")
264
+ user_header = f'"Authorization: Bearer {hf_token}"'
265
+ if hf_token:
266
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
267
+ else:
268
+ os.system(f"aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
269
+ elif "civitai.com" in url:
270
+ if "?" in url:
271
+ url = url.split("?")[0]
272
+ if civitai_api_key:
273
+ url = url + f"?token={civitai_api_key}"
274
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
275
+ else:
276
+ print("\033[91mYou need an API key to download Civitai models.\033[0m")
277
+ else:
278
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
279
+
280
+
281
+ def get_model_list(directory_path):
282
+ model_list = []
283
+ valid_extensions = {'.ckpt', '.pt', '.pth', '.safetensors', '.bin'}
284
+
285
+ for filename in os.listdir(directory_path):
286
+ if os.path.splitext(filename)[1] in valid_extensions:
287
+ # name_without_extension = os.path.splitext(filename)[0]
288
+ file_path = os.path.join(directory_path, filename)
289
+ # model_list.append((name_without_extension, file_path))
290
+ model_list.append(file_path)
291
+ print('\033[34mFILE: ' + file_path + '\033[0m')
292
+ return model_list
293
+
294
+
295
+ directory_models = 'models'
296
+ os.makedirs(directory_models, exist_ok=True)
297
+ directory_loras = 'loras'
298
+ os.makedirs(directory_loras, exist_ok=True)
299
+ directory_vaes = 'vaes'
300
+ os.makedirs(directory_vaes, exist_ok=True)
301
 
302
  # Download stuffs
303
+ for url in [url.strip() for url in download_model.split(',')]:
304
  if not os.path.exists(f"./models/{url.split('/')[-1]}"):
305
+ download_things(directory_models, url, HF_TOKEN, CIVITAI_API_KEY)
306
+ for url in [url.strip() for url in download_vae.split(',')]:
307
  if not os.path.exists(f"./vaes/{url.split('/')[-1]}"):
308
+ download_things(directory_vaes, url, HF_TOKEN, CIVITAI_API_KEY)
309
+ for url in [url.strip() for url in download_lora.split(',')]:
310
  if not os.path.exists(f"./loras/{url.split('/')[-1]}"):
311
+ download_things(directory_loras, url, HF_TOKEN, CIVITAI_API_KEY)
312
 
313
  # Download Embeddings
314
+ directory_embeds = 'embedings'
315
+ os.makedirs(directory_embeds, exist_ok=True)
316
+ download_embeds = [
317
+ 'https://huggingface.co/datasets/Nerfgun3/bad_prompt/blob/main/bad_prompt_version2.pt',
318
+ 'https://huggingface.co/embed/negative/resolve/main/EasyNegativeV2.safetensors',
319
+ 'https://huggingface.co/embed/negative/resolve/main/bad-hands-5.pt',
320
+ ]
321
+
322
+ for url_embed in download_embeds:
323
  if not os.path.exists(f"./embedings/{url_embed.split('/')[-1]}"):
324
+ download_things(directory_embeds, url_embed, HF_TOKEN, CIVITAI_API_KEY)
325
 
326
  # Build list models
327
+ embed_list = get_model_list(directory_embeds)
328
+ model_list = get_model_list(directory_models)
329
+ model_list = load_diffusers_format_model + model_list
330
+ lora_model_list = get_model_list(directory_loras)
 
 
 
331
  lora_model_list.insert(0, "None")
332
  lora_model_list = lora_model_list + DIFFUSERS_FORMAT_LORAS
333
+ vae_model_list = get_model_list(directory_vaes)
 
334
  vae_model_list.insert(0, "None")
335
 
336
  print('\033[33m🏁 Download and listing of valid models completed.\033[0m')
337
 
 
 
 
 
 
 
 
 
 
 
338
  #######################
339
  # GUI
340
  #######################
341
+ import gradio as gr
342
+ import logging
343
  logging.getLogger("diffusers").setLevel(logging.ERROR)
344
+ import diffusers
345
  diffusers.utils.logging.set_verbosity(40)
346
+ import warnings
347
  warnings.filterwarnings(action="ignore", category=FutureWarning, module="diffusers")
348
  warnings.filterwarnings(action="ignore", category=UserWarning, module="diffusers")
349
  warnings.filterwarnings(action="ignore", category=FutureWarning, module="transformers")
350
+ from stablepy import logger
351
+
352
  logger.setLevel(logging.DEBUG)
353
 
354
+ msg_inc_vae = (
355
+ "Use the right VAE for your model to maintain image quality. The wrong"
356
+ " VAE can lead to poor results, like blurriness in the generated images."
357
+ )
358
+
359
+ SDXL_TASK = [k for k, v in TASK_STABLEPY.items() if v in SDXL_TASKS]
360
+ SD_TASK = [k for k, v in TASK_STABLEPY.items() if v in SD15_TASKS]
361
+ FLUX_TASK = list(TASK_STABLEPY.keys())[:3] + [k for k, v in TASK_STABLEPY.items() if v in FLUX_CN_UNION_MODES.keys()]
362
+
363
+ MODEL_TYPE_TASK = {
364
+ "SD 1.5": SD_TASK,
365
+ "SDXL": SDXL_TASK,
366
+ "FLUX": FLUX_TASK,
367
+ }
368
+
369
+ MODEL_TYPE_CLASS = {
370
+ "diffusers:StableDiffusionPipeline": "SD 1.5",
371
+ "diffusers:StableDiffusionXLPipeline": "SDXL",
372
+ "diffusers:FluxPipeline": "FLUX",
373
+ }
374
+
375
+ POST_PROCESSING_SAMPLER = ["Use same sampler"] + scheduler_names[:-2]
376
+
377
  CSS = """
378
  .contain { display: flex; flex-direction: column; }
379
  #component-0 { height: 100%; }
380
  #gallery { flex-grow: 1; }
 
381
  """
382
 
383
+ SUBTITLE_GUI = (
384
+ "### This demo uses [diffusers](https://github.com/huggingface/diffusers)"
385
+ " to perform different tasks in image generation."
386
+ )
387
+
388
+
389
+ def extract_parameters(input_string):
390
+ parameters = {}
391
+ input_string = input_string.replace("\n", "")
392
+
393
+ if "Negative prompt:" not in input_string:
394
+ if "Steps:" in input_string:
395
+ input_string = input_string.replace("Steps:", "Negative prompt: Steps:")
396
+ else:
397
+ print("Invalid metadata")
398
+ parameters["prompt"] = input_string
399
+ return parameters
400
+
401
+ parm = input_string.split("Negative prompt:")
402
+ parameters["prompt"] = parm[0].strip()
403
+ if "Steps:" not in parm[1]:
404
+ print("Steps not detected")
405
+ parameters["neg_prompt"] = parm[1].strip()
406
+ return parameters
407
+ parm = parm[1].split("Steps:")
408
+ parameters["neg_prompt"] = parm[0].strip()
409
+ input_string = "Steps:" + parm[1]
410
+
411
+ # Extracting Steps
412
+ steps_match = re.search(r'Steps: (\d+)', input_string)
413
+ if steps_match:
414
+ parameters['Steps'] = int(steps_match.group(1))
415
+
416
+ # Extracting Size
417
+ size_match = re.search(r'Size: (\d+x\d+)', input_string)
418
+ if size_match:
419
+ parameters['Size'] = size_match.group(1)
420
+ width, height = map(int, parameters['Size'].split('x'))
421
+ parameters['width'] = width
422
+ parameters['height'] = height
423
+
424
+ # Extracting other parameters
425
+ other_parameters = re.findall(r'(\w+): (.*?)(?=, \w+|$)', input_string)
426
+ for param in other_parameters:
427
+ parameters[param[0]] = param[1].strip('"')
428
+
429
+ return parameters
430
+
431
+
432
+ def get_my_lora(link_url):
433
+ for url in [url.strip() for url in link_url.split(',')]:
434
+ if not os.path.exists(f"./loras/{url.split('/')[-1]}"):
435
+ download_things(directory_loras, url, HF_TOKEN, CIVITAI_API_KEY)
436
+ new_lora_model_list = get_model_list(directory_loras)
437
+ new_lora_model_list.insert(0, "None")
438
+ new_lora_model_list = new_lora_model_list + DIFFUSERS_FORMAT_LORAS
439
+
440
+ return gr.update(
441
+ choices=new_lora_model_list
442
+ ), gr.update(
443
+ choices=new_lora_model_list
444
+ ), gr.update(
445
+ choices=new_lora_model_list
446
+ ), gr.update(
447
+ choices=new_lora_model_list
448
+ ), gr.update(
449
+ choices=new_lora_model_list
450
+ ),
451
+
452
+
453
+ def info_html(json_data, title, subtitle):
454
+ return f"""
455
+ <div style='padding: 0; border-radius: 10px;'>
456
+ <p style='margin: 0; font-weight: bold;'>{title}</p>
457
+ <details>
458
+ <summary>Details</summary>
459
+ <p style='margin: 0; font-weight: bold;'>{subtitle}</p>
460
+ </details>
461
+ </div>
462
+ """
463
+
464
+
465
+ def get_model_type(repo_id: str):
466
+ api = HfApi(token=os.environ.get("HF_TOKEN")) # if use private or gated model
467
+ default = "SD 1.5"
468
+ try:
469
+ model = api.model_info(repo_id=repo_id, timeout=5.0)
470
+ tags = model.tags
471
+ for tag in tags:
472
+ if tag in MODEL_TYPE_CLASS.keys(): return MODEL_TYPE_CLASS.get(tag, default)
473
+ except Exception:
474
+ return default
475
+ return default
476
+
477
 
478
  class GuiSD:
479
  def __init__(self, stream=True):
480
  self.model = None
 
 
 
 
481
 
482
+ print("Loading model...")
483
+ self.model = Model_Diffusers(
484
+ base_model_id="Lykon/dreamshaper-8",
485
+ task_name="txt2img",
486
+ vae_model=None,
487
+ type_model_precision=torch.float16,
488
+ retain_task_model_in_cache=False,
489
+ device="cpu",
490
+ )
491
+ self.model.load_beta_styles()
 
 
 
 
 
492
 
493
+ def load_new_model(self, model_name, vae_model, task, progress=gr.Progress(track_tqdm=True)):
494
 
495
+ yield f"Loading model: {model_name}"
496
 
497
  vae_model = vae_model if vae_model != "None" else None
498
  model_type = get_model_type(model_name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
499
 
500
+ if vae_model:
 
 
 
 
501
  vae_type = "SDXL" if "sdxl" in vae_model.lower() else "SD 1.5"
502
  if model_type != vae_type:
503
+ gr.Warning(msg_inc_vae)
 
 
504
 
505
+ self.model.device = torch.device("cpu")
506
+ dtype_model = torch.bfloat16 if model_type == "FLUX" else torch.float16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
 
508
+ self.model.load_pipe(
509
+ model_name,
510
+ task_name=TASK_STABLEPY[task],
511
+ vae_model=vae_model,
512
+ type_model_precision=dtype_model,
513
+ retain_task_model_in_cache=False,
514
+ )
515
 
516
  yield f"Model loaded: {model_name}"
517
 
 
536
  lora_scale4,
537
  lora5,
538
  lora_scale5,
 
 
 
 
539
  sampler,
 
 
540
  img_height,
541
  img_width,
542
  model_name,
 
554
  high_threshold,
555
  value_threshold,
556
  distance_threshold,
 
 
557
  controlnet_output_scaling_in_unet,
558
  controlnet_start_threshold,
559
  controlnet_stop_threshold,
 
561
  syntax_weights,
562
  upscaler_model_path,
563
  upscaler_increases_size,
564
+ esrgan_tile,
565
+ esrgan_tile_overlap,
566
  hires_steps,
567
  hires_denoising_strength,
568
  hires_sampler,
 
570
  hires_negative_prompt,
571
  hires_before_adetailer,
572
  hires_after_adetailer,
 
 
 
573
  loop_generation,
574
  leave_progress_bar,
575
  disable_progress_bar,
576
  image_previews,
577
  display_images,
578
  save_generated_images,
 
579
  image_storage_location,
580
  retain_compel_previous_load,
581
  retain_detailfix_model_previous_load,
 
610
  mask_blur_b,
611
  mask_padding_b,
612
  retain_task_cache_gui,
 
613
  image_ip1,
614
  mask_ip1,
615
  model_ip1,
 
621
  mode_ip2,
622
  scale_ip2,
623
  pag_scale,
 
 
 
624
  ):
 
 
625
 
626
  vae_model = vae_model if vae_model != "None" else None
627
+ loras_list = [lora1, lora2, lora3, lora4, lora5]
628
  vae_msg = f"VAE: {vae_model}" if vae_model else ""
629
  msg_lora = ""
630
 
 
643
  (image_ip2, mask_ip2, model_ip2, mode_ip2, scale_ip2),
644
  ]
645
 
646
+ for imgip, mskip, modelip, modeip, scaleip in all_adapters:
647
+ if imgip:
648
+ params_ip_img.append(imgip)
649
+ if mskip:
650
+ params_ip_msk.append(mskip)
651
+ params_ip_model.append(modelip)
652
+ params_ip_mode.append(modeip)
653
+ params_ip_scale.append(scaleip)
 
654
 
655
+ self.model.stream_config(concurrency=5, latent_resize_by=1, vae_decoding=False)
 
656
 
657
  if task != "txt2img" and not image_control:
658
+ raise ValueError("No control image found: To use this function, you have to upload an image in 'Image ControlNet/Inpaint/Img2img'")
659
 
660
+ if task == "inpaint" and not image_mask:
661
+ raise ValueError("No mask image found: Specify one in 'Image Mask'")
662
 
663
+ if upscaler_model_path in UPSCALER_KEYS[:9]:
664
  upscaler_model = upscaler_model_path
665
  else:
666
+ directory_upscalers = 'upscalers'
667
+ os.makedirs(directory_upscalers, exist_ok=True)
668
+
669
  url_upscaler = UPSCALER_DICT_GUI[upscaler_model_path]
670
 
671
+ if not os.path.exists(f"./upscalers/{url_upscaler.split('/')[-1]}"):
672
+ download_things(directory_upscalers, url_upscaler, HF_TOKEN)
673
 
674
+ upscaler_model = f"./upscalers/{url_upscaler.split('/')[-1]}"
675
 
676
  logging.getLogger("ultralytics").setLevel(logging.INFO if adetailer_verbose else logging.ERROR)
677
 
 
725
  "high_threshold": high_threshold,
726
  "value_threshold": value_threshold,
727
  "distance_threshold": distance_threshold,
 
 
728
  "lora_A": lora1 if lora1 != "None" else None,
729
  "lora_scale_A": lora_scale1,
730
  "lora_B": lora2 if lora2 != "None" else None,
 
735
  "lora_scale_D": lora_scale4,
736
  "lora_E": lora5 if lora5 != "None" else None,
737
  "lora_scale_E": lora_scale5,
738
+ "textual_inversion": embed_list if textual_inversion and self.model.class_name != "StableDiffusionXLPipeline" else [],
 
 
 
 
739
  "syntax_weights": syntax_weights, # "Classic"
740
  "sampler": sampler,
 
 
741
  "xformers_memory_efficient_attention": xformers_memory_efficient_attention,
742
  "gui_active": True,
743
  "loop_generation": loop_generation,
 
755
  "image_previews": image_previews,
756
  "display_images": display_images,
757
  "save_generated_images": save_generated_images,
 
758
  "image_storage_location": image_storage_location,
759
  "retain_compel_previous_load": retain_compel_previous_load,
760
  "retain_detailfix_model_previous_load": retain_detailfix_model_previous_load,
 
764
  "t2i_adapter_conditioning_factor": float(t2i_adapter_conditioning_factor),
765
  "upscaler_model_path": upscaler_model,
766
  "upscaler_increases_size": upscaler_increases_size,
767
+ "esrgan_tile": esrgan_tile,
768
+ "esrgan_tile_overlap": esrgan_tile_overlap,
769
  "hires_steps": hires_steps,
770
  "hires_denoising_strength": hires_denoising_strength,
771
  "hires_prompt": hires_prompt,
 
773
  "hires_sampler": hires_sampler,
774
  "hires_before_adetailer": hires_before_adetailer,
775
  "hires_after_adetailer": hires_after_adetailer,
 
 
776
  "ip_adapter_image": params_ip_img,
777
  "ip_adapter_mask": params_ip_msk,
778
  "ip_adapter_model": params_ip_model,
779
  "ip_adapter_mode": params_ip_mode,
780
  "ip_adapter_scale": params_ip_scale,
 
 
 
781
  }
782
 
 
 
 
 
783
  self.model.device = torch.device("cuda:0")
784
+ if hasattr(self.model.pipe, "transformer") and loras_list != ["None"] * 5:
785
  self.model.pipe.transformer.to(self.model.device)
786
  print("transformer to cuda")
787
 
788
+ info_state = "PROCESSING "
789
+ for img, seed, image_path, metadata in self.model(**pipe_params):
790
+ info_state += ">"
 
 
791
  if image_path:
792
+ info_state = f"COMPLETE. Seeds: {str(seed)}"
793
  if vae_msg:
794
+ info_state = info_state + "<br>" + vae_msg
 
 
 
 
 
795
 
796
  for status, lora in zip(self.model.lora_status, self.model.lora_memory):
797
  if status:
 
800
  msg_lora += f"<br>Error with: {lora}"
801
 
802
  if msg_lora:
803
+ info_state += msg_lora
804
 
805
+ info_state = info_state + "<br>" + "GENERATION DATA:<br>" + metadata[0].replace("\n", "<br>") + "<br>-------<br>"
806
 
807
  download_links = "<br>".join(
808
  [
 
811
  ]
812
  )
813
  if save_generated_images:
814
+ info_state += f"<br>{download_links}"
815
+
816
+ yield img, info_state
817
 
 
818
 
819
+ def update_task_options(model_name, task_name):
820
+ new_choices = MODEL_TYPE_TASK[get_model_type(model_name)]
821
+
822
+ if task_name not in new_choices:
823
+ task_name = "txt2img"
824
+
825
+ return gr.update(value=task_name, choices=new_choices)
826
 
827
 
828
  def dynamic_gpu_duration(func, duration, *args):
829
 
 
830
  @spaces.GPU(duration=duration)
831
  def wrapped_func():
832
  yield from func(*args)
 
840
 
841
 
842
  def sd_gen_generate_pipeline(*args):
843
+
844
  gpu_duration_arg = int(args[-1]) if args[-1] else 59
845
  verbose_arg = int(args[-2])
846
  load_lora_cpu = args[-3]
847
  generation_args = args[:-3]
848
  lora_list = [
849
  None if item == "None" else item
850
+ for item in [args[7], args[9], args[11], args[13], args[15]]
851
  ]
852
+ lora_status = [None] * 5
853
 
854
  msg_load_lora = "Updating LoRAs in GPU..."
855
  if load_lora_cpu:
856
+ msg_load_lora = "Updating LoRAs in CPU (Slow but saves GPU usage)..."
857
 
858
+ if lora_list != sd_gen.model.lora_memory and lora_list != [None] * 5:
859
+ yield None, msg_load_lora
860
 
861
  # Load lora in CPU
862
  if load_lora_cpu:
863
+ lora_status = sd_gen.model.lora_merge(
864
  lora_A=lora_list[0], lora_scale_A=args[8],
865
  lora_B=lora_list[1], lora_scale_B=args[10],
866
  lora_C=lora_list[2], lora_scale_C=args[12],
867
  lora_D=lora_list[3], lora_scale_D=args[14],
868
  lora_E=lora_list[4], lora_scale_E=args[16],
 
 
869
  )
870
  print(lora_status)
871
 
 
 
 
 
 
 
 
 
872
  if verbose_arg:
873
  for status, lora in zip(lora_status, lora_list):
874
  if status:
 
876
  elif status is not None:
877
  gr.Warning(f"Failed to load LoRA: {lora}")
878
 
879
+ if lora_status == [None] * 5 and sd_gen.model.lora_memory != [None] * 5 and load_lora_cpu:
880
  lora_cache_msg = ", ".join(
881
  str(x) for x in sd_gen.model.lora_memory if x is not None
882
  )
883
  gr.Info(f"LoRAs in cache: {lora_cache_msg}")
884
 
885
+ msg_request = f"Requesting {gpu_duration_arg}s. of GPU time"
 
886
  gr.Info(msg_request)
887
  print(msg_request)
888
+
889
+ # yield from sd_gen.generate_pipeline(*generation_args)
890
 
891
  start_time = time.time()
892
 
 
893
  yield from dynamic_gpu_duration(
894
  sd_gen.generate_pipeline,
895
  gpu_duration_arg,
 
897
  )
898
 
899
  end_time = time.time()
 
 
 
 
900
 
901
  if verbose_arg:
902
+ execution_time = end_time - start_time
903
+ msg_task_complete = (
904
+ f"GPU task complete in: {round(execution_time, 0) + 1} seconds"
905
+ )
906
  gr.Info(msg_task_complete)
907
  print(msg_task_complete)
908
 
 
909
 
910
+ def extract_exif_data(image):
911
+ if image is None: return ""
912
 
913
+ try:
914
+ metadata_keys = ['parameters', 'metadata', 'prompt', 'Comment']
 
915
 
916
+ for key in metadata_keys:
917
+ if key in image.info:
918
+ return image.info[key]
919
+
920
+ return str(image.info)
921
+
922
+ except Exception as e:
923
+ return f"Error extracting metadata: {str(e)}"
924
 
 
 
925
 
926
+ @spaces.GPU(duration=20)
927
+ def esrgan_upscale(image, upscaler_name, upscaler_size):
928
+ if image is None: return None
929
 
930
+ from stablepy.diffusers_vanilla.utils import save_pil_image_with_metadata
931
+ from stablepy import UpscalerESRGAN
932
 
933
+ exif_image = extract_exif_data(image)
 
934
 
935
+ url_upscaler = UPSCALER_DICT_GUI[upscaler_name]
936
+ directory_upscalers = 'upscalers'
937
+ os.makedirs(directory_upscalers, exist_ok=True)
938
+ if not os.path.exists(f"./upscalers/{url_upscaler.split('/')[-1]}"):
939
+ download_things(directory_upscalers, url_upscaler, HF_TOKEN)
940
 
941
+ scaler_beta = UpscalerESRGAN(0, 0)
942
+ image_up = scaler_beta.upscale(image, upscaler_size, f"./upscalers/{url_upscaler.split('/')[-1]}")
943
 
944
  image_path = save_pil_image_with_metadata(image_up, f'{os.getcwd()}/up_images', exif_image)
945
 
946
  return image_path
947
 
948
 
 
949
  dynamic_gpu_duration.zerogpu = True
950
  sd_gen_generate_pipeline.zerogpu = True
951
  sd_gen = GuiSD()
 
958
 
959
  with gr.Column(scale=2):
960
 
 
 
 
 
 
 
 
 
961
  task_gui = gr.Dropdown(label="Task", choices=SDXL_TASK, value=TASK_MODEL_LIST[0])
962
  model_name_gui = gr.Dropdown(label="Model", choices=model_list, value=model_list[0], allow_custom_value=True)
963
  prompt_gui = gr.Textbox(lines=5, placeholder="Enter prompt", label="Prompt")
964
+ neg_prompt_gui = gr.Textbox(lines=3, placeholder="Enter Neg prompt", label="Negative prompt")
965
  with gr.Row(equal_height=False):
966
  set_params_gui = gr.Button(value="↙️", variant="secondary", size="sm")
967
  clear_prompt_gui = gr.Button(value="🗑️", variant="secondary", size="sm")
 
974
  [task_gui],
975
  )
976
 
977
+ load_model_gui = gr.HTML()
978
 
979
  result_images = gr.Gallery(
980
  label="Generated images",
 
995
  gpu_duration_gui = gr.Number(minimum=5, maximum=240, value=59, show_label=False, container=False, info="GPU time duration (seconds)")
996
  with gr.Column():
997
  verbose_info_gui = gr.Checkbox(value=False, container=False, label="Status info")
998
+ load_lora_cpu_gui = gr.Checkbox(value=False, container=False, label="Load LoRAs on CPU (Save GPU time)")
999
 
1000
  with gr.Column(scale=1):
1001
+ steps_gui = gr.Slider(minimum=1, maximum=100, step=1, value=30, label="Steps")
1002
  cfg_gui = gr.Slider(minimum=0, maximum=30, step=0.5, value=7., label="CFG")
1003
+ sampler_gui = gr.Dropdown(label="Sampler", choices=scheduler_names, value="Euler a")
 
1004
  img_width_gui = gr.Slider(minimum=64, maximum=4096, step=8, value=1024, label="Img Width")
1005
  img_height_gui = gr.Slider(minimum=64, maximum=4096, step=8, value=1024, label="Img Height")
1006
  seed_gui = gr.Number(minimum=-1, maximum=9999999999, value=-1, label="Seed")
 
1019
  "width": gr.update(value=1024),
1020
  "height": gr.update(value=1024),
1021
  "Seed": gr.update(value=-1),
1022
+ "Sampler": gr.update(value="Euler a"),
1023
+ "scale": gr.update(value=7.), # cfg
1024
+ "skip": gr.update(value=True),
1025
  "Model": gr.update(value=name_model),
 
 
 
1026
  }
1027
  valid_keys = list(valid_receptors.keys())
1028
 
1029
  parameters = extract_parameters(base_prompt)
 
 
 
 
 
 
 
 
 
1030
 
1031
  for key, val in parameters.items():
1032
  # print(val)
 
1035
  if key == "Sampler":
1036
  if val not in scheduler_names:
1037
  continue
1038
+ elif key == "skip":
 
 
 
1039
  if "," in str(val):
1040
  val = val.replace(",", "")
1041
  if int(val) >= 2:
 
1048
  val = re.sub(r'\s+', ' ', re.sub(r',+', ',', val)).strip()
1049
  if key in ["Steps", "width", "height", "Seed"]:
1050
  val = int(val)
1051
+ if key == "scale":
 
 
1052
  val = float(val)
1053
  if key == "Model":
1054
  filtered_models = [m for m in model_list if val in m]
 
1077
  cfg_gui,
1078
  clip_skip_gui,
1079
  model_name_gui,
 
 
 
1080
  ],
1081
  )
1082
 
 
1093
  )
1094
 
1095
  num_images_gui = gr.Slider(minimum=1, maximum=5, step=1, value=1, label="Images")
1096
+ prompt_s_options = [
1097
+ ("Compel format: (word)weight", "Compel"),
1098
+ ("Classic format: (word:weight)", "Classic"),
1099
+ ("Classic-original format: (word:weight)", "Classic-original"),
1100
+ ("Classic-no_norm format: (word:weight)", "Classic-no_norm"),
1101
+ ("Classic-ignore", "Classic-ignore"),
1102
+ ("None", "None"),
1103
+ ]
1104
+ prompt_syntax_gui = gr.Dropdown(label="Prompt Syntax", choices=prompt_s_options, value=prompt_s_options[1][1])
1105
  vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list, value=vae_model_list[0])
1106
 
1107
  with gr.Accordion("Hires fix", open=False, visible=True):
1108
 
1109
  upscaler_model_path_gui = gr.Dropdown(label="Upscaler", choices=UPSCALER_KEYS, value=UPSCALER_KEYS[0])
1110
  upscaler_increases_size_gui = gr.Slider(minimum=1.1, maximum=4., step=0.1, value=1.2, label="Upscale by")
1111
+ esrgan_tile_gui = gr.Slider(minimum=0, value=0, maximum=500, step=1, label="ESRGAN Tile")
1112
+ esrgan_tile_overlap_gui = gr.Slider(minimum=1, maximum=200, step=1, value=8, label="ESRGAN Tile Overlap")
1113
  hires_steps_gui = gr.Slider(minimum=0, value=30, maximum=100, step=1, label="Hires Steps")
1114
  hires_denoising_strength_gui = gr.Slider(minimum=0.1, maximum=1.0, step=0.01, value=0.55, label="Hires Denoising Strength")
1115
  hires_sampler_gui = gr.Dropdown(label="Hires Sampler", choices=POST_PROCESSING_SAMPLER, value=POST_PROCESSING_SAMPLER[0])
 
 
 
1116
  hires_prompt_gui = gr.Textbox(label="Hires Prompt", placeholder="Main prompt will be use", lines=3)
1117
  hires_negative_prompt_gui = gr.Textbox(label="Hires Negative Prompt", placeholder="Main negative prompt will be use", lines=3)
1118
 
1119
  with gr.Accordion("LoRA", open=False, visible=True):
1120
 
1121
+ def lora_dropdown(label):
1122
+ return gr.Dropdown(label=label, choices=lora_model_list, value="None", allow_custom_value=True)
1123
 
1124
+ def lora_scale_slider(label):
1125
+ return gr.Slider(minimum=-2, maximum=2, step=0.01, value=0.33, label=label)
1126
 
1127
  lora1_gui = lora_dropdown("Lora1")
1128
  lora_scale_1_gui = lora_scale_slider("Lora Scale 1")
 
1134
  lora_scale_4_gui = lora_scale_slider("Lora Scale 4")
1135
  lora5_gui = lora_dropdown("Lora5")
1136
  lora_scale_5_gui = lora_scale_slider("Lora Scale 5")
 
 
 
 
1137
 
1138
  with gr.Accordion("From URL", open=False, visible=True):
1139
+ text_lora = gr.Textbox(label="LoRA URL", placeholder="https://civitai.com/api/download/models/28907", lines=1)
1140
+ button_lora = gr.Button("Get and update lists of LoRAs")
 
 
 
 
 
 
 
1141
  button_lora.click(
1142
  get_my_lora,
1143
+ [text_lora],
1144
+ [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
1145
  )
1146
 
 
 
 
 
 
 
 
 
1147
  with gr.Accordion("IP-Adapter", open=False, visible=True):
1148
 
1149
+ IP_MODELS = sorted(list(set(IP_ADAPTERS_SD + IP_ADAPTERS_SDXL)))
1150
+ MODE_IP_OPTIONS = ["original", "style", "layout", "style+layout"]
1151
+
1152
  with gr.Accordion("IP-Adapter 1", open=False, visible=True):
1153
  image_ip1 = gr.Image(label="IP Image", type="filepath")
1154
  mask_ip1 = gr.Image(label="IP Mask", type="filepath")
 
1167
  image_mask_gui = gr.Image(label="Image Mask", type="filepath")
1168
  strength_gui = gr.Slider(
1169
  minimum=0.01, maximum=1.0, step=0.01, value=0.55, label="Strength",
1170
+ info="This option adjusts the level of changes for img2img and inpainting."
1171
  )
1172
+ image_resolution_gui = gr.Slider(minimum=64, maximum=2048, step=64, value=1024, label="Image Resolution")
1173
+ preprocessor_name_gui = gr.Dropdown(label="Preprocessor Name", choices=PREPROCESSOR_CONTROLNET["canny"])
 
 
 
 
 
 
 
1174
 
1175
  def change_preprocessor_choices(task):
1176
  task = TASK_STABLEPY[task]
1177
+ if task in PREPROCESSOR_CONTROLNET.keys():
1178
+ choices_task = PREPROCESSOR_CONTROLNET[task]
1179
  else:
1180
+ choices_task = PREPROCESSOR_CONTROLNET["canny"]
1181
  return gr.update(choices=choices_task, value=choices_task[0])
1182
+
1183
  task_gui.change(
1184
  change_preprocessor_choices,
1185
  [task_gui],
1186
  [preprocessor_name_gui],
1187
  )
1188
+ preprocess_resolution_gui = gr.Slider(minimum=64, maximum=2048, step=64, value=512, label="Preprocess Resolution")
1189
+ low_threshold_gui = gr.Slider(minimum=1, maximum=255, step=1, value=100, label="Canny low threshold")
1190
+ high_threshold_gui = gr.Slider(minimum=1, maximum=255, step=1, value=200, label="Canny high threshold")
1191
+ value_threshold_gui = gr.Slider(minimum=1, maximum=2.0, step=0.01, value=0.1, label="Hough value threshold (MLSD)")
1192
+ distance_threshold_gui = gr.Slider(minimum=1, maximum=20.0, step=0.01, value=0.1, label="Hough distance threshold (MLSD)")
1193
+ control_net_output_scaling_gui = gr.Slider(minimum=0, maximum=5.0, step=0.1, value=1, label="ControlNet Output Scaling in UNet")
1194
+ control_net_start_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=0, label="ControlNet Start Threshold (%)")
1195
+ control_net_stop_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=1, label="ControlNet Stop Threshold (%)")
1196
 
1197
  with gr.Accordion("T2I adapter", open=False, visible=False):
1198
  t2i_adapter_preprocessor_gui = gr.Checkbox(value=True, label="T2i Adapter Preprocessor")
 
1248
  negative_prompt_ad_a_gui = gr.Textbox(label="Negative prompt", placeholder="Main negative prompt will be use", lines=3)
1249
  strength_ad_a_gui = gr.Number(label="Strength:", value=0.35, step=0.01, minimum=0.01, maximum=1.0)
1250
  face_detector_ad_a_gui = gr.Checkbox(label="Face detector", value=True)
1251
+ person_detector_ad_a_gui = gr.Checkbox(label="Person detector", value=True)
1252
  hand_detector_ad_a_gui = gr.Checkbox(label="Hand detector", value=False)
1253
  mask_dilation_a_gui = gr.Number(label="Mask dilation:", value=4, minimum=1)
1254
  mask_blur_a_gui = gr.Number(label="Mask blur:", value=4, minimum=1)
 
1260
  prompt_ad_b_gui = gr.Textbox(label="Main prompt", placeholder="Main prompt will be use", lines=3)
1261
  negative_prompt_ad_b_gui = gr.Textbox(label="Negative prompt", placeholder="Main negative prompt will be use", lines=3)
1262
  strength_ad_b_gui = gr.Number(label="Strength:", value=0.35, step=0.01, minimum=0.01, maximum=1.0)
1263
+ face_detector_ad_b_gui = gr.Checkbox(label="Face detector", value=True)
1264
  person_detector_ad_b_gui = gr.Checkbox(label="Person detector", value=True)
1265
  hand_detector_ad_b_gui = gr.Checkbox(label="Hand detector", value=False)
1266
  mask_dilation_b_gui = gr.Number(label="Mask dilation:", value=4, minimum=1)
 
1268
  mask_padding_b_gui = gr.Number(label="Mask padding:", value=32, minimum=1)
1269
 
1270
  with gr.Accordion("Other settings", open=False, visible=True):
 
 
1271
  save_generated_images_gui = gr.Checkbox(value=True, label="Create a download link for the images")
 
1272
  hires_before_adetailer_gui = gr.Checkbox(value=False, label="Hires Before Adetailer")
1273
  hires_after_adetailer_gui = gr.Checkbox(value=True, label="Hires After Adetailer")
1274
  generator_in_cpu_gui = gr.Checkbox(value=False, label="Generator in CPU")
 
1278
  retain_task_cache_gui = gr.Checkbox(value=False, label="Retain task model in cache")
1279
  leave_progress_bar_gui = gr.Checkbox(value=True, label="Leave Progress Bar")
1280
  disable_progress_bar_gui = gr.Checkbox(value=False, label="Disable Progress Bar")
1281
+ display_images_gui = gr.Checkbox(value=True, label="Display Images")
1282
  image_previews_gui = gr.Checkbox(value=True, label="Image Previews")
1283
  image_storage_location_gui = gr.Textbox(value="./images", label="Image Storage Location")
1284
  retain_compel_previous_load_gui = gr.Checkbox(value=False, label="Retain Compel Previous Load")
 
1287
  xformers_memory_efficient_attention_gui = gr.Checkbox(value=False, label="Xformers Memory Efficient Attention")
1288
 
1289
  with gr.Accordion("Examples and help", open=False, visible=True):
1290
+ gr.Markdown(
1291
+ """### Help:
1292
+ - The current space runs on a ZERO GPU which is assigned for approximately 60 seconds; Therefore, if you submit expensive tasks, the operation may be canceled upon reaching the maximum allowed time with 'GPU TASK ABORTED'.
1293
+ - Distorted or strange images often result from high prompt weights, so it's best to use low weights and scales, and consider using Classic variants like 'Classic-original'.
1294
+ - For better results with Pony Diffusion, try using sampler DPM++ 1s or DPM2 with Compel or Classic prompt weights.
1295
+ """
1296
+ )
1297
+ gr.Markdown(
1298
+ """### The following examples perform specific tasks:
1299
+ 1. Generation with SDXL and upscale
1300
+ 2. Generation with FLUX dev
1301
+ 3. ControlNet Canny SDXL
1302
+ 4. Optical pattern (Optical illusion) SDXL
1303
+ 5. Convert an image to a coloring drawing
1304
+ 6. ControlNet OpenPose SD 1.5 and Latent upscale
1305
+
1306
+ - Different tasks can be performed, such as img2img or using the IP adapter, to preserve a person's appearance or a specific style based on an image.
1307
+ """
1308
+ )
1309
  gr.Examples(
1310
+ examples=[
1311
+ [
1312
+ "1girl, souryuu asuka langley, neon genesis evangelion, rebuild of evangelion, lance of longinus, cat hat, plugsuit, pilot suit, red bodysuit, sitting, crossed legs, black eye patch, throne, looking down, from bottom, looking at viewer, outdoors, (masterpiece), (best quality), (ultra-detailed), very aesthetic, illustration, disheveled hair, perfect composition, moist skin, intricate details",
1313
+ "nfsw, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, unfinished, very displeasing, oldest, early, chromatic aberration, artistic error, scan, abstract",
1314
+ 28,
1315
+ 7.0,
1316
+ -1,
1317
+ "None",
1318
+ 0.33,
1319
+ "Euler a",
1320
+ 1152,
1321
+ 896,
1322
+ "cagliostrolab/animagine-xl-3.1",
1323
+ "txt2img",
1324
+ "image.webp", # img conttol
1325
+ 1024, # img resolution
1326
+ 0.35, # strength
1327
+ 1.0, # cn scale
1328
+ 0.0, # cn start
1329
+ 1.0, # cn end
1330
+ "Classic",
1331
+ "Nearest",
1332
+ 45,
1333
+ False,
1334
+ ],
1335
+ [
1336
+ "a digital illustration of a movie poster titled 'Finding Emo', finding nemo parody poster, featuring a depressed cartoon clownfish with black emo hair, eyeliner, and piercings, bored expression, swimming in a dark underwater scene, in the background, movie title in a dripping, grungy font, moody blue and purple color palette",
1337
+ "",
1338
+ 24,
1339
+ 3.5,
1340
+ -1,
1341
+ "None",
1342
+ 0.33,
1343
+ "Euler a",
1344
+ 1152,
1345
+ 896,
1346
+ "black-forest-labs/FLUX.1-dev",
1347
+ "txt2img",
1348
+ None, # img conttol
1349
+ 1024, # img resolution
1350
+ 0.35, # strength
1351
+ 1.0, # cn scale
1352
+ 0.0, # cn start
1353
+ 1.0, # cn end
1354
+ "Classic",
1355
+ None,
1356
+ 70,
1357
+ True,
1358
+ ],
1359
+ [
1360
+ "((masterpiece)), best quality, blonde disco girl, detailed face, realistic face, realistic hair, dynamic pose, pink pvc, intergalactic disco background, pastel lights, dynamic contrast, airbrush, fine detail, 70s vibe, midriff",
1361
+ "(worst quality:1.2), (bad quality:1.2), (poor quality:1.2), (missing fingers:1.2), bad-artist-anime, bad-artist, bad-picture-chill-75v",
1362
+ 48,
1363
+ 3.5,
1364
+ -1,
1365
+ "None",
1366
+ 0.33,
1367
+ "DPM++ 2M SDE Lu",
1368
+ 1024,
1369
+ 1024,
1370
+ "misri/epicrealismXL_v7FinalDestination",
1371
+ "canny ControlNet",
1372
+ "image.webp", # img conttol
1373
+ 1024, # img resolution
1374
+ 0.35, # strength
1375
+ 1.0, # cn scale
1376
+ 0.0, # cn start
1377
+ 1.0, # cn end
1378
+ "Classic",
1379
+ None,
1380
+ 44,
1381
+ False,
1382
+ ],
1383
+ [
1384
+ "cinematic scenery old city ruins",
1385
+ "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), (illustration, 3d, 2d, painting, cartoons, sketch, blurry, film grain, noise), (low quality, worst quality:1.2)",
1386
+ 50,
1387
+ 4.0,
1388
+ -1,
1389
+ "None",
1390
+ 0.33,
1391
+ "Euler a",
1392
+ 1024,
1393
+ 1024,
1394
+ "misri/juggernautXL_juggernautX",
1395
+ "optical pattern ControlNet",
1396
+ "spiral_no_transparent.png", # img conttol
1397
+ 1024, # img resolution
1398
+ 0.35, # strength
1399
+ 1.0, # cn scale
1400
+ 0.05, # cn start
1401
+ 0.75, # cn end
1402
+ "Classic",
1403
+ None,
1404
+ 35,
1405
+ False,
1406
+ ],
1407
+ [
1408
+ "black and white, line art, coloring drawing, clean line art, black strokes, no background, white, black, free lines, black scribbles, on paper, A blend of comic book art and lineart full of black and white color, masterpiece, high-resolution, trending on Pixiv fan box, palette knife, brush strokes, two-dimensional, planar vector, T-shirt design, stickers, and T-shirt design, vector art, fantasy art, Adobe Illustrator, hand-painted, digital painting, low polygon, soft lighting, aerial view, isometric style, retro aesthetics, 8K resolution, black sketch lines, monochrome, invert color",
1409
+ "color, red, green, yellow, colored, duplicate, blurry, abstract, disfigured, deformed, animated, toy, figure, framed, 3d, bad art, poorly drawn, extra limbs, close up, b&w, weird colors, blurry, watermark, blur haze, 2 heads, long neck, watermark, elongated body, cropped image, out of frame, draft, deformed hands, twisted fingers, double image, malformed hands, multiple heads, extra limb, ugly, poorly drawn hands, missing limb, cut-off, over satured, grain, lowères, bad anatomy, poorly drawn face, mutation, mutated, floating limbs, disconnected limbs, out of focus, long body, disgusting, extra fingers, groos proportions, missing arms, mutated hands, cloned face, missing legs, ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, blurry, bad anatomy, blurred, watermark, grainy, signature, cut off, draft, deformed, blurry, bad anatomy, disfigured, poorly drawn face, mutation, bluelish, blue",
1410
+ 20,
1411
+ 4.0,
1412
+ -1,
1413
+ "loras/Coloring_book_-_LineArt.safetensors",
1414
+ 1.0,
1415
+ "DPM++ 2M SDE Karras",
1416
+ 1024,
1417
+ 1024,
1418
+ "cagliostrolab/animagine-xl-3.1",
1419
+ "lineart ControlNet",
1420
+ "color_image.png", # img conttol
1421
+ 896, # img resolution
1422
+ 0.35, # strength
1423
+ 1.0, # cn scale
1424
+ 0.0, # cn start
1425
+ 1.0, # cn end
1426
+ "Compel",
1427
+ None,
1428
+ 35,
1429
+ False,
1430
+ ],
1431
+ [
1432
+ "1girl,face,curly hair,red hair,white background,",
1433
+ "(worst quality:2),(low quality:2),(normal quality:2),lowres,watermark,",
1434
+ 38,
1435
+ 5.0,
1436
+ -1,
1437
+ "None",
1438
+ 0.33,
1439
+ "DPM++ 2M SDE Karras",
1440
+ 512,
1441
+ 512,
1442
+ "digiplay/majicMIX_realistic_v7",
1443
+ "openpose ControlNet",
1444
+ "image.webp", # img conttol
1445
+ 1024, # img resolution
1446
+ 0.35, # strength
1447
+ 1.0, # cn scale
1448
+ 0.0, # cn start
1449
+ 0.9, # cn end
1450
+ "Compel",
1451
+ "Latent (antialiased)",
1452
+ 46,
1453
+ False,
1454
+ ],
1455
+ ],
1456
  fn=sd_gen.generate_pipeline,
1457
  inputs=[
1458
  prompt_gui,
 
1478
  gpu_duration_gui,
1479
  load_lora_cpu_gui,
1480
  ],
1481
+ outputs=[result_images, actual_task_info],
1482
  cache_examples=False,
1483
  )
1484
+ gr.Markdown(
1485
+ """### Resources
1486
+ - John6666's space has some great features you might find helpful [link](https://huggingface.co/spaces/John6666/DiffuseCraftMod).
1487
+ - You can also try the image generator in Colab’s free tier, which provides free GPU [link](https://github.com/R3gm/SD_diffusers_interactive).
1488
+ """
1489
+ )
1490
 
1491
  with gr.Tab("Inpaint mask maker", render=True):
1492
 
1493
+ def create_mask_now(img, invert):
1494
+ import numpy as np
1495
+ import time
1496
+
1497
+ time.sleep(0.5)
1498
+
1499
+ transparent_image = img["layers"][0]
1500
+
1501
+ # Extract the alpha channel
1502
+ alpha_channel = np.array(transparent_image)[:, :, 3]
1503
+
1504
+ # Create a binary mask by thresholding the alpha channel
1505
+ binary_mask = alpha_channel > 1
1506
+
1507
+ if invert:
1508
+ print("Invert")
1509
+ # Invert the binary mask so that the drawn shape is white and the rest is black
1510
+ binary_mask = np.invert(binary_mask)
1511
+
1512
+ # Convert the binary mask to a 3-channel RGB mask
1513
+ rgb_mask = np.stack((binary_mask,) * 3, axis=-1)
1514
+
1515
+ # Convert the mask to uint8
1516
+ rgb_mask = rgb_mask.astype(np.uint8) * 255
1517
+
1518
+ return img["background"], rgb_mask
1519
+
1520
  with gr.Row():
1521
  with gr.Column(scale=2):
1522
  image_base = gr.ImageEditor(
 
1525
  # enable crop (or disable it)
1526
  # transforms=["crop"],
1527
  brush=gr.Brush(
1528
+ default_size="16", # or leave it as 'auto'
1529
+ color_mode="fixed", # 'fixed' hides the user swatches and colorpicker, 'defaults' shows it
1530
+ # default_color="black", # html names are supported
1531
+ colors=[
1532
+ "rgba(0, 0, 0, 1)", # rgb(a)
1533
+ "rgba(0, 0, 0, 0.1)",
1534
+ "rgba(255, 255, 255, 0.1)",
1535
+ # "hsl(360, 120, 120)" # in fact any valid colorstring
1536
+ ]
1537
  ),
1538
  eraser=gr.Eraser(default_size="16")
1539
  )
 
1569
 
1570
  with gr.Row():
1571
  with gr.Column():
 
 
 
1572
  image_up_tab = gr.Image(label="Image", type="pil", sources=["upload"])
1573
+ upscaler_tab = gr.Dropdown(label="Upscaler", choices=UPSCALER_KEYS[9:], value=UPSCALER_KEYS[11])
1574
  upscaler_size_tab = gr.Slider(minimum=1., maximum=4., step=0.1, value=1.1, label="Upscale by")
1575
  generate_button_up_tab = gr.Button(value="START UPSCALE", variant="primary")
1576
 
 
1578
  result_up_tab = gr.Image(label="Result", type="pil", interactive=False, format="png")
1579
 
1580
  generate_button_up_tab.click(
1581
+ fn=esrgan_upscale,
1582
  inputs=[image_up_tab, upscaler_tab, upscaler_size_tab],
1583
  outputs=[result_up_tab],
1584
  )
1585
 
 
 
 
1586
  generate_button.click(
1587
  fn=sd_gen.load_new_model,
1588
  inputs=[
1589
  model_name_gui,
1590
  vae_model_gui,
1591
+ task_gui
 
1592
  ],
1593
  outputs=[load_model_gui],
1594
  queue=True,
 
1613
  lora_scale_4_gui,
1614
  lora5_gui,
1615
  lora_scale_5_gui,
 
 
 
 
1616
  sampler_gui,
 
 
1617
  img_height_gui,
1618
  img_width_gui,
1619
  model_name_gui,
 
1631
  high_threshold_gui,
1632
  value_threshold_gui,
1633
  distance_threshold_gui,
 
 
1634
  control_net_output_scaling_gui,
1635
  control_net_start_threshold_gui,
1636
  control_net_stop_threshold_gui,
 
1638
  prompt_syntax_gui,
1639
  upscaler_model_path_gui,
1640
  upscaler_increases_size_gui,
1641
+ esrgan_tile_gui,
1642
+ esrgan_tile_overlap_gui,
1643
  hires_steps_gui,
1644
  hires_denoising_strength_gui,
1645
  hires_sampler_gui,
 
1647
  hires_negative_prompt_gui,
1648
  hires_before_adetailer_gui,
1649
  hires_after_adetailer_gui,
 
 
 
1650
  loop_generation_gui,
1651
  leave_progress_bar_gui,
1652
  disable_progress_bar_gui,
1653
  image_previews_gui,
1654
  display_images_gui,
1655
  save_generated_images_gui,
 
1656
  image_storage_location_gui,
1657
  retain_compel_previous_load_gui,
1658
  retain_detailfix_model_previous_load_gui,
 
1687
  mask_blur_b_gui,
1688
  mask_padding_b_gui,
1689
  retain_task_cache_gui,
 
1690
  image_ip1,
1691
  mask_ip1,
1692
  model_ip1,
 
1698
  mode_ip2,
1699
  scale_ip2,
1700
  pag_scale_gui,
 
 
 
1701
  load_lora_cpu_gui,
1702
  verbose_info_gui,
1703
  gpu_duration_gui,
1704
  ],
1705
+ outputs=[result_images, actual_task_info],
1706
  queue=True,
1707
  show_progress="minimal",
1708
  )
constants.py DELETED
@@ -1,585 +0,0 @@
1
- import os
2
- from stablepy.diffusers_vanilla.constants import FLUX_CN_UNION_MODES
3
- from stablepy import (
4
- scheduler_names,
5
- SD15_TASKS,
6
- SDXL_TASKS,
7
- ALL_BUILTIN_UPSCALERS,
8
- IP_ADAPTERS_SD,
9
- IP_ADAPTERS_SDXL,
10
- )
11
-
12
- # - **Download Models**
13
- DOWNLOAD_MODEL = "https://huggingface.co/TechnoByte/MilkyWonderland/resolve/main/milkyWonderland_v40.safetensors"
14
-
15
- # - **Download VAEs**
16
- DOWNLOAD_VAE = "https://huggingface.co/fp16-guy/anything_kl-f8-anime2_vae-ft-mse-840000-ema-pruned_blessed_clearvae_fp16_cleaned/resolve/main/vae-ft-mse-840000-ema-pruned_fp16.safetensors?download=true"
17
-
18
- # - **Download LoRAs**
19
- DOWNLOAD_LORA = "https://huggingface.co/Leopain/color/resolve/main/Coloring_book_-_LineArt.safetensors, https://civitai.com/api/download/models/135867, https://huggingface.co/Linaqruf/anime-detailer-xl-lora/resolve/main/anime-detailer-xl.safetensors?download=true, https://huggingface.co/Linaqruf/style-enhancer-xl-lora/resolve/main/style-enhancer-xl.safetensors?download=true, https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-8steps-CFG-lora.safetensors?download=true, https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-8steps-CFG-lora.safetensors?download=true"
20
-
21
- LOAD_DIFFUSERS_FORMAT_MODEL = [
22
- 'stabilityai/stable-diffusion-xl-base-1.0',
23
- 'Laxhar/noobai-XL-1.1',
24
- 'Laxhar/noobai-XL-Vpred-1.0',
25
- 'black-forest-labs/FLUX.1-dev',
26
- 'John6666/blue-pencil-flux1-v021-fp8-flux',
27
- 'John6666/wai-ani-flux-v10forfp8-fp8-flux',
28
- 'John6666/xe-anime-flux-v04-fp8-flux',
29
- 'John6666/lyh-anime-flux-v2a1-fp8-flux',
30
- 'John6666/carnival-unchained-v10-fp8-flux',
31
- 'John6666/iniverse-mix-xl-sfwnsfw-fluxdfp16nsfwv11-fp8-flux',
32
- 'Freepik/flux.1-lite-8B-alpha',
33
- 'shauray/FluxDev-HyperSD-merged',
34
- 'mikeyandfriends/PixelWave_FLUX.1-dev_03',
35
- 'terminusresearch/FluxBooru-v0.3',
36
- 'black-forest-labs/FLUX.1-schnell',
37
- # 'ostris/OpenFLUX.1',
38
- 'shuttleai/shuttle-3-diffusion',
39
- 'Laxhar/noobai-XL-1.0',
40
- 'John6666/noobai-xl-nai-xl-epsilonpred10version-sdxl',
41
- 'Laxhar/noobai-XL-0.77',
42
- 'John6666/noobai-xl-nai-xl-epsilonpred075version-sdxl',
43
- 'Laxhar/noobai-XL-0.6',
44
- 'John6666/noobai-xl-nai-xl-epsilonpred05version-sdxl',
45
- 'John6666/noobai-cyberfix-v10-sdxl',
46
- 'John6666/noobaiiter-xl-vpred-v075-sdxl',
47
- 'John6666/ntr-mix-illustrious-xl-noob-xl-v40-sdxl',
48
- 'John6666/ntr-mix-illustrious-xl-noob-xl-ntrmix35-sdxl',
49
- 'John6666/ntr-mix-illustrious-xl-noob-xl-v777-sdxl',
50
- 'John6666/ntr-mix-illustrious-xl-noob-xl-v777forlora-sdxl',
51
- 'John6666/ntr-mix-illustrious-xl-noob-xl-xi-sdxl',
52
- 'John6666/ntr-mix-illustrious-xl-noob-xl-xii-sdxl',
53
- 'John6666/ntr-mix-illustrious-xl-noob-xl-xiii-sdxl',
54
- 'John6666/mistoon-anime-v10illustrious-sdxl',
55
- 'John6666/hassaku-xl-illustrious-v10-sdxl',
56
- 'John6666/hassaku-xl-illustrious-v10style-sdxl',
57
- 'John6666/haruki-mix-illustrious-v10-sdxl',
58
- 'John6666/noobreal-v10-sdxl',
59
- 'John6666/complicated-noobai-merge-vprediction-sdxl',
60
- 'Laxhar/noobai-XL-Vpred-0.9r',
61
- 'Laxhar/noobai-XL-Vpred-0.75s',
62
- 'Laxhar/noobai-XL-Vpred-0.75',
63
- 'Laxhar/noobai-XL-Vpred-0.65s',
64
- 'Laxhar/noobai-XL-Vpred-0.65',
65
- 'Laxhar/noobai-XL-Vpred-0.6',
66
- 'John6666/cat-tower-noobai-xl-checkpoint-v14vpred-sdxl',
67
- 'John6666/noobai-xl-nai-xl-vpred05version-sdxl',
68
- 'John6666/noobai-fusion2-vpred-itercomp-v1-sdxl',
69
- 'John6666/noobai-xl-nai-xl-vpredtestversion-sdxl',
70
- 'John6666/chadmix-noobai075-illustrious01-v10-sdxl',
71
- 'OnomaAIResearch/Illustrious-xl-early-release-v0',
72
- 'John6666/illustriousxl-mmmix-v50-sdxl',
73
- 'John6666/illustrious-pencil-xl-v200-sdxl',
74
- 'John6666/obsession-illustriousxl-v21-sdxl',
75
- 'John6666/obsession-illustriousxl-v30-sdxl',
76
- 'John6666/obsession-illustriousxl-v31-sdxl',
77
- 'John6666/wai-nsfw-illustrious-v70-sdxl',
78
- 'John6666/illustrious-pony-mix-v3-sdxl',
79
- 'John6666/nova-anime-xl-illustriousv10-sdxl',
80
- 'John6666/nova-orange-xl-v30-sdxl',
81
- 'John6666/silvermoon-mix03-illustrious-v10-sdxl',
82
- 'eienmojiki/Anything-XL',
83
- 'eienmojiki/Starry-XL-v5.2',
84
- 'John6666/meinaxl-v2-sdxl',
85
- 'Eugeoter/artiwaifu-diffusion-2.0',
86
- 'comin/IterComp',
87
- 'John6666/epicrealism-xl-vxiabeast-sdxl',
88
- 'John6666/epicrealism-xl-v10kiss2-sdxl',
89
- 'John6666/epicrealism-xl-v8kiss-sdxl',
90
- 'misri/zavychromaxl_v80',
91
- 'SG161222/RealVisXL_V4.0',
92
- 'SG161222/RealVisXL_V5.0',
93
- 'misri/newrealityxlAllInOne_Newreality40',
94
- 'gsdf/CounterfeitXL',
95
- 'WhiteAiZ/autismmixSDXL_autismmixConfetti_diffusers',
96
- 'kitty7779/ponyDiffusionV6XL',
97
- 'GraydientPlatformAPI/aniverse-pony',
98
- 'John6666/ras-real-anime-screencap-v1-sdxl',
99
- 'John6666/duchaiten-pony-xl-no-score-v60-sdxl',
100
- 'John6666/mistoon-anime-ponyalpha-sdxl',
101
- 'John6666/mistoon-xl-copper-v20fast-sdxl',
102
- 'John6666/ebara-mfcg-pony-mix-v12-sdxl',
103
- 'John6666/t-ponynai3-v51-sdxl',
104
- 'John6666/t-ponynai3-v65-sdxl',
105
- 'John6666/prefect-pony-xl-v3-sdxl',
106
- 'John6666/prefect-pony-xl-v4-sdxl',
107
- 'John6666/mala-anime-mix-nsfw-pony-xl-v5-sdxl',
108
- 'John6666/wai-ani-nsfw-ponyxl-v10-sdxl',
109
- 'John6666/wai-real-mix-v11-sdxl',
110
- 'John6666/wai-shuffle-pdxl-v2-sdxl',
111
- 'John6666/wai-c-v6-sdxl',
112
- 'John6666/iniverse-mix-xl-sfwnsfw-pony-guofeng-v43-sdxl',
113
- 'John6666/sifw-annihilation-xl-v2-sdxl',
114
- 'John6666/photo-realistic-pony-v5-sdxl',
115
- 'John6666/pony-realism-v21main-sdxl',
116
- 'John6666/pony-realism-v22main-sdxl',
117
- 'John6666/cyberrealistic-pony-v63-sdxl',
118
- 'John6666/cyberrealistic-pony-v64-sdxl',
119
- 'John6666/cyberrealistic-pony-v65-sdxl',
120
- 'John6666/cyberrealistic-pony-v7-sdxl',
121
- 'GraydientPlatformAPI/realcartoon-pony-diffusion',
122
- 'John6666/nova-anime-xl-pony-v5-sdxl',
123
- 'John6666/autismmix-sdxl-autismmix-pony-sdxl',
124
- 'John6666/aimz-dream-real-pony-mix-v3-sdxl',
125
- 'John6666/prefectious-xl-nsfw-v10-sdxl',
126
- 'GraydientPlatformAPI/iniverseponyRealGuofeng49',
127
- 'John6666/duchaiten-pony-real-v11fix-sdxl',
128
- 'John6666/duchaiten-pony-real-v20-sdxl',
129
- 'John6666/duchaiten-pony-xl-no-score-v70-sdxl',
130
- 'Spestly/OdysseyXL-3.0',
131
- 'Spestly/OdysseyXL-4.0',
132
- 'KBlueLeaf/Kohaku-XL-Zeta',
133
- 'cagliostrolab/animagine-xl-3.1',
134
- 'yodayo-ai/kivotos-xl-2.0',
135
- 'yodayo-ai/holodayo-xl-2.1',
136
- 'yodayo-ai/clandestine-xl-1.0',
137
- 'digiplay/majicMIX_sombre_v2',
138
- 'digiplay/majicMIX_realistic_v6',
139
- 'digiplay/majicMIX_realistic_v7',
140
- 'digiplay/DreamShaper_8',
141
- 'digiplay/BeautifulArt_v1',
142
- 'digiplay/DarkSushi2.5D_v1',
143
- 'digiplay/darkphoenix3D_v1.1',
144
- 'digiplay/BeenYouLiteL11_diffusers',
145
- 'GraydientPlatformAPI/rev-animated2',
146
- 'myxlmynx/cyberrealistic_classic40',
147
- 'GraydientPlatformAPI/cyberreal6',
148
- 'GraydientPlatformAPI/cyberreal5',
149
- 'youknownothing/deliberate-v6',
150
- 'GraydientPlatformAPI/deliberate-cyber3',
151
- 'GraydientPlatformAPI/picx-real',
152
- 'GraydientPlatformAPI/perfectworld6',
153
- 'emilianJR/epiCRealism',
154
- 'votepurchase/counterfeitV30_v30',
155
- 'votepurchase/ChilloutMix',
156
- 'Meina/MeinaMix_V11',
157
- 'Meina/MeinaUnreal_V5',
158
- 'Meina/MeinaPastel_V7',
159
- 'GraydientPlatformAPI/realcartoon3d-17',
160
- 'GraydientPlatformAPI/realcartoon-pixar11',
161
- 'GraydientPlatformAPI/realcartoon-real17',
162
- 'nitrosocke/Ghibli-Diffusion',
163
- ]
164
-
165
- DIFFUSERS_FORMAT_LORAS = [
166
- "nerijs/animation2k-flux",
167
- "XLabs-AI/flux-RealismLora",
168
- "Shakker-Labs/FLUX.1-dev-LoRA-Logo-Design",
169
- ]
170
-
171
- DOWNLOAD_EMBEDS = [
172
- 'https://huggingface.co/datasets/Nerfgun3/bad_prompt/blob/main/bad_prompt_version2.pt',
173
- # 'https://huggingface.co/embed/negative/resolve/main/EasyNegativeV2.safetensors',
174
- # 'https://huggingface.co/embed/negative/resolve/main/bad-hands-5.pt',
175
- ]
176
-
177
- CIVITAI_API_KEY = os.environ.get("CIVITAI_API_KEY")
178
- HF_TOKEN = os.environ.get("HF_READ_TOKEN")
179
-
180
- DIRECTORY_MODELS = 'models'
181
- DIRECTORY_LORAS = 'loras'
182
- DIRECTORY_VAES = 'vaes'
183
- DIRECTORY_EMBEDS = 'embedings'
184
- DIRECTORY_UPSCALERS = 'upscalers'
185
-
186
- CACHE_HF = "/home/user/.cache/huggingface/hub/"
187
- STORAGE_ROOT = "/home/user/"
188
-
189
- TASK_STABLEPY = {
190
- 'txt2img': 'txt2img',
191
- 'img2img': 'img2img',
192
- 'inpaint': 'inpaint',
193
- # 'canny T2I Adapter': 'sdxl_canny_t2i', # NO HAVE STEP CALLBACK PARAMETERS SO NOT WORKS WITH DIFFUSERS 0.29.0
194
- # 'sketch T2I Adapter': 'sdxl_sketch_t2i',
195
- # 'lineart T2I Adapter': 'sdxl_lineart_t2i',
196
- # 'depth-midas T2I Adapter': 'sdxl_depth-midas_t2i',
197
- # 'openpose T2I Adapter': 'sdxl_openpose_t2i',
198
- 'openpose ControlNet': 'openpose',
199
- 'canny ControlNet': 'canny',
200
- 'mlsd ControlNet': 'mlsd',
201
- 'scribble ControlNet': 'scribble',
202
- 'softedge ControlNet': 'softedge',
203
- 'segmentation ControlNet': 'segmentation',
204
- 'depth ControlNet': 'depth',
205
- 'normalbae ControlNet': 'normalbae',
206
- 'lineart ControlNet': 'lineart',
207
- 'lineart_anime ControlNet': 'lineart_anime',
208
- 'shuffle ControlNet': 'shuffle',
209
- 'ip2p ControlNet': 'ip2p',
210
- 'optical pattern ControlNet': 'pattern',
211
- 'recolor ControlNet': 'recolor',
212
- 'tile ControlNet': 'tile',
213
- 'repaint ControlNet': 'repaint',
214
- }
215
-
216
- TASK_MODEL_LIST = list(TASK_STABLEPY.keys())
217
-
218
- UPSCALER_DICT_GUI = {
219
- None: None,
220
- **{bu: bu for bu in ALL_BUILTIN_UPSCALERS if bu not in ["HAT x4", "DAT x4", "DAT x3", "DAT x2", "SwinIR 4x"]},
221
- # "RealESRGAN_x4plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth",
222
- "RealESRNet_x4plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/RealESRNet_x4plus.pth",
223
- # "RealESRGAN_x4plus_anime_6B": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth",
224
- # "RealESRGAN_x2plus": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.1/RealESRGAN_x2plus.pth",
225
- # "realesr-animevideov3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-animevideov3.pth",
226
- # "realesr-general-x4v3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth",
227
- # "realesr-general-wdn-x4v3": "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-wdn-x4v3.pth",
228
- "4x-UltraSharp": "https://huggingface.co/Shandypur/ESRGAN-4x-UltraSharp/resolve/main/4x-UltraSharp.pth",
229
- "4x_foolhardy_Remacri": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri/resolve/main/4x_foolhardy_Remacri.pth",
230
- "Remacri4xExtraSmoother": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/Remacri%204x%20ExtraSmoother.pth",
231
- "AnimeSharp4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/AnimeSharp%204x.pth",
232
- "lollypop": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/lollypop.pth",
233
- "RealisticRescaler4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/RealisticRescaler%204x.pth",
234
- "NickelbackFS4x": "https://huggingface.co/hollowstrawberry/upscalers-backup/resolve/main/ESRGAN/NickelbackFS%204x.pth"
235
- }
236
-
237
- UPSCALER_KEYS = list(UPSCALER_DICT_GUI.keys())
238
-
239
- DIFFUSERS_CONTROLNET_MODEL = [
240
- "Automatic",
241
-
242
- "brad-twinkl/controlnet-union-sdxl-1.0-promax",
243
- "xinsir/controlnet-union-sdxl-1.0",
244
- "xinsir/anime-painter",
245
- "Eugeoter/noob-sdxl-controlnet-canny",
246
- "Eugeoter/noob-sdxl-controlnet-lineart_anime",
247
- "Eugeoter/noob-sdxl-controlnet-depth",
248
- "Eugeoter/noob-sdxl-controlnet-normal",
249
- "Eugeoter/noob-sdxl-controlnet-softedge_hed",
250
- "Eugeoter/noob-sdxl-controlnet-scribble_pidinet",
251
- "Eugeoter/noob-sdxl-controlnet-scribble_hed",
252
- "Eugeoter/noob-sdxl-controlnet-manga_line",
253
- "Eugeoter/noob-sdxl-controlnet-lineart_realistic",
254
- "Eugeoter/noob-sdxl-controlnet-depth_midas-v1-1",
255
- "dimitribarbot/controlnet-openpose-sdxl-1.0-safetensors",
256
- "r3gm/controlnet-openpose-sdxl-1.0-fp16",
257
- "r3gm/controlnet-canny-scribble-integrated-sdxl-v2-fp16",
258
- "r3gm/controlnet-union-sdxl-1.0-fp16",
259
- "r3gm/controlnet-lineart-anime-sdxl-fp16",
260
- "r3gm/control_v1p_sdxl_qrcode_monster_fp16",
261
- "r3gm/controlnet-tile-sdxl-1.0-fp16",
262
- "r3gm/controlnet-recolor-sdxl-fp16",
263
- "r3gm/controlnet-openpose-twins-sdxl-1.0-fp16",
264
- "r3gm/controlnet-qr-pattern-sdxl-fp16",
265
- "Yakonrus/SDXL_Controlnet_Tile_Realistic_v2",
266
- "TheMistoAI/MistoLine",
267
- "briaai/BRIA-2.3-ControlNet-Recoloring",
268
- "briaai/BRIA-2.3-ControlNet-Canny",
269
-
270
- "lllyasviel/control_v11p_sd15_openpose",
271
- "lllyasviel/control_v11p_sd15_canny",
272
- "lllyasviel/control_v11p_sd15_mlsd",
273
- "lllyasviel/control_v11p_sd15_scribble",
274
- "lllyasviel/control_v11p_sd15_softedge",
275
- "lllyasviel/control_v11p_sd15_seg",
276
- "lllyasviel/control_v11f1p_sd15_depth",
277
- "lllyasviel/control_v11p_sd15_normalbae",
278
- "lllyasviel/control_v11p_sd15_lineart",
279
- "lllyasviel/control_v11p_sd15s2_lineart_anime",
280
- "lllyasviel/control_v11e_sd15_shuffle",
281
- "lllyasviel/control_v11e_sd15_ip2p",
282
- "lllyasviel/control_v11p_sd15_inpaint",
283
- "monster-labs/control_v1p_sd15_qrcode_monster",
284
- "lllyasviel/control_v11f1e_sd15_tile",
285
- "latentcat/control_v1p_sd15_brightness",
286
- "yuanqiuye/qrcode_controlnet_v3",
287
-
288
- "Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro",
289
- # "Shakker-Labs/FLUX.1-dev-ControlNet-Pose",
290
- # "Shakker-Labs/FLUX.1-dev-ControlNet-Depth",
291
- # "jasperai/Flux.1-dev-Controlnet-Upscaler",
292
- # "jasperai/Flux.1-dev-Controlnet-Depth",
293
- # "jasperai/Flux.1-dev-Controlnet-Surface-Normals",
294
- # "XLabs-AI/flux-controlnet-canny-diffusers",
295
- # "XLabs-AI/flux-controlnet-hed-diffusers",
296
- # "XLabs-AI/flux-controlnet-depth-diffusers",
297
- # "InstantX/FLUX.1-dev-Controlnet-Union",
298
- # "InstantX/FLUX.1-dev-Controlnet-Canny",
299
- ]
300
-
301
- PROMPT_W_OPTIONS = [
302
- ("Compel format: (word)weight", "Compel"),
303
- ("Classic format: (word:weight)", "Classic"),
304
- ("Classic-original format: (word:weight)", "Classic-original"),
305
- ("Classic-no_norm format: (word:weight)", "Classic-no_norm"),
306
- ("Classic-sd_embed format: (word:weight)", "Classic-sd_embed"),
307
- ("Classic-ignore", "Classic-ignore"),
308
- ("None", "None"),
309
- ]
310
-
311
- WARNING_MSG_VAE = (
312
- "Use the right VAE for your model to maintain image quality. The wrong"
313
- " VAE can lead to poor results, like blurriness in the generated images."
314
- )
315
-
316
- SDXL_TASK = [k for k, v in TASK_STABLEPY.items() if v in SDXL_TASKS]
317
- SD_TASK = [k for k, v in TASK_STABLEPY.items() if v in SD15_TASKS]
318
- FLUX_TASK = list(TASK_STABLEPY.keys())[:3] + [k for k, v in TASK_STABLEPY.items() if v in FLUX_CN_UNION_MODES.keys()]
319
-
320
- MODEL_TYPE_TASK = {
321
- "SD 1.5": SD_TASK,
322
- "SDXL": SDXL_TASK,
323
- "FLUX": FLUX_TASK,
324
- }
325
-
326
- MODEL_TYPE_CLASS = {
327
- "diffusers:StableDiffusionPipeline": "SD 1.5",
328
- "diffusers:StableDiffusionXLPipeline": "SDXL",
329
- "diffusers:FluxPipeline": "FLUX",
330
- }
331
-
332
- DIFFUSECRAFT_CHECKPOINT_NAME = {
333
- "sd1.5": "SD 1.5",
334
- "sdxl": "SDXL",
335
- "flux-dev": "FLUX",
336
- "flux-schnell": "FLUX",
337
- }
338
-
339
- POST_PROCESSING_SAMPLER = ["Use same sampler"] + [
340
- name_s for name_s in scheduler_names if "Auto-Loader" not in name_s
341
- ]
342
-
343
- IP_MODELS = []
344
- ALL_IPA = sorted(set(IP_ADAPTERS_SD + IP_ADAPTERS_SDXL))
345
-
346
- for origin_name in ALL_IPA:
347
- suffixes = []
348
- if origin_name in IP_ADAPTERS_SD:
349
- suffixes.append("sd1.5")
350
- if origin_name in IP_ADAPTERS_SDXL:
351
- suffixes.append("sdxl")
352
- ref_name = f"{origin_name} ({'/'.join(suffixes)})"
353
- IP_MODELS.append((ref_name, origin_name))
354
-
355
- MODE_IP_OPTIONS = ["original", "style", "layout", "style+layout"]
356
-
357
- SUBTITLE_GUI = (
358
- "### This demo uses [diffusers](https://github.com/huggingface/diffusers)"
359
- " to perform different tasks in image generation."
360
- )
361
-
362
- HELP_GUI = (
363
- """### Help:
364
- - The current space runs on a ZERO GPU which is assigned for approximately 60 seconds; Therefore, if you submit expensive tasks, the operation may be canceled upon reaching the maximum allowed time with 'GPU TASK ABORTED'.
365
- - Distorted or strange images often result from high prompt weights, so it's best to use low weights and scales, and consider using Classic variants like 'Classic-original'.
366
- - For better results with Pony Diffusion, try using sampler DPM++ 1s or DPM2 with Compel or Classic prompt weights.
367
- """
368
- )
369
-
370
- EXAMPLES_GUI_HELP = (
371
- """### The following examples perform specific tasks:
372
- 1. Generation with SDXL and upscale
373
- 2. Generation with FLUX dev
374
- 3. ControlNet Canny SDXL
375
- 4. Optical pattern (Optical illusion) SDXL
376
- 5. Convert an image to a coloring drawing
377
- 6. V prediction model inference
378
- 7. V prediction model sd_embed variant inference
379
- 8. ControlNet OpenPose SD 1.5 and Latent upscale
380
-
381
- - Different tasks can be performed, such as img2img or using the IP adapter, to preserve a person's appearance or a specific style based on an image.
382
- """
383
- )
384
-
385
- EXAMPLES_GUI = [
386
- [
387
- "splatter paint theme, 1girl, frame center, pretty face, face with artistic paint artwork, feminism, long hair, upper body view, futuristic expression illustrative painted background, origami, stripes, explosive paint splashes behind her, hand on cheek pose, strobe lighting, masterpiece photography creative artwork, golden morning light, highly detailed, masterpiece, best quality, very aesthetic, absurdres",
388
- "logo, artist name, (worst quality, normal quality), bad-artist, ((bad anatomy)), ((bad hands)), ((bad proportions)), ((duplicate limbs)), ((fused limbs)), ((interlocking fingers)), ((poorly drawn face)), high contrast., score_6, score_5, score_4, lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]",
389
- 28,
390
- 5.0,
391
- -1,
392
- "None",
393
- 0.33,
394
- "DPM++ 2M SDE",
395
- 1152,
396
- 896,
397
- "John6666/noobai-xl-nai-xl-epsilonpred10version-sdxl",
398
- "txt2img",
399
- "image.webp", # img conttol
400
- 1024, # img resolution
401
- 0.35, # strength
402
- 1.0, # cn scale
403
- 0.0, # cn start
404
- 1.0, # cn end
405
- "Classic-no_norm",
406
- "Nearest",
407
- 45,
408
- False,
409
- ],
410
- [
411
- "a digital illustration of a movie poster titled 'Finding Emo', finding nemo parody poster, featuring a depressed cartoon clownfish with black emo hair, eyeliner, and piercings, bored expression, swimming in a dark underwater scene, in the background, movie title in a dripping, grungy font, moody blue and purple color palette",
412
- "",
413
- 24,
414
- 3.5,
415
- -1,
416
- "None",
417
- 0.33,
418
- "FlowMatch Euler",
419
- 1152,
420
- 896,
421
- "black-forest-labs/FLUX.1-dev",
422
- "txt2img",
423
- None, # img conttol
424
- 1024, # img resolution
425
- 0.35, # strength
426
- 1.0, # cn scale
427
- 0.0, # cn start
428
- 1.0, # cn end
429
- "Classic",
430
- None,
431
- 70,
432
- True,
433
- ],
434
- [
435
- "((masterpiece)), best quality, blonde disco girl, detailed face, realistic face, realistic hair, dynamic pose, pink pvc, intergalactic disco background, pastel lights, dynamic contrast, airbrush, fine detail, 70s vibe, midriff",
436
- "(worst quality:1.2), (bad quality:1.2), (poor quality:1.2), (missing fingers:1.2), bad-artist-anime, bad-artist, bad-picture-chill-75v",
437
- 48,
438
- 3.5,
439
- -1,
440
- "None",
441
- 0.33,
442
- "DPM++ 2M SDE Ef",
443
- 1024,
444
- 1024,
445
- "John6666/epicrealism-xl-v10kiss2-sdxl",
446
- "canny ControlNet",
447
- "image.webp", # img conttol
448
- 1024, # img resolution
449
- 0.35, # strength
450
- 1.0, # cn scale
451
- 0.0, # cn start
452
- 1.0, # cn end
453
- "Classic",
454
- None,
455
- 44,
456
- False,
457
- ],
458
- [
459
- "cinematic scenery old city ruins",
460
- "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), (illustration, 3d, 2d, painting, cartoons, sketch, blurry, film grain, noise), (low quality, worst quality:1.2)",
461
- 50,
462
- 4.0,
463
- -1,
464
- "None",
465
- 0.33,
466
- "Euler a",
467
- 1024,
468
- 1024,
469
- "SG161222/RealVisXL_V5.0",
470
- "optical pattern ControlNet",
471
- "spiral_no_transparent.png", # img conttol
472
- 1024, # img resolution
473
- 0.35, # strength
474
- 1.0, # cn scale
475
- 0.05, # cn start
476
- 0.8, # cn end
477
- "Classic",
478
- None,
479
- 35,
480
- False,
481
- ],
482
- [
483
- "black and white, line art, coloring drawing, clean line art, black strokes, no background, white, black, free lines, black scribbles, on paper, A blend of comic book art and lineart full of black and white color, masterpiece, high-resolution, trending on Pixiv fan box, palette knife, brush strokes, two-dimensional, planar vector, T-shirt design, stickers, and T-shirt design, vector art, fantasy art, Adobe Illustrator, hand-painted, digital painting, low polygon, soft lighting, aerial view, isometric style, retro aesthetics, 8K resolution, black sketch lines, monochrome, invert color",
484
- "color, red, green, yellow, colored, duplicate, blurry, abstract, disfigured, deformed, animated, toy, figure, framed, 3d, bad art, poorly drawn, extra limbs, close up, b&w, weird colors, blurry, watermark, blur haze, 2 heads, long neck, watermark, elongated body, cropped image, out of frame, draft, deformed hands, twisted fingers, double image, malformed hands, multiple heads, extra limb, ugly, poorly drawn hands, missing limb, cut-off, over satured, grain, lowères, bad anatomy, poorly drawn face, mutation, mutated, floating limbs, disconnected limbs, out of focus, long body, disgusting, extra fingers, groos proportions, missing arms, mutated hands, cloned face, missing legs, ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, blurry, bad anatomy, blurred, watermark, grainy, signature, cut off, draft, deformed, blurry, bad anatomy, disfigured, poorly drawn face, mutation, bluelish, blue",
485
- 20,
486
- 4.0,
487
- -1,
488
- "loras/Coloring_book_-_LineArt.safetensors",
489
- 1.0,
490
- "DPM++ 2M SDE",
491
- 1024,
492
- 1024,
493
- "eienmojiki/Anything-XL",
494
- "lineart ControlNet",
495
- "color_image.png", # img conttol
496
- 896, # img resolution
497
- 0.35, # strength
498
- 1.0, # cn scale
499
- 0.0, # cn start
500
- 1.0, # cn end
501
- "Compel",
502
- None,
503
- 35,
504
- False,
505
- ],
506
- [
507
- "[mochizuki_shiina], [syuri22], newest, reimu, solo, outdoors, water, flower, lantern",
508
- "worst quality, normal quality, old, sketch,",
509
- 28,
510
- 7.0,
511
- -1,
512
- "None",
513
- 0.33,
514
- "DPM 3M Ef",
515
- 1600,
516
- 1024,
517
- "Laxhar/noobai-XL-Vpred-1.0",
518
- "txt2img",
519
- "color_image.png", # img conttol
520
- 1024, # img resolution
521
- 0.35, # strength
522
- 1.0, # cn scale
523
- 0.0, # cn start
524
- 1.0, # cn end
525
- "Classic",
526
- None,
527
- 30,
528
- False,
529
- ],
530
- [
531
- "[mochizuki_shiina], [syuri22], newest, multiple girls, 2girls, earrings, jewelry, gloves, purple eyes, black hair, looking at viewer, nail polish, hat, smile, open mouth, fingerless gloves, sleeveless, :d, upper body, blue eyes, closed mouth, black gloves, hands up, long hair, shirt, bare shoulders, white headwear, blush, black headwear, blue nails, upper teeth only, short hair, white gloves, white shirt, teeth, rabbit hat, star earrings, purple nails, pink hair, detached sleeves, fingernails, fake animal ears, animal hat, sleeves past wrists, black shirt, medium hair, fur trim, sleeveless shirt, turtleneck, long sleeves, rabbit ears, star \\(symbol\\)",
532
- "worst quality, normal quality, old, sketch,",
533
- 28,
534
- 7.0,
535
- -1,
536
- "None",
537
- 0.33,
538
- "DPM 3M Ef",
539
- 1600,
540
- 1024,
541
- "Laxhar/noobai-XL-Vpred-1.0",
542
- "txt2img",
543
- "color_image.png", # img conttol
544
- 1024, # img resolution
545
- 0.35, # strength
546
- 1.0, # cn scale
547
- 0.0, # cn start
548
- 1.0, # cn end
549
- "Classic-sd_embed",
550
- None,
551
- 30,
552
- False,
553
- ],
554
- [
555
- "1girl,face,curly hair,red hair,white background,",
556
- "(worst quality:2),(low quality:2),(normal quality:2),lowres,watermark,",
557
- 38,
558
- 5.0,
559
- -1,
560
- "None",
561
- 0.33,
562
- "DPM++ 2M SDE",
563
- 512,
564
- 512,
565
- "digiplay/majicMIX_realistic_v7",
566
- "openpose ControlNet",
567
- "image.webp", # img conttol
568
- 1024, # img resolution
569
- 0.35, # strength
570
- 1.0, # cn scale
571
- 0.0, # cn start
572
- 0.9, # cn end
573
- "Classic-original",
574
- "Latent (antialiased)",
575
- 46,
576
- False,
577
- ],
578
- ]
579
-
580
- RESOURCES = (
581
- """### Resources
582
- - John6666's space has some great features you might find helpful [link](https://huggingface.co/spaces/John6666/DiffuseCraftMod).
583
- - You can also try the image generator in Colab’s free tier, which provides free GPU [link](https://github.com/R3gm/SD_diffusers_interactive).
584
- """
585
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
image_processor.py DELETED
@@ -1,130 +0,0 @@
1
- import spaces
2
- import gradio as gr
3
- from stablepy import Preprocessor
4
-
5
- PREPROCESSOR_TASKS_LIST = [
6
- "Canny",
7
- "Openpose",
8
- "DPT",
9
- "Midas",
10
- "ZoeDepth",
11
- "DepthAnything",
12
- "HED",
13
- "PidiNet",
14
- "TEED",
15
- "Lineart",
16
- "LineartAnime",
17
- "Anyline",
18
- "Lineart standard",
19
- "SegFormer",
20
- "UPerNet",
21
- "ContentShuffle",
22
- "Recolor",
23
- "Blur",
24
- "MLSD",
25
- "NormalBae",
26
- ]
27
-
28
- preprocessor = Preprocessor()
29
-
30
-
31
- def process_inputs(
32
- image,
33
- name,
34
- resolution,
35
- precessor_resolution,
36
- low_threshold,
37
- high_threshold,
38
- value_threshod,
39
- distance_threshold,
40
- recolor_mode,
41
- recolor_gamma_correction,
42
- blur_k_size,
43
- pre_openpose_extra,
44
- hed_scribble,
45
- pre_pidinet_safe,
46
- pre_lineart_coarse,
47
- use_cuda,
48
- ):
49
- if not image:
50
- raise ValueError("To use this, simply upload an image.")
51
-
52
- preprocessor.load(name, False)
53
-
54
- params = dict(
55
- image_resolution=resolution,
56
- detect_resolution=precessor_resolution,
57
- low_threshold=low_threshold,
58
- high_threshold=high_threshold,
59
- thr_v=value_threshod,
60
- thr_d=distance_threshold,
61
- mode=recolor_mode,
62
- gamma_correction=recolor_gamma_correction,
63
- blur_sigma=blur_k_size,
64
- hand_and_face=pre_openpose_extra,
65
- scribble=hed_scribble,
66
- safe=pre_pidinet_safe,
67
- coarse=pre_lineart_coarse,
68
- )
69
-
70
- if use_cuda:
71
- @spaces.GPU(duration=15)
72
- def wrapped_func():
73
- preprocessor.to("cuda")
74
- return preprocessor(image, **params)
75
- return wrapped_func()
76
-
77
- return preprocessor(image, **params)
78
-
79
-
80
- def preprocessor_tab():
81
- with gr.Row():
82
- with gr.Column():
83
- pre_image = gr.Image(label="Image", type="pil", sources=["upload"])
84
- pre_options = gr.Dropdown(label="Preprocessor", choices=PREPROCESSOR_TASKS_LIST, value=PREPROCESSOR_TASKS_LIST[0])
85
- pre_img_resolution = gr.Slider(
86
- minimum=64, maximum=4096, step=64, value=1024, label="Image Resolution",
87
- info="The maximum proportional size of the generated image based on the uploaded image."
88
- )
89
- pre_start = gr.Button(value="PROCESS IMAGE", variant="primary")
90
- with gr.Accordion("Advanced Settings", open=False):
91
- with gr.Column():
92
- pre_processor_resolution = gr.Slider(minimum=64, maximum=2048, step=64, value=512, label="Preprocessor Resolution")
93
- pre_low_threshold = gr.Slider(minimum=1, maximum=255, step=1, value=100, label="'CANNY' low threshold")
94
- pre_high_threshold = gr.Slider(minimum=1, maximum=255, step=1, value=200, label="'CANNY' high threshold")
95
- pre_value_threshold = gr.Slider(minimum=1, maximum=2.0, step=0.01, value=0.1, label="'MLSD' Hough value threshold")
96
- pre_distance_threshold = gr.Slider(minimum=1, maximum=20.0, step=0.01, value=0.1, label="'MLSD' Hough distance threshold")
97
- pre_recolor_mode = gr.Dropdown(label="'RECOLOR' mode", choices=["luminance", "intensity"], value="luminance")
98
- pre_recolor_gamma_correction = gr.Number(minimum=0., maximum=25., value=1., step=0.001, label="'RECOLOR' gamma correction")
99
- pre_blur_k_size = gr.Number(minimum=0, maximum=100, value=9, step=1, label="'BLUR' sigma")
100
- pre_openpose_extra = gr.Checkbox(value=True, label="'OPENPOSE' face and hand")
101
- pre_hed_scribble = gr.Checkbox(value=False, label="'HED' scribble")
102
- pre_pidinet_safe = gr.Checkbox(value=False, label="'PIDINET' safe")
103
- pre_lineart_coarse = gr.Checkbox(value=False, label="'LINEART' coarse")
104
- pre_use_cuda = gr.Checkbox(value=False, label="Use CUDA")
105
-
106
- with gr.Column():
107
- pre_result = gr.Image(label="Result", type="pil", interactive=False, format="png")
108
-
109
- pre_start.click(
110
- fn=process_inputs,
111
- inputs=[
112
- pre_image,
113
- pre_options,
114
- pre_img_resolution,
115
- pre_processor_resolution,
116
- pre_low_threshold,
117
- pre_high_threshold,
118
- pre_value_threshold,
119
- pre_distance_threshold,
120
- pre_recolor_mode,
121
- pre_recolor_gamma_correction,
122
- pre_blur_k_size,
123
- pre_openpose_extra,
124
- pre_hed_scribble,
125
- pre_pidinet_safe,
126
- pre_lineart_coarse,
127
- pre_use_cuda,
128
- ],
129
- outputs=[pre_result],
130
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,7 +1,4 @@
1
- stablepy==0.6.2
2
  torch==2.2.0
3
  gdown
4
- opencv-python
5
- unidecode
6
- pydantic==2.10.6
7
- huggingface_hub==0.29.3
 
1
+ git+https://github.com/R3gm/stablepy.git@flux_beta
2
  torch==2.2.0
3
  gdown
4
+ opencv-python
 
 
 
utils.py DELETED
@@ -1,485 +0,0 @@
1
- import os
2
- import re
3
- import gradio as gr
4
- from constants import (
5
- DIFFUSERS_FORMAT_LORAS,
6
- CIVITAI_API_KEY,
7
- HF_TOKEN,
8
- MODEL_TYPE_CLASS,
9
- DIRECTORY_LORAS,
10
- DIRECTORY_MODELS,
11
- DIFFUSECRAFT_CHECKPOINT_NAME,
12
- CACHE_HF,
13
- STORAGE_ROOT,
14
- )
15
- from huggingface_hub import HfApi
16
- from huggingface_hub import snapshot_download
17
- from diffusers import DiffusionPipeline
18
- from huggingface_hub import model_info as model_info_data
19
- from diffusers.pipelines.pipeline_loading_utils import variant_compatible_siblings
20
- from stablepy.diffusers_vanilla.utils import checkpoint_model_type
21
- from pathlib import PosixPath
22
- from unidecode import unidecode
23
- import urllib.parse
24
- import copy
25
- import requests
26
- from requests.adapters import HTTPAdapter
27
- from urllib3.util import Retry
28
- import shutil
29
- import subprocess
30
-
31
- USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
32
-
33
-
34
- def request_json_data(url):
35
- model_version_id = url.split('/')[-1]
36
- if "?modelVersionId=" in model_version_id:
37
- match = re.search(r'modelVersionId=(\d+)', url)
38
- model_version_id = match.group(1)
39
-
40
- endpoint_url = f"https://civitai.com/api/v1/model-versions/{model_version_id}"
41
-
42
- params = {}
43
- headers = {'User-Agent': USER_AGENT, 'content-type': 'application/json'}
44
- session = requests.Session()
45
- retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
46
- session.mount("https://", HTTPAdapter(max_retries=retries))
47
-
48
- try:
49
- result = session.get(endpoint_url, params=params, headers=headers, stream=True, timeout=(3.0, 15))
50
- result.raise_for_status()
51
- json_data = result.json()
52
- return json_data if json_data else None
53
- except Exception as e:
54
- print(f"Error: {e}")
55
- return None
56
-
57
-
58
- class ModelInformation:
59
- def __init__(self, json_data):
60
- self.model_version_id = json_data.get("id", "")
61
- self.model_id = json_data.get("modelId", "")
62
- self.download_url = json_data.get("downloadUrl", "")
63
- self.model_url = f"https://civitai.com/models/{self.model_id}?modelVersionId={self.model_version_id}"
64
- self.filename_url = next(
65
- (v.get("name", "") for v in json_data.get("files", []) if str(self.model_version_id) in v.get("downloadUrl", "") and v.get("type", "Model") == "Model"), ""
66
- )
67
- self.filename_url = self.filename_url if self.filename_url else ""
68
- self.description = json_data.get("description", "")
69
- if self.description is None: self.description = ""
70
- self.model_name = json_data.get("model", {}).get("name", "")
71
- self.model_type = json_data.get("model", {}).get("type", "")
72
- self.nsfw = json_data.get("model", {}).get("nsfw", False)
73
- self.poi = json_data.get("model", {}).get("poi", False)
74
- self.images = [img.get("url", "") for img in json_data.get("images", [])]
75
- self.example_prompt = json_data.get("trainedWords", [""])[0] if json_data.get("trainedWords") else ""
76
- self.original_json = copy.deepcopy(json_data)
77
-
78
-
79
- def retrieve_model_info(url):
80
- json_data = request_json_data(url)
81
- if not json_data:
82
- return None
83
- model_descriptor = ModelInformation(json_data)
84
- return model_descriptor
85
-
86
-
87
- def download_things(directory, url, hf_token="", civitai_api_key="", romanize=False):
88
- url = url.strip()
89
- downloaded_file_path = None
90
-
91
- if "drive.google.com" in url:
92
- original_dir = os.getcwd()
93
- os.chdir(directory)
94
- os.system(f"gdown --fuzzy {url}")
95
- os.chdir(original_dir)
96
- elif "huggingface.co" in url:
97
- url = url.replace("?download=true", "")
98
- # url = urllib.parse.quote(url, safe=':/') # fix encoding
99
- if "/blob/" in url:
100
- url = url.replace("/blob/", "/resolve/")
101
- user_header = f'"Authorization: Bearer {hf_token}"'
102
-
103
- filename = unidecode(url.split('/')[-1]) if romanize else url.split('/')[-1]
104
-
105
- if hf_token:
106
- os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {filename}")
107
- else:
108
- os.system(f"aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 {url} -d {directory} -o {filename}")
109
-
110
- downloaded_file_path = os.path.join(directory, filename)
111
-
112
- elif "civitai.com" in url:
113
-
114
- if not civitai_api_key:
115
- print("\033[91mYou need an API key to download Civitai models.\033[0m")
116
-
117
- model_profile = retrieve_model_info(url)
118
- if (
119
- model_profile is not None
120
- and model_profile.download_url
121
- and model_profile.filename_url
122
- ):
123
- url = model_profile.download_url
124
- filename = unidecode(model_profile.filename_url) if romanize else model_profile.filename_url
125
- else:
126
- if "?" in url:
127
- url = url.split("?")[0]
128
- filename = ""
129
-
130
- url_dl = url + f"?token={civitai_api_key}"
131
- print(f"Filename: {filename}")
132
-
133
- param_filename = ""
134
- if filename:
135
- param_filename = f"-o '{filename}'"
136
-
137
- aria2_command = (
138
- f'aria2c --console-log-level=error --summary-interval=10 -c -x 16 '
139
- f'-k 1M -s 16 -d "{directory}" {param_filename} "{url_dl}"'
140
- )
141
- os.system(aria2_command)
142
-
143
- if param_filename and os.path.exists(os.path.join(directory, filename)):
144
- downloaded_file_path = os.path.join(directory, filename)
145
-
146
- # # PLAN B
147
- # # Follow the redirect to get the actual download URL
148
- # curl_command = (
149
- # f'curl -L -sI --connect-timeout 5 --max-time 5 '
150
- # f'-H "Content-Type: application/json" '
151
- # f'-H "Authorization: Bearer {civitai_api_key}" "{url}"'
152
- # )
153
-
154
- # headers = os.popen(curl_command).read()
155
-
156
- # # Look for the redirected "Location" URL
157
- # location_match = re.search(r'location: (.+)', headers, re.IGNORECASE)
158
-
159
- # if location_match:
160
- # redirect_url = location_match.group(1).strip()
161
-
162
- # # Extract the filename from the redirect URL's "Content-Disposition"
163
- # filename_match = re.search(r'filename%3D%22(.+?)%22', redirect_url)
164
- # if filename_match:
165
- # encoded_filename = filename_match.group(1)
166
- # # Decode the URL-encoded filename
167
- # decoded_filename = urllib.parse.unquote(encoded_filename)
168
-
169
- # filename = unidecode(decoded_filename) if romanize else decoded_filename
170
- # print(f"Filename: {filename}")
171
-
172
- # aria2_command = (
173
- # f'aria2c --console-log-level=error --summary-interval=10 -c -x 16 '
174
- # f'-k 1M -s 16 -d "{directory}" -o "{filename}" "{redirect_url}"'
175
- # )
176
- # return_code = os.system(aria2_command)
177
-
178
- # # if return_code != 0:
179
- # # raise RuntimeError(f"Failed to download file: {filename}. Error code: {return_code}")
180
- # downloaded_file_path = os.path.join(directory, filename)
181
- # if not os.path.exists(downloaded_file_path):
182
- # downloaded_file_path = None
183
-
184
- # if not downloaded_file_path:
185
- # # Old method
186
- # if "?" in url:
187
- # url = url.split("?")[0]
188
- # url = url + f"?token={civitai_api_key}"
189
- # os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
190
-
191
- else:
192
- os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
193
-
194
- return downloaded_file_path
195
-
196
-
197
- def get_model_list(directory_path):
198
- model_list = []
199
- valid_extensions = {'.ckpt', '.pt', '.pth', '.safetensors', '.bin'}
200
-
201
- for filename in os.listdir(directory_path):
202
- if os.path.splitext(filename)[1] in valid_extensions:
203
- # name_without_extension = os.path.splitext(filename)[0]
204
- file_path = os.path.join(directory_path, filename)
205
- # model_list.append((name_without_extension, file_path))
206
- model_list.append(file_path)
207
- print('\033[34mFILE: ' + file_path + '\033[0m')
208
- return model_list
209
-
210
-
211
- def extract_parameters(input_string):
212
- parameters = {}
213
- input_string = input_string.replace("\n", "")
214
-
215
- if "Negative prompt:" not in input_string:
216
- if "Steps:" in input_string:
217
- input_string = input_string.replace("Steps:", "Negative prompt: Steps:")
218
- else:
219
- print("Invalid metadata")
220
- parameters["prompt"] = input_string
221
- return parameters
222
-
223
- parm = input_string.split("Negative prompt:")
224
- parameters["prompt"] = parm[0].strip()
225
- if "Steps:" not in parm[1]:
226
- print("Steps not detected")
227
- parameters["neg_prompt"] = parm[1].strip()
228
- return parameters
229
- parm = parm[1].split("Steps:")
230
- parameters["neg_prompt"] = parm[0].strip()
231
- input_string = "Steps:" + parm[1]
232
-
233
- # Extracting Steps
234
- steps_match = re.search(r'Steps: (\d+)', input_string)
235
- if steps_match:
236
- parameters['Steps'] = int(steps_match.group(1))
237
-
238
- # Extracting Size
239
- size_match = re.search(r'Size: (\d+x\d+)', input_string)
240
- if size_match:
241
- parameters['Size'] = size_match.group(1)
242
- width, height = map(int, parameters['Size'].split('x'))
243
- parameters['width'] = width
244
- parameters['height'] = height
245
-
246
- # Extracting other parameters
247
- other_parameters = re.findall(r'([^,:]+): (.*?)(?=, [^,:]+:|$)', input_string)
248
- for param in other_parameters:
249
- parameters[param[0].strip()] = param[1].strip('"')
250
-
251
- return parameters
252
-
253
-
254
- def get_my_lora(link_url, romanize):
255
- l_name = ""
256
- for url in [url.strip() for url in link_url.split(',')]:
257
- if not os.path.exists(f"./loras/{url.split('/')[-1]}"):
258
- l_name = download_things(DIRECTORY_LORAS, url, HF_TOKEN, CIVITAI_API_KEY, romanize)
259
- new_lora_model_list = get_model_list(DIRECTORY_LORAS)
260
- new_lora_model_list.insert(0, "None")
261
- new_lora_model_list = new_lora_model_list + DIFFUSERS_FORMAT_LORAS
262
- msg_lora = "Downloaded"
263
- if l_name:
264
- msg_lora += f": <b>{l_name}</b>"
265
- print(msg_lora)
266
-
267
- return gr.update(
268
- choices=new_lora_model_list
269
- ), gr.update(
270
- choices=new_lora_model_list
271
- ), gr.update(
272
- choices=new_lora_model_list
273
- ), gr.update(
274
- choices=new_lora_model_list
275
- ), gr.update(
276
- choices=new_lora_model_list
277
- ), gr.update(
278
- choices=new_lora_model_list
279
- ), gr.update(
280
- choices=new_lora_model_list
281
- ), gr.update(
282
- value=msg_lora
283
- )
284
-
285
-
286
- def info_html(json_data, title, subtitle):
287
- return f"""
288
- <div style='padding: 0; border-radius: 10px;'>
289
- <p style='margin: 0; font-weight: bold;'>{title}</p>
290
- <details>
291
- <summary>Details</summary>
292
- <p style='margin: 0; font-weight: bold;'>{subtitle}</p>
293
- </details>
294
- </div>
295
- """
296
-
297
-
298
- def get_model_type(repo_id: str):
299
- api = HfApi(token=os.environ.get("HF_TOKEN")) # if use private or gated model
300
- default = "SD 1.5"
301
- try:
302
- if os.path.exists(repo_id):
303
- tag, _, _, _ = checkpoint_model_type(repo_id)
304
- return DIFFUSECRAFT_CHECKPOINT_NAME[tag]
305
- else:
306
- model = api.model_info(repo_id=repo_id, timeout=5.0)
307
- tags = model.tags
308
- for tag in tags:
309
- if tag in MODEL_TYPE_CLASS.keys(): return MODEL_TYPE_CLASS.get(tag, default)
310
-
311
- except Exception:
312
- return default
313
- return default
314
-
315
-
316
- def restart_space(repo_id: str, factory_reboot: bool):
317
- api = HfApi(token=os.environ.get("HF_TOKEN"))
318
- try:
319
- runtime = api.get_space_runtime(repo_id=repo_id)
320
- if runtime.stage == "RUNNING":
321
- api.restart_space(repo_id=repo_id, factory_reboot=factory_reboot)
322
- print(f"Restarting space: {repo_id}")
323
- else:
324
- print(f"Space {repo_id} is in stage: {runtime.stage}")
325
- except Exception as e:
326
- print(e)
327
-
328
-
329
- def extract_exif_data(image):
330
- if image is None:
331
- return ""
332
-
333
- try:
334
- metadata_keys = ['parameters', 'metadata', 'prompt', 'Comment']
335
-
336
- for key in metadata_keys:
337
- if key in image.info:
338
- return image.info[key]
339
-
340
- return str(image.info)
341
-
342
- except Exception as e:
343
- return f"Error extracting metadata: {str(e)}"
344
-
345
-
346
- def create_mask_now(img, invert):
347
- import numpy as np
348
- import time
349
-
350
- time.sleep(0.5)
351
-
352
- transparent_image = img["layers"][0]
353
-
354
- # Extract the alpha channel
355
- alpha_channel = np.array(transparent_image)[:, :, 3]
356
-
357
- # Create a binary mask by thresholding the alpha channel
358
- binary_mask = alpha_channel > 1
359
-
360
- if invert:
361
- print("Invert")
362
- # Invert the binary mask so that the drawn shape is white and the rest is black
363
- binary_mask = np.invert(binary_mask)
364
-
365
- # Convert the binary mask to a 3-channel RGB mask
366
- rgb_mask = np.stack((binary_mask,) * 3, axis=-1)
367
-
368
- # Convert the mask to uint8
369
- rgb_mask = rgb_mask.astype(np.uint8) * 255
370
-
371
- return img["background"], rgb_mask
372
-
373
-
374
- def download_diffuser_repo(repo_name: str, model_type: str, revision: str = "main", token=True):
375
-
376
- variant = None
377
- if token is True and not os.environ.get("HF_TOKEN"):
378
- token = None
379
-
380
- if model_type == "SDXL":
381
- info = model_info_data(
382
- repo_name,
383
- token=token,
384
- revision=revision,
385
- timeout=5.0,
386
- )
387
-
388
- filenames = {sibling.rfilename for sibling in info.siblings}
389
- model_filenames, variant_filenames = variant_compatible_siblings(
390
- filenames, variant="fp16"
391
- )
392
-
393
- if len(variant_filenames):
394
- variant = "fp16"
395
-
396
- if model_type == "FLUX":
397
- cached_folder = snapshot_download(
398
- repo_id=repo_name,
399
- allow_patterns="transformer/*"
400
- )
401
- else:
402
- cached_folder = DiffusionPipeline.download(
403
- pretrained_model_name=repo_name,
404
- force_download=False,
405
- token=token,
406
- revision=revision,
407
- # mirror="https://hf-mirror.com",
408
- variant=variant,
409
- use_safetensors=True,
410
- trust_remote_code=False,
411
- timeout=5.0,
412
- )
413
-
414
- if isinstance(cached_folder, PosixPath):
415
- cached_folder = cached_folder.as_posix()
416
-
417
- # Task model
418
- # from huggingface_hub import hf_hub_download
419
- # hf_hub_download(
420
- # task_model,
421
- # filename="diffusion_pytorch_model.safetensors", # fix fp16 variant
422
- # )
423
-
424
- return cached_folder
425
-
426
-
427
- def get_folder_size_gb(folder_path):
428
- result = subprocess.run(["du", "-s", folder_path], capture_output=True, text=True)
429
-
430
- total_size_kb = int(result.stdout.split()[0])
431
- total_size_gb = total_size_kb / (1024 ** 2)
432
-
433
- return total_size_gb
434
-
435
-
436
- def get_used_storage_gb():
437
- try:
438
- used_gb = get_folder_size_gb(STORAGE_ROOT)
439
- print(f"Used Storage: {used_gb:.2f} GB")
440
- except Exception as e:
441
- used_gb = 999
442
- print(f"Error while retrieving the used storage: {e}.")
443
-
444
- return used_gb
445
-
446
-
447
- def delete_model(removal_candidate):
448
- print(f"Removing: {removal_candidate}")
449
-
450
- if os.path.exists(removal_candidate):
451
- os.remove(removal_candidate)
452
- else:
453
- diffusers_model = f"{CACHE_HF}{DIRECTORY_MODELS}--{removal_candidate.replace('/', '--')}"
454
- if os.path.isdir(diffusers_model):
455
- shutil.rmtree(diffusers_model)
456
-
457
-
458
- def progress_step_bar(step, total):
459
- # Calculate the percentage for the progress bar width
460
- percentage = min(100, ((step / total) * 100))
461
-
462
- return f"""
463
- <div style="position: relative; width: 100%; background-color: gray; border-radius: 5px; overflow: hidden;">
464
- <div style="width: {percentage}%; height: 17px; background-color: #800080; transition: width 0.5s;"></div>
465
- <div style="position: absolute; width: 100%; text-align: center; color: white; top: 0; line-height: 19px; font-size: 13px;">
466
- {int(percentage)}%
467
- </div>
468
- </div>
469
- """
470
-
471
-
472
- def html_template_message(msg):
473
- return f"""
474
- <div style="position: relative; width: 100%; background-color: gray; border-radius: 5px; overflow: hidden;">
475
- <div style="width: 0%; height: 17px; background-color: #800080; transition: width 0.5s;"></div>
476
- <div style="position: absolute; width: 100%; text-align: center; color: white; top: 0; line-height: 19px; font-size: 14px; font-weight: bold; text-shadow: 1px 1px 2px black;">
477
- {msg}
478
- </div>
479
- </div>
480
- """
481
-
482
-
483
- def escape_html(text):
484
- """Escapes HTML special characters in the input text."""
485
- return text.replace("<", "&lt;").replace(">", "&gt;").replace("\n", "<br>")