comrender commited on
Commit
9047ade
Β·
verified Β·
1 Parent(s): db08e46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -55
app.py CHANGED
@@ -180,10 +180,19 @@ def prepare_image(image, max_size=MAX_INPUT_SIZE):
180
  return image
181
 
182
 
183
- def esrgan_upscale(image, model, device='cuda'):
184
- """Upscale image 4x using ESRGAN"""
 
 
 
 
 
 
 
 
 
185
  # Prepare image
186
- img_np = np.array(image).astype(np.float32) / 255.
187
  img_np = np.transpose(img_np, (2, 0, 1)) # HWC to CHW
188
  img_tensor = torch.from_numpy(img_np).unsqueeze(0).to(device)
189
 
@@ -195,10 +204,18 @@ def esrgan_upscale(image, model, device='cuda'):
195
  output_np = np.transpose(output_np, (1, 2, 0)) # CHW to HWC
196
  output_np = (output_np * 255).astype(np.uint8)
197
 
198
- return Image.fromarray(output_np)
 
 
 
 
 
 
 
 
199
 
200
 
201
- @spaces.GPU(duration=60) # 60 seconds should be enough
202
  def enhance_image(
203
  input_image,
204
  prompt,
@@ -206,6 +223,7 @@ def enhance_image(
206
  randomize_seed,
207
  num_inference_steps,
208
  denoising_strength,
 
209
  progress=gr.Progress(track_tqdm=True),
210
  ):
211
  """Main enhancement function"""
@@ -228,12 +246,12 @@ def enhance_image(
228
  input_image = prepare_image(input_image)
229
  original_size = input_image.size
230
 
231
- # Step 1: ESRGAN upscale (4x) on GPU
232
- gr.Info("πŸ” Upscaling with ESRGAN 4x...")
233
 
234
  # Move ESRGAN to GPU for faster processing
235
  esrgan_model.to("cuda")
236
- upscaled_image = esrgan_upscale(input_image, esrgan_model, device="cuda")
237
 
238
  # Move ESRGAN back to CPU to free memory
239
  esrgan_model.to("cpu")
@@ -299,9 +317,9 @@ def enhance_image(
299
  with gr.Blocks(css=css) as demo:
300
  gr.HTML("""
301
  <div class="main-header">
302
- <h1>πŸš€ ESRGAN 4x + FLUX Enhancement</h1>
303
- <p>Upload an image to upscale 4x with ESRGAN and enhance with FLUX</p>
304
- <p>Optimized for <strong>ZeroGPU</strong> | Max input: 512x512 β†’ Output: 2048x2048</p>
305
  </div>
306
  """)
307
 
@@ -315,46 +333,52 @@ with gr.Blocks(css=css) as demo:
315
  )
316
 
317
  prompt = gr.Textbox(
318
- label="Enhancement Prompt",
319
  placeholder="Describe the desired enhancement (e.g., 'high quality, sharp details, vibrant colors')",
320
  value="high quality, ultra detailed, sharp",
321
  lines=2
322
  )
323
 
324
- with gr.Accordion("Advanced Settings", open=False):
325
- num_inference_steps = gr.Slider(
326
- label="Enhancement Steps",
327
- minimum=10,
328
- maximum=25,
329
- step=1,
330
- value=18,
331
- info="More steps = better quality but slower"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  )
333
-
334
- denoising_strength = gr.Slider(
335
- label="Enhancement Strength",
336
- minimum=0.1,
337
- maximum=0.6,
338
- step=0.05,
339
- value=0.35,
340
- info="Higher = more changes to the image"
341
  )
342
-
343
- with gr.Row():
344
- randomize_seed = gr.Checkbox(
345
- label="Randomize seed",
346
- value=True
347
- )
348
- seed = gr.Slider(
349
- label="Seed",
350
- minimum=0,
351
- maximum=MAX_SEED,
352
- step=1,
353
- value=42
354
- )
355
 
356
  enhance_btn = gr.Button(
357
- "🎨 Enhance Image (4x Upscale)",
358
  variant="primary",
359
  size="lg"
360
  )
@@ -374,18 +398,6 @@ with gr.Blocks(css=css) as demo:
374
  visible=False
375
  )
376
 
377
- # Examples
378
- gr.Examples(
379
- examples=[
380
- ["high quality, ultra detailed, sharp"],
381
- ["cinematic, professional photography, enhanced details"],
382
- ["vibrant colors, high contrast, sharp focus"],
383
- ["photorealistic, 8k quality, fine details"],
384
- ],
385
- inputs=[prompt],
386
- label="Example Prompts"
387
- )
388
-
389
  # Event handler
390
  enhance_btn.click(
391
  fn=enhance_image,
@@ -396,14 +408,16 @@ with gr.Blocks(css=css) as demo:
396
  randomize_seed,
397
  num_inference_steps,
398
  denoising_strength,
 
399
  ],
400
  outputs=[result_slider, used_seed]
401
  )
402
 
403
  gr.HTML("""
404
  <div style="margin-top: 2rem; text-align: center; color: #666;">
405
- <p>πŸ“Œ Pipeline: ESRGAN 4x-UltraSharp β†’ FLUX Dev Enhancement</p>
406
  <p>⚑ Optimized for ZeroGPU with automatic memory management</p>
 
407
  </div>
408
  """)
409
 
 
180
  return image
181
 
182
 
183
+ def esrgan_upscale(image, model, device='cuda', upscale_factor=4):
184
+ """Upscale image using ESRGAN with variable factor support"""
185
+ orig_w, orig_h = image.size
186
+ pre_resize_factor = upscale_factor / 4.0
187
+ low_res_w = int(orig_w * pre_resize_factor)
188
+ low_res_h = int(orig_h * pre_resize_factor)
189
+ if low_res_w < 1 or low_res_h < 1:
190
+ raise ValueError("Upscale factor too small for image size")
191
+
192
+ low_res_image = image.resize((low_res_w, low_res_h), Image.LANCZOS)
193
+
194
  # Prepare image
195
+ img_np = np.array(low_res_image).astype(np.float32) / 255.
196
  img_np = np.transpose(img_np, (2, 0, 1)) # HWC to CHW
197
  img_tensor = torch.from_numpy(img_np).unsqueeze(0).to(device)
198
 
 
204
  output_np = np.transpose(output_np, (1, 2, 0)) # CHW to HWC
205
  output_np = (output_np * 255).astype(np.uint8)
206
 
207
+ upscaled = Image.fromarray(output_np)
208
+
209
+ # Resize back to exact target size if needed (due to rounding)
210
+ target_w = int(orig_w * upscale_factor)
211
+ target_h = int(orig_h * upscale_factor)
212
+ if upscaled.size != (target_w, target_h):
213
+ upscaled = upscaled.resize((target_w, target_h), Image.LANCZOS)
214
+
215
+ return upscaled
216
 
217
 
218
+ @spaces.GPU(duration=120) # Increased to 120 seconds
219
  def enhance_image(
220
  input_image,
221
  prompt,
 
223
  randomize_seed,
224
  num_inference_steps,
225
  denoising_strength,
226
+ upscale_factor,
227
  progress=gr.Progress(track_tqdm=True),
228
  ):
229
  """Main enhancement function"""
 
246
  input_image = prepare_image(input_image)
247
  original_size = input_image.size
248
 
249
+ # Step 1: ESRGAN upscale on GPU
250
+ gr.Info(f"πŸ” Upscaling with ESRGAN x{upscale_factor}...")
251
 
252
  # Move ESRGAN to GPU for faster processing
253
  esrgan_model.to("cuda")
254
+ upscaled_image = esrgan_upscale(input_image, esrgan_model, device="cuda", upscale_factor=upscale_factor)
255
 
256
  # Move ESRGAN back to CPU to free memory
257
  esrgan_model.to("cpu")
 
317
  with gr.Blocks(css=css) as demo:
318
  gr.HTML("""
319
  <div class="main-header">
320
+ <h1>πŸš€ Flux Dev Ultimate Upscaler</h1>
321
+ <p>Upload an image to upscale 2-4x with ESRGAN and enhance with FLUX</p>
322
+ <p>Optimized for <strong>ZeroGPU</strong> | Max input: 512x512 β†’ Output: up to 2048x2048</p>
323
  </div>
324
  """)
325
 
 
333
  )
334
 
335
  prompt = gr.Textbox(
336
+ label="Describe image with prompt",
337
  placeholder="Describe the desired enhancement (e.g., 'high quality, sharp details, vibrant colors')",
338
  value="high quality, ultra detailed, sharp",
339
  lines=2
340
  )
341
 
342
+ # Advanced Settings (always open)
343
+ upscale_factor = gr.Slider(
344
+ label="Upscale Ratio",
345
+ minimum=2,
346
+ maximum=4,
347
+ step=1,
348
+ value=4,
349
+ info="Choose upscale factor (2x, 3x, 4x)"
350
+ )
351
+
352
+ num_inference_steps = gr.Slider(
353
+ label="Enhancement Steps",
354
+ minimum=10,
355
+ maximum=25,
356
+ step=1,
357
+ value=18,
358
+ info="More steps = better quality but slower"
359
+ )
360
+
361
+ denoising_strength = gr.Slider(
362
+ label="Creativity (Denoising)",
363
+ minimum=0.1,
364
+ maximum=0.6,
365
+ step=0.05,
366
+ value=0.35,
367
+ info="Higher = more changes to the image"
368
+ )
369
+
370
+ with gr.Row():
371
+ randomize_seed = gr.Checkbox(
372
+ label="Randomize seed",
373
+ value=True
374
  )
375
+ seed = gr.Number(
376
+ label="Seed",
377
+ value=42
 
 
 
 
 
378
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
379
 
380
  enhance_btn = gr.Button(
381
+ "Upscale",
382
  variant="primary",
383
  size="lg"
384
  )
 
398
  visible=False
399
  )
400
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  # Event handler
402
  enhance_btn.click(
403
  fn=enhance_image,
 
408
  randomize_seed,
409
  num_inference_steps,
410
  denoising_strength,
411
+ upscale_factor,
412
  ],
413
  outputs=[result_slider, used_seed]
414
  )
415
 
416
  gr.HTML("""
417
  <div style="margin-top: 2rem; text-align: center; color: #666;">
418
+ <p>πŸ“Œ Pipeline: ESRGAN 2-4x-UltraSharp β†’ FLUX Dev Enhancement</p>
419
  <p>⚑ Optimized for ZeroGPU with automatic memory management</p>
420
+ <p>πŸ“Œ Note: User is responsible for obtaining commercial license from Flux Dev if using image commercially under their license.</p>
421
  </div>
422
  """)
423