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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -17
app.py CHANGED
@@ -41,9 +41,25 @@ def process_images_with_prompt(image1, image2, image3, prompt):
41
  # Gemini ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
42
  client = genai.Client(api_key=api_key)
43
 
 
 
 
 
 
 
 
44
  # ํ”„๋กฌํ”„ํŠธ ์ฒ˜๋ฆฌ
45
  if not prompt or not prompt.strip():
46
- prompt = "์ด ์ด๋ฏธ์ง€๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."
 
 
 
 
 
 
 
 
 
47
  else:
48
  # #1, #2, #3 ์ฐธ์กฐ ์ฒ˜๋ฆฌ
49
  prompt = preprocess_prompt(prompt)
@@ -55,8 +71,7 @@ def process_images_with_prompt(image1, image2, image3, prompt):
55
  parts.append(types.Part.from_text(text=prompt))
56
 
57
  # ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
58
- images_added = 0
59
- for idx, img in enumerate([image1, image2, image3], 1):
60
  if img is not None:
61
  # PIL ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜
62
  with tempfile.NamedTemporaryFile(suffix=".png") as tmp:
@@ -67,12 +82,8 @@ def process_images_with_prompt(image1, image2, image3, prompt):
67
 
68
  # ์ด๋ฏธ์ง€๋ฅผ ํŒŒํŠธ๋กœ ์ถ”๊ฐ€
69
  parts.append(types.Part.from_data(data=image_bytes, mime_type="image/png"))
70
- images_added += 1
71
  logger.info(f"์ด๋ฏธ์ง€ #{idx} ์ถ”๊ฐ€๋จ")
72
 
73
- if images_added == 0:
74
- return None, "์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”."
75
-
76
  # ์ƒ์„ฑ ์„ค์ •
77
  generate_content_config = types.GenerateContentConfig(
78
  temperature=1,
@@ -119,7 +130,7 @@ with gr.Blocks() as demo:
119
  """
120
  <div style="text-align: center; margin-bottom: 1rem;">
121
  <h1>๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ</h1>
122
- <p>์ด๋ฏธ์ง€์™€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
123
  </div>
124
  """
125
  )
@@ -132,11 +143,11 @@ with gr.Blocks() as demo:
132
  image2_input = gr.Image(type="pil", label="#2", image_mode="RGB")
133
  image3_input = gr.Image(type="pil", label="#3", image_mode="RGB")
134
 
135
- # ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ
136
  prompt_input = gr.Textbox(
137
  lines=3,
138
- placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. ์˜ˆ: '#1๊ณผ #2๋ฅผ ํ•ฉ์„ฑํ•ด ์ฃผ์„ธ์š”' ๋˜๋Š” '#1์˜ ์ธ๋ฌผ์„ #3์˜ ๋ฐฐ๊ฒฝ์— ๋„ฃ์–ด์ฃผ์„ธ์š”'",
139
- label="ํ”„๋กฌํ”„ํŠธ"
140
  )
141
 
142
  # ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฒ„ํŠผ๋“ค
@@ -152,6 +163,9 @@ with gr.Blocks() as demo:
152
  # ๊ฒฐ๊ณผ ์ถœ๋ ฅ
153
  output_image = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€")
154
  output_text = gr.Textbox(label="์ƒํƒœ ๋ฉ”์‹œ์ง€")
 
 
 
155
 
156
  # ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
157
  prompt1_btn.click(lambda: "#1๊ณผ #2๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด ์ฃผ์„ธ์š”", outputs=prompt_input)
@@ -159,10 +173,30 @@ with gr.Blocks() as demo:
159
  prompt3_btn.click(lambda: "#3์˜ ์Šคํƒ€์ผ๋กœ #1์„ ๋ณ€ํ™˜ํ•ด ์ฃผ์„ธ์š”", outputs=prompt_input)
160
 
161
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  submit_btn.click(
163
- fn=process_images_with_prompt,
164
  inputs=[image1_input, image2_input, image3_input, prompt_input],
165
- outputs=[output_image, output_text],
166
  )
167
 
168
  gr.HTML(
@@ -170,10 +204,10 @@ with gr.Blocks() as demo:
170
  <div style="margin-top: 1rem; padding: 1rem; background-color: #f8f9fa; border-radius: 0.5rem;">
171
  <h3>์‚ฌ์šฉ ๋ฐฉ๋ฒ•:</h3>
172
  <ul>
173
- <li>์ด๋ฏธ์ง€๋ฅผ #1, #2, #3 ์Šฌ๋กฏ์— ์—…๋กœ๋“œํ•˜์„ธ์š”</li>
174
- <li>ํ”„๋กฌํ”„ํŠธ์—์„œ #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</li>
175
- <li>์˜ˆ์‹œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</li>
176
- <li>๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋งŒ ์—…๋กœ๋“œํ•˜์„ธ์š”</li>
177
  </ul>
178
  </div>
179
  """
 
41
  # Gemini ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
42
  client = genai.Client(api_key=api_key)
43
 
44
+ # ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ํ™•์ธ
45
+ images = [image1, image2, image3]
46
+ valid_images = [img for img in images if img is not None]
47
+
48
+ if not valid_images:
49
+ return None, "์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”."
50
+
51
  # ํ”„๋กฌํ”„ํŠธ ์ฒ˜๋ฆฌ
52
  if not prompt or not prompt.strip():
53
+ # ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ ์ˆ˜์— ๋”ฐ๋ผ ์ž๋™ ํ•ฉ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ
54
+ if len(valid_images) == 1:
55
+ prompt = "์ด ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ์„ธ์š”. ๋” ์ƒ์ƒํ•˜๊ณ  ์˜ˆ์ˆ ์ ์ธ ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
56
+ logger.info("๋‹จ์ผ ์ด๋ฏธ์ง€ ํ”„๋กฌํ”„ํŠธ ์ž๋™ ์ƒ์„ฑ")
57
+ elif len(valid_images) == 2:
58
+ prompt = "์ด ๋‘ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ์ด๋ฏธ์ง€์˜ ์š”์†Œ๋ฅผ ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
59
+ logger.info("๋‘ ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ž๋™ ์ƒ์„ฑ")
60
+ else:
61
+ prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
62
+ logger.info("์„ธ ์ด๋ฏธ์ง€ ํ•ฉ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ž๋™ ์ƒ์„ฑ")
63
  else:
64
  # #1, #2, #3 ์ฐธ์กฐ ์ฒ˜๋ฆฌ
65
  prompt = preprocess_prompt(prompt)
 
71
  parts.append(types.Part.from_text(text=prompt))
72
 
73
  # ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
74
+ for idx, img in enumerate(images, 1):
 
75
  if img is not None:
76
  # PIL ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜
77
  with tempfile.NamedTemporaryFile(suffix=".png") as tmp:
 
82
 
83
  # ์ด๋ฏธ์ง€๋ฅผ ํŒŒํŠธ๋กœ ์ถ”๊ฐ€
84
  parts.append(types.Part.from_data(data=image_bytes, mime_type="image/png"))
 
85
  logger.info(f"์ด๋ฏธ์ง€ #{idx} ์ถ”๊ฐ€๋จ")
86
 
 
 
 
87
  # ์ƒ์„ฑ ์„ค์ •
88
  generate_content_config = types.GenerateContentConfig(
89
  temperature=1,
 
130
  """
131
  <div style="text-align: center; margin-bottom: 1rem;">
132
  <h1>๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ๊ธฐ</h1>
133
+ <p>์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” #1, #2, #3์œผ๋กœ ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
134
  </div>
135
  """
136
  )
 
143
  image2_input = gr.Image(type="pil", label="#2", image_mode="RGB")
144
  image3_input = gr.Image(type="pil", label="#3", image_mode="RGB")
145
 
146
+ # ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ (์„ ํƒ ์‚ฌํ•ญ)
147
  prompt_input = gr.Textbox(
148
  lines=3,
149
+ placeholder="ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ๋‘๋ฉด ์ž๋™ ํ•ฉ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: '#1๊ณผ #2๋ฅผ ํ•ฉ์„ฑํ•ด ์ฃผ์„ธ์š”'",
150
+ label="ํ”„๋กฌํ”„ํŠธ (์„ ํƒ ์‚ฌํ•ญ)"
151
  )
152
 
153
  # ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฒ„ํŠผ๋“ค
 
163
  # ๊ฒฐ๊ณผ ์ถœ๋ ฅ
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)
 
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:
185
+ auto_prompt = "์ด ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ์„ธ์š”. ๋” ์ƒ์ƒํ•˜๊ณ  ์˜ˆ์ˆ ์ ์ธ ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
186
+ elif len(valid_images) == 2:
187
+ auto_prompt = "์ด ๋‘ ์ด๋ฏธ์ง€๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ์ด๋ฏธ์ง€์˜ ์š”์†Œ๋ฅผ ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
188
+ else:
189
+ auto_prompt = "์ด ์„ธ ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•ด์ฃผ์„ธ์š”. ๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋˜ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ํ•˜๋‚˜์˜ ์žฅ๋ฉด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
190
+
191
+ # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
192
+ result_img, status = process_images_with_prompt(image1, image2, image3, prompt)
193
+
194
+ return result_img, status, auto_prompt
195
+
196
  submit_btn.click(
197
+ fn=process_and_show_prompt,
198
  inputs=[image1_input, image2_input, image3_input, prompt_input],
199
+ outputs=[output_image, output_text, prompt_display],
200
  )
201
 
202
  gr.HTML(
 
204
  <div style="margin-top: 1rem; padding: 1rem; background-color: #f8f9fa; border-radius: 0.5rem;">
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
  """