aiqtech commited on
Commit
b52ff62
ยท
verified ยท
1 Parent(s): c61c4a7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +96 -40
app.py CHANGED
@@ -22,16 +22,66 @@ from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
22
  import gc
23
  from PIL import Image, ImageDraw, ImageFont
24
 
25
- def clear_memory():
26
- """๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ํ•จ์ˆ˜"""
27
- gc.collect()
 
28
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  if torch.cuda.is_available():
30
- with torch.cuda.device(0): # ๋ช…์‹œ์ ์œผ๋กœ device 0 ์‚ฌ์šฉ
31
- torch.cuda.empty_cache()
32
- except:
33
- pass
34
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  # GPU ์„ค์ •
36
  device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # ๋ช…์‹œ์ ์œผ๋กœ cuda:0 ์ง€์ •
37
 
@@ -340,51 +390,40 @@ def on_change_bbox(prompts: dict[str, Any] | None):
340
  def on_change_prompt(img: Image.Image | None, prompt: str | None, bg_prompt: str | None = None):
341
  return gr.update(interactive=bool(img and prompt))
342
 
 
 
343
  def process_prompt(img: Image.Image, prompt: str, bg_prompt: str | None = None,
344
  aspect_ratio: str = "1:1", position: str = "bottom-center",
345
  scale_percent: float = 100, text_params: dict | None = None) -> tuple[Image.Image, Image.Image]:
346
  try:
347
- if img is None or prompt.strip() == "":
348
- raise gr.Error("Please provide both image and prompt")
349
-
350
-
351
- print(f"Processing with position: {position}, scale: {scale_percent}")
352
 
353
- try:
354
- prompt = translate_to_english(prompt)
 
355
  if bg_prompt:
356
- bg_prompt = translate_to_english(bg_prompt)
357
- except Exception as e:
358
- print(f"Translation error (continuing with original text): {str(e)}")
359
-
360
- # ๊ธฐ์กด ์ฒ˜๋ฆฌ ๋กœ์ง...
361
- results, _ = _process(img, prompt, bg_prompt, aspect_ratio)
362
-
363
- if bg_prompt:
364
- try:
365
  combined = combine_with_background(
366
  foreground=results[2],
367
  background=results[1],
368
  position=position,
369
  scale_percent=scale_percent
370
  )
371
- except Exception as e:
372
- print(f"Combination error: {str(e)}")
373
- combined = results[1]
374
- else:
375
- combined = results[1]
376
-
377
- # ํ…์ŠคํŠธ ์ถ”๊ฐ€ ๋กœ์ง์„ ์—ฌ๊ธฐ๋กœ ์ด๋™
378
- if text_params and text_params.get('text'):
379
- combined = add_text_to_image(combined, text_params)
380
-
381
- return combined, results[2]
382
  except Exception as e:
383
  print(f"Error in process_prompt: {str(e)}")
384
  raise gr.Error(str(e))
385
  finally:
386
  clear_memory()
387
 
 
388
  def process_bbox(img: Image.Image, box_input: str) -> tuple[Image.Image, Image.Image]:
389
  try:
390
  if img is None or box_input.strip() == "":
@@ -423,7 +462,14 @@ def update_box_button(img, box_input):
423
  except:
424
  return gr.update(interactive=False, variant="secondary")
425
 
426
-
 
 
 
 
 
 
 
427
  # CSS ์ •์˜
428
  css = """
429
  footer {display: none}
@@ -559,9 +605,15 @@ def update_process_button(img, prompt):
559
  interactive=bool(img and prompt),
560
  variant="primary" if bool(img and prompt) else "secondary"
561
  )
 
 
 
 
 
 
 
562
 
563
- # UI ๊ตฌ์„ฑ
564
- with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
565
  gr.HTML("""
566
  <div class="main-title">
567
  <h1>๐ŸŽจGiniGen Canvas</h1>
@@ -769,10 +821,14 @@ pipe = FluxPipeline.from_pretrained(
769
  token=HF_TOKEN
770
  )
771
 
772
- demo.queue(max_size=5)
773
  demo.launch(
774
  server_name="0.0.0.0",
775
  server_port=7860,
776
  share=False,
777
- max_threads=2
 
 
 
 
778
  )
 
22
  import gc
23
  from PIL import Image, ImageDraw, ImageFont
24
 
25
+ # ๋ชจ๋ธ ์ดˆ๊ธฐํ™” ๋ถ€๋ถ„ ์ˆ˜์ •
26
+ def initialize_models():
27
+ global segmenter, gd_model, gd_processor, pipe
28
+
29
  try:
30
+ # GPU ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ
31
+ clear_memory()
32
+
33
+ # ๋ฒˆ์—ญ ๋ชจ๋ธ์€ CPU์—์„œ๋งŒ ์‹คํ–‰
34
+ model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to('cpu')
35
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
36
+ translator = pipeline("translation", model=model, tokenizer=tokenizer, device=-1)
37
+
38
+ # GroundingDINO ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
39
+ gd_processor = GroundingDinoProcessor.from_pretrained(gd_model_path)
40
+ gd_model = GroundingDinoForObjectDetection.from_pretrained(
41
+ gd_model_path,
42
+ torch_dtype=torch.float16, # float32 ๋Œ€์‹  float16 ์‚ฌ์šฉ
43
+ device_map="auto" # ์ž๋™ ๋””๋ฐ”์ด์Šค ๋งคํ•‘
44
+ )
45
+
46
+ # Segmenter ์ดˆ๊ธฐํ™”
47
+ segmenter = BoxSegmenter(device="cpu")
48
  if torch.cuda.is_available():
49
+ segmenter.to(device)
50
+
51
+ # FLUX ํŒŒ์ดํ”„๋ผ์ธ ์ดˆ๊ธฐํ™”
52
+ pipe = FluxPipeline.from_pretrained(
53
+ "black-forest-labs/FLUX.1-dev",
54
+ torch_dtype=torch.float16,
55
+ token=HF_TOKEN
56
+ )
57
+ pipe.enable_attention_slicing(slice_size="auto")
58
+
59
+ # LoRA ๊ฐ€์ค‘์น˜ ๋กœ๋“œ
60
+ pipe.load_lora_weights(
61
+ hf_hub_download(
62
+ "ByteDance/Hyper-SD",
63
+ "Hyper-FLUX.1-dev-8steps-lora.safetensors",
64
+ use_auth_token=HF_TOKEN
65
+ )
66
+ )
67
+ pipe.fuse_lora(lora_scale=0.125)
68
+
69
+ if torch.cuda.is_available():
70
+ pipe = pipe.to("cuda:0")
71
+
72
+ except Exception as e:
73
+ print(f"Model initialization error: {str(e)}")
74
+ raise
75
+
76
+ def clear_memory():
77
+ """๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ๊ฐ•ํ™” ํ•จ์ˆ˜"""
78
+ gc.collect()
79
+ torch.cuda.empty_cache()
80
+
81
+ if torch.cuda.is_available():
82
+ with torch.cuda.device(0):
83
+ torch.cuda.reset_peak_memory_stats()
84
+ torch.cuda.empty_cache()
85
  # GPU ์„ค์ •
86
  device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # ๋ช…์‹œ์ ์œผ๋กœ cuda:0 ์ง€์ •
87
 
 
390
  def on_change_prompt(img: Image.Image | None, prompt: str | None, bg_prompt: str | None = None):
391
  return gr.update(interactive=bool(img and prompt))
392
 
393
+
394
+ @spaces.GPU(duration=20)
395
  def process_prompt(img: Image.Image, prompt: str, bg_prompt: str | None = None,
396
  aspect_ratio: str = "1:1", position: str = "bottom-center",
397
  scale_percent: float = 100, text_params: dict | None = None) -> tuple[Image.Image, Image.Image]:
398
  try:
399
+ # ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
400
+ img = process_image(img)
 
 
 
401
 
402
+ with torch.cuda.amp.autocast(): # ์ž๋™ ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ์‚ฌ์šฉ
403
+ results, _ = _process(img, prompt, bg_prompt, aspect_ratio)
404
+
405
  if bg_prompt:
 
 
 
 
 
 
 
 
 
406
  combined = combine_with_background(
407
  foreground=results[2],
408
  background=results[1],
409
  position=position,
410
  scale_percent=scale_percent
411
  )
412
+
413
+ if text_params and text_params.get('text'):
414
+ combined = add_text_to_image(combined, text_params)
415
+
416
+ return combined, results[2]
417
+
418
+ return results[1], results[2]
419
+
 
 
 
420
  except Exception as e:
421
  print(f"Error in process_prompt: {str(e)}")
422
  raise gr.Error(str(e))
423
  finally:
424
  clear_memory()
425
 
426
+
427
  def process_bbox(img: Image.Image, box_input: str) -> tuple[Image.Image, Image.Image]:
428
  try:
429
  if img is None or box_input.strip() == "":
 
462
  except:
463
  return gr.update(interactive=False, variant="secondary")
464
 
465
+ def process_image(img: Image.Image, max_size: int = 1024) -> Image.Image:
466
+ """์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์ ํ™”"""
467
+ if img.width > max_size or img.height > max_size:
468
+ ratio = max_size / max(img.width, img.height)
469
+ new_size = (int(img.width * ratio), int(img.height * ratio))
470
+ return img.resize(new_size, Image.LANCZOS)
471
+ return img
472
+
473
  # CSS ์ •์˜
474
  css = """
475
  footer {display: none}
 
605
  interactive=bool(img and prompt),
606
  variant="primary" if bool(img and prompt) else "secondary"
607
  )
608
+
609
+ demo = gr.Blocks(
610
+ theme=gr.themes.Soft(),
611
+ css=css,
612
+ analytics_enabled=False, # ๋ถ„์„ ๋น„ํ™œ์„ฑํ™”
613
+ cache_examples=False # ์˜ˆ์ œ ์บ์‹ฑ ๋น„ํ™œ์„ฑํ™”
614
+ )
615
 
616
+
 
617
  gr.HTML("""
618
  <div class="main-title">
619
  <h1>๐ŸŽจGiniGen Canvas</h1>
 
821
  token=HF_TOKEN
822
  )
823
 
824
+ demo.queue(max_size=3) # ํ ํฌ๊ธฐ ๊ฐ์†Œ
825
  demo.launch(
826
  server_name="0.0.0.0",
827
  server_port=7860,
828
  share=False,
829
+ max_threads=2,
830
+ enable_queue=True,
831
+ cache_examples=False,
832
+ show_error=True,
833
+ show_tips=False
834
  )