Kims12 commited on
Commit
14ca9a3
ยท
verified ยท
1 Parent(s): 9287902

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +96 -24
app.py CHANGED
@@ -20,13 +20,76 @@ def save_binary_file(file_name, data):
20
  with open(file_name, "wb") as f:
21
  f.write(data)
22
 
23
- def preprocess_prompt(prompt):
24
  """
25
- ํ”„๋กฌํ”„ํŠธ์— ์žˆ๋Š” #1, #2, #3 ์ฐธ์กฐ๋ฅผ ์ ์ ˆํ•œ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜
26
  """
27
- # #1, #2, #3 ์ฐธ์กฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜
28
- processed_prompt = prompt.replace("#1", "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€").replace("#2", "๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€").replace("#3", "์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€")
29
- return processed_prompt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  def process_images_with_prompt(image1, image2, image3, prompt):
32
  """
@@ -61,8 +124,8 @@ def process_images_with_prompt(image1, image2, image3, prompt):
61
  prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
62
  logger.info("์„ธ ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ž๋™ ์ƒ์„ฑ")
63
  else:
64
- # #1, #2, #3 ์ฐธ์กฐ ์ฒ˜๋ฆฌ
65
- prompt = preprocess_prompt(prompt)
66
 
67
  # ์ปจํ…์ธ  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ (์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ๊ฒฐํ•ฉ)
68
  parts = []
@@ -130,7 +193,7 @@ with gr.Blocks() as demo:
130
  """
131
  <div style="text-align: center; margin-bottom: 1rem;">
132
  <h1>๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ</h1>
133
- <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
134
  </div>
135
  """
136
  )
@@ -146,15 +209,27 @@ with gr.Blocks() as demo:
146
  # ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ (์„ ํƒ ์‚ฌํ•ญ)
147
  prompt_input = gr.Textbox(
148
  lines=3,
149
- placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: '#1๊ณผ #2๋ฅผ ํ•ฉ์„ฑํ•ด ์ฃผ์„ธ์š”'",
150
  label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
151
  )
152
 
153
- # ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฒ„ํŠผ๋“ค
154
- with gr.Row():
155
- prompt1_btn = gr.Button("์˜ˆ์‹œ: #1 + #2 ํ•ฉ์„ฑ")
156
- prompt2_btn = gr.Button("์˜ˆ์‹œ: #1์˜ ์ธ๋ฌผ + #2์˜ ๋ฐฐ๊ฒฝ")
157
- prompt3_btn = gr.Button("์˜ˆ์‹œ: #3 ์Šคํƒ€์ผ๋กœ #1 ๋ณ€ํ™˜")
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
  # ์ƒ์„ฑ ๋ฒ„ํŠผ
160
  submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ", variant="primary")
@@ -164,21 +239,16 @@ with gr.Blocks() as demo:
164
  output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
165
  output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
166
 
167
- # ์ž๋™ ์ƒ์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
168
  prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ", visible=True)
169
 
170
- # ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
171
- prompt1_btn.click(lambda: "#1๊ณผ #2๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด ์ฃผ์„ธ์š”", outputs=prompt_input)
172
- prompt2_btn.click(lambda: "#1์˜ ์ธ๋ฌผ์„ #2์˜ ๋ฐฐ๊ฒฝ์— ๋„ฃ์–ด์ฃผ์„ธ์š”", outputs=prompt_input)
173
- prompt3_btn.click(lambda: "#3์˜ ์Šคํƒ€์ผ๋กœ #1์„ ๋ณ€ํ™˜ํ•ด ์ฃผ์„ธ์š”", outputs=prompt_input)
174
-
175
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
176
  def process_and_show_prompt(image1, image2, image3, prompt):
177
  # ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ํ™•์ธ
178
  images = [image1, image2, image3]
179
  valid_images = [img for img in images if img is not None]
180
 
181
- # ์ž๋™ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ (ํ‘œ์‹œ์šฉ)
182
  auto_prompt = prompt
183
  if not prompt or not prompt.strip():
184
  if len(valid_images) == 1:
@@ -187,6 +257,8 @@ with gr.Blocks() as demo:
187
  auto_prompt = "์ด ๋‘ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ์ด๋ฏธ์ง€์˜ ์š”์†Œ๋ฅผ ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
188
  else:
189
  auto_prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๏ฟฝ๏ฟฝ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
 
 
190
 
191
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
192
  result_img, status = process_images_with_prompt(image1, image2, image3, prompt)
@@ -205,9 +277,9 @@ with gr.Blocks() as demo:
205
  <h3>์‚ฌ์šฉ ๋ฐฉ๋ฒ•:</h3>
206
  <ul>
207
  <li><strong>์ž๋™ ํ•ฉ์„ฑ:</strong> ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค</li>
208
- <li><strong>์ด๋ฏธ์ง€ ์ฐธ์กฐ:</strong> ํ”„๋กฌํ”„ํŠธ์—์„œ #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</li>
209
- <li><strong>์˜ˆ์‹œ ๋ฒ„ํŠผ:</strong> ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ํด๋ฆญํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</li>
210
- <li><strong>ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ:</strong> ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•˜์„ธ์š”</li>
211
  </ul>
212
  </div>
213
  """
 
20
  with open(file_name, "wb") as f:
21
  f.write(data)
22
 
23
+ def preprocess_prompt(prompt, image1, image2, image3):
24
  """
25
+ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ธฐ๋Šฅ ๋ช…๋ น์„ ํ•ด์„
26
  """
27
+ # ์ด๋ฏธ์ง€ ์—†๋Š” ์ฐธ์กฐ ํ™•์ธ ๋ฐ ์ฒ˜๋ฆฌ
28
+ has_img1 = image1 is not None
29
+ has_img2 = image2 is not None
30
+ has_img3 = image3 is not None
31
+
32
+ # #1, #2, #3 ์ฐธ์กฐ๋ฅผ ์„ค๋ช…์œผ๋กœ ๋ณ€ํ™˜ (์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ)
33
+ if "#1" in prompt and not has_img1:
34
+ prompt = prompt.replace("#1", "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€(์—†์Œ)")
35
+ else:
36
+ prompt = prompt.replace("#1", "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€")
37
+
38
+ if "#2" in prompt and not has_img2:
39
+ prompt = prompt.replace("#2", "๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€(์—†์Œ)")
40
+ else:
41
+ prompt = prompt.replace("#2", "๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€")
42
+
43
+ if "#3" in prompt and not has_img3:
44
+ prompt = prompt.replace("#3", "์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€(์—†์Œ)")
45
+ else:
46
+ prompt = prompt.replace("#3", "์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€")
47
+
48
+ # ๊ธฐ๋Šฅ ๋ช…๋ น ํ•ด์„
49
+ if "1. ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ" in prompt:
50
+ # ์„ค๋ช… ์ถ”์ถœ์„ ์‹œ๋„ํ•˜์ง€๋งŒ ์‹คํŒจํ•ด๋„ ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ ์ œ๊ณต
51
+ desc_match = re.search(r'#1์„ "(.*?)"์œผ๋กœ ๋ฐ”๊ฟ”๋ผ', prompt)
52
+ if desc_match:
53
+ description = desc_match.group(1)
54
+ prompt = f"์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ {description}์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. ์›๋ณธ ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ๋‚ด์šฉ์€ ์œ ์ง€ํ•˜๋˜ ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ๊ณผ ๋ถ„์œ„๊ธฐ๋กœ ์žฌํ•ด์„ํ•ด์ฃผ์„ธ์š”."
55
+ else:
56
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ์„ธ์š”. ๋” ์ƒ์ƒํ•˜๊ณ  ์˜ˆ์ˆ ์ ์ธ ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
57
+
58
+ elif "2. ๊ธ€์ž์ง€์šฐ๊ธฐ" in prompt:
59
+ # ์ง€์šธ ํ…์ŠคํŠธ ์ถ”์ถœ์„ ์‹œ๋„ํ•˜์ง€๋งŒ ์‹คํŒจํ•ด๋„ ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ ์ œ๊ณต
60
+ text_match = re.search(r'#1์—์„œ "(.*?)"๋ฅผ ์ง€์›Œ๋ผ', prompt)
61
+ if text_match:
62
+ text_to_remove = text_match.group(1)
63
+ prompt = f"์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ '{text_to_remove}' ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”. ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋˜ ๋ถ€๋ถ„์„ ๋ฐฐ๊ฒฝ๊ณผ ์กฐํ™”๋กญ๊ฒŒ ์ฑ„์›Œ์ฃผ์„ธ์š”."
64
+ else:
65
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ ๋ชจ๋“  ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”. ๊น”๋”ํ•œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
66
+
67
+ elif "3. ์–ผ๊ตด๋ฐ”๊พธ๊ธฐ" in prompt:
68
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์–ผ๊ตด์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์–ผ๊ตด๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”. ์–ผ๊ตด์˜ ํ‘œ์ •๊ณผ ํŠน์ง•์€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
69
+
70
+ elif "4. ์˜ท๋ฐ”๊พธ๊ธฐ" in prompt:
71
+ # ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ์ฐธ์กฐ ์ฒ˜๋ฆฌ
72
+ if "#3" in prompt or "๋˜๋Š” #3" in prompt:
73
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ ๋‘ ๋ฒˆ์งธ ๋˜๋Š” ์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”. ์˜์ƒ์˜ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์€ ์ฐธ์กฐ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
74
+ else:
75
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ธ๋ฌผ ์˜์ƒ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜์ƒ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”. ์˜์ƒ์˜ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋”ฐ๋ฅด๋˜, ์‹ ์ฒด ๋น„์œจ๊ณผ ํฌ์ฆˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”."
76
+
77
+ elif "5. ๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ" in prompt:
78
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด๋Š” ์œ ์ง€ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ๊ณผ ์กฐํ™”๋กญ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”."
79
+
80
+ elif "6. ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ)" in prompt:
81
+ # ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ์ฐธ์กฐ ์ฒ˜๋ฆฌ
82
+ if "#3" in prompt or "๋˜๋Š” #3" in prompt:
83
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์™€ ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ , ํŠนํžˆ ์ƒํ’ˆ์ด ์ž˜ ๋ณด์ด๋„๋ก ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•ด์ฃผ์„ธ์š”."
84
+ else:
85
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์™€ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ , ํŠนํžˆ ์ƒํ’ˆ์ด ์ž˜ ๋ณด์ด๋„๋ก ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•ด์ฃผ์„ธ์š”."
86
+
87
+ elif "7. ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ)" in prompt:
88
+ prompt = "์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์„ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ํ”ผ์‚ฌ์ฒด์™€ ๊ตฌ๋„๋Š” ์œ ์ง€ํ•˜๋˜, ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์˜ˆ์ˆ ์  ์Šคํƒ€์ผ, ์ƒ‰์ƒ, ์งˆ๊ฐ์„ ์ ์šฉํ•ด์ฃผ์„ธ์š”."
89
+
90
+ # ์ž…๋ ฅ์ด ์œ„ ๊ธฐ๋Šฅ๋“ค์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์›๋ณธ ํ”„๋กฌํ”„ํŠธ ์œ ์ง€
91
+
92
+ return prompt
93
 
94
  def process_images_with_prompt(image1, image2, image3, prompt):
95
  """
 
124
  prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
125
  logger.info("์„ธ ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ž๋™ ์ƒ์„ฑ")
126
  else:
127
+ # ํ”„๋กฌํ”„ํŠธ ์ „์ฒ˜๋ฆฌ ๋ฐ ๊ธฐ๋Šฅ ๋ช…๋ น ํ•ด์„
128
+ prompt = preprocess_prompt(prompt, image1, image2, image3)
129
 
130
  # ์ปจํ…์ธ  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ (์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ๊ฒฐํ•ฉ)
131
  parts = []
 
193
  """
194
  <div style="text-align: center; margin-bottom: 1rem;">
195
  <h1>๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ</h1>
196
+ <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ธฐ๋Šฅ ๋ช…๋ น์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
197
  </div>
198
  """
199
  )
 
209
  # ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ (์„ ํƒ ์‚ฌํ•ญ)
210
  prompt_input = gr.Textbox(
211
  lines=3,
212
+ placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
213
  label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
214
  )
215
 
216
+ # ๊ธฐ๋Šฅ ๋ช…๋ น ์„ค๋ช…
217
+ gr.HTML(
218
+ """
219
+ <div style="margin: 0.5rem 0; padding: 0.5rem; background-color: #f0f0f0; border-radius: 0.5rem;">
220
+ <h4>๊ธฐ๋Šฅ ๋ช…๋ น ๋ชฉ๋ก:</h4>
221
+ <ol style="margin-left: 1.5rem;">
222
+ <li>์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ: <code>#1์„ "์„ค๋ช…ํ•ด์ฃผ์„ธ์š”"์œผ๋กœ ๋ฐ”๊ฟ”๋ผ</code></li>
223
+ <li>๊ธ€์ž์ง€์šฐ๊ธฐ: <code>#1์—์„œ "์ค‘๊ตญ์–ด"๋ฅผ ์ง€์›Œ๋ผ</code></li>
224
+ <li>์–ผ๊ตด๋ฐ”๊พธ๊ธฐ: <code>#1์˜ ์ธ๋ฌผ์„ #2์˜ ์–ผ๊ตด๋กœ ๋ฐ”๊ฟ”๋ผ</code></li>
225
+ <li>์˜ท๋ฐ”๊พธ๊ธฐ: <code>#1์˜ ์ธ๋ฌผ์— #2 ๋˜๋Š” #3์˜ ์˜ท์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ</code></li>
226
+ <li>๋ฐฐ๊ฒฝ๋ฐ”๊พธ๊ธฐ: <code>#1์˜ ์ด๋ฏธ์ง€์— #2์˜ ๋ฐฐ๊ฒฝ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ”๊ฟ”๋ผ</code></li>
227
+ <li>์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์ƒํ’ˆํฌํ•จ): <code>#1์™€ #2 ๋˜๋Š” #3์˜ ๋ฅผ ํ•ฉ์„ฑํ•˜๋ผ</code></li>
228
+ <li>์ด๋ฏธ์ง€ ํ•ฉ์„ฑ(์Šคํƒ€์ผ์ ์šฉ): <code>#1์™€ #2๋ฅผ ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋ผ</code></li>
229
+ </ol>
230
+ </div>
231
+ """
232
+ )
233
 
234
  # ์ƒ์„ฑ ๋ฒ„ํŠผ
235
  submit_btn = gr.Button("์ด๋ฏธ์ง€ ์ƒ์„ฑ", variant="primary")
 
239
  output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
240
  output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
241
 
242
+ # ์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
243
  prompt_display = gr.Textbox(label="์‚ฌ์šฉ๋œ ํ”„๋กฌํ”„ํŠธ", visible=True)
244
 
 
 
 
 
 
245
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
246
  def process_and_show_prompt(image1, image2, image3, prompt):
247
  # ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ํ™•์ธ
248
  images = [image1, image2, image3]
249
  valid_images = [img for img in images if img is not None]
250
 
251
+ # ์ž๋™ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ ๋˜๋Š” ํ”„๋กฌํ”„ํŠธ ์ „์ฒ˜๋ฆฌ
252
  auto_prompt = prompt
253
  if not prompt or not prompt.strip():
254
  if len(valid_images) == 1:
 
257
  auto_prompt = "์ด ๋‘ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ์ด๋ฏธ์ง€์˜ ์š”์†Œ๋ฅผ ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
258
  else:
259
  auto_prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๏ฟฝ๏ฟฝ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
260
+ else:
261
+ auto_prompt = preprocess_prompt(prompt, image1, image2, image3)
262
 
263
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
264
  result_img, status = process_images_with_prompt(image1, image2, image3, prompt)
 
277
  <h3>์‚ฌ์šฉ ๋ฐฉ๋ฒ•:</h3>
278
  <ul>
279
  <li><strong>์ž๋™ ํ•ฉ์„ฑ:</strong> ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„์›Œ๋‘๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค</li>
280
+ <li><strong>๊ธฐ๋Šฅ ๋ช…๋ น:</strong> ์œ„ ๋ชฉ๋ก์˜ ๊ธฐ๋Šฅ ๋ช…๋ น์„ ๋ณต์‚ฌํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ์ฐฝ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ›„ ํ•„์š”์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์„ธ์š”</li>
281
+ <li><strong>์ด๋ฏธ์ง€ ์ฐธ์กฐ:</strong> #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</li>
282
+ <li><strong>์ผ๋ถ€ ์ด๋ฏธ์ง€๋งŒ:</strong> ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•ด๋„ ๊ธฐ๋Šฅ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค</li>
283
  </ul>
284
  </div>
285
  """