Update app.py
Browse files
app.py
CHANGED
@@ -12,7 +12,7 @@ import logging
|
|
12 |
from google import genai
|
13 |
from google.genai import types
|
14 |
|
15 |
-
# .env ํ์ผ์ ์ ์ฅ๋ ํ๊ฒฝ๋ณ์ ๋ก๋ (pip install python-dotenv
|
16 |
from dotenv import load_dotenv
|
17 |
load_dotenv()
|
18 |
|
@@ -29,11 +29,22 @@ def save_binary_file(file_name, data):
|
|
29 |
logger.debug(f"ํ์ผ ์ ์ฅ ์๋ฃ: {file_name}")
|
30 |
|
31 |
|
32 |
-
def generate(text,
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
try:
|
36 |
-
#
|
37 |
effective_api_key = os.environ.get("GEMINI_API_KEY")
|
38 |
if effective_api_key:
|
39 |
logger.debug("ํ๊ฒฝ๋ณ์์์ API ํค ๋ถ๋ฌ์ด")
|
@@ -44,32 +55,40 @@ def generate(text, composite_file, background_file=None, style_file=None, model=
|
|
44 |
client = genai.Client(api_key=effective_api_key)
|
45 |
logger.debug("Gemini ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ.")
|
46 |
|
47 |
-
#
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
logger.
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
files.append(style_upload)
|
63 |
-
logger.debug(f"์คํ์ผ ์ด๋ฏธ์ง ์
๋ก๋ ์๋ฃ. URI: {style_upload.uri}, MIME ํ์
: {style_upload.mime_type}")
|
64 |
-
|
65 |
-
# ํ์ผ ์
๋ก๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ฝํ
์ธ ํํธ ์์ฑ
|
66 |
parts = []
|
67 |
-
for
|
68 |
-
parts.append(
|
69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
parts.append(types.Part.from_text(text=text))
|
71 |
-
|
72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
logger.debug(f"์ปจํ
์ธ ๊ฐ์ฒด ์์ฑ ์๋ฃ: {contents}")
|
74 |
|
75 |
generate_content_config = types.GenerateContentConfig(
|
@@ -77,7 +96,10 @@ def generate(text, composite_file, background_file=None, style_file=None, model=
|
|
77 |
top_p=0.95,
|
78 |
top_k=40,
|
79 |
max_output_tokens=8192,
|
80 |
-
response_modalities=[
|
|
|
|
|
|
|
81 |
response_mime_type="text/plain",
|
82 |
)
|
83 |
logger.debug(f"์์ฑ ์ค์ : {generate_content_config}")
|
@@ -108,7 +130,8 @@ def generate(text, composite_file, background_file=None, style_file=None, model=
|
|
108 |
|
109 |
logger.debug(f"Raw chunk: {chunk}")
|
110 |
|
111 |
-
|
|
|
112 |
logger.debug("์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ญ์ ์๋ฃ.")
|
113 |
return temp_path
|
114 |
|
@@ -117,42 +140,84 @@ def generate(text, composite_file, background_file=None, style_file=None, model=
|
|
117 |
return None # ์ค๋ฅ ๋ฐ์ ์ None ๋ฐํ
|
118 |
|
119 |
|
120 |
-
def
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
# ์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ (์
๋ ฅ๋ ๊ฒฝ์ฐ)
|
140 |
-
if style_pil is not None:
|
141 |
-
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp3:
|
142 |
-
style_path = tmp3.name
|
143 |
-
style_pil.save(style_path)
|
144 |
-
logger.debug(f"์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {style_path}")
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
model = "gemini-2.0-flash-exp-image-generation"
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
logger.debug(f"์ด๋ฏธ์ง ์์ฑ ์๋ฃ. ๊ฒฝ๋ก: {gemma_edited_image_path}")
|
155 |
-
result_img = Image.open(gemma_edited_image_path)
|
156 |
if result_img.mode == "RGBA":
|
157 |
result_img = result_img.convert("RGB")
|
158 |
return [result_img]
|
@@ -161,7 +226,7 @@ def process_image_and_prompt(composite_pil, background_pil, style_pil, prompt):
|
|
161 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
162 |
|
163 |
except Exception as e:
|
164 |
-
logger.exception("
|
165 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
166 |
|
167 |
|
@@ -175,45 +240,78 @@ with gr.Blocks() as demo:
|
|
175 |
</div>
|
176 |
<div>
|
177 |
<h1>Gemini๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ํธ์ง</h1>
|
|
|
178 |
<p>Gemini API ํค๋ ํ๊ฒฝ๋ณ์(GEMINI_API_KEY)๋ก ์ค์ ๋์ด ์์ต๋๋ค.</p>
|
179 |
</div>
|
180 |
</div>
|
181 |
"""
|
182 |
)
|
183 |
-
gr.Markdown("
|
184 |
|
185 |
with gr.Row():
|
186 |
with gr.Column():
|
187 |
-
|
188 |
-
|
189 |
-
|
|
|
|
|
190 |
prompt_input = gr.Textbox(
|
191 |
-
lines=
|
192 |
placeholder="ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์...",
|
193 |
label="ํธ์ง ํ๋กฌํํธ"
|
194 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
submit_btn = gr.Button("์ด๋ฏธ์ง ํธ์ง ์คํ")
|
|
|
196 |
with gr.Column():
|
|
|
197 |
output_gallery = gr.Gallery(label="ํธ์ง ๊ฒฐ๊ณผ")
|
|
|
198 |
|
|
|
199 |
submit_btn.click(
|
200 |
-
fn=
|
201 |
-
inputs=[
|
202 |
-
outputs=output_gallery,
|
|
|
|
|
|
|
|
|
203 |
)
|
204 |
|
205 |
-
#
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
|
|
213 |
|
214 |
-
if result:
|
215 |
-
logger.info(f"์ง์ ํธ์ถ ์ฑ๊ณต. ๊ฒฐ๊ณผ: {result}")
|
216 |
-
else:
|
217 |
-
logger.error("์ง์ ํธ์ถ ์คํจ.")
|
218 |
|
219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
29 |
logger.debug(f"ํ์ผ ์ ์ฅ ์๋ฃ: {file_name}")
|
30 |
|
31 |
|
32 |
+
def generate(text, files_list, model="gemini-2.0-flash-exp-image-generation"):
|
33 |
+
"""
|
34 |
+
์ฌ๋ฌ ์ด๋ฏธ์ง์ ํ
์คํธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ฌ Gemini API๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ํจ์
|
35 |
+
|
36 |
+
Args:
|
37 |
+
text (str): ์ด๋ฏธ์ง ์์ฑ์ ์ฌ์ฉํ ํ
์คํธ ํ๋กฌํํธ
|
38 |
+
files_list (list): ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ๋ฆฌ์คํธ
|
39 |
+
model (str): ์ฌ์ฉํ Gemini ๋ชจ๋ธ๋ช
|
40 |
+
|
41 |
+
Returns:
|
42 |
+
str: ์์ฑ๋ ์ด๋ฏธ์ง์ ํ์ผ ๊ฒฝ๋ก ๋๋ None (์ค๋ฅ ๋ฐ์ ์)
|
43 |
+
"""
|
44 |
+
logger.debug(f"generate ํจ์ ์์ - ํ
์คํธ: '{text}', ํ์ผ ์: {len(files_list)}, ๋ชจ๋ธ: '{model}'")
|
45 |
+
|
46 |
try:
|
47 |
+
# API ํค๋ ํ๊ฒฝ๋ณ์์์ ๋ถ๋ฌ์ด
|
48 |
effective_api_key = os.environ.get("GEMINI_API_KEY")
|
49 |
if effective_api_key:
|
50 |
logger.debug("ํ๊ฒฝ๋ณ์์์ API ํค ๋ถ๋ฌ์ด")
|
|
|
55 |
client = genai.Client(api_key=effective_api_key)
|
56 |
logger.debug("Gemini ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ.")
|
57 |
|
58 |
+
# ์ฌ๋ฌ ํ์ผ ์
๋ก๋
|
59 |
+
uploaded_files = []
|
60 |
+
for file_path in files_list:
|
61 |
+
if file_path and os.path.exists(file_path):
|
62 |
+
uploaded_file = client.files.upload(file=file_path)
|
63 |
+
uploaded_files.append(uploaded_file)
|
64 |
+
logger.debug(f"ํ์ผ ์
๋ก๋ ์๋ฃ. URI: {uploaded_file.uri}, MIME ํ์
: {uploaded_file.mime_type}")
|
65 |
+
else:
|
66 |
+
logger.warning(f"ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ None์
๋๋ค: {file_path}")
|
67 |
+
|
68 |
+
if not uploaded_files:
|
69 |
+
logger.error("์
๋ก๋ํ ํ์ผ์ด ์์ต๋๋ค.")
|
70 |
+
return None
|
71 |
+
|
72 |
+
# ํํธ ๋ฆฌ์คํธ ์์ฑ (๋ชจ๋ ์ด๋ฏธ์ง + ํ
์คํธ ํ๋กฌํํธ)
|
|
|
|
|
|
|
|
|
73 |
parts = []
|
74 |
+
for uploaded_file in uploaded_files:
|
75 |
+
parts.append(
|
76 |
+
types.Part.from_uri(
|
77 |
+
file_uri=uploaded_file.uri,
|
78 |
+
mime_type=uploaded_file.mime_type,
|
79 |
+
)
|
80 |
+
)
|
81 |
+
|
82 |
+
# ํ
์คํธ ํ๋กฌํํธ ์ถ๊ฐ
|
83 |
parts.append(types.Part.from_text(text=text))
|
84 |
+
|
85 |
+
# ์ปจํ
์ธ ๊ฐ์ฒด ์์ฑ
|
86 |
+
contents = [
|
87 |
+
types.Content(
|
88 |
+
role="user",
|
89 |
+
parts=parts,
|
90 |
+
),
|
91 |
+
]
|
92 |
logger.debug(f"์ปจํ
์ธ ๊ฐ์ฒด ์์ฑ ์๋ฃ: {contents}")
|
93 |
|
94 |
generate_content_config = types.GenerateContentConfig(
|
|
|
96 |
top_p=0.95,
|
97 |
top_k=40,
|
98 |
max_output_tokens=8192,
|
99 |
+
response_modalities=[
|
100 |
+
"image",
|
101 |
+
"text",
|
102 |
+
],
|
103 |
response_mime_type="text/plain",
|
104 |
)
|
105 |
logger.debug(f"์์ฑ ์ค์ : {generate_content_config}")
|
|
|
130 |
|
131 |
logger.debug(f"Raw chunk: {chunk}")
|
132 |
|
133 |
+
# ์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ ๋ฆฌ
|
134 |
+
del uploaded_files
|
135 |
logger.debug("์
๋ก๋๋ ํ์ผ ์ ๋ณด ์ญ์ ์๋ฃ.")
|
136 |
return temp_path
|
137 |
|
|
|
140 |
return None # ์ค๋ฅ ๋ฐ์ ์ None ๋ฐํ
|
141 |
|
142 |
|
143 |
+
def save_image_temp(image):
|
144 |
+
"""์ด๋ฏธ์ง๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅํ๋ ์ ํธ๋ฆฌํฐ ํจ์"""
|
145 |
+
if image is None:
|
146 |
+
return None
|
147 |
+
|
148 |
+
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
|
149 |
+
temp_path = tmp.name
|
150 |
+
if isinstance(image, Image.Image):
|
151 |
+
if image.mode == "RGBA":
|
152 |
+
# ์ํ ์ฑ๋์ด ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ
|
153 |
+
image = image.convert("RGB")
|
154 |
+
image.save(temp_path)
|
155 |
+
else:
|
156 |
+
logger.warning(f"์ง์๋์ง ์๋ ์ด๋ฏธ์ง ํ์
: {type(image)}")
|
157 |
+
return None
|
158 |
+
|
159 |
+
logger.debug(f"์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: {temp_path}")
|
160 |
+
return temp_path
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
|
162 |
+
|
163 |
+
def process_with_background_and_style(main_image, background_image, style_image, prompt):
|
164 |
+
"""
|
165 |
+
์ฃผ ์ด๋ฏธ์ง, ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง, ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ํ๋กฌํํธ์ ํจ๊ป ์ฒ๋ฆฌํ๋ ํจ์
|
166 |
+
|
167 |
+
Args:
|
168 |
+
main_image (PIL.Image): ์ฃผ ๋์ ์ด๋ฏธ์ง
|
169 |
+
background_image (PIL.Image): ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง
|
170 |
+
style_image (PIL.Image): ์คํ์ผ ์ฐธ์กฐ ์ด๋ฏธ์ง
|
171 |
+
prompt (str): ์ด๋ฏธ์ง ํธ์ง ํ๋กฌํํธ
|
172 |
+
|
173 |
+
Returns:
|
174 |
+
list: ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง ๋ชฉ๋ก
|
175 |
+
"""
|
176 |
+
logger.debug(f"process_with_background_and_style ํจ์ ์์ - ํ๋กฌํํธ: '{prompt}'")
|
177 |
+
try:
|
178 |
+
# ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅ
|
179 |
+
files_list = []
|
180 |
+
|
181 |
+
# ์ฃผ ์ด๋ฏธ์ง ์ ์ฅ
|
182 |
+
main_path = save_image_temp(main_image)
|
183 |
+
if main_path:
|
184 |
+
files_list.append(main_path)
|
185 |
+
|
186 |
+
# ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์ ์ฅ (์๋ ๊ฒฝ์ฐ)
|
187 |
+
if background_image is not None:
|
188 |
+
bg_path = save_image_temp(background_image)
|
189 |
+
if bg_path:
|
190 |
+
files_list.append(bg_path)
|
191 |
+
|
192 |
+
# ์คํ์ผ ์ด๋ฏธ์ง ์ ์ฅ (์๋ ๊ฒฝ์ฐ)
|
193 |
+
if style_image is not None:
|
194 |
+
style_path = save_image_temp(style_image)
|
195 |
+
if style_path:
|
196 |
+
files_list.append(style_path)
|
197 |
+
|
198 |
+
# ์ด๋ฏธ์ง๊ฐ ํ๋๋ ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ
|
199 |
+
if not files_list:
|
200 |
+
logger.error("์ฒ๋ฆฌํ ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค.")
|
201 |
+
return []
|
202 |
+
|
203 |
+
# ํ๋กฌํํธ ๋ณด๊ฐ (๋ฐฐ๊ฒฝ ๋ฐ ์คํ์ผ ๊ด๋ จ ์ ๋ณด ์ถ๊ฐ)
|
204 |
+
enhanced_prompt = prompt
|
205 |
+
if background_image is not None and style_image is not None:
|
206 |
+
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํด์ฃผ์ธ์. ์ธ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์คํ์ผ์ ์ ์ฉํด์ฃผ์ธ์."
|
207 |
+
elif background_image is not None:
|
208 |
+
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํด์ฃผ์ธ์."
|
209 |
+
elif style_image is not None:
|
210 |
+
enhanced_prompt = f"{prompt}. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ฃผ ๋์ ์ด๋ฏธ์ง์ด๊ณ , ๋ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์คํ์ผ์ ์ ์ฉํด์ฃผ์ธ์."
|
211 |
+
|
212 |
+
logger.debug(f"๋ณด๊ฐ๋ ํ๋กฌํํธ: {enhanced_prompt}")
|
213 |
model = "gemini-2.0-flash-exp-image-generation"
|
214 |
+
|
215 |
+
# Gemini API ํธ์ถ
|
216 |
+
result_path = generate(text=enhanced_prompt, files_list=files_list, model=model)
|
217 |
+
|
218 |
+
if result_path:
|
219 |
+
logger.debug(f"์ด๋ฏธ์ง ์์ฑ ์๋ฃ. ๊ฒฝ๋ก: {result_path}")
|
220 |
+
result_img = Image.open(result_path)
|
|
|
|
|
221 |
if result_img.mode == "RGBA":
|
222 |
result_img = result_img.convert("RGB")
|
223 |
return [result_img]
|
|
|
226 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
227 |
|
228 |
except Exception as e:
|
229 |
+
logger.exception("process_with_background_and_style ํจ์์์ ์ค๋ฅ ๋ฐ์:")
|
230 |
return [] # ์ค๋ฅ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
|
231 |
|
232 |
|
|
|
240 |
</div>
|
241 |
<div>
|
242 |
<h1>Gemini๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ํธ์ง</h1>
|
243 |
+
<p>๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.</p>
|
244 |
<p>Gemini API ํค๋ ํ๊ฒฝ๋ณ์(GEMINI_API_KEY)๋ก ์ค์ ๋์ด ์์ต๋๋ค.</p>
|
245 |
</div>
|
246 |
</div>
|
247 |
"""
|
248 |
)
|
249 |
+
gr.Markdown("์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๊ณ , ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์. ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ์คํ์ผ ์ด๋ฏธ์ง๋ ์ ํ์ฌํญ์
๋๋ค.")
|
250 |
|
251 |
with gr.Row():
|
252 |
with gr.Column():
|
253 |
+
# ์
๋ ฅ ์ปดํฌ๋ํธ
|
254 |
+
main_image_input = gr.Image(type="pil", label="์ฃผ ์ด๋ฏธ์ง ์
๋ก๋", image_mode="RGB")
|
255 |
+
background_image_input = gr.Image(type="pil", label="๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์
๋ก๋ (์ ํ์ฌํญ)", image_mode="RGB")
|
256 |
+
style_image_input = gr.Image(type="pil", label="์คํ์ผ ์ด๋ฏธ์ง ์
๋ก๋ (์ ํ์ฌํญ)", image_mode="RGB")
|
257 |
+
|
258 |
prompt_input = gr.Textbox(
|
259 |
+
lines=3,
|
260 |
placeholder="ํธ์งํ ๋ด์ฉ์ ์
๋ ฅํ์ธ์...",
|
261 |
label="ํธ์ง ํ๋กฌํํธ"
|
262 |
)
|
263 |
+
|
264 |
+
# ํ๋กฌํํธ ์์
|
265 |
+
gr.Markdown("### ํ๋กฌํํธ ์์")
|
266 |
+
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์นํด์ฃผ์ธ์'")
|
267 |
+
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง๋ฅผ ์คํ์ผ ์ด๋ฏธ์ง์ ํํ์ผ๋ก ๋ณํํด์ฃผ์ธ์'")
|
268 |
+
gr.Markdown("- '์ฃผ ์ด๋ฏธ์ง์ ๋ฐฐ๊ฒฝ์ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ก ๋์ฒดํ๊ณ , ์ธ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์๊ฐ์ ์ ์ฉํด์ฃผ์ธ์'")
|
269 |
+
|
270 |
submit_btn = gr.Button("์ด๋ฏธ์ง ํธ์ง ์คํ")
|
271 |
+
|
272 |
with gr.Column():
|
273 |
+
# ์ถ๋ ฅ ์ปดํฌ๋ํธ
|
274 |
output_gallery = gr.Gallery(label="ํธ์ง ๊ฒฐ๊ณผ")
|
275 |
+
output_info = gr.Textbox(label="์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ ๋ณด", lines=2)
|
276 |
|
277 |
+
# ์ฒ๋ฆฌ ํจ์ ์ฐ๊ฒฐ
|
278 |
submit_btn.click(
|
279 |
+
fn=process_with_background_and_style,
|
280 |
+
inputs=[main_image_input, background_image_input, style_image_input, prompt_input],
|
281 |
+
outputs=[output_gallery],
|
282 |
+
).then(
|
283 |
+
lambda: "ํธ์ง์ด ์๋ฃ๋์์ต๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด์ฃผ์ธ์.",
|
284 |
+
None,
|
285 |
+
output_info
|
286 |
)
|
287 |
|
288 |
+
# ์์ ์ด๋ฏธ์ง ์ถ๊ฐ
|
289 |
+
gr.Examples(
|
290 |
+
examples=[
|
291 |
+
["example_main.jpg", "example_background.jpg", "example_style.jpg", "์ฃผ ์ด๋ฏธ์ง์ ์ธ๋ฌผ์ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ํฉ์ฑํ๊ณ , ์คํ์ผ ์ด๋ฏธ์ง์ ํํ์ ์ ์ฉํด์ฃผ์ธ์"],
|
292 |
+
["example_main.jpg", None, "example_style.jpg", "์ด๋ฏธ์ง๋ฅผ ์คํ์ผ ์ด๋ฏธ์ง์ ํํ์ผ๋ก ๋ณํํด์ฃผ์ธ์"],
|
293 |
+
["example_main.jpg", "example_background.jpg", None, "์ฃผ ์ด๋ฏธ์ง์ ๋ฐฐ๊ฒฝ์ ์ ๊ฑฐํ๊ณ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง ์์ ํฉ์ฑํด์ฃผ์ธ์"],
|
294 |
+
],
|
295 |
+
inputs=[main_image_input, background_image_input, style_image_input, prompt_input],
|
296 |
+
)
|
297 |
|
|
|
|
|
|
|
|
|
298 |
|
299 |
+
# ์ ํ๋ฆฌ์ผ์ด์
์คํ
|
300 |
+
if __name__ == "__main__":
|
301 |
+
# ์ค์ ์ด์์์๋ ํ
์คํธ ์ฝ๋ ์ ๊ฑฐ
|
302 |
+
# ํ
์คํธ์ฉ ๋๋ฏธ ์ด๋ฏธ์ง (์ค์ ์ด๋ฏธ์ง๋ก ๋์ฒด ๊ฐ๋ฅ)
|
303 |
+
# dummy_image = Image.new("RGB", (100, 100), color="red")
|
304 |
+
# dummy_bg = Image.new("RGB", (100, 100), color="blue")
|
305 |
+
# dummy_style = Image.new("RGB", (100, 100), color="green")
|
306 |
+
# dummy_prompt = "์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํด์ค"
|
307 |
+
|
308 |
+
# logger.info("process_with_background_and_style ํจ์๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค...")
|
309 |
+
# result = process_with_background_and_style(dummy_image, dummy_bg, dummy_style, dummy_prompt)
|
310 |
+
|
311 |
+
# if result:
|
312 |
+
# logger.info(f"์ง์ ํธ์ถ ์ฑ๊ณต. ๊ฒฐ๊ณผ: {result}")
|
313 |
+
# else:
|
314 |
+
# logger.error("์ง์ ํธ์ถ ์คํจ.")
|
315 |
+
|
316 |
+
# Gradio ์ฑ ์คํ
|
317 |
+
demo.launch(share=True)
|