Kims12 commited on
Commit
af7449f
ยท
verified ยท
1 Parent(s): 11eae0e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -19
app.py CHANGED
@@ -5,6 +5,7 @@ import gradio as gr
5
  import logging
6
  import re
7
  from io import BytesIO
 
8
 
9
  from google import genai
10
  from google.genai import types
@@ -146,9 +147,10 @@ def preprocess_prompt(prompt, image1, image2, image3):
146
  prompt += " ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."
147
  return prompt
148
 
149
- def generate_with_images(prompt, images):
150
  """
151
  API ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
152
  """
153
  try:
154
  api_key = os.environ.get("GEMINI_API_KEY")
@@ -156,7 +158,18 @@ def generate_with_images(prompt, images):
156
  return None, "API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
157
 
158
  client = genai.Client(api_key=api_key)
159
- logger.info(f"Gemini API ์š”์ฒญ ์‹œ์ž‘ - ํ”„๋กฌํ”„ํŠธ: {prompt}")
 
 
 
 
 
 
 
 
 
 
 
160
 
161
  contents = [prompt]
162
  for idx, img in enumerate(images, 1):
@@ -198,7 +211,7 @@ def generate_with_images(prompt, images):
198
  logger.exception("์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
199
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
200
 
201
- def process_images_with_prompt(image1, image2, image3, prompt):
202
  """
203
  3๊ฐœ์˜ ์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ์ข… ์˜์–ด ํ”„๋กฌํ”„ํŠธ(final_prompt)๋ฅผ ์ƒ์„ฑํ•œ ํ›„,
204
  API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
@@ -226,27 +239,60 @@ def process_images_with_prompt(image1, image2, image3, prompt):
226
  final_prompt = "Please creatively composite these three images, combining their main elements into a cohesive and natural scene."
227
  logger.info("Default prompt generated for three images")
228
 
229
- result_img, status = generate_with_images(final_prompt, valid_images)
230
  return result_img, status, final_prompt
231
  except Exception as e:
232
  logger.exception("์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
233
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
234
 
235
- def process_and_show_prompt(image1, image2, image3, prompt):
236
- try:
237
- result_img, status, final_prompt = process_images_with_prompt(image1, image2, image3, prompt)
238
- return result_img, status, final_prompt
239
- except Exception as e:
240
- logger.exception("์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
241
- return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
 
243
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
244
  with gr.Blocks() as demo:
245
  gr.HTML(
246
  """
247
  <div style="text-align: center; margin-bottom: 1rem;">
248
- <h1>๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ (์˜ˆ์ œ ํฌํ•จ)</h1>
249
- <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜ ์˜ˆ์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญ๏ฟฝ๏ฟฝ๋ฉด ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๊ฐ€ down ํด๋”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.</p>
250
  </div>
251
  """
252
  )
@@ -268,11 +314,22 @@ with gr.Blocks() as demo:
268
  clothes_change_btn = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ")
269
  background_change_btn = gr.Button("๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ")
270
  composite_product_btn = gr.Button("๋ถ€๋ถ„์ง€์šฐ๊ธฐ")
271
- submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ", variant="primary")
 
 
272
  with gr.Column():
273
- output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
274
- output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
275
- prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)", visible=True)
 
 
 
 
 
 
 
 
 
276
 
277
  # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ)
278
  image_change_btn.click(
@@ -302,9 +359,9 @@ with gr.Blocks() as demo:
302
  )
303
 
304
  submit_btn.click(
305
- fn=process_and_show_prompt,
306
  inputs=[image1_input, image2_input, image3_input, prompt_input],
307
- outputs=[output_image, output_text, prompt_display],
308
  )
309
 
310
  gr.Markdown(
@@ -314,6 +371,7 @@ with gr.Blocks() as demo:
314
  1. **์ž๋™ ํ•ฉ์„ฑ**: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.
315
  2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
316
  3. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๋กœ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
317
 
318
  > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
319
  """
 
5
  import logging
6
  import re
7
  from io import BytesIO
8
+ import time
9
 
10
  from google import genai
11
  from google.genai import types
 
147
  prompt += " ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."
148
  return prompt
149
 
150
+ def generate_with_images(prompt, images, variation_index=0):
151
  """
152
  API ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
153
+ variation_index๋กœ ๋‹ค์–‘ํ•œ ๋ณ€ํ™”๋ฅผ ์ค๋‹ˆ๋‹ค.
154
  """
155
  try:
156
  api_key = os.environ.get("GEMINI_API_KEY")
 
158
  return None, "API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
159
 
160
  client = genai.Client(api_key=api_key)
161
+ logger.info(f"Gemini API ์š”์ฒญ ์‹œ์ž‘ - ํ”„๋กฌํ”„ํŠธ: {prompt}, ๋ณ€ํ˜• ์ธ๋ฑ์Šค: {variation_index}")
162
+
163
+ # ๋ณ€ํ˜• ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ํ”„๋กฌํ”„ํŠธ์— ์•ฝ๊ฐ„์˜ ๋ณ€ํ™” ์ถ”๊ฐ€
164
+ variation_suffixes = [
165
+ " ์ฒซ ๋ฒˆ์งธ ๋ณ€ํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.",
166
+ " ๋‘ ๋ฒˆ์งธ ๋ณ€ํ˜•์œผ๋กœ ๋” ์ƒ์ƒํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.",
167
+ " ์„ธ ๋ฒˆ์งธ ๋ณ€ํ˜•์œผ๋กœ ๋” ์ฐฝ์˜์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.",
168
+ " ๋„ค ๋ฒˆ์งธ ๋ณ€ํ˜•์œผ๋กœ ์ƒ‰๊ฐ์„ ๋” ๊ฐ•์กฐํ•ด์„œ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
169
+ ]
170
+
171
+ if variation_index < len(variation_suffixes):
172
+ prompt = prompt + variation_suffixes[variation_index]
173
 
174
  contents = [prompt]
175
  for idx, img in enumerate(images, 1):
 
211
  logger.exception("์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
212
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
213
 
214
+ def process_images_with_prompt(image1, image2, image3, prompt, variation_index=0):
215
  """
216
  3๊ฐœ์˜ ์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ์ข… ์˜์–ด ํ”„๋กฌํ”„ํŠธ(final_prompt)๋ฅผ ์ƒ์„ฑํ•œ ํ›„,
217
  API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
239
  final_prompt = "Please creatively composite these three images, combining their main elements into a cohesive and natural scene."
240
  logger.info("Default prompt generated for three images")
241
 
242
+ result_img, status = generate_with_images(final_prompt, valid_images, variation_index)
243
  return result_img, status, final_prompt
244
  except Exception as e:
245
  logger.exception("์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
246
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
247
 
248
+ def generate_multiple_images(image1, image2, image3, prompt, progress=gr.Progress()):
249
+ """
250
+ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
251
+ """
252
+ results = []
253
+ statuses = []
254
+ prompts = []
255
+
256
+ num_images = 4 # ์ƒ์„ฑํ•  ์ด๋ฏธ์ง€ ์ˆ˜
257
+
258
+ progress(0, desc="์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค€๋น„ ์ค‘...")
259
+
260
+ for i in range(num_images):
261
+ progress((i / num_images), desc=f"{i+1}/{num_images} ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘...")
262
+ result_img, status, final_prompt = process_images_with_prompt(image1, image2, image3, prompt, i)
263
+
264
+ if result_img is not None:
265
+ results.append(result_img)
266
+ statuses.append(f"์ด๋ฏธ์ง€ #{i+1}: {status}")
267
+ prompts.append(f"์ด๋ฏธ์ง€ #{i+1}: {final_prompt}")
268
+ else:
269
+ # ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋„ ๊ฒฐ๊ณผ ๋ชฉ๋ก์— None์„ ์ถ”๊ฐ€
270
+ results.append(None)
271
+ statuses.append(f"์ด๋ฏธ์ง€ #{i+1} ์ƒ์„ฑ ์‹คํŒจ: {status}")
272
+ prompts.append(f"์ด๋ฏธ์ง€ #{i+1}: {final_prompt}")
273
+
274
+ # API ํ˜ธ์ถœ ์‚ฌ์ด์— ์•ฝ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๋‘์–ด ์†๋„ ์ œํ•œ ๋ฐฉ์ง€
275
+ time.sleep(1)
276
+
277
+ progress(1.0, desc="์ด๋ฏธ์ง€ ์ƒ์„ฑ ์™„๋ฃŒ!")
278
+
279
+ # ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ์Šฌ๋กฏ ์ฑ„์šฐ๊ธฐ
280
+ while len(results) < 4:
281
+ results.append(None)
282
+
283
+ # ์ƒํƒœ ๋ฉ”์‹œ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ์ •๋ณด ๊ฒฐํ•ฉ
284
+ combined_status = "\n".join(statuses)
285
+ combined_prompts = "\n".join(prompts)
286
+
287
+ return results[0], results[1], results[2], results[3], combined_status, combined_prompts
288
 
289
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
290
  with gr.Blocks() as demo:
291
  gr.HTML(
292
  """
293
  <div style="text-align: center; margin-bottom: 1rem;">
294
+ <h1>4์žฅ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ (์˜ˆ์ œ ํฌํ•จ)</h1>
295
+ <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  "์ด๋ฏธ์ง€ ์ƒ์„ฑ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐจ๋ก€๋กœ 4์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.</p>
296
  </div>
297
  """
298
  )
 
314
  clothes_change_btn = gr.Button("๊ฐ€์ƒ ์ƒํ’ˆ์ฐฉ์šฉ")
315
  background_change_btn = gr.Button("๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ")
316
  composite_product_btn = gr.Button("๋ถ€๋ถ„์ง€์šฐ๊ธฐ")
317
+ submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ (4์žฅ)", variant="primary")
318
+
319
+ with gr.Row():
320
  with gr.Column():
321
+ output_image1 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #1")
322
+ with gr.Column():
323
+ output_image2 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #2")
324
+
325
+ with gr.Row():
326
+ with gr.Column():
327
+ output_image3 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #3")
328
+ with gr.Column():
329
+ output_image4 = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ #4")
330
+
331
+ output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
332
+ prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)", visible=True)
333
 
334
  # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ)
335
  image_change_btn.click(
 
359
  )
360
 
361
  submit_btn.click(
362
+ fn=generate_multiple_images,
363
  inputs=[image1_input, image2_input, image3_input, prompt_input],
364
+ outputs=[output_image1, output_image2, output_image3, output_image4, output_text, prompt_display],
365
  )
366
 
367
  gr.Markdown(
 
371
  1. **์ž๋™ ํ•ฉ์„ฑ**: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.
372
  2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
373
  3. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๋กœ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
374
+ 4. **๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€**: "์ด๋ฏธ์ง€ ์ƒ์„ฑ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐจ๋ก€๋กœ 4์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
375
 
376
  > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
377
  """