Kims12 commited on
Commit
16a6799
ยท
verified ยท
1 Parent(s): 354f96e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +308 -113
app.py CHANGED
@@ -1,3 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
  import tempfile
3
  from PIL import Image
@@ -7,6 +107,18 @@ import re
7
  from io import BytesIO
8
  import time
9
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  from google import genai
11
  from google.genai import types
12
 
@@ -299,140 +411,223 @@ def generate_multiple_images(image1, image2, image3, prompt, progress=gr.Progres
299
 
300
  return results[0], results[1], results[2], results[3], combined_status, combined_prompts
301
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
302
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
303
  with gr.Blocks() as demo:
304
  gr.HTML(
305
  """
306
  <div style="text-align: center; margin-bottom: 1rem;">
307
- <h1>์ด์ปค๋จธ์Šค์šฉ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ</h1>
308
- <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์˜ˆ์ œ๋ฅผ ์ฐธ๊ฐ€ํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  "์ด๋ฏธ์ง€ ์ƒ์„ฑ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐจ๋ก€๋กœ 4์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.</p>
309
  </div>
310
  """
311
  )
312
 
313
- with gr.Row():
314
- # ์™ผ์ชฝ ์ž…๋ ฅ ์˜์—ญ (์˜ˆ์ œ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์•„๋ž˜์— ๋ฐฐ์น˜)
315
- with gr.Column(scale=1):
316
  with gr.Row():
317
- image1_input = gr.Image(type="pil", label="#1", image_mode="RGB", height=300, width=200)
318
- image2_input = gr.Image(type="pil", label="#2", image_mode="RGB", height=300, width=200)
319
- image3_input = gr.Image(type="pil", label="#3", image_mode="RGB", height=300, width=200)
320
- prompt_input = gr.Textbox(
321
- lines=3,
322
- placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
323
- label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
324
  )
325
- with gr.Row():
326
- image_change_btn1 = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ-1")
327
- image_change_btn2 = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ-2")
328
- text_remove_btn = gr.Button("๊ธ€์ž ์ง€์šฐ๊ธฐ")
329
- text_change_btn = gr.Button("๊ธ€์ž ๋ณ€๊ฒฝํ•˜๊ธฐ")
330
- clothes_change_btn1 = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ-1")
331
- clothes_change_btn2 = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ-2")
332
- holding_product_btn = gr.Button("์ƒํ’ˆ๋“ค๊ณ  ์žˆ๊ธฐ")
333
- background_change_btn = gr.Button("๋ฐฐ๊ฒฝ ๋ฐ”๊พธ๊ธฐ")
334
- composite_product_btn = gr.Button("๋ถ€๋ถ„ ์ง€์šฐ๊ธฐ")
335
- submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ (4์žฅ)", variant="primary")
336
 
337
  gr.Markdown(
338
  """
339
- ### ์‚ฌ์šฉ ๋ฐฉ๋ฒ•:
340
-
341
- 1. **์ž๋™ ํ•ฉ์„ฑ**: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.
342
- 2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
343
- 3. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๋กœ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
344
- 4. **๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€**: "์ด๋ฏธ์ง€ ์ƒ์„ฑ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐจ๋ก€๋กœ 4์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
345
- 5. **์˜ˆ์ œ์„ ํƒ**: ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”.
346
 
347
- > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
348
  """
349
  )
350
 
351
- # ์˜ˆ์ œ ์ด๋ฏธ์ง€: ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์•„๋ž˜ ์™ผ์ชฝ ์˜์—ญ์— ๋ฐฐ์น˜
352
- gr.Markdown("## ์˜ˆ์ œ ์ด๋ฏธ์ง€")
353
- examples = [
354
- ["down/๋ชจ๋ธ.jpg", None, None, "(#1์˜ ์—ฌ์„ฑ)์ด ์‚ด์ง ๋’ค๋กœ ๋Œ์•„๋ณด๋Š” ๋ชจ์Šต์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์ „ seed๋ฅผ ์œ ์ง€ํ•œํ…Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ผ."],
355
- ["down/์ƒ์–ด๋ ˆ๊ณ ๋ชจํ˜•.png", None, None, "(#1 ๋ ˆ๋ชจ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋งŒ ๊ฒ€์€์ƒ‰ ๊ณ ๋ž˜๋ ˆ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ seed๋ฅผ ๋ณ€๊ฒฝ์„ ํ•˜์ง€๋งˆ๋ผ."],
356
- ["down/์ค‘๊ตญ์–ด.png", None, None, "(#1 ์ด๋ฏธ์ง€)์— ์žˆ๋Š” ์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ผ."],
357
- ["down/ํ…์ŠคํŠธ.webp", None, None, '(#1์˜ ํ…์ŠคํŠธ)๋ฅผ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•œ์ฒด ํ…์ŠคํŠธ๋งŒ "Hello"๋กœ ๋ฐ”๊ฟ”๋ผ'],
358
- ["down/๋ชจ๋ธ.jpg", "down/์„ ๊ธ€๋ผ์Šค.png", "down/์ฒญ๋ฐ”์ง€.png", "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)์™€ (#3์˜ ์ฒญ๋ฐ”์ง€)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
359
- ["down/๋ชจ๋ธ.jpg", "down/์„ ๊ธ€๋ผ์Šค.png", "down/์นดํŽ˜์ „๊ฒฝ.png", "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ (#3์˜ ์žฅ์†Œ)์—์„œ ์˜์ž์— ์•‰์•„ ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
360
- ["down/๋ชจ๋ธ.jpg", "down/์™€์ธ์ž”.png", None, "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์™€์ธ์ž”)์„ ์—ฌ์„ฑ๋ชจ๋ธ์ด ํ™๋ณดํ•  ์™€์ธ์ž”์„ ๋‹๋ณด์ด๊ฒŒ ๋“ค๊ณ  ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ชจ์Šต์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
361
- ["down/๋ชจ๋ธ.jpg", "down/์นดํŽ˜์ „๊ฒฝ.png", None, "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด (#2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ)์„ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ƒ์„ฑํ•˜๋ผ."],
362
- ["down/์ƒ์–ด๋ ˆ๊ณ ๋ชจํ˜•.png", None, None, "(#1์˜ ๋ ˆ๊ณ ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„, ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฃผ๋ณ€ ๋ฐฐ๊ฒฝ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ฑ„์›Œ์ฃผ์„ธ์š”. ๋‹จ, ์ด๋ฏธ์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฃผ์š” ์š”์†Œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด ํ•ด์•ผํ•œ๋‹ค."]
363
- ]
364
-
365
- gr.Examples(
366
- examples=examples,
367
- inputs=[image1_input, image2_input, image3_input, prompt_input],
368
- elem_id="examples-grid"
369
- )
370
-
371
- # ์˜ค๋ฅธ์ชฝ ์ถœ๋ ฅ ์˜์—ญ
372
- with gr.Column(scale=1):
373
  with gr.Row():
374
  with gr.Column():
375
- output_image1 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #1", height=600, width=450)
376
- output_image3 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #3", height=600, width=450)
 
377
  with gr.Column():
378
- output_image2 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #2", height=600, width=450)
379
- output_image4 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #4", height=600, width=450)
380
 
381
- output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€", lines=4)
382
- prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)", visible=True, lines=4)
383
-
384
- # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ)
385
- image_change_btn1.click(
386
- fn=lambda: "(#1์˜ ์—ฌ์„ฑ)์ด ์‚ด์ง ๋’ค๋กœ ๋Œ์•„๋ณด๋Š” ๋ชจ์Šต์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์ „ seed๋ฅผ ์œ ์ง€ํ•œํ…Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ผ.",
387
- inputs=[],
388
- outputs=prompt_input
389
- )
390
- image_change_btn2.click(
391
- fn=lambda: "(#1 ๋ ˆ๋ชจ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋งŒ ๊ฒ€์€์ƒ‰ ๊ณ ๋ž˜๋ ˆ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ seed๋ฅผ ๋ณ€๊ฒฝ์„ ํ•˜์ง€๋งˆ๋ผ.",
392
- inputs=[],
393
- outputs=prompt_input
394
- )
395
- text_remove_btn.click(
396
- fn=lambda: "(#1 ์ด๋ฏธ์ง€)์— ์žˆ๋Š” ์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ผ.",
397
- inputs=[],
398
- outputs=prompt_input
399
- )
400
- text_change_btn.click(
401
- fn=lambda: "(#1์˜ ํ…์ŠคํŠธ)๋ฅผ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•œ์ฒด ํ…์ŠคํŠธ๋งŒ \"Hello\"๋กœ ๋ฐ”๊ฟ”๋ผ",
402
- inputs=[],
403
- outputs=prompt_input
404
- )
405
- clothes_change_btn1.click(
406
- fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๊ฒ”)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)์™€ (#3์˜ ์ฒญ๋ฐ”์ง€)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
407
- inputs=[],
408
- outputs=prompt_input
409
- )
410
- clothes_change_btn2.click(
411
- fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ (#3์˜ ์žฅ์†Œ)์—์„œ ์˜์ž์— ์•‰์•„ ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
412
- inputs=[],
413
- outputs=prompt_input
414
- )
415
- holding_product_btn.click(
416
- fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์™€์ธ์ž”)์„ ์—ฌ์„ฑ๋ชจ๋ธ์ด ํ™๋ณดํ•  ์™€์ธ์ž”์„ ๋‹๋ณด์ด๊ฒŒ ๋“ค๊ณ  ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ชจ์Šต์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
417
- inputs=[],
418
- outputs=prompt_input
419
- )
420
- background_change_btn.click(
421
- fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด (#2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ)์„ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ๋‘ ์ด๋ฏธ์ง€์˜ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ƒ์„ฑํ•˜๋ผ.",
422
- inputs=[],
423
- outputs=prompt_input
424
- )
425
- composite_product_btn.click(
426
- fn=lambda: "(#1์˜ ๋ ˆ๊ณ ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„, ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฃผ๋ณ€ ๋ฐฐ๊ฒฝ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ฑ„์›Œ์ฃผ์„ธ์š”. ๋‹จ, ์ด๋ฏธ์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฃผ์š” ์š”์†Œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด ํ•ด์•ผํ•œ๋‹ค.",
427
- inputs=[],
428
- outputs=prompt_input
429
- )
430
-
431
- submit_btn.click(
432
- fn=generate_multiple_images,
433
- inputs=[image1_input, image2_input, image3_input, prompt_input],
434
- outputs=[output_image1, output_image2, output_image3, output_image4, output_text, prompt_display],
435
- )
436
 
437
  if __name__ == "__main__":
438
- demo.launch(share=True)
 
1
+ import os
2
+ import sys
3
+ from torchvision.transforms import functional
4
+ sys.modules["torchvision.transforms.functional_tensor"] = functional
5
+
6
+ from basicsr.archs.srvgg_arch import SRVGGNetCompact
7
+ from gfpgan.utils import GFPGANer
8
+ from realesrgan.utils import RealESRGANer
9
+
10
+ import torch
11
+ import cv2
12
+ import gradio as gr
13
+
14
+ # ํ•„์š”ํ•œ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
15
+ def download_upscaler_models():
16
+ if not os.path.exists('realesr-general-x4v3.pth'):
17
+ os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .")
18
+ if not os.path.exists('GFPGANv1.4.pth'):
19
+ os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .")
20
+
21
+ # ์—…์Šค์ผ€์ผ๋Ÿฌ ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
22
+ def init_upscaler_model():
23
+ model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
24
+ model_path = 'realesr-general-x4v3.pth'
25
+ half = True if torch.cuda.is_available() else False
26
+ upsampler = RealESRGANer(scale=4, model_path=model_path, model=model, tile=0, tile_pad=10, pre_pad=0, half=half)
27
+
28
+ return upsampler
29
+
30
+ # ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋ง ํ•จ์ˆ˜
31
+ def upscale_image(img):
32
+ try:
33
+ upsampler = init_upscaler_model()
34
+
35
+ # ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฝ๊ธฐ
36
+ img = cv2.imread(img, cv2.IMREAD_UNCHANGED)
37
+ if len(img.shape) == 3 and img.shape[2] == 4:
38
+ img_mode = 'RGBA'
39
+ elif len(img.shape) == 2:
40
+ img_mode = None
41
+ img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
42
+ else:
43
+ img_mode = None
44
+
45
+ # ์ž‘์€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •
46
+ h, w = img.shape[0:2]
47
+ if h < 300:
48
+ img = cv2.resize(img, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4)
49
+
50
+ # ๊ณ ์ •๋œ GFPGANv1.4 ๋ชจ๋ธ ์‚ฌ์šฉ
51
+ face_enhancer = GFPGANer(
52
+ model_path='GFPGANv1.4.pth',
53
+ upscale=2,
54
+ arch='clean',
55
+ channel_multiplier=2,
56
+ bg_upsampler=upsampler
57
+ )
58
+
59
+ # ์ด๋ฏธ์ง€ ํ–ฅ์ƒ
60
+ try:
61
+ _, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True)
62
+ except RuntimeError as error:
63
+ print('์˜ค๋ฅ˜', error)
64
+ return None
65
+
66
+ # RGB๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜
67
+ output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
68
+ return output
69
+ except Exception as error:
70
+ print('๊ธ€๋กœ๋ฒŒ ์˜ˆ์™ธ', error)
71
+ return None
72
+
73
+ # ์—…์Šค์ผ€์ผ๋Ÿฌ ํƒญ UI ์ƒ์„ฑ ํ•จ์ˆ˜
74
+ def create_upscaler_tab():
75
+ # ํ•„์š”ํ•œ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
76
+ download_upscaler_models()
77
+
78
+ with gr.Tab("์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ"):
79
+ gr.Markdown(
80
+ """
81
+ # ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ
82
+
83
+ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ณ ํ•ด์ƒ๋„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ๋ฌผ ์‚ฌ์ง„์˜ ์–ผ๊ตด ๋””ํ…Œ์ผ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
84
+ """
85
+ )
86
+
87
+ with gr.Row():
88
+ with gr.Column():
89
+ input_image = gr.Image(type="filepath", label="์ž…๋ ฅ ์ด๋ฏธ์ง€")
90
+ upscale_btn = gr.Button("์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ", variant="primary")
91
+
92
+ with gr.Column():
93
+ output_image = gr.Image(type="numpy", label="๊ฒฐ๊ณผ ์ด๋ฏธ์ง€")
94
+
95
+ upscale_btn.click(
96
+ fn=upscale_image,
97
+ inputs=[input_image],
98
+ outputs=[output_image]
99
+ )
100
+
101
  import os
102
  import tempfile
103
  from PIL import Image
 
107
  from io import BytesIO
108
  import time
109
 
110
+ # ์—…์Šค์ผ€์ผ๋Ÿฌ ๋ชจ๋“ˆ ์ž„ํฌํŠธ
111
+ import sys
112
+ from torchvision.transforms import functional
113
+ sys.modules["torchvision.transforms.functional_tensor"] = functional
114
+
115
+ from basicsr.archs.srvgg_arch import SRVGGNetCompact
116
+ from gfpgan.utils import GFPGANer
117
+ from realesrgan.utils import RealESRGANer
118
+
119
+ import torch
120
+ import cv2
121
+
122
  from google import genai
123
  from google.genai import types
124
 
 
411
 
412
  return results[0], results[1], results[2], results[3], combined_status, combined_prompts
413
 
414
+ # ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ ๊ธฐ๋Šฅ
415
+ def download_upscaler_models():
416
+ if not os.path.exists('realesr-general-x4v3.pth'):
417
+ os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .")
418
+ if not os.path.exists('GFPGANv1.4.pth'):
419
+ os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .")
420
+
421
+ def upscale_image(img):
422
+ try:
423
+ # ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
424
+ model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
425
+ model_path = 'realesr-general-x4v3.pth'
426
+ half = True if torch.cuda.is_available() else False
427
+ upsampler = RealESRGANer(scale=4, model_path=model_path, model=model, tile=0, tile_pad=10, pre_pad=0, half=half)
428
+
429
+ # ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฝ๊ธฐ
430
+ img = cv2.imread(img, cv2.IMREAD_UNCHANGED)
431
+ if len(img.shape) == 3 and img.shape[2] == 4:
432
+ img_mode = 'RGBA'
433
+ elif len(img.shape) == 2:
434
+ img_mode = None
435
+ img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
436
+ else:
437
+ img_mode = None
438
+
439
+ # ์ž‘์€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •
440
+ h, w = img.shape[0:2]
441
+ if h < 300:
442
+ img = cv2.resize(img, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4)
443
+
444
+ # GFPGANv1.4 ๋ชจ๋ธ ์‚ฌ์šฉ
445
+ face_enhancer = GFPGANer(
446
+ model_path='GFPGANv1.4.pth',
447
+ upscale=2,
448
+ arch='clean',
449
+ channel_multiplier=2,
450
+ bg_upsampler=upsampler
451
+ )
452
+
453
+ # ์ด๋ฏธ์ง€ ํ–ฅ์ƒ
454
+ try:
455
+ _, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True)
456
+ except RuntimeError as error:
457
+ print('์˜ค๋ฅ˜', error)
458
+ return None
459
+
460
+ # RGB๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜
461
+ output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
462
+ return output
463
+ except Exception as error:
464
+ print('๊ธ€๋กœ๋ฒŒ ์˜ˆ์™ธ', error)
465
+ return None
466
+
467
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
468
  with gr.Blocks() as demo:
469
  gr.HTML(
470
  """
471
  <div style="text-align: center; margin-bottom: 1rem;">
472
+ <h1>์ด์ปค๋จธ์Šค์šฉ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘ ๋„๊ตฌ</h1>
473
+ <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์„ธ์š”.</p>
474
  </div>
475
  """
476
  )
477
 
478
+ with gr.Tabs():
479
+ # ์ฒซ ๋ฒˆ์งธ ํƒญ: ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ
480
+ with gr.Tab("์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ"):
481
  with gr.Row():
482
+ # ์™ผ์ชฝ ์ž…๋ ฅ ์˜์—ญ (์˜ˆ์ œ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์•„๋ž˜์— ๋ฐฐ์น˜)
483
+ with gr.Column(scale=1):
484
+ with gr.Row():
485
+ image1_input = gr.Image(type="pil", label="#1", image_mode="RGB", height=300, width=200)
486
+ image2_input = gr.Image(type="pil", label="#2", image_mode="RGB", height=300, width=200)
487
+ image3_input = gr.Image(type="pil", label="#3", image_mode="RGB", height=300, width=200)
488
+ prompt_input = gr.Textbox(
489
+ lines=3,
490
+ placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
491
+ label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
492
+ )
493
+ with gr.Row():
494
+ image_change_btn1 = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ-1")
495
+ image_change_btn2 = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ-2")
496
+ text_remove_btn = gr.Button("๊ธ€์ž ์ง€์šฐ๊ธฐ")
497
+ text_change_btn = gr.Button("๊ธ€์ž ๋ณ€๊ฒฝํ•˜๊ธฐ")
498
+ clothes_change_btn1 = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ-1")
499
+ clothes_change_btn2 = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ-2")
500
+ holding_product_btn = gr.Button("์ƒํ’ˆ๋“ค๊ณ  ์žˆ๊ธฐ")
501
+ background_change_btn = gr.Button("๋ฐฐ๊ฒฝ ๋ฐ”๊พธ๊ธฐ")
502
+ composite_product_btn = gr.Button("๋ถ€๋ถ„ ์ง€์šฐ๊ธฐ")
503
+ submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ (4์žฅ)", variant="primary")
504
+
505
+ gr.Markdown(
506
+ """
507
+ ### ์‚ฌ์šฉ ๋ฐฉ๋ฒ•:
508
+
509
+ 1. **์ž๋™ ํ•ฉ์„ฑ**: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.
510
+ 2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
511
+ 3. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๋กœ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
512
+ 4. **๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€**: "์ด๋ฏธ์ง€ ์ƒ์„ฑ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐจ๋ก€๋กœ 4์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
513
+ 5. **์˜ˆ์ œ์„ ํƒ**: ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”.
514
+
515
+ > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
516
+ """
517
+ )
518
+
519
+ # ์˜ˆ์ œ ์ด๋ฏธ์ง€: ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์•„๋ž˜ ์™ผ์ชฝ ์˜์—ญ์— ๋ฐฐ์น˜
520
+ gr.Markdown("## ์˜ˆ์ œ ์ด๋ฏธ์ง€")
521
+ examples = [
522
+ ["down/๋ชจ๋ธ.jpg", None, None, "(#1์˜ ์—ฌ์„ฑ)์ด ์‚ด์ง ๋’ค๋กœ ๋Œ์•„๋ณด๋Š” ๋ชจ์Šต์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์ „ seed๋ฅผ ์œ ์ง€ํ•œํ…Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ผ."],
523
+ ["down/์ƒ์–ด๋ ˆ๊ณ ๋ชจํ˜•.png", None, None, "(#1 ๋ ˆ๋ชจ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋งŒ ๊ฒ€์€์ƒ‰ ๊ณ ๋ž˜๋ ˆ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ seed๋ฅผ ๋ณ€๊ฒฝ์„ ํ•˜์ง€๋งˆ๋ผ."],
524
+ ["down/์ค‘๊ตญ์–ด.png", None, None, "(#1 ์ด๋ฏธ์ง€)์— ์žˆ๋Š” ์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ผ."],
525
+ ["down/ํ…์ŠคํŠธ.webp", None, None, '(#1์˜ ํ…์ŠคํŠธ)๋ฅผ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•œ์ฒด ํ…์ŠคํŠธ๋งŒ "Hello"๋กœ ๋ฐ”๊ฟ”๋ผ'],
526
+ ["down/๋ชจ๋ธ.jpg", "down/์„ ๊ธ€๋ผ์Šค.png", "down/์ฒญ๋ฐ”์ง€.png", "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)์™€ (#3์˜ ์ฒญ๋ฐ”์ง€)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
527
+ ["down/๋ชจ๋ธ.jpg", "down/์„ ๊ธ€๋ผ์Šค.png", "down/์นดํŽ˜์ „๊ฒฝ.png", "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ (#3์˜ ์žฅ์†Œ)์—์„œ ์˜์ž์— ์•‰์•„ ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
528
+ ["down/๋ชจ๋ธ.jpg", "down/์™€์ธ์ž”.png", None, "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์™€์ธ์ž”)์„ ์—ฌ์„ฑ๋ชจ๋ธ์ด ํ™๋ณดํ•  ์™€์ธ์ž”์„ ๋‹๋ณด์ด๊ฒŒ ๋“ค๊ณ  ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ชจ์Šต์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ."],
529
+ ["down/๋ชจ๋ธ.jpg", "down/์นดํŽ˜์ „๊ฒฝ.png", None, "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด (#2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ)์„ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ƒ์„ฑํ•˜๋ผ."],
530
+ ["down/์ƒ์–ด๋ ˆ๊ณ ๋ชจํ˜•.png", None, None, "(#1์˜ ๋ ˆ๊ณ ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„, ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฃผ๋ณ€ ๋ฐฐ๊ฒฝ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ฑ„์›Œ์ฃผ์„ธ์š”. ๋‹จ, ์ด๋ฏธ์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฃผ์š” ์š”์†Œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด ํ•ด์•ผํ•œ๋‹ค."]
531
+ ]
532
+
533
+ gr.Examples(
534
+ examples=examples,
535
+ inputs=[image1_input, image2_input, image3_input, prompt_input],
536
+ elem_id="examples-grid"
537
+ )
538
+
539
+ # ์˜ค๋ฅธ์ชฝ ์ถœ๋ ฅ ์˜์—ญ
540
+ with gr.Column(scale=1):
541
+ with gr.Row():
542
+ with gr.Column():
543
+ output_image1 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #1", height=600, width=450)
544
+ output_image3 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #3", height=600, width=450)
545
+ with gr.Column():
546
+ output_image2 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #2", height=600, width=450)
547
+ output_image4 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #4", height=600, width=450)
548
+
549
+ output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€", lines=4)
550
+ prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)", visible=True, lines=4)
551
+
552
+ # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ)
553
+ image_change_btn1.click(
554
+ fn=lambda: "(#1์˜ ์—ฌ์„ฑ)์ด ์‚ด์ง ๋’ค๋กœ ๋Œ์•„๋ณด๋Š” ๋ชจ์Šต์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์ „ seed๋ฅผ ์œ ์ง€ํ•œํ…Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ผ.",
555
+ inputs=[],
556
+ outputs=prompt_input
557
+ )
558
+ image_change_btn2.click(
559
+ fn=lambda: "(#1 ๋ ˆ๋ชจ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋งŒ ๊ฒ€์€์ƒ‰ ๊ณ ๋ž˜๋ ˆ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ seed๋ฅผ ๋ณ€๊ฒฝ์„ ํ•˜์ง€๋งˆ๋ผ.",
560
+ inputs=[],
561
+ outputs=prompt_input
562
+ )
563
+ text_remove_btn.click(
564
+ fn=lambda: "(#1 ์ด๋ฏธ์ง€)์— ์žˆ๋Š” ์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ผ.",
565
+ inputs=[],
566
+ outputs=prompt_input
567
+ )
568
+ text_change_btn.click(
569
+ fn=lambda: "(#1์˜ ํ…์ŠคํŠธ)๋ฅผ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•œ์ฒด ํ…์ŠคํŠธ๋งŒ \"Hello\"๋กœ ๋ฐ”๊ฟ”๋ผ",
570
+ inputs=[],
571
+ outputs=prompt_input
572
+ )
573
+ clothes_change_btn1.click(
574
+ fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๊ฒ”)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)์™€ (#3์˜ ์ฒญ๋ฐ”์ง€)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
575
+ inputs=[],
576
+ outputs=prompt_input
577
+ )
578
+ clothes_change_btn2.click(
579
+ fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์„ ๊ธ€๋ผ์Šค)๋ฅผ ์ง์ ‘ ๋ชจ๋ธ์ด ์ฐฉ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ (#3์˜ ์žฅ์†Œ)์—์„œ ์˜์ž์— ์•‰์•„ ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
580
+ inputs=[],
581
+ outputs=prompt_input
582
+ )
583
+ holding_product_btn.click(
584
+ fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์œ ์น˜ํ•œ ์ฒด (#2์˜ ์™€์ธ์ž”)์„ ์—ฌ์„ฑ๋ชจ๋ธ์ด ํ™๋ณดํ•  ์™€์ธ์ž”์„ ๋‹๋ณด์ด๊ฒŒ ๋“ค๊ณ  ์žˆ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ชจ์Šต์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ผ.",
585
+ inputs=[],
586
+ outputs=prompt_input
587
+ )
588
+ background_change_btn.click(
589
+ fn=lambda: "(#1์˜ ์—ฌ์„ฑ๋ชจ๋ธ)์ด (#2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ)์„ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ๋‘ ์ด๋ฏธ์ง€์˜ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ƒ์„ฑํ•˜๋ผ.",
590
+ inputs=[],
591
+ outputs=prompt_input
592
+ )
593
+ composite_product_btn.click(
594
+ fn=lambda: "(#1์˜ ๋ ˆ๊ณ ๋ชจํ˜•)์—์„œ ์ฒญ์ƒ‰์ƒ์–ด๋ ˆ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„, ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฃผ๋ณ€ ๋ฐฐ๊ฒฝ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ์ฑ„์›Œ์ฃผ์„ธ์š”. ๋‹จ, ์ด๋ฏธ์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฃผ์š” ์š”์†Œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด ํ•ด์•ผํ•œ๋‹ค.",
595
+ inputs=[],
596
+ outputs=prompt_input
597
  )
598
+
599
+ submit_btn.click(
600
+ fn=generate_multiple_images,
601
+ inputs=[image1_input, image2_input, image3_input, prompt_input],
602
+ outputs=[output_image1, output_image2, output_image3, output_image4, output_text, prompt_display],
603
+ )
604
+
605
+ # ๋‘ ๋ฒˆ์งธ ํƒญ: ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ
606
+ with gr.Tab("์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ"):
607
+ # ํ•„์š”ํ•œ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ ํ˜ธ์ถœ
608
+ download_upscaler_models()
609
 
610
  gr.Markdown(
611
  """
612
+ # ์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ๋Ÿฌ
 
 
 
 
 
 
613
 
614
+ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ณ ํ•ด์ƒ๋„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ๋ฌผ ์‚ฌ์ง„์˜ ์–ผ๊ตด ๋””ํ…Œ์ผ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
615
  """
616
  )
617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618
  with gr.Row():
619
  with gr.Column():
620
+ input_upscale_image = gr.Image(type="filepath", label="์ž…๋ ฅ ์ด๋ฏธ์ง€")
621
+ upscale_btn = gr.Button("์ด๋ฏธ์ง€ ์—…์Šค์ผ€์ผ", variant="primary")
622
+
623
  with gr.Column():
624
+ output_upscale_image = gr.Image(type="numpy", label="๊ฒฐ๊ณผ ์ด๋ฏธ์ง€")
 
625
 
626
+ upscale_btn.click(
627
+ fn=upscale_image,
628
+ inputs=[input_upscale_image],
629
+ outputs=[output_upscale_image]
630
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
631
 
632
  if __name__ == "__main__":
633
+ demo.launch(share=True)