jon-pascal commited on
Commit
c161754
1 Parent(s): 0fccdcf

Update app.py

Browse files

made for maree

Files changed (1) hide show
  1. app.py +418 -536
app.py CHANGED
@@ -32,11 +32,11 @@ parser = argparse.ArgumentParser()
32
  parser.add_argument("--opt", type=str, default='options/SUPIR_v0.yaml')
33
  parser.add_argument("--ip", type=str, default='127.0.0.1')
34
  parser.add_argument("--port", type=int, default='6688')
35
- parser.add_argument("--no_llava", action='store_true', default=True)#False
36
- parser.add_argument("--use_image_slider", action='store_true', default=False)#False
37
  parser.add_argument("--log_history", action='store_true', default=False)
38
- parser.add_argument("--loading_half_params", action='store_true', default=False)#False
39
- parser.add_argument("--use_tile_vae", action='store_true', default=True)#False
40
  parser.add_argument("--encoder_tile_size", type=int, default=512)
41
  parser.add_argument("--decoder_tile_size", type=int, default=64)
42
  parser.add_argument("--load_8bit_llava", action='store_true', default=False)
@@ -59,7 +59,22 @@ if torch.cuda.device_count() > 0:
59
  def check_upload(input_image):
60
  if input_image is None:
61
  raise gr.Error("Please provide an image to restore.")
62
- return gr.update(visible = True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  def update_seed(is_randomize_seed, seed):
65
  if is_randomize_seed:
@@ -68,94 +83,98 @@ def update_seed(is_randomize_seed, seed):
68
 
69
  def reset():
70
  return [
71
- None,
72
- 0,
73
- None,
74
- None,
75
- "Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.",
76
- "painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth",
77
- 1,
78
- 1024,
79
- 1,
80
- 2,
81
- 50,
82
- -1.0,
83
- 1.,
84
- default_setting.s_cfg_Quality if torch.cuda.device_count() > 0 else 1.0,
85
- True,
86
- random.randint(0, max_64_bit_int),
87
- 5,
88
- 1.003,
89
- "Wavelet",
90
- "fp32",
91
- "fp32",
92
- 1.0,
93
- True,
94
- False,
95
- default_setting.spt_linear_CFG_Quality if torch.cuda.device_count() > 0 else 1.0,
96
- 0.,
97
- "v0-Q",
98
- "input",
99
- 6
100
  ]
101
 
102
  def check(input_image):
103
  if input_image is None:
104
  raise gr.Error("Please provide an image to restore.")
105
 
106
- @spaces.GPU(duration=420)
107
- def stage1_process(
108
  input_image,
109
- gamma_correction,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  diff_dtype,
111
- ae_dtype
 
 
 
 
 
 
 
112
  ):
113
- print('stage1_process ==>>')
114
- if torch.cuda.device_count() == 0:
115
- gr.Warning('Set this space to GPU config to make it work.')
116
- return None, None
117
- torch.cuda.set_device(SUPIR_device)
118
- LQ = HWC3(np.array(Image.open(input_image)))
119
- LQ = fix_resize(LQ, 512)
120
- # stage1
121
- LQ = np.array(LQ) / 255 * 2 - 1
122
- LQ = torch.tensor(LQ, dtype=torch.float32).permute(2, 0, 1).unsqueeze(0).to(SUPIR_device)[:, :3, :, :]
123
-
124
- model.ae_dtype = convert_dtype(ae_dtype)
125
- model.model.dtype = convert_dtype(diff_dtype)
126
-
127
- LQ = model.batchify_denoise(LQ, is_stage1=True)
128
- LQ = (LQ[0].permute(1, 2, 0) * 127.5 + 127.5).cpu().numpy().round().clip(0, 255).astype(np.uint8)
129
- # gamma correction
130
- LQ = LQ / 255.0
131
- LQ = np.power(LQ, gamma_correction)
132
- LQ *= 255.0
133
- LQ = LQ.round().clip(0, 255).astype(np.uint8)
134
- print('<<== stage1_process')
135
- return LQ, gr.update(visible = True)
136
-
137
- def stage2_process(*args, **kwargs):
138
  try:
139
- return restore_in_Xmin(*args, **kwargs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  except Exception as e:
141
- # NO_GPU_MESSAGE_INQUEUE
142
- print("gradio.exceptions.Error 'No GPU is currently available for you after 60s'")
143
- print('str(type(e)): ' + str(type(e))) # <class 'gradio.exceptions.Error'>
144
- print('str(e): ' + str(e)) # You have exceeded your GPU quota...
145
- try:
146
- print('e.message: ' + e.message) # No GPU is currently available for you after 60s
147
- except Exception as e2:
148
- print('Failure')
149
- if str(e).startswith("No GPU is currently available for you after 60s"):
150
- print('Exception identified!!!')
151
- #if str(type(e)) == "<class 'gradio.exceptions.Error'>":
152
- #print('Exception of name ' + type(e).__name__)
153
  raise e
154
 
155
  def restore_in_Xmin(
156
- noisy_image,
157
- rotation,
158
- denoise_image,
159
  prompt,
160
  a_prompt,
161
  n_prompt,
@@ -167,7 +186,6 @@ def restore_in_Xmin(
167
  s_stage1,
168
  s_stage2,
169
  s_cfg,
170
- randomize_seed,
171
  seed,
172
  s_churn,
173
  s_noise,
@@ -180,51 +198,16 @@ def restore_in_Xmin(
180
  spt_linear_CFG,
181
  spt_linear_s_stage2,
182
  model_select,
183
- output_format,
184
  allocation
185
  ):
186
- print("noisy_image:\n" + str(noisy_image))
187
- print("denoise_image:\n" + str(denoise_image))
188
- print("rotation: " + str(rotation))
189
- print("prompt: " + str(prompt))
190
- print("a_prompt: " + str(a_prompt))
191
- print("n_prompt: " + str(n_prompt))
192
- print("num_samples: " + str(num_samples))
193
- print("min_size: " + str(min_size))
194
- print("downscale: " + str(downscale))
195
- print("upscale: " + str(upscale))
196
- print("edm_steps: " + str(edm_steps))
197
- print("s_stage1: " + str(s_stage1))
198
- print("s_stage2: " + str(s_stage2))
199
- print("s_cfg: " + str(s_cfg))
200
- print("randomize_seed: " + str(randomize_seed))
201
- print("seed: " + str(seed))
202
- print("s_churn: " + str(s_churn))
203
- print("s_noise: " + str(s_noise))
204
- print("color_fix_type: " + str(color_fix_type))
205
- print("diff_dtype: " + str(diff_dtype))
206
- print("ae_dtype: " + str(ae_dtype))
207
- print("gamma_correction: " + str(gamma_correction))
208
- print("linear_CFG: " + str(linear_CFG))
209
- print("linear_s_stage2: " + str(linear_s_stage2))
210
- print("spt_linear_CFG: " + str(spt_linear_CFG))
211
- print("spt_linear_s_stage2: " + str(spt_linear_s_stage2))
212
- print("model_select: " + str(model_select))
213
- print("GPU time allocation: " + str(allocation) + " min")
214
- print("output_format: " + str(output_format))
215
-
216
- input_format = re.sub(r"^.*\.([^\.]+)$", r"\1", noisy_image)
217
-
218
- if input_format not in ['png', 'webp', 'jpg', 'jpeg', 'gif', 'bmp', 'heic']:
219
- gr.Warning('Invalid image format. Please first convert into *.png, *.webp, *.jpg, *.jpeg, *.gif, *.bmp or *.heic.')
220
  return None, None, None, None
221
 
222
- if output_format == "input":
223
- if noisy_image is None:
224
- output_format = "png"
225
- else:
226
- output_format = input_format
227
- print("final output_format: " + str(output_format))
228
 
229
  if prompt is None:
230
  prompt = ""
@@ -241,17 +224,9 @@ def restore_in_Xmin(
241
  a_prompt = prompt + a_prompt
242
  print("Final prompt: " + str(a_prompt))
243
 
244
- denoise_image = np.array(Image.open(noisy_image if denoise_image is None else denoise_image))
245
-
246
- if rotation == 90:
247
- denoise_image = np.array(list(zip(*denoise_image[::-1])))
248
- elif rotation == 180:
249
- denoise_image = np.array(list(zip(*denoise_image[::-1])))
250
- denoise_image = np.array(list(zip(*denoise_image[::-1])))
251
- elif rotation == -90:
252
- denoise_image = np.array(list(zip(*denoise_image))[::-1])
253
 
254
- if 1 < downscale:
255
  input_height, input_width, input_channel = denoise_image.shape
256
  denoise_image = np.array(Image.fromarray(denoise_image).resize((input_width // downscale, input_height // downscale), Image.LANCZOS))
257
 
@@ -259,10 +234,10 @@ def restore_in_Xmin(
259
 
260
  if torch.cuda.device_count() == 0:
261
  gr.Warning('Set this space to GPU config to make it work.')
262
- return [noisy_image, denoise_image], gr.update(label="Downloadable results in *." + output_format + " format", format = output_format, value = [denoise_image]), None, gr.update(visible=True)
263
 
264
  if model_select != model.current_model:
265
- print('load ' + model_select)
266
  if model_select == 'v0-Q':
267
  model.load_state_dict(ckpt_Q, strict=False)
268
  elif model_select == 'v0-F':
@@ -273,46 +248,26 @@ def restore_in_Xmin(
273
  model.model.dtype = convert_dtype(diff_dtype)
274
 
275
  # Allocation
276
- if allocation == 1:
277
- return restore_in_1min(
278
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
279
- )
280
- if allocation == 2:
281
- return restore_in_2min(
282
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
283
- )
284
- if allocation == 3:
285
- return restore_in_3min(
286
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
287
- )
288
- if allocation == 4:
289
- return restore_in_4min(
290
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
291
- )
292
- if allocation == 5:
293
- return restore_in_5min(
294
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
295
- )
296
- if allocation == 7:
297
- return restore_in_7min(
298
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
299
- )
300
- if allocation == 8:
301
- return restore_in_8min(
302
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
303
- )
304
- if allocation == 9:
305
- return restore_in_9min(
306
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
307
- )
308
- if allocation == 10:
309
- return restore_in_10min(
310
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
311
- )
312
- else:
313
- return restore_in_6min(
314
- noisy_image, denoise_image, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale, edm_steps, s_stage1, s_stage2, s_cfg, randomize_seed, seed, s_churn, s_noise, color_fix_type, diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select, output_format, allocation
315
- )
316
 
317
  @spaces.GPU(duration=59)
318
  def restore_in_1min(*args, **kwargs):
@@ -355,8 +310,7 @@ def restore_in_10min(*args, **kwargs):
355
  return restore_on_gpu(*args, **kwargs)
356
 
357
  def restore_on_gpu(
358
- noisy_image,
359
- input_image,
360
  prompt,
361
  a_prompt,
362
  n_prompt,
@@ -368,7 +322,6 @@ def restore_on_gpu(
368
  s_stage1,
369
  s_stage2,
370
  s_cfg,
371
- randomize_seed,
372
  seed,
373
  s_churn,
374
  s_noise,
@@ -381,15 +334,17 @@ def restore_on_gpu(
381
  spt_linear_CFG,
382
  spt_linear_s_stage2,
383
  model_select,
384
- output_format,
385
  allocation
386
  ):
387
  start = time.time()
388
- print('restore ==>>')
 
 
389
 
390
  torch.cuda.set_device(SUPIR_device)
391
 
392
  with torch.no_grad():
 
393
  input_image = upscale_image(input_image, upscale, unit_resolution=32, min_size=min_size)
394
  LQ = np.array(input_image) / 255.0
395
  LQ = np.power(LQ, gamma_correction)
@@ -399,57 +354,40 @@ def restore_on_gpu(
399
  LQ = torch.tensor(LQ, dtype=torch.float32).permute(2, 0, 1).unsqueeze(0).to(SUPIR_device)[:, :3, :, :]
400
  captions = ['']
401
 
402
- samples = model.batchify_sample(LQ, captions, num_steps=edm_steps, restoration_scale=s_stage1, s_churn=s_churn,
403
- s_noise=s_noise, cfg_scale=s_cfg, control_scale=s_stage2, seed=seed,
404
- num_samples=num_samples, p_p=a_prompt, n_p=n_prompt, color_fix_type=color_fix_type,
405
- use_linear_CFG=linear_CFG, use_linear_control_scale=linear_s_stage2,
406
- cfg_scale_start=spt_linear_CFG, control_scale_start=spt_linear_s_stage2)
 
 
407
 
408
  x_samples = (einops.rearrange(samples, 'b c h w -> b h w c') * 127.5 + 127.5).cpu().numpy().round().clip(
409
  0, 255).astype(np.uint8)
410
  results = [x_samples[i] for i in range(num_samples)]
411
  torch.cuda.empty_cache()
412
 
413
- # All the results have the same size
414
  input_height, input_width, input_channel = np.array(input_image).shape
415
  result_height, result_width, result_channel = np.array(results[0]).shape
416
 
417
- print('<<== restore')
418
  end = time.time()
419
  secondes = int(end - start)
420
  minutes = math.floor(secondes / 60)
421
  secondes = secondes - (minutes * 60)
422
  hours = math.floor(minutes / 60)
423
  minutes = minutes - (hours * 60)
424
- information = ("Start the process again if you want a different result. " if randomize_seed else "") + \
425
- "If you don't get the image you wanted, add more details in the « Image description ». " + \
426
- "Wait " + str(allocation) + " min before a new run to avoid quota penalty or use another computer. " + \
427
- "The image" + (" has" if len(results) == 1 else "s have") + " been generated in " + \
428
- ((str(hours) + " h, ") if hours != 0 else "") + \
429
- ((str(minutes) + " min, ") if hours != 0 or minutes != 0 else "") + \
430
- str(secondes) + " sec. " + \
431
- "The new image resolution is " + str(result_width) + \
432
- " pixels large and " + str(result_height) + \
433
- " pixels high, so a resolution of " + f'{result_width * result_height:,}' + " pixels."
434
- print(information)
435
- try:
436
- print("Initial resolution: " + f'{input_width * input_height:,}')
437
- print("Final resolution: " + f'{result_width * result_height:,}')
438
- print("edm_steps: " + str(edm_steps))
439
- print("num_samples: " + str(num_samples))
440
- print("downscale: " + str(downscale))
441
- print("Estimated minutes: " + f'{(((result_width * result_height**(1/1.75)) * input_width * input_height * (edm_steps**(1/2)) * (num_samples**(1/2.5)))**(1/2.5)) / 25000:,}')
442
- except Exception as e:
443
- print('Exception of Estimation')
444
 
445
  # Only one image can be shown in the slider
446
- return [noisy_image] + [results[0]], gr.update(label="Downloadable results in *." + output_format + " format", format = output_format, value = results), gr.update(value = information, visible = True), gr.update(visible=True)
447
 
448
  def load_and_reset(param_setting):
449
- print('load_and_reset ==>>')
450
  if torch.cuda.device_count() == 0:
451
  gr.Warning('Set this space to GPU config to make it work.')
452
- return None, None, None, None, None, None, None, None, None, None, None, None, None, None
453
  edm_steps = default_setting.edm_steps
454
  s_stage2 = 1.0
455
  s_stage1 = -1.0
@@ -476,277 +414,281 @@ def load_and_reset(param_setting):
476
  else:
477
  raise NotImplementedError
478
  gr.Info('The parameters are reset.')
479
- print('<<== load_and_reset')
480
  return edm_steps, s_cfg, s_stage2, s_stage1, s_churn, s_noise, a_prompt, n_prompt, color_fix_type, linear_CFG, \
481
  linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select
482
 
483
  def log_information(result_gallery):
484
- print('log_information')
485
  if result_gallery is not None:
486
  for i, result in enumerate(result_gallery):
487
  print(result[0])
488
 
489
  def on_select_result(result_slider, result_gallery, evt: gr.SelectData):
490
- print('on_select_result')
491
  if result_gallery is not None:
492
  for i, result in enumerate(result_gallery):
493
  print(result[0])
494
  return [result_slider[0], result_gallery[evt.index][0]]
495
 
496
  title_html = """
497
- <h1><center>SUPIR</center></h1>
498
- <big><center>Upscale your images up to x10 freely, without account, without watermark and download it</center></big>
499
- <center><big><big>🤸<big><big><big><big><big><big>🤸</big></big></big></big></big></big></big></big></center>
500
-
501
- <p>This is an online demo of SUPIR, a practicing model scaling for photo-realistic image restoration.
502
- The content added by SUPIR is <b><u>imagination, not real-world information</u></b>.
503
- SUPIR is for beauty and illustration only.
504
- Most of the processes last few minutes.
505
- If you want to upscale AI-generated images, be noticed that <i>PixArt Sigma</i> space can directly generate 5984x5984 images.
506
- Due to Gradio issues, the generated image is slightly less satured than the original.
507
- Please leave a <a href="https://huggingface.co/spaces/Fabrice-TIERCELIN/SUPIR/discussions/new">message in discussion</a> if you encounter issues.
508
- You can also use <a href="https://huggingface.co/spaces/gokaygokay/AuraSR">AuraSR</a> to upscale x4.
509
-
510
- <p><center><a href="https://arxiv.org/abs/2401.13627">Paper</a> &emsp; <a href="http://supir.xpixel.group/">Project Page</a> &emsp; <a href="https://huggingface.co/blog/MonsterMMORPG/supir-sota-image-upscale-better-than-magnific-ai">Local Install Guide</a></center></p>
511
- <p><center><a style="display:inline-block" href='https://github.com/Fanghua-Yu/SUPIR'><img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Fanghua-Yu/SUPIR?style=social"></a></center></p>
512
  """
513
 
514
-
515
- claim_md = """
516
- ## **Piracy**
517
- The images are not stored but the logs are saved during a month.
518
- ## **How to get SUPIR**
519
- You can get SUPIR on HuggingFace by [duplicating this space](https://huggingface.co/spaces/Fabrice-TIERCELIN/SUPIR?duplicate=true) and set GPU.
520
- You can also install SUPIR on your computer following [this tutorial](https://huggingface.co/blog/MonsterMMORPG/supir-sota-image-upscale-better-than-magnific-ai).
521
- You can install _Pinokio_ on your computer and then install _SUPIR_ into it. It should be quite easy if you have an Nvidia GPU.
522
- ## **Terms of use**
523
- By using this service, users are required to agree to the following terms: The service is a research preview intended for non-commercial use only. It only provides limited safety measures and may generate offensive content. It must not be used for any illegal, harmful, violent, racist, or sexual purposes. The service may collect user dialogue data for future research. Please submit a feedback to us if you get any inappropriate answer! We will collect those to keep improving our models. For an optimal experience, please use desktop computers for this demo, as mobile devices may compromise its quality.
524
- ## **License**
525
- The service is a research preview intended for non-commercial use only, subject to the model [License](https://github.com/Fanghua-Yu/SUPIR) of SUPIR.
526
- """
527
-
528
  # Gradio interface
529
  with gr.Blocks() as interface:
530
  if torch.cuda.device_count() == 0:
531
  with gr.Row():
532
  gr.HTML("""
533
- <p style="background-color: red;"><big><big><big><b>⚠️To use SUPIR, <a href="https://huggingface.co/spaces/Fabrice-TIERCELIN/SUPIR?duplicate=true">duplicate this space</a> and set a GPU with 30 GB VRAM.</b>
534
-
535
- You can't use SUPIR directly here because this space runs on a CPU, which is not enough for SUPIR. Please provide <a href="https://huggingface.co/spaces/Fabrice-TIERCELIN/SUPIR/discussions/new">feedback</a> if you have issues.
536
- </big></big></big></p>
537
  """)
538
  gr.HTML(title_html)
539
 
540
- input_image = gr.Image(label="Input (*.png, *.webp, *.jpeg, *.jpg, *.gif, *.bmp, *.heic)", show_label=True, type="filepath", height=600, elem_id="image-input")
541
- rotation = gr.Radio([["No rotation", 0], ["⤵ Rotate +90°", 90], ["↩ Return 180°", 180], ["⤴ Rotate -90°", -90]], label="Orientation correction", info="Will apply the following rotation before restoring the image; the AI needs a good orientation to understand the content", value=0, interactive=True, visible=False)
542
  with gr.Group():
543
- prompt = gr.Textbox(label="Image description", info="Help the AI understand what the image represents; describe as much as possible, especially the details we can't see on the original image; you can write in any language", value="", placeholder="A 33 years old man, walking, in the street, Santiago, morning, Summer, photorealistic", lines=3)
544
- prompt_hint = gr.HTML("You can use a <a href='"'https://huggingface.co/spaces/MaziyarPanahi/llava-llama-3-8b'"'>LlaVa space</a> to auto-generate the description of your image.")
545
- upscale = gr.Radio([["x1", 1], ["x2", 2], ["x3", 3], ["x4", 4], ["x5", 5], ["x6", 6], ["x7", 7], ["x8", 8], ["x9", 9], ["x10", 10]], label="Upscale factor", info="Resolution x1 to x10", value=2, interactive=True)
546
- output_format = gr.Radio([["As input", "input"], ["*.png", "png"], ["*.webp", "webp"], ["*.jpeg", "jpeg"], ["*.gif", "gif"], ["*.bmp", "bmp"]], label="Image format for result", info="File extention", value="input", interactive=True)
547
- allocation = gr.Radio([["1 min", 1], ["2 min", 2], ["3 min", 3], ["4 min", 4], ["5 min", 5]], label="GPU allocation time", info="lower=May abort run, higher=Quota penalty for next runs", value=5, interactive=True)
548
-
549
- with gr.Accordion("Pre-denoising (optional)", open=False):
550
- gamma_correction = gr.Slider(label="Gamma Correction", info = "lower=lighter, higher=darker", minimum=0.1, maximum=2.0, value=1.0, step=0.1)
551
- denoise_button = gr.Button(value="Pre-denoise")
552
- denoise_image = gr.Image(label="Denoised image", show_label=True, type="filepath", sources=[], interactive = False, height=600, elem_id="image-s1")
553
- denoise_information = gr.HTML(value="If present, the denoised image will be used for the restoration instead of the input image.", visible=False)
 
 
 
 
 
 
 
 
 
 
 
 
554
 
555
  with gr.Accordion("Advanced options", open=False):
556
- a_prompt = gr.Textbox(label="Additional image description",
557
- info="Completes the main image description",
558
- value='Cinematic, High Contrast, highly detailed, taken using a Canon EOS R '
559
- 'camera, hyper detailed photo - realistic maximum detail, 32k, Color '
560
- 'Grading, ultra HD, extreme meticulous detailing, skin pore detailing, '
561
- 'hyper sharpness, perfect without deformations.',
562
- lines=3)
563
- n_prompt = gr.Textbox(label="Negative image description",
564
- info="Disambiguate by listing what the image does NOT represent",
565
- value='painting, oil painting, illustration, drawing, art, sketch, anime, '
566
- 'cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, '
567
- 'worst quality, low quality, frames, watermark, signature, jpeg artifacts, '
568
- 'deformed, lowres, over-smooth',
569
- lines=3)
570
- edm_steps = gr.Slider(label="Steps", info="lower=faster, higher=more details", minimum=1, maximum=200, value=default_setting.edm_steps if torch.cuda.device_count() > 0 else 1, step=1)
571
- num_samples = gr.Slider(label="Num Samples", info="Number of generated results", minimum=1, maximum=4 if not args.use_image_slider else 1
572
- , value=1, step=1)
573
- min_size = gr.Slider(label="Minimum size", info="Minimum height, minimum width of the result", minimum=32, maximum=4096, value=1024, step=32)
574
- downscale = gr.Radio([["/1", 1], ["/2", 2], ["/3", 3], ["/4", 4], ["/5", 5], ["/6", 6], ["/7", 7], ["/8", 8], ["/9", 9], ["/10", 10]], label="Pre-downscale factor", info="Reducing blurred image reduce the process time", value=1, interactive=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
  with gr.Row():
576
  with gr.Column():
577
- model_select = gr.Radio([["💃 Quality (v0-Q)", "v0-Q"], ["🎯 Fidelity (v0-F)", "v0-F"]], label="Model Selection", info="Pretrained model", value="v0-Q",
578
- interactive=True)
 
 
 
 
 
579
  with gr.Column():
580
- color_fix_type = gr.Radio([["None", "None"], ["AdaIn (improve as a photo)", "AdaIn"], ["Wavelet (for JPEG artifacts)", "Wavelet"]], label="Color-Fix Type", info="AdaIn=Improve following a style, Wavelet=For JPEG artifacts", value="AdaIn",
581
- interactive=True)
582
- s_cfg = gr.Slider(label="Text Guidance Scale", info="lower=follow the image, higher=follow the prompt", minimum=1.0, maximum=15.0,
583
- value=default_setting.s_cfg_Quality if torch.cuda.device_count() > 0 else 1.0, step=0.1)
584
- s_stage2 = gr.Slider(label="Restoring Guidance Strength", minimum=0., maximum=1., value=1., step=0.05)
585
- s_stage1 = gr.Slider(label="Pre-denoising Guidance Strength", minimum=-1.0, maximum=6.0, value=-1.0, step=1.0)
586
- s_churn = gr.Slider(label="S-Churn", minimum=0, maximum=40, value=5, step=1)
587
- s_noise = gr.Slider(label="S-Noise", minimum=1.0, maximum=1.1, value=1.003, step=0.001)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  with gr.Row():
589
  with gr.Column():
590
  linear_CFG = gr.Checkbox(label="Linear CFG", value=True)
591
- spt_linear_CFG = gr.Slider(label="CFG Start", minimum=1.0,
592
- maximum=9.0, value=default_setting.spt_linear_CFG_Quality if torch.cuda.device_count() > 0 else 1.0, step=0.5)
 
 
 
 
 
593
  with gr.Column():
594
  linear_s_stage2 = gr.Checkbox(label="Linear Restoring Guidance", value=False)
595
- spt_linear_s_stage2 = gr.Slider(label="Guidance Start", minimum=0.,
596
- maximum=1., value=0., step=0.05)
 
 
 
 
 
597
  with gr.Column():
598
- diff_dtype = gr.Radio([["fp32 (precision)", "fp32"], ["fp16 (medium)", "fp16"], ["bf16 (speed)", "bf16"]], label="Diffusion Data Type", value="fp32",
599
- interactive=True)
 
 
 
 
600
  with gr.Column():
601
- ae_dtype = gr.Radio([["fp32 (precision)", "fp32"], ["bf16 (speed)", "bf16"]], label="Auto-Encoder Data Type", value="fp32",
602
- interactive=True)
603
- randomize_seed = gr.Checkbox(label = "\U0001F3B2 Randomize seed", value = True, info = "If checked, result is always different")
604
- seed = gr.Slider(label="Seed", minimum=0, maximum=max_64_bit_int, step=1, randomize=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  with gr.Group():
606
- param_setting = gr.Radio(["Quality", "Fidelity"], interactive=True, label="Presetting", value = "Quality")
 
 
 
 
 
607
  restart_button = gr.Button(value="Apply presetting")
608
 
609
  with gr.Column():
610
- diffusion_button = gr.Button(value="🚀 Upscale/Restore", variant = "primary", elem_id = "process_button")
611
- reset_btn = gr.Button(value="🧹 Reinit page", variant="stop", elem_id="reset_button", visible = False)
612
-
613
- restore_information = gr.HTML(value = "Restart the process to get another result.", visible = False)
614
- result_slider = ImageSlider(label = 'Comparator', show_label = False, interactive = False, elem_id = "slider1", show_download_button = False)
615
- result_gallery = gr.Gallery(label = 'Downloadable results', show_label = True, interactive = False, elem_id = "gallery1")
616
-
617
- gr.Examples(
618
- examples = [
619
- [
620
- "./Examples/Example1.png",
621
- 0,
622
- None,
623
- "Group of people, walking, happy, in the street, photorealistic, 8k, extremely detailled",
624
- "Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.",
625
- "painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth",
626
- 2,
627
- 1024,
628
- 1,
629
- 8,
630
- 200,
631
- -1,
632
- 1,
633
- 7.5,
634
- False,
635
- 42,
636
- 5,
637
- 1.003,
638
- "AdaIn",
639
- "fp16",
640
- "bf16",
641
- 1.0,
642
- True,
643
- 4,
644
- False,
645
- 0.,
646
- "v0-Q",
647
- "input",
648
- 5
649
- ],
650
- [
651
- "./Examples/Example2.jpeg",
652
- 0,
653
- None,
654
- "La cabeza de un gato atigrado, en una casa, fotorrealista, 8k, extremadamente detallada",
655
- "Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.",
656
- "painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth",
657
- 1,
658
- 1024,
659
- 1,
660
- 1,
661
- 200,
662
- -1,
663
- 1,
664
- 7.5,
665
- False,
666
- 42,
667
- 5,
668
- 1.003,
669
- "Wavelet",
670
- "fp16",
671
- "bf16",
672
- 1.0,
673
- True,
674
- 4,
675
- False,
676
- 0.,
677
- "v0-Q",
678
- "input",
679
- 4
680
- ],
681
- [
682
- "./Examples/Example3.webp",
683
- 0,
684
- None,
685
- "A red apple",
686
- "Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.",
687
- "painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth",
688
- 1,
689
- 1024,
690
- 1,
691
- 1,
692
- 200,
693
- -1,
694
- 1,
695
- 7.5,
696
- False,
697
- 42,
698
- 5,
699
- 1.003,
700
- "Wavelet",
701
- "fp16",
702
- "bf16",
703
- 1.0,
704
- True,
705
- 4,
706
- False,
707
- 0.,
708
- "v0-Q",
709
- "input",
710
- 4
711
- ],
712
- [
713
- "./Examples/Example3.webp",
714
- 0,
715
- None,
716
- "A red marble",
717
- "Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.",
718
- "painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth",
719
- 1,
720
- 1024,
721
- 1,
722
- 1,
723
- 200,
724
- -1,
725
- 1,
726
- 7.5,
727
- False,
728
- 42,
729
- 5,
730
- 1.003,
731
- "Wavelet",
732
- "fp16",
733
- "bf16",
734
- 1.0,
735
- True,
736
- 4,
737
- False,
738
- 0.,
739
- "v0-Q",
740
- "input",
741
- 4
742
- ],
743
- ],
744
- run_on_click = True,
745
- fn = stage2_process,
746
- inputs = [
747
  input_image,
748
- rotation,
749
- denoise_image,
750
  prompt,
751
  a_prompt,
752
  n_prompt,
@@ -758,124 +700,63 @@ with gr.Blocks() as interface:
758
  s_stage1,
759
  s_stage2,
760
  s_cfg,
761
- randomize_seed,
762
  seed,
763
  s_churn,
764
  s_noise,
765
  color_fix_type,
766
  diff_dtype,
767
  ae_dtype,
768
- gamma_correction,
769
  linear_CFG,
770
  linear_s_stage2,
771
  spt_linear_CFG,
772
  spt_linear_s_stage2,
773
  model_select,
774
- output_format,
775
  allocation
776
  ],
777
- outputs = [
778
  result_slider,
779
  result_gallery,
780
  restore_information,
781
  reset_btn
782
- ],
783
- cache_examples = False,
 
 
 
 
 
784
  )
785
 
786
- with gr.Row():
787
- gr.Markdown(claim_md)
788
-
789
- input_image.upload(fn = check_upload, inputs = [
790
- input_image
791
- ], outputs = [
792
- rotation
793
- ], queue = False, show_progress = False)
794
-
795
- denoise_button.click(fn = check, inputs = [
796
- input_image
797
- ], outputs = [], queue = False, show_progress = False).success(fn = stage1_process, inputs = [
798
- input_image,
799
- gamma_correction,
800
- diff_dtype,
801
- ae_dtype
802
- ], outputs=[
803
- denoise_image,
804
- denoise_information
805
- ])
806
-
807
- diffusion_button.click(fn = update_seed, inputs = [
808
- randomize_seed,
809
- seed
810
- ], outputs = [
811
- seed
812
- ], queue = False, show_progress = False).then(fn = check, inputs = [
813
- input_image
814
- ], outputs = [], queue = False, show_progress = False).success(fn=stage2_process, inputs = [
815
- input_image,
816
- rotation,
817
- denoise_image,
818
- prompt,
819
- a_prompt,
820
- n_prompt,
821
- num_samples,
822
- min_size,
823
- downscale,
824
- upscale,
825
- edm_steps,
826
- s_stage1,
827
- s_stage2,
828
- s_cfg,
829
- randomize_seed,
830
- seed,
831
- s_churn,
832
- s_noise,
833
- color_fix_type,
834
- diff_dtype,
835
- ae_dtype,
836
- gamma_correction,
837
- linear_CFG,
838
- linear_s_stage2,
839
- spt_linear_CFG,
840
- spt_linear_s_stage2,
841
- model_select,
842
- output_format,
843
- allocation
844
- ], outputs = [
845
- result_slider,
846
- result_gallery,
847
- restore_information,
848
- reset_btn
849
- ]).success(fn = log_information, inputs = [
850
- result_gallery
851
- ], outputs = [], queue = False, show_progress = False)
852
-
853
  result_gallery.change(on_select_result, [result_slider, result_gallery], result_slider)
854
  result_gallery.select(on_select_result, [result_slider, result_gallery], result_slider)
855
 
856
- restart_button.click(fn = load_and_reset, inputs = [
857
- param_setting
858
- ], outputs = [
859
- edm_steps,
860
- s_cfg,
861
- s_stage2,
862
- s_stage1,
863
- s_churn,
864
- s_noise,
865
- a_prompt,
866
- n_prompt,
867
- color_fix_type,
868
- linear_CFG,
869
- linear_s_stage2,
870
- spt_linear_CFG,
871
- spt_linear_s_stage2,
872
- model_select
873
- ])
874
-
875
- reset_btn.click(fn = reset, inputs = [], outputs = [
 
 
 
 
 
876
  input_image,
877
- rotation,
878
- denoise_image,
879
  prompt,
880
  a_prompt,
881
  n_prompt,
@@ -887,21 +768,22 @@ with gr.Blocks() as interface:
887
  s_stage1,
888
  s_stage2,
889
  s_cfg,
890
- randomize_seed,
891
  seed,
892
  s_churn,
893
  s_noise,
894
  color_fix_type,
895
  diff_dtype,
896
  ae_dtype,
897
- gamma_correction,
898
  linear_CFG,
899
  linear_s_stage2,
900
  spt_linear_CFG,
901
  spt_linear_s_stage2,
902
  model_select,
903
- output_format,
904
  allocation
905
- ], queue = False, show_progress = False)
906
-
 
 
 
907
  interface.queue(10).launch()
 
32
  parser.add_argument("--opt", type=str, default='options/SUPIR_v0.yaml')
33
  parser.add_argument("--ip", type=str, default='127.0.0.1')
34
  parser.add_argument("--port", type=int, default='6688')
35
+ parser.add_argument("--no_llava", action='store_true', default=True)
36
+ parser.add_argument("--use_image_slider", action='store_true', default=False)
37
  parser.add_argument("--log_history", action='store_true', default=False)
38
+ parser.add_argument("--loading_half_params", action='store_true', default=False)
39
+ parser.add_argument("--use_tile_vae", action='store_true', default=True)
40
  parser.add_argument("--encoder_tile_size", type=int, default=512)
41
  parser.add_argument("--decoder_tile_size", type=int, default=64)
42
  parser.add_argument("--load_8bit_llava", action='store_true', default=False)
 
59
  def check_upload(input_image):
60
  if input_image is None:
61
  raise gr.Error("Please provide an image to restore.")
62
+ return gr.update(visible=True)
63
+
64
+ def process_uploaded_image(image_path):
65
+ image = Image.open(image_path)
66
+ width, height = image.size
67
+ max_dim = max(width, height)
68
+ if max_dim > 1024:
69
+ if width > height:
70
+ new_width = 1024
71
+ new_height = int((1024 / width) * height)
72
+ else:
73
+ new_height = 1024
74
+ new_width = int((1024 / height) * width)
75
+ image = image.resize((new_width, new_height), Image.ANTIALIAS)
76
+ image.save(image_path)
77
+ return image_path
78
 
79
  def update_seed(is_randomize_seed, seed):
80
  if is_randomize_seed:
 
83
 
84
  def reset():
85
  return [
86
+ None, # input_image
87
+ "", # prompt
88
+ 'Cinematic, High Contrast, highly detailed, taken using a Canon EOS R camera, hyper detailed photo - realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations.', # a_prompt
89
+ 'painting, oil painting, illustration, drawing, art, sketch, anime, cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, worst quality, low quality, frames, watermark, signature, jpeg artifacts, deformed, lowres, over-smooth', # n_prompt
90
+ 1, # num_samples
91
+ 1024, # min_size
92
+ 1, # downscale
93
+ 2, # upscale
94
+ default_setting.edm_steps if torch.cuda.device_count() > 0 else 1, # edm_steps
95
+ -1.0, # s_stage1
96
+ 1.0, # s_stage2
97
+ default_setting.s_cfg_Quality if torch.cuda.device_count() > 0 else 1.0, # s_cfg
98
+ random.randint(0, max_64_bit_int), # seed
99
+ 5, # s_churn
100
+ 1.003, # s_noise
101
+ 'Wavelet', # color_fix_type
102
+ 'fp32', # diff_dtype
103
+ 'fp32', # ae_dtype
104
+ 1.0, # gamma_correction
105
+ True, # linear_CFG
106
+ False, # linear_s_stage2
107
+ default_setting.spt_linear_CFG_Quality if torch.cuda.device_count() > 0 else 1.0, # spt_linear_CFG
108
+ 0.0, # spt_linear_s_stage2
109
+ 'v0-Q', # model_select
110
+ 4 # allocation
 
 
 
 
111
  ]
112
 
113
  def check(input_image):
114
  if input_image is None:
115
  raise gr.Error("Please provide an image to restore.")
116
 
117
+ def stage2_process(
 
118
  input_image,
119
+ prompt,
120
+ a_prompt,
121
+ n_prompt,
122
+ num_samples,
123
+ min_size,
124
+ downscale,
125
+ upscale,
126
+ edm_steps,
127
+ s_stage1,
128
+ s_stage2,
129
+ s_cfg,
130
+ seed,
131
+ s_churn,
132
+ s_noise,
133
+ color_fix_type,
134
  diff_dtype,
135
+ ae_dtype,
136
+ gamma_correction,
137
+ linear_CFG,
138
+ linear_s_stage2,
139
+ spt_linear_CFG,
140
+ spt_linear_s_stage2,
141
+ model_select,
142
+ allocation
143
  ):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  try:
145
+ return restore_in_Xmin(
146
+ input_image,
147
+ prompt,
148
+ a_prompt,
149
+ n_prompt,
150
+ num_samples,
151
+ min_size,
152
+ downscale,
153
+ upscale,
154
+ edm_steps,
155
+ s_stage1,
156
+ s_stage2,
157
+ s_cfg,
158
+ seed,
159
+ s_churn,
160
+ s_noise,
161
+ color_fix_type,
162
+ diff_dtype,
163
+ ae_dtype,
164
+ gamma_correction,
165
+ linear_CFG,
166
+ linear_s_stage2,
167
+ spt_linear_CFG,
168
+ spt_linear_s_stage2,
169
+ model_select,
170
+ allocation
171
+ )
172
  except Exception as e:
173
+ print(f"Exception occurred: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
174
  raise e
175
 
176
  def restore_in_Xmin(
177
+ input_image_path,
 
 
178
  prompt,
179
  a_prompt,
180
  n_prompt,
 
186
  s_stage1,
187
  s_stage2,
188
  s_cfg,
 
189
  seed,
190
  s_churn,
191
  s_noise,
 
198
  spt_linear_CFG,
199
  spt_linear_s_stage2,
200
  model_select,
 
201
  allocation
202
  ):
203
+ print("Starting image restoration process...")
204
+ input_format = re.sub(r"^.*\.([^\.]+)$", r"\1", input_image_path)
205
+
206
+ if input_format.lower() not in ['png', 'webp', 'jpg', 'jpeg', 'gif', 'bmp', 'heic']:
207
+ gr.Warning('Invalid image format. Please use a supported image format.')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  return None, None, None, None
209
 
210
+ output_format = "png"
 
 
 
 
 
211
 
212
  if prompt is None:
213
  prompt = ""
 
224
  a_prompt = prompt + a_prompt
225
  print("Final prompt: " + str(a_prompt))
226
 
227
+ denoise_image = np.array(Image.open(input_image_path))
 
 
 
 
 
 
 
 
228
 
229
+ if downscale > 1:
230
  input_height, input_width, input_channel = denoise_image.shape
231
  denoise_image = np.array(Image.fromarray(denoise_image).resize((input_width // downscale, input_height // downscale), Image.LANCZOS))
232
 
 
234
 
235
  if torch.cuda.device_count() == 0:
236
  gr.Warning('Set this space to GPU config to make it work.')
237
+ return [input_image_path, denoise_image], gr.update(label="Downloadable results", format=output_format, value=[denoise_image]), None, gr.update(visible=True)
238
 
239
  if model_select != model.current_model:
240
+ print('Loading model: ' + model_select)
241
  if model_select == 'v0-Q':
242
  model.load_state_dict(ckpt_Q, strict=False)
243
  elif model_select == 'v0-F':
 
248
  model.model.dtype = convert_dtype(diff_dtype)
249
 
250
  # Allocation
251
+ allocation_functions = {
252
+ 1: restore_in_1min,
253
+ 2: restore_in_2min,
254
+ 3: restore_in_3min,
255
+ 4: restore_in_4min,
256
+ 5: restore_in_5min,
257
+ 6: restore_in_6min,
258
+ 7: restore_in_7min,
259
+ 8: restore_in_8min,
260
+ 9: restore_in_9min,
261
+ 10: restore_in_10min,
262
+ }
263
+
264
+ restore_function = allocation_functions.get(allocation, restore_in_4min)
265
+ return restore_function(
266
+ input_image_path, prompt, a_prompt, n_prompt, num_samples, min_size, downscale, upscale,
267
+ edm_steps, s_stage1, s_stage2, s_cfg, seed, s_churn, s_noise, color_fix_type,
268
+ diff_dtype, ae_dtype, gamma_correction, linear_CFG, linear_s_stage2, spt_linear_CFG,
269
+ spt_linear_s_stage2, model_select, allocation
270
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
 
272
  @spaces.GPU(duration=59)
273
  def restore_in_1min(*args, **kwargs):
 
310
  return restore_on_gpu(*args, **kwargs)
311
 
312
  def restore_on_gpu(
313
+ input_image_path,
 
314
  prompt,
315
  a_prompt,
316
  n_prompt,
 
322
  s_stage1,
323
  s_stage2,
324
  s_cfg,
 
325
  seed,
326
  s_churn,
327
  s_noise,
 
334
  spt_linear_CFG,
335
  spt_linear_s_stage2,
336
  model_select,
 
337
  allocation
338
  ):
339
  start = time.time()
340
+ print('Starting GPU restoration...')
341
+
342
+ output_format = "png"
343
 
344
  torch.cuda.set_device(SUPIR_device)
345
 
346
  with torch.no_grad():
347
+ input_image = Image.open(input_image_path)
348
  input_image = upscale_image(input_image, upscale, unit_resolution=32, min_size=min_size)
349
  LQ = np.array(input_image) / 255.0
350
  LQ = np.power(LQ, gamma_correction)
 
354
  LQ = torch.tensor(LQ, dtype=torch.float32).permute(2, 0, 1).unsqueeze(0).to(SUPIR_device)[:, :3, :, :]
355
  captions = ['']
356
 
357
+ samples = model.batchify_sample(
358
+ LQ, captions, num_steps=edm_steps, restoration_scale=s_stage1, s_churn=s_churn,
359
+ s_noise=s_noise, cfg_scale=s_cfg, control_scale=s_stage2, seed=seed,
360
+ num_samples=num_samples, p_p=a_prompt, n_p=n_prompt, color_fix_type=color_fix_type,
361
+ use_linear_CFG=linear_CFG, use_linear_control_scale=linear_s_stage2,
362
+ cfg_scale_start=spt_linear_CFG, control_scale_start=spt_linear_s_stage2
363
+ )
364
 
365
  x_samples = (einops.rearrange(samples, 'b c h w -> b h w c') * 127.5 + 127.5).cpu().numpy().round().clip(
366
  0, 255).astype(np.uint8)
367
  results = [x_samples[i] for i in range(num_samples)]
368
  torch.cuda.empty_cache()
369
 
 
370
  input_height, input_width, input_channel = np.array(input_image).shape
371
  result_height, result_width, result_channel = np.array(results[0]).shape
372
 
373
+ print('Restoration completed.')
374
  end = time.time()
375
  secondes = int(end - start)
376
  minutes = math.floor(secondes / 60)
377
  secondes = secondes - (minutes * 60)
378
  hours = math.floor(minutes / 60)
379
  minutes = minutes - (hours * 60)
380
+ information = ("Start the process again if you want a different result. " if seed is not None else "") + \
381
+ "The image has been enhanced successfully."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
382
 
383
  # Only one image can be shown in the slider
384
+ return [input_image_path] + [results[0]], gr.update(label="Downloadable results", format=output_format, value=results), gr.update(value=information, visible=True), gr.update(visible=True)
385
 
386
  def load_and_reset(param_setting):
387
+ print('Resetting parameters...')
388
  if torch.cuda.device_count() == 0:
389
  gr.Warning('Set this space to GPU config to make it work.')
390
+ return None, None, None, None, None, None, None, None, None, None, None, None, None
391
  edm_steps = default_setting.edm_steps
392
  s_stage2 = 1.0
393
  s_stage1 = -1.0
 
414
  else:
415
  raise NotImplementedError
416
  gr.Info('The parameters are reset.')
417
+ print('Parameters reset completed.')
418
  return edm_steps, s_cfg, s_stage2, s_stage1, s_churn, s_noise, a_prompt, n_prompt, color_fix_type, linear_CFG, \
419
  linear_s_stage2, spt_linear_CFG, spt_linear_s_stage2, model_select
420
 
421
  def log_information(result_gallery):
422
+ print('Logging information...')
423
  if result_gallery is not None:
424
  for i, result in enumerate(result_gallery):
425
  print(result[0])
426
 
427
  def on_select_result(result_slider, result_gallery, evt: gr.SelectData):
428
+ print('Result selected.')
429
  if result_gallery is not None:
430
  for i, result in enumerate(result_gallery):
431
  print(result[0])
432
  return [result_slider[0], result_gallery[evt.index][0]]
433
 
434
  title_html = """
435
+ <h1><center>Maree's Magical Photo Tool</center></h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  """
437
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438
  # Gradio interface
439
  with gr.Blocks() as interface:
440
  if torch.cuda.device_count() == 0:
441
  with gr.Row():
442
  gr.HTML("""
443
+ <p style="background-color: red;"><big><big><big><b>⚠️To use this tool, set a GPU with sufficient VRAM.</b></big></big></big></p>
 
 
 
444
  """)
445
  gr.HTML(title_html)
446
 
447
+ input_image = gr.Image(label="Upload your photo", show_label=True, type="filepath", height=400, elem_id="image-input")
 
448
  with gr.Group():
449
+ prompt = gr.Textbox(
450
+ label="Describe your photo",
451
+ info="Tell me about your photo so I can make it better.",
452
+ value="",
453
+ placeholder="Type a description...",
454
+ lines=3
455
+ )
456
+ upscale = gr.Radio(
457
+ [["x1", 1], ["x2", 2], ["x3", 3], ["x4", 4]],
458
+ label="Upscale factor",
459
+ info="Choose how much to enlarge the photo",
460
+ value=2,
461
+ interactive=True
462
+ )
463
+ allocation = gr.Radio(
464
+ [["1 min", 1], ["2 min", 2], ["3 min", 3], ["4 min", 4], ["5 min", 5]],
465
+ label="GPU allocation time (for Jon)",
466
+ info="You can ignore this setting",
467
+ value=4,
468
+ interactive=True
469
+ )
470
+
471
+ gamma_correction = gr.Number(value=1.0, visible=False) # Hidden component with default value 1.0
472
 
473
  with gr.Accordion("Advanced options", open=False):
474
+ a_prompt = gr.Textbox(
475
+ label="Additional image description",
476
+ info="Completes the main image description",
477
+ value='Cinematic, High Contrast, highly detailed, taken using a Canon EOS R '
478
+ 'camera, hyper detailed photo - realistic maximum detail, 32k, Color '
479
+ 'Grading, ultra HD, extreme meticulous detailing, skin pore detailing, '
480
+ 'hyper sharpness, perfect without deformations.',
481
+ lines=3
482
+ )
483
+ n_prompt = gr.Textbox(
484
+ label="Negative image description",
485
+ info="Disambiguate by listing what the image does NOT represent",
486
+ value='painting, oil painting, illustration, drawing, art, sketch, anime, '
487
+ 'cartoon, CG Style, 3D render, unreal engine, blurring, aliasing, unsharp, weird textures, ugly, dirty, messy, '
488
+ 'worst quality, low quality, frames, watermark, signature, jpeg artifacts, '
489
+ 'deformed, lowres, over-smooth',
490
+ lines=3
491
+ )
492
+ edm_steps = gr.Slider(
493
+ label="Steps",
494
+ info="Lower=faster, higher=more details",
495
+ minimum=1,
496
+ maximum=200,
497
+ value=default_setting.edm_steps if torch.cuda.device_count() > 0 else 1,
498
+ step=1
499
+ )
500
+ num_samples = gr.Slider(
501
+ label="Num Samples",
502
+ info="Number of generated results",
503
+ minimum=1,
504
+ maximum=4 if not args.use_image_slider else 1,
505
+ value=1,
506
+ step=1
507
+ )
508
+ min_size = gr.Slider(
509
+ label="Minimum size",
510
+ info="Minimum height, minimum width of the result",
511
+ minimum=32,
512
+ maximum=4096,
513
+ value=1024,
514
+ step=32
515
+ )
516
+ downscale = gr.Radio(
517
+ [["/1", 1], ["/2", 2], ["/3", 3], ["/4", 4]],
518
+ label="Pre-downscale factor",
519
+ info="Reducing blurred image reduces the process time",
520
+ value=1,
521
+ interactive=True
522
+ )
523
  with gr.Row():
524
  with gr.Column():
525
+ model_select = gr.Radio(
526
+ [["💃 Quality (v0-Q)", "v0-Q"], ["🎯 Fidelity (v0-F)", "v0-F"]],
527
+ label="Model Selection",
528
+ info="Pretrained model",
529
+ value="v0-Q",
530
+ interactive=True
531
+ )
532
  with gr.Column():
533
+ color_fix_type = gr.Radio(
534
+ [["None", "None"], ["AdaIn (improve as a photo)", "AdaIn"], ["Wavelet (for JPEG artifacts)", "Wavelet"]],
535
+ label="Color-Fix Type",
536
+ info="AdaIn=Improve following a style, Wavelet=For JPEG artifacts",
537
+ value="AdaIn",
538
+ interactive=True
539
+ )
540
+ s_cfg = gr.Slider(
541
+ label="Text Guidance Scale",
542
+ info="Lower=follow the image, higher=follow the prompt",
543
+ minimum=1.0,
544
+ maximum=15.0,
545
+ value=default_setting.s_cfg_Quality if torch.cuda.device_count() > 0 else 1.0,
546
+ step=0.1
547
+ )
548
+ s_stage2 = gr.Slider(
549
+ label="Restoring Guidance Strength",
550
+ minimum=0.,
551
+ maximum=1.,
552
+ value=1.,
553
+ step=0.05
554
+ )
555
+ s_stage1 = gr.Slider(
556
+ label="Pre-denoising Guidance Strength",
557
+ minimum=-1.0,
558
+ maximum=6.0,
559
+ value=-1.0,
560
+ step=1.0
561
+ )
562
+ s_churn = gr.Slider(
563
+ label="S-Churn",
564
+ minimum=0,
565
+ maximum=40,
566
+ value=5,
567
+ step=1
568
+ )
569
+ s_noise = gr.Slider(
570
+ label="S-Noise",
571
+ minimum=1.0,
572
+ maximum=1.1,
573
+ value=1.003,
574
+ step=0.001
575
+ )
576
  with gr.Row():
577
  with gr.Column():
578
  linear_CFG = gr.Checkbox(label="Linear CFG", value=True)
579
+ spt_linear_CFG = gr.Slider(
580
+ label="CFG Start",
581
+ minimum=1.0,
582
+ maximum=9.0,
583
+ value=default_setting.spt_linear_CFG_Quality if torch.cuda.device_count() > 0 else 1.0,
584
+ step=0.5
585
+ )
586
  with gr.Column():
587
  linear_s_stage2 = gr.Checkbox(label="Linear Restoring Guidance", value=False)
588
+ spt_linear_s_stage2 = gr.Slider(
589
+ label="Guidance Start",
590
+ minimum=0.,
591
+ maximum=1.,
592
+ value=0.,
593
+ step=0.05
594
+ )
595
  with gr.Column():
596
+ diff_dtype = gr.Radio(
597
+ [["fp32 (precision)", "fp32"], ["fp16 (medium)", "fp16"], ["bf16 (speed)", "bf16"]],
598
+ label="Diffusion Data Type",
599
+ value="fp32",
600
+ interactive=True
601
+ )
602
  with gr.Column():
603
+ ae_dtype = gr.Radio(
604
+ [["fp32 (precision)", "fp32"], ["bf16 (speed)", "bf16"]],
605
+ label="Auto-Encoder Data Type",
606
+ value="fp32",
607
+ interactive=True
608
+ )
609
+ randomize_seed = gr.Checkbox(
610
+ label="\U0001F3B2 Randomize seed",
611
+ value=True,
612
+ info="If checked, result is always different"
613
+ )
614
+ seed = gr.Slider(
615
+ label="Seed",
616
+ minimum=0,
617
+ maximum=max_64_bit_int,
618
+ step=1,
619
+ randomize=True
620
+ )
621
  with gr.Group():
622
+ param_setting = gr.Radio(
623
+ ["Quality", "Fidelity"],
624
+ interactive=True,
625
+ label="Presetting",
626
+ value="Quality"
627
+ )
628
  restart_button = gr.Button(value="Apply presetting")
629
 
630
  with gr.Column():
631
+ diffusion_button = gr.Button(
632
+ value="🚀 Enhance Photo",
633
+ variant="primary",
634
+ elem_id="process_button"
635
+ )
636
+ reset_btn = gr.Button(
637
+ value="🧹 Reset",
638
+ variant="stop",
639
+ elem_id="reset_button",
640
+ visible=False
641
+ )
642
+
643
+ restore_information = gr.HTML(
644
+ value="Start the process again if you want a different result.",
645
+ visible=False
646
+ )
647
+ result_slider = ImageSlider(
648
+ label='Comparator',
649
+ show_label=False,
650
+ interactive=False,
651
+ elem_id="slider1",
652
+ show_download_button=False
653
+ )
654
+ result_gallery = gr.Gallery(
655
+ label='Downloadable results',
656
+ show_label=True,
657
+ interactive=False,
658
+ elem_id="gallery1"
659
+ )
660
+
661
+ input_image.upload(
662
+ fn=process_uploaded_image,
663
+ inputs=input_image,
664
+ outputs=input_image,
665
+ queue=False
666
+ )
667
+
668
+ input_image.upload(
669
+ fn=check_upload,
670
+ inputs=input_image,
671
+ outputs=[],
672
+ queue=False,
673
+ show_progress=False
674
+ )
675
+
676
+ diffusion_button.click(
677
+ fn=update_seed,
678
+ inputs=[randomize_seed, seed],
679
+ outputs=[seed],
680
+ queue=False,
681
+ show_progress=False
682
+ ).then(
683
+ fn=check,
684
+ inputs=[input_image],
685
+ outputs=[],
686
+ queue=False,
687
+ show_progress=False
688
+ ).success(
689
+ fn=stage2_process,
690
+ inputs=[
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
691
  input_image,
 
 
692
  prompt,
693
  a_prompt,
694
  n_prompt,
 
700
  s_stage1,
701
  s_stage2,
702
  s_cfg,
 
703
  seed,
704
  s_churn,
705
  s_noise,
706
  color_fix_type,
707
  diff_dtype,
708
  ae_dtype,
709
+ gamma_correction, # Use the hidden gamma_correction component
710
  linear_CFG,
711
  linear_s_stage2,
712
  spt_linear_CFG,
713
  spt_linear_s_stage2,
714
  model_select,
 
715
  allocation
716
  ],
717
+ outputs=[
718
  result_slider,
719
  result_gallery,
720
  restore_information,
721
  reset_btn
722
+ ]
723
+ ).success(
724
+ fn=log_information,
725
+ inputs=[result_gallery],
726
+ outputs=[],
727
+ queue=False,
728
+ show_progress=False
729
  )
730
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
731
  result_gallery.change(on_select_result, [result_slider, result_gallery], result_slider)
732
  result_gallery.select(on_select_result, [result_slider, result_gallery], result_slider)
733
 
734
+ restart_button.click(
735
+ fn=load_and_reset,
736
+ inputs=[param_setting],
737
+ outputs=[
738
+ edm_steps,
739
+ s_cfg,
740
+ s_stage2,
741
+ s_stage1,
742
+ s_churn,
743
+ s_noise,
744
+ a_prompt,
745
+ n_prompt,
746
+ color_fix_type,
747
+ linear_CFG,
748
+ linear_s_stage2,
749
+ spt_linear_CFG,
750
+ spt_linear_s_stage2,
751
+ model_select
752
+ ]
753
+ )
754
+
755
+ reset_btn.click(
756
+ fn=reset,
757
+ inputs=[],
758
+ outputs=[
759
  input_image,
 
 
760
  prompt,
761
  a_prompt,
762
  n_prompt,
 
768
  s_stage1,
769
  s_stage2,
770
  s_cfg,
 
771
  seed,
772
  s_churn,
773
  s_noise,
774
  color_fix_type,
775
  diff_dtype,
776
  ae_dtype,
777
+ gamma_correction, # Use the hidden gamma_correction component
778
  linear_CFG,
779
  linear_s_stage2,
780
  spt_linear_CFG,
781
  spt_linear_s_stage2,
782
  model_select,
 
783
  allocation
784
+ ],
785
+ queue=False,
786
+ show_progress=False
787
+ )
788
+
789
  interface.queue(10).launch()