Update app.py
Browse files
app.py
CHANGED
@@ -9,15 +9,12 @@ import base64
|
|
9 |
import mimetypes
|
10 |
import logging
|
11 |
|
12 |
-
|
13 |
-
from google.
|
14 |
|
15 |
# .env ํ์ผ์ ์ ์ฅ๋ ํ๊ฒฝ๋ณ์ ๋ก๋ (python-dotenv ์ค์น ํ์: pip install python-dotenv)
|
16 |
-
|
17 |
-
|
18 |
-
load_dotenv()
|
19 |
-
except ImportError:
|
20 |
-
logger.warning("python-dotenv๊ฐ ์ค์น๋์ง ์์์ต๋๋ค. ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ ์ค์ ํด์ผ ํฉ๋๋ค.")
|
21 |
|
22 |
# ๋ก๊น
์ค์ (๋ก๊ทธ ๋ ๋ฒจ: DEBUG)
|
23 |
logging.basicConfig(level=logging.DEBUG,
|
@@ -32,19 +29,8 @@ def save_binary_file(file_name, data):
|
|
32 |
logger.debug(f"ํ์ผ ์ ์ฅ ์๋ฃ: {file_name}")
|
33 |
|
34 |
|
35 |
-
def generate(text,
|
36 |
-
""
|
37 |
-
์ฌ๋ฌ ์ด๋ฏธ์ง์ ํ
์คํธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ฌ Gemini API๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ํจ์
|
38 |
-
|
39 |
-
Args:
|
40 |
-
text (str): ์ด๋ฏธ์ง ์์ฑ์ ์ฌ์ฉํ ํ
์คํธ ํ๋กฌํํธ
|
41 |
-
files_list (list): ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ๋ฆฌ์คํธ
|
42 |
-
model (str): ์ฌ์ฉํ Gemini ๋ชจ๋ธ๋ช
|
43 |
-
|
44 |
-
Returns:
|
45 |
-
str: ์์ฑ๋ ์ด๋ฏธ์ง์ ํ์ผ ๊ฒฝ๋ก ๋๋ None (์ค๋ฅ ๋ฐ์ ์)
|
46 |
-
"""
|
47 |
-
logger.debug(f"generate ํจ์ ์์ - ํ
์คํธ: '{text}', ํ์ผ ์: {len(files_list)}, ๋ชจ๋ธ: '{model}'")
|
48 |
|
49 |
try:
|
50 |
# API ํค๋ ํ๊ฒฝ๋ณ์์์ ๋ถ๋ฌ์ด
|
@@ -58,34 +44,50 @@ def generate(text, files_list, model="gemini-2.0-flash-exp-image-generation"):
|
|
58 |
client = genai.Client(api_key=effective_api_key)
|
59 |
logger.debug("Gemini ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ.")
|
60 |
|
61 |
-
#
|
62 |
uploaded_files = []
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
#
|
76 |
parts = []
|
77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
parts.append(
|
79 |
types.Part.from_uri(
|
80 |
-
file_uri=
|
81 |
-
mime_type=
|
82 |
)
|
83 |
)
|
84 |
-
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
parts.append(types.Part.from_text(text=text))
|
87 |
-
|
88 |
-
# ์ปจํ
์ธ ๊ฐ์ฒด ์์ฑ
|
89 |
contents = [
|
90 |
types.Content(
|
91 |
role="user",
|
@@ -133,7 +135,6 @@ def generate(text, files_list, model="gemini-2.0-flash-exp-image-generation"):
|
|
133 |
|
134 |
logger.debug(f"Raw chunk: {chunk}")
|
135 |
|
136 |
-
# ์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ ๋ฆฌ
|
137 |
del uploaded_files
|
138 |
logger.debug("์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ญ์ ์๋ฃ.")
|
139 |
return temp_path
|
@@ -143,84 +144,43 @@ def generate(text, files_list, model="gemini-2.0-flash-exp-image-generation"):
|
|
143 |
return None # ์ค๋ฅ ๋ฐ์ ์ None ๋ฐํ
|
144 |
|
145 |
|
146 |
-
def
|
147 |
-
"
|
148 |
-
if image is None:
|
149 |
-
return None
|
150 |
-
|
151 |
-
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
|
152 |
-
temp_path = tmp.name
|
153 |
-
if isinstance(image, Image.Image):
|
154 |
-
if image.mode == "RGBA":
|
155 |
-
# ์ํ ์ฑ๋์ด ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ
|
156 |
-
image = image.convert("RGB")
|
157 |
-
image.save(temp_path)
|
158 |
-
else:
|
159 |
-
logger.warning(f"์ง์๋์ง ์๋ ์ด๋ฏธ์ง ํ์
: {type(image)}")
|
160 |
-
return None
|
161 |
-
|
162 |
-
logger.debug(f"์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {temp_path}")
|
163 |
-
return temp_path
|
164 |
-
|
165 |
-
|
166 |
-
def process_with_background_and_style(main_image, background_image, style_image, prompt):
|
167 |
-
"""
|
168 |
-
์ฃผ ์ด๋ฏธ์ง, ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง, ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ํ๋กฌํํธ์ ํจ๊ป ์ฒ๋ฆฌํ๋ ํจ์
|
169 |
-
|
170 |
-
Args:
|
171 |
-
main_image (PIL.Image): ์ฃผ ๋์ ์ด๋ฏธ์ง
|
172 |
-
background_image (PIL.Image): ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง
|
173 |
-
style_image (PIL.Image): ์คํ์ผ ์ฐธ์กฐ ์ด๋ฏธ์ง
|
174 |
-
prompt (str): ์ด๋ฏธ์ง ํธ์ง ํ๋กฌํํธ
|
175 |
-
|
176 |
-
Returns:
|
177 |
-
list: ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง ๋ชฉ๋ก
|
178 |
-
"""
|
179 |
-
logger.debug(f"process_with_background_and_style ํจ์ ์์ - ํ๋กฌํํธ: '{prompt}'")
|
180 |
try:
|
181 |
-
#
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
# ์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ (
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
return []
|
205 |
-
|
206 |
-
# ํ๋กฌํํธ ๋ณด๊ฐ (๋ฐฐ๊ฒฝ ๋ฐ ์คํ์ผ ๊ด๋ จ ์ ๋ณด ์ถ๊ฐ)
|
207 |
-
enhanced_prompt = prompt
|
208 |
-
if background_image is not None and style_image is not None:
|
209 |
-
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํด์ฃผ์ธ์. ์ธ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์คํ์ผ์ ์ ์ฉํด์ฃผ์ธ์."
|
210 |
-
elif background_image is not None:
|
211 |
-
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํด์ฃผ์ธ์."
|
212 |
-
elif style_image is not None:
|
213 |
-
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์คํ์ผ์ ์ ์ฉํด์ฃผ์ธ์."
|
214 |
-
|
215 |
-
logger.debug(f"๋ณด๊ฐ๋ ํ๋กฌํํธ: {enhanced_prompt}")
|
216 |
model = "gemini-2.0-flash-exp-image-generation"
|
217 |
|
218 |
-
|
219 |
-
|
|
|
|
|
|
|
220 |
|
221 |
-
if
|
222 |
-
logger.debug(f"์ด๋ฏธ์ง ์์ฑ ์๋ฃ. ๊ฒฝ๋ก: {
|
223 |
-
result_img = Image.open(
|
224 |
if result_img.mode == "RGBA":
|
225 |
result_img = result_img.convert("RGB")
|
226 |
return [result_img]
|
@@ -229,7 +189,7 @@ def process_with_background_and_style(main_image, background_image, style_image,
|
|
229 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
230 |
|
231 |
except Exception as e:
|
232 |
-
logger.exception("
|
233 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
234 |
|
235 |
|
@@ -243,78 +203,46 @@ with gr.Blocks() as demo:
|
|
243 |
</div>
|
244 |
<div>
|
245 |
<h1>Gemini๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ํธ์ง</h1>
|
246 |
-
<p>๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.</p>
|
247 |
<p>Gemini API ํค๋ ํ๊ฒฝ๋ณ์(GEMINI_API_KEY)๋ก ์ค์ ๋์ด ์์ต๋๋ค.</p>
|
248 |
</div>
|
249 |
</div>
|
250 |
"""
|
251 |
)
|
252 |
-
gr.Markdown("์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๊ณ , ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์.
|
253 |
|
254 |
with gr.Row():
|
255 |
with gr.Column():
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
style_image_input = gr.Image(type="pil", label="์คํ์ผ ์ด๋ฏธ์ง ์
๋ก๋ (์ ํ์ฌํญ)", image_mode="RGB")
|
260 |
-
|
261 |
prompt_input = gr.Textbox(
|
262 |
-
lines=
|
263 |
placeholder="ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์...",
|
264 |
label="ํธ์ง ํ๋กฌํํธ"
|
265 |
)
|
266 |
-
|
267 |
-
# ํ๋กฌํํธ ์์
|
268 |
-
gr.Markdown("### ํ๋กฌํํธ ์์")
|
269 |
-
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์นํด์ฃผ์ธ์'")
|
270 |
-
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง๋ฅผ ์คํ์ผ ์ด๋ฏธ์ง์ ํํ์ผ๋ก ๋ณํํด์ฃผ์ธ์'")
|
271 |
-
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง์ ๋ฐฐ๊ฒฝ์ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ก ๋์ฒดํ๊ณ , ์ธ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์๊ฐ์ ์ ์ฉํด์ฃผ์ธ์'")
|
272 |
-
|
273 |
submit_btn = gr.Button("์ด๋ฏธ์ง ํธ์ง ์คํ")
|
274 |
-
|
275 |
with gr.Column():
|
276 |
-
# ์ถ๋ ฅ ์ปดํฌ๋ํธ
|
277 |
output_gallery = gr.Gallery(label="ํธ์ง ๊ฒฐ๊ณผ")
|
278 |
-
output_info = gr.Textbox(label="์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ ๋ณด", lines=2)
|
279 |
|
280 |
-
# ์ฒ๋ฆฌ ํจ์ ์ฐ๊ฒฐ
|
281 |
submit_btn.click(
|
282 |
-
fn=
|
283 |
-
inputs=[
|
284 |
-
outputs=
|
285 |
-
).then(
|
286 |
-
lambda: "ํธ์ง์ด ์๋ฃ๋์์ต๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด์ฃผ์ธ์.",
|
287 |
-
None,
|
288 |
-
output_info
|
289 |
)
|
290 |
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
|
|
|
|
|
|
|
|
|
301 |
|
302 |
-
|
303 |
-
if __name__ == "__main__":
|
304 |
-
# ์ค์ ์ด์์์๋ ํ
์คํธ ์ฝ๋ ์ ๊ฑฐ
|
305 |
-
# ํ
์คํธ์ฉ ๋๋ฏธ ์ด๋ฏธ์ง (์ค์ ์ด๋ฏธ์ง๋ก ๋์ฒด ๊ฐ๋ฅ)
|
306 |
-
# dummy_image = Image.new("RGB", (100, 100), color="red")
|
307 |
-
# dummy_bg = Image.new("RGB", (100, 100), color="blue")
|
308 |
-
# dummy_style = Image.new("RGB", (100, 100), color="green")
|
309 |
-
# dummy_prompt = "์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํด์ค"
|
310 |
-
|
311 |
-
# logger.info("process_with_background_and_style ํจ์๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค...")
|
312 |
-
# result = process_with_background_and_style(dummy_image, dummy_bg, dummy_style, dummy_prompt)
|
313 |
-
|
314 |
-
# if result:
|
315 |
-
# logger.info(f"์ง์ ํธ์ถ ์ฑ๊ณต. ๊ฒฐ๊ณผ: {result}")
|
316 |
-
# else:
|
317 |
-
# logger.error("์ง์ ํธ์ถ ์คํจ.")
|
318 |
-
|
319 |
-
# Gradio ์ฑ ์คํ
|
320 |
-
demo.launch(share=True)
|
|
|
9 |
import mimetypes
|
10 |
import logging
|
11 |
|
12 |
+
from google import genai
|
13 |
+
from google.genai import types
|
14 |
|
15 |
# .env ํ์ผ์ ์ ์ฅ๋ ํ๊ฒฝ๋ณ์ ๋ก๋ (python-dotenv ์ค์น ํ์: pip install python-dotenv)
|
16 |
+
from dotenv import load_dotenv
|
17 |
+
load_dotenv()
|
|
|
|
|
|
|
18 |
|
19 |
# ๋ก๊น
์ค์ (๋ก๊ทธ ๋ ๋ฒจ: DEBUG)
|
20 |
logging.basicConfig(level=logging.DEBUG,
|
|
|
29 |
logger.debug(f"ํ์ผ ์ ์ฅ ์๋ฃ: {file_name}")
|
30 |
|
31 |
|
32 |
+
def generate(text, file_name, background_file=None, style_file=None, model="gemini-2.0-flash-exp-image-generation"):
|
33 |
+
logger.debug(f"generate ํจ์ ์์ - ํ
์คํธ: '{text}', ํ์ผ๋ช
: '{file_name}', ๋ชจ๋ธ: '{model}'")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
try:
|
36 |
# API ํค๋ ํ๊ฒฝ๋ณ์์์ ๋ถ๋ฌ์ด
|
|
|
44 |
client = genai.Client(api_key=effective_api_key)
|
45 |
logger.debug("Gemini ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ.")
|
46 |
|
47 |
+
# ์๋ณธ, ๋ฐฐ๊ฒฝ, ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๊ฐ ์
๋ก๋ (์กด์ฌํ๋ ๊ฒฝ์ฐ)
|
48 |
uploaded_files = []
|
49 |
+
uploaded_files.append(client.files.upload(file=file_name))
|
50 |
+
logger.debug(f"์๋ณธ ํ์ผ ์
๋ก๋ ์๋ฃ. URI: {uploaded_files[0].uri}, MIME ํ์
: {uploaded_files[0].mime_type}")
|
51 |
+
|
52 |
+
if background_file is not None:
|
53 |
+
bg_file = client.files.upload(file=background_file)
|
54 |
+
uploaded_files.append(bg_file)
|
55 |
+
logger.debug(f"๋ฐฐ๊ฒฝ ํ์ผ ์
๋ก๋ ์๋ฃ. URI: {bg_file.uri}, MIME ํ์
: {bg_file.mime_type}")
|
56 |
+
if style_file is not None:
|
57 |
+
style_uploaded = client.files.upload(file=style_file)
|
58 |
+
uploaded_files.append(style_uploaded)
|
59 |
+
logger.debug(f"์คํ์ผ ํ์ผ ์
๋ก๋ ์๋ฃ. URI: {style_uploaded.uri}, MIME ํ์
: {style_uploaded.mime_type}")
|
60 |
+
|
61 |
+
# ์ปจํ
์ธ ๊ฐ์ฒด ์์ฑ: ์
๋ก๋ํ ์ด๋ฏธ์ง๋ค์ ์์๋๋ก(์๋ณธ, ๋ฐฐ๊ฒฝ, ์คํ์ผ) ์ถ๊ฐํ๊ณ ๋ง์ง๋ง์ ํ
์คํธ ํ๋กฌํํธ ์ถ๊ฐ
|
62 |
parts = []
|
63 |
+
# ์๋ณธ ์ด๋ฏธ์ง ํํธ
|
64 |
+
parts.append(
|
65 |
+
types.Part.from_uri(
|
66 |
+
file_uri=uploaded_files[0].uri,
|
67 |
+
mime_type=uploaded_files[0].mime_type,
|
68 |
+
)
|
69 |
+
)
|
70 |
+
# ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ํํธ (์กด์ฌ ์)
|
71 |
+
if background_file is not None:
|
72 |
parts.append(
|
73 |
types.Part.from_uri(
|
74 |
+
file_uri=uploaded_files[1].uri,
|
75 |
+
mime_type=uploaded_files[1].mime_type,
|
76 |
)
|
77 |
)
|
78 |
+
# ์คํ์ผ ์ด๋ฏธ์ง ํํธ (์กด์ฌ ์)
|
79 |
+
if style_file is not None:
|
80 |
+
# ๋ฐฐ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ uploaded_files[1]๊ฐ ์คํ์ผ ์ด๋ฏธ์ง๊ฐ ๋จ์ ์ฃผ์
|
81 |
+
style_index = 2 if background_file is not None else 1
|
82 |
+
parts.append(
|
83 |
+
types.Part.from_uri(
|
84 |
+
file_uri=uploaded_files[style_index].uri,
|
85 |
+
mime_type=uploaded_files[style_index].mime_type,
|
86 |
+
)
|
87 |
+
)
|
88 |
+
# ๋ง์ง๋ง์ผ๋ก ํ
์คํธ ํํธ ์ถ๊ฐ
|
89 |
parts.append(types.Part.from_text(text=text))
|
90 |
+
|
|
|
91 |
contents = [
|
92 |
types.Content(
|
93 |
role="user",
|
|
|
135 |
|
136 |
logger.debug(f"Raw chunk: {chunk}")
|
137 |
|
|
|
138 |
del uploaded_files
|
139 |
logger.debug("์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ญ์ ์๋ฃ.")
|
140 |
return temp_path
|
|
|
144 |
return None # ์ค๋ฅ ๋ฐ์ ์ None ๋ฐํ
|
145 |
|
146 |
|
147 |
+
def process_image_and_prompt(original_pil, prompt, background_pil=None, style_pil=None):
|
148 |
+
logger.debug(f"process_image_and_prompt ํจ์ ์์ - ํ๋กฌํํธ: '{prompt}'")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
try:
|
150 |
+
# ์๋ณธ ์ด๋ฏธ์ง ์ ์ฅ
|
151 |
+
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
|
152 |
+
original_path = tmp.name
|
153 |
+
original_pil.save(original_path)
|
154 |
+
logger.debug(f"์๋ณธ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {original_path}")
|
155 |
+
|
156 |
+
# ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์ ์ฅ (์ ๊ณต๋ ๊ฒฝ์ฐ)
|
157 |
+
background_path = None
|
158 |
+
if background_pil is not None:
|
159 |
+
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_bg:
|
160 |
+
background_path = tmp_bg.name
|
161 |
+
background_pil.save(background_path)
|
162 |
+
logger.debug(f"๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {background_path}")
|
163 |
+
|
164 |
+
# ์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ (์ ๊ณต๋ ๊ฒฝ์ฐ)
|
165 |
+
style_path = None
|
166 |
+
if style_pil is not None:
|
167 |
+
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_style:
|
168 |
+
style_path = tmp_style.name
|
169 |
+
style_pil.save(style_path)
|
170 |
+
logger.debug(f"์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {style_path}")
|
171 |
+
|
172 |
+
input_text = prompt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
173 |
model = "gemini-2.0-flash-exp-image-generation"
|
174 |
|
175 |
+
gemma_edited_image_path = generate(text=input_text,
|
176 |
+
file_name=original_path,
|
177 |
+
background_file=background_path,
|
178 |
+
style_file=style_path,
|
179 |
+
model=model)
|
180 |
|
181 |
+
if gemma_edited_image_path:
|
182 |
+
logger.debug(f"์ด๋ฏธ์ง ์์ฑ ์๋ฃ. ๊ฒฝ๋ก: {gemma_edited_image_path}")
|
183 |
+
result_img = Image.open(gemma_edited_image_path)
|
184 |
if result_img.mode == "RGBA":
|
185 |
result_img = result_img.convert("RGB")
|
186 |
return [result_img]
|
|
|
189 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
190 |
|
191 |
except Exception as e:
|
192 |
+
logger.exception("process_image_and_prompt ํจ์์์ ์ค๋ฅ ๋ฐ์:")
|
193 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
194 |
|
195 |
|
|
|
203 |
</div>
|
204 |
<div>
|
205 |
<h1>Gemini๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ํธ์ง</h1>
|
|
|
206 |
<p>Gemini API ํค๋ ํ๊ฒฝ๋ณ์(GEMINI_API_KEY)๋ก ์ค์ ๋์ด ์์ต๋๋ค.</p>
|
207 |
</div>
|
208 |
</div>
|
209 |
"""
|
210 |
)
|
211 |
+
gr.Markdown("์๋ณธ, ๋ฐฐ๊ฒฝ, ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๊ณ , ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์.")
|
212 |
|
213 |
with gr.Row():
|
214 |
with gr.Column():
|
215 |
+
original_input = gr.Image(type="pil", label="์๋ณธ ์ด๋ฏธ์ง", image_mode="RGBA")
|
216 |
+
background_input = gr.Image(type="pil", label="๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง", image_mode="RGBA")
|
217 |
+
style_input = gr.Image(type="pil", label="์คํ์ผ ์ด๋ฏธ์ง", image_mode="RGBA")
|
|
|
|
|
218 |
prompt_input = gr.Textbox(
|
219 |
+
lines=2,
|
220 |
placeholder="ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์...",
|
221 |
label="ํธ์ง ํ๋กฌํํธ"
|
222 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
submit_btn = gr.Button("์ด๋ฏธ์ง ํธ์ง ์คํ")
|
|
|
224 |
with gr.Column():
|
|
|
225 |
output_gallery = gr.Gallery(label="ํธ์ง ๊ฒฐ๊ณผ")
|
|
|
226 |
|
|
|
227 |
submit_btn.click(
|
228 |
+
fn=process_image_and_prompt,
|
229 |
+
inputs=[original_input, prompt_input, background_input, style_input],
|
230 |
+
outputs=output_gallery,
|
|
|
|
|
|
|
|
|
231 |
)
|
232 |
|
233 |
+
# --- ํ
์คํธ ์ฝ๋ ---
|
234 |
+
# ํ
์คํธ์ฉ ๋๋ฏธ ์ด๋ฏธ์ง (์ค์ ์ด๋ฏธ์ง๋ก ๋์ฒด ๊ฐ๋ฅ)
|
235 |
+
dummy_original = Image.new("RGBA", (100, 100), color="red")
|
236 |
+
dummy_background = Image.new("RGBA", (100, 100), color="green")
|
237 |
+
dummy_style = Image.new("RGBA", (100, 100), color="blue")
|
238 |
+
dummy_prompt = "์ด๋ฏธ์ง ํธ์ง: ์๋ณธ์ ๋นจ๊ฐ, ๋ฐฐ๊ฒฝ์ ์ด๋ก, ์คํ์ผ์ ํ๋"
|
239 |
+
|
240 |
+
logger.info("process_image_and_prompt ํจ์๋ฅผ ์ง์ ํธ์ถํฉ๏ฟฝ๏ฟฝ๋ค...")
|
241 |
+
result = process_image_and_prompt(dummy_original, dummy_prompt, dummy_background, dummy_style)
|
242 |
|
243 |
+
if result:
|
244 |
+
logger.info(f"์ง์ ํธ์ถ ์ฑ๊ณต. ๊ฒฐ๊ณผ: {result}")
|
245 |
+
else:
|
246 |
+
logger.error("์ง์ ํธ์ถ ์คํจ.")
|
247 |
|
248 |
+
demo.launch(share=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|