Kims12 commited on
Commit
45f2341
ยท
verified ยท
1 Parent(s): 1c79c32

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -27
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, model="gemini-2.0-flash-exp-image-generation"):
33
  logger.debug(f"generate ํ•จ์ˆ˜ ์‹œ์ž‘ - ํ…์ŠคํŠธ: '{text}', ํŒŒ์ผ๋ช…: '{file_name}', ๋ชจ๋ธ: '{model}'")
34
 
35
  try:
@@ -44,23 +44,54 @@ def generate(text, file_name, model="gemini-2.0-flash-exp-image-generation"):
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,7 +135,7 @@ def generate(text, file_name, model="gemini-2.0-flash-exp-image-generation"):
104
 
105
  logger.debug(f"Raw chunk: {chunk}")
106
 
107
- del files
108
  logger.debug("์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์ •๋ณด ์‚ญ์ œ ์™„๋ฃŒ.")
109
  return temp_path
110
 
@@ -113,19 +144,39 @@ def generate(text, file_name, model="gemini-2.0-flash-exp-image-generation"):
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,11 +208,13 @@ with gr.Blocks() as demo:
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,17 +226,19 @@ with gr.Blocks() as demo:
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}")
 
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
  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
 
136
  logger.debug(f"Raw chunk: {chunk}")
137
 
138
+ del uploaded_files
139
  logger.debug("์—…๋กœ๋“œ๋œ ํŒŒ์ผ ์ •๋ณด ์‚ญ์ œ ์™„๋ฃŒ.")
140
  return temp_path
141
 
 
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
  </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
 
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}")