Kims12 commited on
Commit
447a9c2
·
verified ·
1 Parent(s): 0fefa9b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -44
app.py CHANGED
@@ -249,18 +249,16 @@ def process_images_with_prompt(image1, image2, image3, prompt, variation_index=0
249
  if result_img is not None:
250
  return result_img, status, final_prompt
251
  else:
252
- # API 호출은 성공했지만 이미지 생성 실패
253
  last_error = status
254
  retry_count += 1
255
  logger.warning(f"이미지 생성 실패, 재시도 {retry_count}/{max_retries}: {status}")
256
- time.sleep(1) # 1초 대기 후 재시도
257
  except Exception as e:
258
  last_error = str(e)
259
  retry_count += 1
260
  logger.exception(f"이미지 처리 중 오류 발생, 재시도 {retry_count}/{max_retries}:")
261
- time.sleep(1) # 1초 대기 후 재시도
262
 
263
- # 모든 재시도 실패 후
264
  return None, f"최대 재시도 횟수({max_retries}회) 초과 후 실패: {last_error}", prompt
265
 
266
  def generate_multiple_images(image1, image2, image3, prompt, progress=gr.Progress()):
@@ -285,21 +283,17 @@ def generate_multiple_images(image1, image2, image3, prompt, progress=gr.Progres
285
  statuses.append(f"이미지 #{i+1}: {status}")
286
  prompts.append(f"이미지 #{i+1}: {final_prompt}")
287
  else:
288
- # 에러가 발생한 경우에도 결과 목록에 None을 추가
289
  results.append(None)
290
  statuses.append(f"이미지 #{i+1} 생성 실패: {status}")
291
  prompts.append(f"이미지 #{i+1}: {final_prompt}")
292
 
293
- # API 호출 사이에 약간의 간격을 두어 속도 제한 방지
294
  time.sleep(1)
295
 
296
  progress(1.0, desc="이미지 생성 완료!")
297
 
298
- # 결과가 없는 경우 빈 슬롯 채우기
299
  while len(results) < 4:
300
  results.append(None)
301
 
302
- # 상태 메시지와 프롬프트 정보 결합
303
  combined_status = "\n".join(statuses)
304
  combined_prompts = "\n".join(prompts)
305
 
@@ -310,15 +304,14 @@ with gr.Blocks() as demo:
310
  gr.HTML(
311
  """
312
  <div style="text-align: center; margin-bottom: 1rem;">
313
- <h1>4장 이미지 생성기 (예제 포함)</h1>
314
- <p>이미지를 업로드하고 "이미지 생성" 버튼을 클릭하면 차례로 4장의 이미지가 생성됩니다.</p>
315
- <p>모든 이미지는 균일한 크기로 표시됩니다.</p>
316
  </div>
317
  """
318
  )
319
 
320
  with gr.Row():
321
- # 왼쪽 입력 영역
322
  with gr.Column(scale=1):
323
  with gr.Row():
324
  image1_input = gr.Image(type="pil", label="#1", image_mode="RGB", height=300, width=200)
@@ -330,15 +323,15 @@ with gr.Blocks() as demo:
330
  label="프롬프트 (선택 사항)"
331
  )
332
  with gr.Row():
333
- image_change_btn1 = gr.Button("이미지변경-1")
334
- image_change_btn2 = gr.Button("이미지변경-2")
335
- text_remove_btn = gr.Button("글자지우기")
336
- text_change_btn = gr.Button("글자변경하기")
337
  clothes_change_btn1 = gr.Button("가상 상품착용-1")
338
- clothes_change_btn2 = gr.Button("상품착용-2")
339
  holding_product_btn = gr.Button("상품들고 있기")
340
- background_change_btn = gr.Button("배경바꾸기")
341
- composite_product_btn = gr.Button("부분지우기")
342
  submit_btn = gr.Button("이미지 생성 (4장)", variant="primary")
343
 
344
  gr.Markdown(
@@ -349,11 +342,32 @@ with gr.Blocks() as demo:
349
  2. **이미지 참조**: #1, #2, #3으로 각 이미지를 참조할 수 있습니다.
350
  3. **선택 옵션**: 위의 버튼을 클릭하면 프롬프트 입력란에 한국어 문구로 입력하시면 됩니다.
351
  4. **다양한 이미지**: "이미지 생성" 버튼을 클릭하면 차례로 4장의 이미지가 생성됩니다.
 
352
 
353
  > **팁**: 프롬프트를 직접 수정할 수도 있습니다.
354
  """
355
  )
356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  # 오른쪽 출력 영역
358
  with gr.Column(scale=1):
359
  with gr.Row():
@@ -369,7 +383,7 @@ with gr.Blocks() as demo:
369
 
370
  # 선택 옵션 버튼 클릭 시 프롬프트 입력란 업데이트 (한국어 문구)
371
  image_change_btn1.click(
372
- fn=lambda: "(#1의 여성) 이미지를 살짝 뒤로 돌아보는 모습으로 최대한 이전 seed를 유지한테 자연스럽게 변경하라.",
373
  inputs=[],
374
  outputs=prompt_input
375
  )
@@ -389,17 +403,17 @@ with gr.Blocks() as demo:
389
  outputs=prompt_input
390
  )
391
  clothes_change_btn1.click(
392
- fn=lambda: "(#1의 여성모겔)이 신체 비육과 포즈는 유치한 체 (#2의 선글라스)와 (#3의 청바지)를 직접 모델이 착용한것 처럼 자연스럽게 이미지를 생성하라.",
393
  inputs=[],
394
  outputs=prompt_input
395
  )
396
  clothes_change_btn2.click(
397
- fn=lambda: "(#1의 여성모델)이 신체 비육과 포즈는 유치한 체 (#2의 선글라스)를 직접 모델이 착용한 것처럼 (#3의 장소)에서 의자에 앉아 있는 자연스러운 이미지를 생성하라.",
398
  inputs=[],
399
  outputs=prompt_input
400
  )
401
  holding_product_btn.click(
402
- fn=lambda: "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 크지 않는 와인잔) 직접 모델이 사용하기 위해 들고 있는 자연스러운 모습으로 이미지를 생성하라.",
403
  inputs=[],
404
  outputs=prompt_input
405
  )
@@ -419,26 +433,6 @@ with gr.Blocks() as demo:
419
  inputs=[image1_input, image2_input, image3_input, prompt_input],
420
  outputs=[output_image1, output_image2, output_image3, output_image4, output_text, prompt_display],
421
  )
422
-
423
- gr.Markdown("## 예제 이미지", elem_classes="gr-examples-header")
424
-
425
- examples = [
426
- ["down/모���.jpg", None, None, "(#1의 여성)이 살짝 뒤로 돌아보는 모습으로 최대한 이전 seed를 유지한테 자연스럽게 변경하라."],
427
- ["down/상어레고모형.png", None, None, "(#1 레모모형)에서 청색상어레고만 검은색 고래레고로 변경하고 나머지 부분은 seed를 변경을 하지마라."],
428
- ["down/중국어.png", None, None, "(#1 이미지)에 있는 중국어를 모두 제거하라."],
429
- ["down/텍스트.webp", None, None, '(#1의 텍스트)를 스타일을 유지한체 텍스트만 "Hello"로 바꿔라'],
430
- ["down/모델.jpg", "down/선글라스.png", "down/청바지.png", "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)와 (#3의 청바지)를 직접 모델이 착용한것 처럼 자연스럽게 이미지를 생성하라."],
431
- ["down/모델.jpg", "down/선글라스.png", "down/카페전경.png", "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)를 직접 모델이 착용한 것처럼 (#3의 장소)에서 의자에 앉아 있는 자연스러운 이미지를 생성하라."],
432
- ["down/모델.jpg", "down/와인잔.png", None, "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 와인잔)을 여성모델이 홍보할 와인잔을 돋보이게 들고 있는 자연스러운 모습으로 이미지를 생성하라."],
433
- ["down/모델.jpg", "down/카페전경.png", None, "(#1의 여성모델)이 (#2 이미지의 배경)을 주요 피사체는 그대로 유지하여 이미지의 분위기가 자연스럽게 어우러지도록 생성하라."],
434
- ["down/상어레고모형.png", None, None, "(#1의 레고모형)에서 청색상어레고를 제거한 후, 그 자리를 주변 배경과 자연스럽게 어우러지도록 채워주세요. 단, 이미지의 다른 부분의 주요 요소는 동일하게 유지해 해야한다."]
435
- ]
436
-
437
- gr.Examples(
438
- examples=examples,
439
- inputs=[image1_input, image2_input, image3_input, prompt_input],
440
- elem_id="examples-grid"
441
- )
442
 
443
  if __name__ == "__main__":
444
- demo.launch(share=True)
 
249
  if result_img is not None:
250
  return result_img, status, final_prompt
251
  else:
 
252
  last_error = status
253
  retry_count += 1
254
  logger.warning(f"이미지 생성 실패, 재시도 {retry_count}/{max_retries}: {status}")
255
+ time.sleep(1)
256
  except Exception as e:
257
  last_error = str(e)
258
  retry_count += 1
259
  logger.exception(f"이미지 처리 중 오류 발생, 재시도 {retry_count}/{max_retries}:")
260
+ time.sleep(1)
261
 
 
262
  return None, f"최대 재시도 횟수({max_retries}회) 초과 후 실패: {last_error}", prompt
263
 
264
  def generate_multiple_images(image1, image2, image3, prompt, progress=gr.Progress()):
 
283
  statuses.append(f"이미지 #{i+1}: {status}")
284
  prompts.append(f"이미지 #{i+1}: {final_prompt}")
285
  else:
 
286
  results.append(None)
287
  statuses.append(f"이미지 #{i+1} 생성 실패: {status}")
288
  prompts.append(f"이미지 #{i+1}: {final_prompt}")
289
 
 
290
  time.sleep(1)
291
 
292
  progress(1.0, desc="이미지 생성 완료!")
293
 
 
294
  while len(results) < 4:
295
  results.append(None)
296
 
 
297
  combined_status = "\n".join(statuses)
298
  combined_prompts = "\n".join(prompts)
299
 
 
304
  gr.HTML(
305
  """
306
  <div style="text-align: center; margin-bottom: 1rem;">
307
+ <h1>이커머스용 이미지 생성기</h1>
308
+ <p>이미지를 업로드하고 예제를 참가하여 프롬프트를 수정하고 "이미지 생성" 버튼을 클릭하면 차례로 4장의 이미지가 생성됩니다.</p>
 
309
  </div>
310
  """
311
  )
312
 
313
  with gr.Row():
314
+ # 왼쪽 입력 영역 (예제 이미지를 포함하여 사용 방법 아래에 배치)
315
  with gr.Column(scale=1):
316
  with gr.Row():
317
  image1_input = gr.Image(type="pil", label="#1", image_mode="RGB", height=300, width=200)
 
323
  label="프롬프트 (선택 사항)"
324
  )
325
  with gr.Row():
326
+ image_change_btn1 = gr.Button("이미지 변경-1")
327
+ image_change_btn2 = gr.Button("이미지 변경-2")
328
+ text_remove_btn = gr.Button("글자 지우기")
329
+ text_change_btn = gr.Button("글자 변경하기")
330
  clothes_change_btn1 = gr.Button("가상 상품착용-1")
331
+ clothes_change_btn2 = gr.Button("가상 상품착용-2")
332
  holding_product_btn = gr.Button("상품들고 있기")
333
+ background_change_btn = gr.Button("배경 바꾸기")
334
+ composite_product_btn = gr.Button("부분 지우기")
335
  submit_btn = gr.Button("이미지 생성 (4장)", variant="primary")
336
 
337
  gr.Markdown(
 
342
  2. **이미지 참조**: #1, #2, #3으로 각 이미지를 참조할 수 있습니다.
343
  3. **선택 옵션**: 위의 버튼을 클릭하면 프롬프트 입력란에 한국어 문구로 입력하시면 됩니다.
344
  4. **다양한 이미지**: "이미지 생성" 버튼을 클릭하면 차례로 4장의 이미지가 생성됩니다.
345
+ 5. **예제선택**: 다양한 예제를 통해 미리 테스트해보세요.
346
 
347
  > **팁**: 프롬프트를 직접 수정할 수도 있습니다.
348
  """
349
  )
350
 
351
+ # 예제 이���지: 사용 방법 아래 왼쪽 영역에 배치
352
+ gr.Markdown("## 예제 이미지")
353
+ examples = [
354
+ ["down/모델.jpg", None, None, "(#1의 여성)이 살짝 뒤로 돌아보는 모습으로 최대한 이전 seed를 유지한테 자연스럽게 변경하라."],
355
+ ["down/상어레고모형.jpg", None, None, "(#1 레모모형)에서 청색상어레고만 검은색 고래레고로 변경하고 나머지 부분은 seed를 변경을 하지마라."],
356
+ ["down/중국어.png", None, None, "(#1 이미지)에 있는 중국어를 모두 제거하라."],
357
+ ["down/텍스트.webp", None, None, '(#1의 텍스트)를 스타일을 유지한체 텍스트만 "Hello"로 바꿔라'],
358
+ ["down/모델.jpg", "down/선글라스.png", "down/청바지.png", "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)와 (#3의 청바지)를 직접 모델이 착용한것 처럼 자연스럽게 이미지를 생성하라."],
359
+ ["down/모델.jpg", "down/선글라스.png", "down/카페전경.png", "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)를 직접 모델이 착용한 것처럼 (#3의 장소)에서 의자에 앉아 있는 자연스러운 이미지를 생성하라."],
360
+ ["down/모델.jpg", "down/와인잔.png", None, "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 와인잔)을 여성모델이 홍보할 와인잔을 돋보이게 들고 있는 자연스러운 모습으로 이미지를 생성하라."],
361
+ ["down/모델.jpg", "down/카페전경.png", None, "(#1의 여성모델)이 (#2 이미지의 배경)을 주요 피사체는 그대로 유지하여 이미지의 분위기가 자연스럽게 어우러지도록 생성하라."],
362
+ ["down/상어레고모형.jpg", None, None, "(#1의 레고모형)에서 청색상어레고를 제거한 후, 그 자리를 주변 배경과 자연스럽게 어우러지도록 채워주세요. 단, 이미지의 다른 부분의 주요 요소는 동일하게 유지해 해야한다."]
363
+ ]
364
+
365
+ gr.Examples(
366
+ examples=examples,
367
+ inputs=[image1_input, image2_input, image3_input, prompt_input],
368
+ elem_id="examples-grid"
369
+ )
370
+
371
  # 오른쪽 출력 영역
372
  with gr.Column(scale=1):
373
  with gr.Row():
 
383
 
384
  # 선택 옵션 버튼 클릭 시 프롬프트 입력란 업데이트 (한국어 문구)
385
  image_change_btn1.click(
386
+ fn=lambda: "(#1의 여성) 살짝 뒤로 돌아보는 모습으로 최대한 이전 seed를 유지한테 자연스럽게 변경하라.",
387
  inputs=[],
388
  outputs=prompt_input
389
  )
 
403
  outputs=prompt_input
404
  )
405
  clothes_change_btn1.click(
406
+ fn=lambda: "(#1의 여성모겔)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)와 (#3의 청바지)를 직접 모델이 착용한것 처럼 자연스럽게 이미지를 생성하라.",
407
  inputs=[],
408
  outputs=prompt_input
409
  )
410
  clothes_change_btn2.click(
411
+ fn=lambda: "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 선글라스)를 직접 모델이 착용한 것처럼 (#3의 장소)에서 의자에 앉아 있는 자연스러운 이미지를 생성하라.",
412
  inputs=[],
413
  outputs=prompt_input
414
  )
415
  holding_product_btn.click(
416
+ fn=lambda: "(#1의 여성모델)이 신체 비율과 포즈는 유치한 체 (#2의 와인잔) 여성모델이 홍보할 와인잔을 돋보이게 들고 있는 자연스러운 모습으로 이미지를 생성하라.",
417
  inputs=[],
418
  outputs=prompt_input
419
  )
 
433
  inputs=[image1_input, image2_input, image3_input, prompt_input],
434
  outputs=[output_image1, output_image2, output_image3, output_image4, output_text, prompt_display],
435
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
 
437
  if __name__ == "__main__":
438
+ demo.launch(share=True)