Kims12 commited on
Commit
08aa2fc
ยท
verified ยท
1 Parent(s): 30ec38e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -57
app.py CHANGED
@@ -101,9 +101,6 @@ def preprocess_prompt(prompt, image1, image2, image3):
101
  else:
102
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ ๋ชจ๋“  ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”. ๊น”๋”ํ•œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
103
 
104
- elif "3. ์–ผ๊ตด๋ฐ”๊พธ๊ธฐ" in prompt:
105
- prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์–ผ๊ตด์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์–ผ๊ตด๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”. ์–ผ๊ตด์˜ ํ‘œ์ •๊ณผ ํŠน์ง•์€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
106
-
107
  elif "4. ์˜ท๋ฐ”๊พธ๊ธฐ" in prompt:
108
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. ์˜์ƒ์˜ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
109
 
@@ -113,12 +110,6 @@ def preprocess_prompt(prompt, image1, image2, image3):
113
  elif "6. ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ)" in prompt:
114
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์™€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€(๋˜๋Š” ์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€)๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ , ํŠนํžˆ ์ƒํ’ˆ์ด ๋‹๋ณด์ด๋„๋ก ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•ด์ฃผ์„ธ์š”."
115
 
116
- elif "7. ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ)" in prompt:
117
- prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด์™€ ๊ตฌ๋„๋Š” ์œ ์ง€ํ•˜๋˜, ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜ˆ์ˆ ์  ์Šคํƒ€์ผ, ์ƒ‰์ƒ, ์งˆ๊ฐ์„ ์ ์šฉํ•ด์ฃผ์„ธ์š”."
118
-
119
- elif "์„ ๋ถ‰์€์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”๋ผ" in prompt or "๋ฅผ ๋ถ‰์€์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”๋ผ" in prompt:
120
- prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ถ‰์€์ƒ‰ ํ†ค์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. ์ „์ฒด์ ์ธ ์ƒ‰์ƒ์„ ๋ถ‰์€ ๊ณ„์—ด๋กœ ์กฐ์ •ํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋А๋‚Œ์„ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
121
-
122
  prompt += " ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."
123
 
124
  return prompt
@@ -179,49 +170,47 @@ def generate_with_images(prompt, images):
179
 
180
  def process_images_with_prompt(image1, image2, image3, prompt):
181
  """
182
- 3๊ฐœ์˜ ์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
 
183
  """
184
  try:
185
  images = [image1, image2, image3]
186
  valid_images = [img for img in images if img is not None]
187
  if not valid_images:
188
- return None, "์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”."
189
- # ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ•œ๊ตญ์–ด๋ผ๋ฉด ๋ฒˆ์—ญ ํ›„ ์ ์šฉ
190
- if prompt and re.search("[๊ฐ€-ํžฃ]", prompt):
191
- prompt = translate_prompt_to_english(prompt)
192
- if not prompt or not prompt.strip():
 
 
 
 
 
 
193
  if len(valid_images) == 1:
194
- prompt = "Please creatively transform this image into a more vivid and artistic version."
195
  logger.info("Default prompt generated for single image")
196
  elif len(valid_images) == 2:
197
- prompt = "Please seamlessly composite these two images, integrating their key elements harmoniously into a single image."
198
  logger.info("Default prompt generated for two images")
199
  else:
200
- prompt = "Please creatively composite these three images, combining their main elements into a cohesive and natural scene."
201
  logger.info("Default prompt generated for three images")
202
- else:
203
- prompt = preprocess_prompt(prompt, image1, image2, image3)
204
- return generate_with_images(prompt, valid_images)
205
  except Exception as e:
206
  logger.exception("์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
207
- return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
208
 
209
  def process_and_show_prompt(image1, image2, image3, prompt):
210
- images = [image1, image2, image3]
211
- valid_images = [img for img in images if img is not None]
 
212
  try:
213
- auto_prompt = prompt
214
- if not prompt or not prompt.strip():
215
- if len(valid_images) == 1:
216
- auto_prompt = "Please creatively transform this image into a more vivid and artistic version."
217
- elif len(valid_images) == 2:
218
- auto_prompt = "Please seamlessly composite these two images, integrating their key elements harmoniously into a single image."
219
- else:
220
- auto_prompt = "Please creatively composite these three images, combining their main elements into a cohesive and natural scene."
221
- else:
222
- auto_prompt = preprocess_prompt(prompt, image1, image2, image3)
223
- result_img, status = process_images_with_prompt(image1, image2, image3, prompt)
224
- return result_img, status, auto_prompt
225
  except Exception as e:
226
  logger.exception("์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
227
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
@@ -248,35 +237,31 @@ with gr.Blocks() as demo:
248
  placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
249
  label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
250
  )
251
- # ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์„ ํƒ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ ํ‘œ์‹œ (์—ฌ๋Ÿฌ ํ•ญ๋ชฉ)
252
  gr.Markdown(
253
  """
254
  **์„ ํƒ ์˜ต์…˜:**
255
 
256
  1. **์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ:** `#1 ์ด๋ฏธ์ง€์˜ [๋‹ค๋ฅธ ๋ชจ์Šต]์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
257
  2. **๊ธ€์ž์ง€์šฐ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ [์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘]๋ฅผ ์ œ๊ฑฐํ•˜๋ผ.`
258
- 3. **์–ผ๊ตด๋ฐ”๊พธ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์–ผ๊ตด์„ #2 ์ด๋ฏธ์ง€์˜ ์–ผ๊ตด๋กœ ๊ต์ฒดํ•˜๋ผ.`
259
- 4. **์˜ท๋ฐ”๊พธ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ #2 ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
260
- 5. **๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์„ #2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
261
- 6. **์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ):** `#1 ์ด๋ฏธ์ง€์™€ #2 ์ด๋ฏธ์ง€(๋˜๋Š” #3 ์ด๋ฏธ์ง€)๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•˜๋ผ.`
262
- 7. **์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ):** `#1 ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์„ #2 ์ด๋ฏธ์ง€์˜ ์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
263
  """
264
  )
265
  with gr.Row():
266
  image_change_btn = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ")
267
  text_remove_btn = gr.Button("๊ธ€์ž์ง€์šฐ๊ธฐ")
268
- face_swap_btn = gr.Button("์–ผ๊ตด๋ฐ”๊พธ๊ธฐ")
269
  clothes_change_btn = gr.Button("์˜ท๋ฐ”๊พธ๊ธฐ")
270
  background_change_btn = gr.Button("๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ")
271
  composite_product_btn = gr.Button("์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ)")
272
- composite_style_btn = gr.Button("์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ)")
273
  submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ", variant="primary")
274
  with gr.Column():
275
  output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
276
  output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
277
- prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ", visible=True)
278
 
279
- # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (์ž…๋ ฅ๊ฐ’์€ ํ•œ๊ตญ์–ด๋กœ ์ง€์ •๋จ)
280
  image_change_btn.click(
281
  fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ [๋‹ค๋ฅธ ๋ชจ์Šต]์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.",
282
  inputs=[],
@@ -287,11 +272,6 @@ with gr.Blocks() as demo:
287
  inputs=[],
288
  outputs=prompt_input
289
  )
290
- face_swap_btn.click(
291
- fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์–ผ๊ตด์„ #2 ์ด๋ฏธ์ง€์˜ ์–ผ๊ตด๋กœ ๊ต์ฒดํ•˜๋ผ.",
292
- inputs=[],
293
- outputs=prompt_input
294
- )
295
  clothes_change_btn.click(
296
  fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ #2 ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.",
297
  inputs=[],
@@ -307,11 +287,6 @@ with gr.Blocks() as demo:
307
  inputs=[],
308
  outputs=prompt_input
309
  )
310
- composite_style_btn.click(
311
- fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์„ #2 ์ด๋ฏธ์ง€์˜ ์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.",
312
- inputs=[],
313
- outputs=prompt_input
314
- )
315
 
316
  submit_btn.click(
317
  fn=process_and_show_prompt,
@@ -327,7 +302,7 @@ with gr.Blocks() as demo:
327
  2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
328
  3. **์ผ๋ถ€ ์ด๋ฏธ์ง€๋งŒ**: ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•ด๋„ ๊ธฐ๋Šฅ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
329
  4. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์˜ ์˜ต์…˜์—์„œ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๊ฐ€ ์ฑ„์›Œ์ง€๊ณ ,
330
- ์ดํ›„ Geminiโ€‘2.0โ€‘flash ๋ชจ๋ธ์„ ํ†ตํ•ด ์˜์–ด๋กœ ๋ฒˆ์—ญ๋˜์–ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
331
 
332
  > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
333
  """
 
101
  else:
102
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ ๋ชจ๋“  ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”. ๊น”๋”ํ•œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
103
 
 
 
 
104
  elif "4. ์˜ท๋ฐ”๊พธ๊ธฐ" in prompt:
105
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. ์˜์ƒ์˜ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
106
 
 
110
  elif "6. ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ)" in prompt:
111
  prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์™€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€(๋˜๋Š” ์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€)๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ , ํŠนํžˆ ์ƒํ’ˆ์ด ๋‹๋ณด์ด๋„๋ก ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•ด์ฃผ์„ธ์š”."
112
 
 
 
 
 
 
 
113
  prompt += " ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."
114
 
115
  return prompt
 
170
 
171
  def process_images_with_prompt(image1, image2, image3, prompt):
172
  """
173
+ 3๊ฐœ์˜ ์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜.
174
+ ์ตœ์ข…์ ์œผ๋กœ ์˜์–ด๋กœ ๋ฒˆ์—ญ๋œ ํ”„๋กฌํ”„ํŠธ(final_prompt)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ API์— ์ ์šฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
175
  """
176
  try:
177
  images = [image1, image2, image3]
178
  valid_images = [img for img in images if img is not None]
179
  if not valid_images:
180
+ return None, "์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.", ""
181
+
182
+ # ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ: ์ „์ฒ˜๋ฆฌ ํ›„ ์ตœ์ข… ์˜์–ด ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ
183
+ if prompt and prompt.strip():
184
+ processed_prompt = preprocess_prompt(prompt, image1, image2, image3)
185
+ if re.search("[๊ฐ€-ํžฃ]", processed_prompt):
186
+ final_prompt = translate_prompt_to_english(processed_prompt)
187
+ else:
188
+ final_prompt = processed_prompt
189
+ else:
190
+ # ํ”„๋กฌํ”„ํŠธ ๋ฏธ์ž…๋ ฅ ์‹œ, ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜์— ๋”ฐ๋ฅธ ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)
191
  if len(valid_images) == 1:
192
+ final_prompt = "Please creatively transform this image into a more vivid and artistic version."
193
  logger.info("Default prompt generated for single image")
194
  elif len(valid_images) == 2:
195
+ final_prompt = "Please seamlessly composite these two images, integrating their key elements harmoniously into a single image."
196
  logger.info("Default prompt generated for two images")
197
  else:
198
+ final_prompt = "Please creatively composite these three images, combining their main elements into a cohesive and natural scene."
199
  logger.info("Default prompt generated for three images")
200
+
201
+ result_img, status = generate_with_images(final_prompt, valid_images)
202
+ return result_img, status, final_prompt
203
  except Exception as e:
204
  logger.exception("์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
205
+ return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
206
 
207
  def process_and_show_prompt(image1, image2, image3, prompt):
208
+ """
209
+ ์ตœ์ข…์ ์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์˜์–ด ์ตœ์ข… ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
210
+ """
211
  try:
212
+ result_img, status, final_prompt = process_images_with_prompt(image1, image2, image3, prompt)
213
+ return result_img, status, final_prompt
 
 
 
 
 
 
 
 
 
 
214
  except Exception as e:
215
  logger.exception("์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:")
216
  return None, f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", prompt
 
237
  placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
238
  label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
239
  )
240
+ # ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์„ ํƒ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ ํ‘œ์‹œ (์–ผ๊ตด๋ฐ”๊พธ๊ธฐ, ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ) ์ œ์™ธ)
241
  gr.Markdown(
242
  """
243
  **์„ ํƒ ์˜ต์…˜:**
244
 
245
  1. **์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ:** `#1 ์ด๋ฏธ์ง€์˜ [๋‹ค๋ฅธ ๋ชจ์Šต]์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
246
  2. **๊ธ€์ž์ง€์šฐ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ [์ค‘๊ตญ์–ด๋ฅผ ๋ชจ๋‘]๋ฅผ ์ œ๊ฑฐํ•˜๋ผ.`
247
+ 3. **์˜ท๋ฐ”๊พธ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ #2 ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
248
+ 4. **๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ:** `#1 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์„ #2 ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.`
249
+ 5. **์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ):** `#1 ์ด๋ฏธ์ง€์™€ #2 ์ด๋ฏธ์ง€(๋˜๋Š” #3 ์ด๋ฏธ์ง€)๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•˜๋ผ.`
 
 
250
  """
251
  )
252
  with gr.Row():
253
  image_change_btn = gr.Button("์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ")
254
  text_remove_btn = gr.Button("๊ธ€์ž์ง€์šฐ๊ธฐ")
 
255
  clothes_change_btn = gr.Button("์˜ท๋ฐ”๊พธ๊ธฐ")
256
  background_change_btn = gr.Button("๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ")
257
  composite_product_btn = gr.Button("์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ)")
 
258
  submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ", variant="primary")
259
  with gr.Column():
260
  output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
261
  output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
262
+ prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ (์˜์–ด)", visible=True)
263
 
264
+ # ์„ ํƒ ์˜ต์…˜ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€ ์—…๋ฐ์ดํŠธ (ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ ์ž…๋ ฅ)
265
  image_change_btn.click(
266
  fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ [๋‹ค๋ฅธ ๋ชจ์Šต]์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.",
267
  inputs=[],
 
272
  inputs=[],
273
  outputs=prompt_input
274
  )
 
 
 
 
 
275
  clothes_change_btn.click(
276
  fn=lambda: "#1 ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ #2 ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ.",
277
  inputs=[],
 
287
  inputs=[],
288
  outputs=prompt_input
289
  )
 
 
 
 
 
290
 
291
  submit_btn.click(
292
  fn=process_and_show_prompt,
 
302
  2. **์ด๋ฏธ์ง€ ์ฐธ์กฐ**: #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
303
  3. **์ผ๋ถ€ ์ด๋ฏธ์ง€๋งŒ**: ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•ด๋„ ๊ธฐ๋Šฅ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
304
  4. **์„ ํƒ ์˜ต์…˜**: ์œ„์˜ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์˜ ์˜ต์…˜์—์„œ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๋ž€์— ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๊ฐ€ ์ฑ„์›Œ์ง€๊ณ ,
305
+ ์ดํ›„ Geminiโ€‘2.0โ€‘flash ๋ชจ๋ธ์„ ํ†ตํ•ด ์˜์–ด๋กœ ๋ฒˆ์—ญ๋˜์–ด ์‹ค์ œ API ํ˜ธ์ถœ ํ”„๋กฌํ”„ํŠธ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
306
 
307
  > **ํŒ**: ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
308
  """