Kims12 commited on
Commit
91d17fb
ยท
verified ยท
1 Parent(s): 181acf3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -82
app.py CHANGED
@@ -29,7 +29,7 @@ def save_binary_file(file_name, data):
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:
@@ -44,54 +44,23 @@ def generate(text, file_name, background_file=None, style_file=None, model="gemi
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",
94
- parts=parts,
 
 
 
 
 
 
95
  ),
96
  ]
97
  logger.debug(f"์ปจํ…์ธ  ๊ฐ์ฒด ์ƒ์„ฑ ์™„๋ฃŒ: {contents}")
@@ -135,7 +104,7 @@ def generate(text, file_name, background_file=None, style_file=None, model="gemi
135
 
136
  logger.debug(f"Raw chunk: {chunk}")
137
 
138
- del uploaded_files
139
  logger.debug("์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์ •๋ณด ์‚ญ์ œ ์™„๋ฃŒ.")
140
  return temp_path
141
 
@@ -144,39 +113,19 @@ def generate(text, file_name, background_file=None, style_file=None, model="gemi
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}")
@@ -208,13 +157,11 @@ with gr.Blocks() as demo:
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="ํŽธ์ง‘ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”...",
@@ -226,19 +173,17 @@ with gr.Blocks() as demo:
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}")
 
29
  logger.debug(f"ํŒŒ์ผ ์ €์žฅ ์™„๋ฃŒ: {file_name}")
30
 
31
 
32
+ def generate(text, file_name, model="gemini-2.0-flash-exp-image-generation"):
33
  logger.debug(f"generate ํ•จ์ˆ˜ ์‹œ์ž‘ - ํ…์ŠคํŠธ: '{text}', ํŒŒ์ผ๋ช…: '{file_name}', ๋ชจ๋ธ: '{model}'")
34
 
35
  try:
 
44
  client = genai.Client(api_key=effective_api_key)
45
  logger.debug("Gemini ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ.")
46
 
47
+ # ํŒŒ์ผ ์—…๋กœ๋“œ
48
+ files = [
49
+ client.files.upload(file=file_name),
50
+ ]
51
+ logger.debug(f"ํŒŒ์ผ ์—…๋กœ๋“œ ์™„๋ฃŒ. URI: {files[0].uri}, MIME ํƒ€์ž…: {files[0].mime_type}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
53
+ # ์ปจํ…์ธ  ๊ฐ์ฒด ์ƒ์„ฑ: ํŒŒ์ผ URI์™€ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ•จ๊ป˜ ํฌํ•จ
54
  contents = [
55
  types.Content(
56
  role="user",
57
+ parts=[
58
+ types.Part.from_uri(
59
+ file_uri=files[0].uri,
60
+ mime_type=files[0].mime_type,
61
+ ),
62
+ types.Part.from_text(text=text),
63
+ ],
64
  ),
65
  ]
66
  logger.debug(f"์ปจํ…์ธ  ๊ฐ์ฒด ์ƒ์„ฑ ์™„๋ฃŒ: {contents}")
 
104
 
105
  logger.debug(f"Raw chunk: {chunk}")
106
 
107
+ del files
108
  logger.debug("์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์ •๋ณด ์‚ญ์ œ ์™„๋ฃŒ.")
109
  return temp_path
110
 
 
113
  return None # ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ None ๋ฐ˜ํ™˜
114
 
115
 
116
+ def process_image_and_prompt(composite_pil, prompt):
117
  logger.debug(f"process_image_and_prompt ํ•จ์ˆ˜ ์‹œ์ž‘ - ํ”„๋กฌํ”„ํŠธ: '{prompt}'")
118
  try:
 
119
  with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
120
+ composite_path = tmp.name
121
+ composite_pil.save(composite_path)
122
+ logger.debug(f"ํ•ฉ์„ฑ ์ด๋ฏธ์ง€ ์ €์žฅ ์™„๋ฃŒ: {composite_path}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
+ file_name = composite_path
125
  input_text = prompt
126
  model = "gemini-2.0-flash-exp-image-generation"
127
 
128
+ gemma_edited_image_path = generate(text=input_text, file_name=file_name, model=model)
 
 
 
 
129
 
130
  if gemma_edited_image_path:
131
  logger.debug(f"์ด๋ฏธ์ง€ ์ƒ์„ฑ ์™„๋ฃŒ. ๊ฒฝ๋กœ: {gemma_edited_image_path}")
 
157
  </div>
158
  """
159
  )
160
+ gr.Markdown("์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ , ํŽธ์ง‘ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”.")
161
 
162
  with gr.Row():
163
  with gr.Column():
164
+ image_input = gr.Image(type="pil", label="์ด๋ฏธ์ง€ ์—…๋กœ๋“œ", image_mode="RGBA")
 
 
165
  prompt_input = gr.Textbox(
166
  lines=2,
167
  placeholder="ํŽธ์ง‘ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”...",
 
173
 
174
  submit_btn.click(
175
  fn=process_image_and_prompt,
176
+ inputs=[image_input, prompt_input],
177
  outputs=output_gallery,
178
  )
179
 
180
  # --- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ---
181
  # ํ…Œ์ŠคํŠธ์šฉ ๋”๋ฏธ ์ด๋ฏธ์ง€ (์‹ค์ œ ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)
182
+ dummy_image = Image.new("RGBA", (100, 100), color="red")
183
+ dummy_prompt = "์ด๋ฏธ์ง€๋ฅผ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜"
 
 
184
 
185
  logger.info("process_image_and_prompt ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค...")
186
+ result = process_image_and_prompt(dummy_image, dummy_prompt)
187
 
188
  if result:
189
  logger.info(f"์ง์ ‘ ํ˜ธ์ถœ ์„ฑ๊ณต. ๊ฒฐ๊ณผ: {result}")