Spaces:
Running
Running
import cv2 | |
import numpy as np | |
from PIL import Image, ImageEnhance, ImageFilter | |
import gradio as gr | |
from io import BytesIO | |
import tempfile | |
import logging | |
import replicate | |
import requests | |
import os | |
from dotenv import load_dotenv | |
import base64 | |
from datetime import datetime, timedelta | |
import uuid | |
import time | |
# .env ํ์ผ์์ ํ๊ฒฝ ๋ณ์ ๋ก๋ (์์ผ๋ฉด ๋ฌด์) | |
load_dotenv() | |
# ๋ก๊น ์ค์ - INFO ๋ ๋ฒจ๋ก ๋ณ๊ฒฝ | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
# Replicate API ํ ํฐ ์ค์ | |
REPLICATE_API_TOKEN = os.getenv("REPLICATE_API_TOKEN", "์ฌ๊ธฐ์_API_ํ ํฐ์_์ ๋ ฅํ์ธ์") | |
os.environ["REPLICATE_API_TOKEN"] = REPLICATE_API_TOKEN | |
# ์ธ์ ๋ณ ์ด๋ฏธ์ง ์ ์ฅ์ฉ ๋์ ๋๋ฆฌ | |
session_images = {} | |
def adjust_brightness(image, value): | |
"""์ด๋ฏธ์ง ๋ฐ๊ธฐ ์กฐ์ """ | |
value = float(value - 1) * 100 # 0-2 ๋ฒ์๋ฅผ -100์์ +100์ผ๋ก ๋ณํ | |
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) | |
h, s, v = cv2.split(hsv) | |
v = cv2.add(v, value) | |
v = np.clip(v, 0, 255) | |
final_hsv = cv2.merge((h, s, v)) | |
return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) | |
def adjust_contrast(image, value): | |
"""์ด๋ฏธ์ง ๋๋น ์กฐ์ """ | |
value = float(value) | |
return np.clip(image * value, 0, 255).astype(np.uint8) | |
def adjust_saturation(image, value): | |
"""์ด๋ฏธ์ง ์ฑ๋ ์กฐ์ """ | |
value = float(value - 1) * 100 # 0-2 ๋ฒ์๋ฅผ -100์์ +100์ผ๋ก ๋ณํ | |
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) | |
h, s, v = cv2.split(hsv) | |
s = cv2.add(s, value) | |
s = np.clip(s, 0, 255) | |
final_hsv = cv2.merge((h, s, v)) | |
return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) | |
def adjust_temperature(image, value): | |
"""์ด๋ฏธ์ง ์์จ๋ ์กฐ์ (์์ ๋ฐธ๋ฐ์ค)""" | |
value = float(value) * 30 # ํจ๊ณผ ์ค์ผ์ผ ์กฐ์ | |
b, g, r = cv2.split(image) | |
if value > 0: # ๋ฐ๋ปํ๊ฒ | |
r = cv2.add(r, value) | |
b = cv2.subtract(b, value) | |
else: # ์ฐจ๊ฐ๊ฒ | |
r = cv2.add(r, value) | |
b = cv2.subtract(b, value) | |
r = np.clip(r, 0, 255) | |
b = np.clip(b, 0, 255) | |
return cv2.merge([b, g, r]) | |
def remove_background(image, session_id): | |
"""๋ฐฐ๊ฒฝ ์ ๊ฑฐ ๊ธฐ๋ฅ - Replicate API ์ฌ์ฉ""" | |
logger.info(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์์") | |
# ์์ ํ์ผ๋ก ์ด๋ฏธ์ง ์ ์ฅ | |
temp_file = tempfile.NamedTemporaryFile(suffix='.png', delete=False) | |
temp_file_path = temp_file.name | |
temp_file.close() | |
# PIL ์ด๋ฏธ์ง๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅ | |
image.save(temp_file_path, format="PNG") | |
try: | |
# Replicate API๋ก ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์์ฒญ | |
output = replicate.run( | |
"851-labs/background-remover:a029dff38972b5fda4ec5d75d7d1cd25aeff621d2cf4946a41055d7db66b80bc", | |
input={ | |
"image": open(temp_file_path, "rb"), | |
"format": "png", | |
"reverse": False, | |
"threshold": 0, | |
"background_type": "rgba" | |
} | |
) | |
# URL์์ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ | |
response = requests.get(output) | |
if response.status_code == 200: | |
# ๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ PIL ์ด๋ฏธ์ง๋ก ๋ณํ | |
img = Image.open(BytesIO(response.content)) | |
# PNG ํ์ผ๋ก ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง ์ ์ฅ (๋ง์คํฌ์ฉ) | |
timestamp = get_korean_timestamp() | |
bg_removed_path = tempfile.gettempdir() + f"/bg_removed_{session_id}_{timestamp}.png" | |
img.save(bg_removed_path, format="PNG") | |
logger.info(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์๋ฃ: {bg_removed_path}") | |
# ์ธ์ ์ ๋ณด ์ ์ฅ | |
session_images[session_id]['bg_removed_image'] = img | |
session_images[session_id]['bg_removed_path'] = bg_removed_path | |
return img | |
else: | |
logger.error(f"์ธ์ {session_id}: API ์๋ต ์ค๋ฅ: {response.status_code}") | |
return image | |
except Exception as e: | |
logger.error(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์ค๋ฅ: {e}") | |
return image | |
finally: | |
# ์์ ํ์ผ ์ญ์ | |
if os.path.exists(temp_file_path): | |
os.unlink(temp_file_path) | |
def get_korean_timestamp(): | |
"""ํ๊ตญ ์๊ฐ ํ์์คํฌํ ์์ฑ""" | |
korea_time = datetime.utcnow() + timedelta(hours=9) | |
return korea_time.strftime('%Y%m%d_%H%M%S') | |
def handle_upload(image, session_id=None): | |
"""์ด๋ฏธ์ง ์ ๋ก๋ ์ฒ๋ฆฌ ๋ฐ ๋ฐฐ๊ฒฝ ์ ๊ฑฐ""" | |
if image is None: | |
return None | |
# ์ธ์ ID ์์ฑ ๋๋ ํ์ธ | |
if session_id is None or session_id not in session_images: | |
session_id = str(uuid.uuid4()) | |
session_images[session_id] = {} | |
# ์๋ณธ ์ด๋ฏธ์ง ์ ์ฅ | |
original_image = Image.fromarray(np.array(image)) | |
session_images[session_id]['original_image'] = original_image | |
# ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์คํ | |
bg_removed_image = remove_background(original_image, session_id) | |
# ํํฐ ์ ์ฉ ์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ๋ฐํ (ํํฐ ์์ด ์๋ณธ ์ด๋ฏธ์ง) | |
return original_image, session_id | |
def process_image(session_id, temperature, brightness, contrast, saturation, filter_mode): | |
"""๋ชจ๋์ ๋ฐ๋ฅธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ""" | |
if session_id is None or session_id not in session_images: | |
logger.warning(f"์ธ์ ID๊ฐ ์ ํจํ์ง ์์ต๋๋ค: {session_id}") | |
return None | |
original_image = session_images[session_id].get('original_image') | |
bg_removed_image = session_images[session_id].get('bg_removed_image') | |
if original_image is None: | |
return None | |
if bg_removed_image is None: | |
logger.warning(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค. ์ ์ฒด ํํฐ ๋ชจ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.") | |
# ์ ์ฒด ํํฐ๋ก ์ฒ๋ฆฌ | |
cv_image = cv2.cvtColor(np.array(original_image), cv2.COLOR_RGB2BGR) | |
cv_image = adjust_temperature(cv_image, temperature) | |
cv_image = adjust_brightness(cv_image, brightness) | |
cv_image = adjust_contrast(cv_image, contrast) | |
cv_image = adjust_saturation(cv_image, saturation) | |
return Image.fromarray(cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)) | |
# ํํฐ ๋ชจ๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ | |
if filter_mode == "์ ์ฒด ํํฐ": | |
# ์๋ณธ ์ด๋ฏธ์ง์ ํํฐ ์ ์ฉ | |
cv_image = cv2.cvtColor(np.array(original_image), cv2.COLOR_RGB2BGR) | |
cv_image = adjust_temperature(cv_image, temperature) | |
cv_image = adjust_brightness(cv_image, brightness) | |
cv_image = adjust_contrast(cv_image, contrast) | |
cv_image = adjust_saturation(cv_image, saturation) | |
return Image.fromarray(cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)) | |
elif filter_mode == "๋ฐฐ๊ฒฝ๋ง ํํฐ ์ ์ฉ": | |
# ์๋ณธ์ ํํฐ ์ ์ฉ ํ ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง ํฉ์ฑ | |
cv_image = cv2.cvtColor(np.array(original_image), cv2.COLOR_RGB2BGR) | |
cv_image = adjust_temperature(cv_image, temperature) | |
cv_image = adjust_brightness(cv_image, brightness) | |
cv_image = adjust_contrast(cv_image, contrast) | |
cv_image = adjust_saturation(cv_image, saturation) | |
filtered_original = Image.fromarray(cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)) | |
# ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ RGBA ๋ชจ๋์ธ์ง ํ์ธ | |
if bg_removed_image.mode != 'RGBA': | |
logger.warning(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ RGBA ๋ชจ๋๊ฐ ์๋๋๋ค.") | |
return filtered_original | |
# ํํฐ๋ง๋ ์ด๋ฏธ์ง๋ฅผ RGBA๋ก ๋ณํ (์ํ ์ฑ๋ ์ถ๊ฐ) | |
if filtered_original.mode != 'RGBA': | |
filtered_original = filtered_original.convert('RGBA') | |
# ํฉ์ฑ (๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๋ฅผ ํํฐ๋ง๋ ์๋ณธ ์์ ๋ฐฐ์น) | |
result = Image.new('RGBA', filtered_original.size, (0, 0, 0, 0)) | |
result.paste(filtered_original, (0, 0), None) | |
result.paste(bg_removed_image, (0, 0), bg_removed_image) | |
return result.convert('RGB') | |
elif filter_mode == "์ํ๋ง ํํฐ ์ ์ฉ": | |
# ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๋ง ํํฐ ์ ์ฉ | |
cv_image = cv2.cvtColor(np.array(bg_removed_image), cv2.COLOR_RGBA2BGRA) | |
# ์ํ ์ฑ๋ ๋ถ๋ฆฌ | |
b, g, r, a = cv2.split(cv_image) | |
# BGR ์ด๋ฏธ์ง๋ก ํฉ์น๊ธฐ | |
bgr = cv2.merge([b, g, r]) | |
# ํํฐ ์ ์ฉ | |
bgr = adjust_temperature(bgr, temperature) | |
bgr = adjust_brightness(bgr, brightness) | |
bgr = adjust_contrast(bgr, contrast) | |
bgr = adjust_saturation(bgr, saturation) | |
# ๋ค์ ์ํ ์ฑ๋๊ณผ ํฉ์น๊ธฐ | |
filtered_bgra = cv2.merge([bgr[:,:,0], bgr[:,:,1], bgr[:,:,2], a]) | |
filtered_bg_removed = Image.fromarray(cv2.cvtColor(filtered_bgra, cv2.COLOR_BGRA2RGBA)) | |
# ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ RGBA ๋ชจ๋์ธ์ง ํ์ธ | |
if bg_removed_image.mode != 'RGBA': | |
logger.warning(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ RGBA ๋ชจ๋๊ฐ ์๋๋๋ค.") | |
# ํํฐ๋ง ์ ์ฉํ๊ณ ๋ฐํ | |
return filtered_bg_removed | |
# ์๋ณธ ์ด๋ฏธ์ง๋ฅผ RGBA๋ก ๋ณํ | |
original_rgba = original_image.convert('RGBA') | |
# ์๋ณธ ์ด๋ฏธ์ง์ ํํฐ๋ง๋ ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑ | |
result = Image.new('RGBA', original_rgba.size, (0, 0, 0, 0)) | |
result.paste(original_rgba, (0, 0), None) | |
result.paste(filtered_bg_removed, (0, 0), bg_removed_image) | |
return result.convert('RGB') | |
# ๊ธฐ๋ณธ๊ฐ์ ์ ์ฒด ํํฐ | |
cv_image = cv2.cvtColor(np.array(original_image), cv2.COLOR_RGB2BGR) | |
cv_image = adjust_temperature(cv_image, temperature) | |
cv_image = adjust_brightness(cv_image, brightness) | |
cv_image = adjust_contrast(cv_image, contrast) | |
cv_image = adjust_saturation(cv_image, saturation) | |
return Image.fromarray(cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)) | |
def download_image(image, session_id, format_type): | |
"""์ด๋ฏธ์ง๋ฅผ ์ง์ ๋ ํ์์ผ๋ก ์ ์ฅํ๊ณ ๊ฒฝ๋ก ๋ฐํ""" | |
if image is None or session_id is None or session_id not in session_images: | |
return None | |
timestamp = get_korean_timestamp() | |
# ์๋ณธ ํ์ผ๋ช ๊ฐ์ ธ์ค๊ธฐ (์๋ ๊ฒฝ์ฐ) | |
original_name = "์ด๋ฏธ์ง" | |
if 'original_name' in session_images[session_id]: | |
original_name = session_images[session_id]['original_name'] | |
if format_type == "JPG": | |
file_name = f"[๋์ฅAI]๋์ฅํํฐ_{original_name}_{timestamp}.jpg" | |
format_str = "JPEG" | |
else: # PNG | |
file_name = f"[๋์ฅAI]๋์ฅํํฐ_{original_name}_{timestamp}.png" | |
format_str = "PNG" | |
# ํ์ผ ์ ์ฅ | |
temp_file_path = tempfile.gettempdir() + "/" + file_name | |
image.save(temp_file_path, format=format_str) | |
return temp_file_path | |
def reset_filters(session_id): | |
"""ํํฐ ์ค์ ์ด๊ธฐํ""" | |
if session_id is None or session_id not in session_images: | |
return None, 0.0, 1.0, 1.0, 1.0 | |
original_image = session_images[session_id].get('original_image') | |
return original_image, 0.0, 1.0, 1.0, 1.0 | |
def create_interface(): | |
css = """ | |
footer { | |
visibility: hidden; | |
} | |
.download-button, .download-output, .reset-button { | |
width: 100%; | |
} | |
.download-container { | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
width: 100%; | |
} | |
#gradio-app { | |
margin: 0 !important; | |
text-align: left !important; | |
padding: 0 !important; | |
} | |
.gradio-container { | |
max-width: 100% !important; | |
margin: 0 !important; | |
padding: 0 !important; | |
} | |
.download-button, .reset-button { | |
background-color: black !important; | |
color: white !important; | |
border: none !important; | |
padding: 10px !important; | |
font-size: 16px !important; | |
border-radius: 4px !important; | |
} | |
.reset-button { | |
background-color: #666 !important; | |
} | |
.filter-mode { | |
margin-top: 20px; | |
margin-bottom: 20px; | |
} | |
.input-panel { | |
padding: 20px; | |
} | |
.output-panel { | |
padding: 20px; | |
height: 100%; | |
display: flex; | |
flex-direction: column; | |
} | |
.output-image { | |
flex-grow: 1; | |
min-height: 400px; | |
} | |
.filter-section { | |
margin: 15px 0; | |
padding: 15px; | |
border: 1px solid #eee; | |
border-radius: 8px; | |
} | |
.session-id { | |
display: none; | |
} | |
""" | |
with gr.Blocks(theme=gr.themes.Soft( | |
primary_hue=gr.themes.Color( | |
c50="#FFF7ED", | |
c100="#FFEDD5", | |
c200="#FED7AA", | |
c300="#FDBA74", | |
c400="#FB923C", | |
c500="#F97316", | |
c600="#EA580C", | |
c700="#C2410C", | |
c800="#9A3412", | |
c900="#7C2D12", | |
c950="#431407", | |
), | |
secondary_hue="zinc", | |
neutral_hue="zinc", | |
font=("Pretendard", "sans-serif") | |
), css=css) as interface: | |
# ์ธ์ ID (์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์์) | |
session_id = gr.Textbox(visible=False, elem_classes="session-id") | |
with gr.Row(): | |
# ์ผ์ชฝ ์ด: ์ ๋ ฅ ํจ๋ | |
with gr.Column(scale=1, elem_classes="input-panel"): | |
# ์ด๋ฏธ์ง ์ ๋ก๋ | |
input_image = gr.Image(type="pil", label="์ด๋ฏธ์ง ์ ๋ก๋") | |
# ํํฐ ๋ชจ๋ ์ ํ | |
with gr.Group(elem_classes="filter-section"): | |
filter_mode = gr.Radio( | |
["์ ์ฒด ํํฐ", "๋ฐฐ๊ฒฝ๋ง ํํฐ ์ ์ฉ", "์ํ๋ง ํํฐ ์ ์ฉ"], | |
label="ํํฐ ์ ์ฉ ๋ชจ๋", | |
value="์ ์ฒด ํํฐ", | |
elem_classes="filter-mode" | |
) | |
# ์กฐ์ ์ฌ๋ผ์ด๋ ๊ทธ๋ฃน (์ค์ ์ฌ๋ผ์ด๋๋ง ๋จ๊น) | |
with gr.Group(elem_classes="filter-section"): | |
gr.Markdown("### ์ด๋ฏธ์ง ํํฐ ์ค์ ") | |
# ์์จ๋๋ฅผ ๊ฐ์ฅ ์๋ก ๋ฐฐ์น | |
temperature_slider = gr.Slider(-1.0, 1.0, value=0.0, step=0.1, label="์์จ๋ ์กฐ์ ") | |
brightness_slider = gr.Slider(0.0, 2.0, value=1.0, step=0.1, label="๋ฐ๊ธฐ ์กฐ์ ") | |
contrast_slider = gr.Slider(0.5, 1.5, value=1.0, step=0.1, label="๋๋น ์กฐ์ ") | |
saturation_slider = gr.Slider(0.0, 2.0, value=1.0, step=0.1, label="์ฑ๋ ์กฐ์ ") | |
# ๋ฆฌ์ ๋ฒํผ | |
reset_button = gr.Button("ํํฐ ์ด๊ธฐํ", elem_classes="reset-button") | |
# ์ค๋ฅธ์ชฝ ์ด: ์ถ๋ ฅ ํจ๋ | |
with gr.Column(scale=1, elem_classes="output-panel"): | |
# ํํฐ ์ ์ฉ๋ ์ด๋ฏธ์ง ์ถ๋ ฅ | |
filtered_output = gr.Image(type="pil", label="ํํฐ ์ ์ฉ๋ ์ด๋ฏธ์ง", elem_classes="output-image") | |
# ์ด๋ฏธ์ง ์ ์ฅ ์ต์ ๋ฐ ๋ค์ด๋ก๋ | |
with gr.Row(): | |
with gr.Column(scale=1): | |
format_select = gr.Radio( | |
["JPG", "PNG"], | |
label="์ ์ฅ ํ์", | |
value="JPG" | |
) | |
with gr.Column(scale=2): | |
download_button = gr.Button("์ด๋ฏธ์ง ๋ณํํ๊ธฐ", elem_classes="download-button") | |
# ๋ค์ด๋ก๋ ๋งํฌ | |
download_output = gr.File(label="๋ณํ๋ ์ด๋ฏธ์ง ๋ค์ด๋ก๋") | |
# ์ด๋ฏธ์ง ์ ๋ก๋ ์ฒ๋ฆฌ ๋ฐ ์ด๊ธฐ ์ถ๋ ฅ ์ค์ | |
def update_image_and_session(image): | |
if image is not None: | |
# ํ์ผ ์ด๋ฆ ์ ์ฅ (๊ฐ๋ฅํ ๊ฒฝ์ฐ) | |
original_name = "์ด๋ฏธ์ง" | |
if hasattr(image, 'name'): | |
original_name = image.name.split('.')[0] | |
# ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐ ์ธ์ ์์ฑ | |
result_image, new_session_id = handle_upload(image) | |
# ์๋ณธ ํ์ผ๋ช ์ ์ฅ | |
if new_session_id in session_images: | |
session_images[new_session_id]['original_name'] = original_name | |
return result_image, new_session_id | |
return None, None | |
input_image.change( | |
fn=update_image_and_session, | |
inputs=[input_image], | |
outputs=[filtered_output, session_id] | |
) | |
# ํํฐ ์ ์ฉ ํจ์ | |
def apply_filters(session_id, temperature, brightness, contrast, saturation, filter_mode): | |
return process_image(session_id, temperature, brightness, contrast, saturation, filter_mode) | |
# ํํฐ ์ ๋ ฅ ๋ณ๊ฒฝ ์ ์ฒ๋ฆฌ | |
filter_inputs = [ | |
session_id, | |
temperature_slider, | |
brightness_slider, | |
contrast_slider, | |
saturation_slider, | |
filter_mode | |
] | |
# ์ฌ๋ผ์ด๋ ๋ณ๊ฒฝ ์ ์ฒ๋ฆฌ | |
for input_component in [temperature_slider, brightness_slider, contrast_slider, saturation_slider]: | |
input_component.change( | |
fn=apply_filters, | |
inputs=filter_inputs, | |
outputs=filtered_output | |
) | |
# ํํฐ ๋ชจ๋ ๋ณ๊ฒฝ ์ ์ฒ๋ฆฌ | |
filter_mode.change( | |
fn=apply_filters, | |
inputs=filter_inputs, | |
outputs=filtered_output | |
) | |
# ๋ฆฌ์ ๋ฒํผ ๊ธฐ๋ฅ | |
reset_button.click( | |
fn=reset_filters, | |
inputs=[session_id], | |
outputs=[filtered_output, temperature_slider, brightness_slider, contrast_slider, saturation_slider] | |
) | |
# ๋ค์ด๋ก๋ ๋ฒํผ ๊ธฐ๋ฅ | |
download_button.click( | |
fn=download_image, | |
inputs=[filtered_output, session_id, format_select], | |
outputs=download_output | |
) | |
# ์ธ์ ์ ๋ฆฌ ํ์ด๋จธ (30๋ถ ์ด์ ๋ ์ธ์ ์ ๊ฑฐ) | |
def cleanup_sessions(): | |
current_time = time.time() | |
to_remove = [] | |
for sess_id in session_images: | |
if 'created_at' in session_images[sess_id]: | |
if current_time - session_images[sess_id]['created_at'] > 1800: # 30๋ถ | |
to_remove.append(sess_id) | |
for sess_id in to_remove: | |
# ์์ ํ์ผ ์ ๊ฑฐ | |
if 'bg_removed_path' in session_images[sess_id]: | |
path = session_images[sess_id]['bg_removed_path'] | |
if os.path.exists(path): | |
os.unlink(path) | |
# ์ธ์ ์ ๋ณด ์ ๊ฑฐ | |
del session_images[sess_id] | |
# 10๋ถ๋ง๋ค ์คํ | |
gr.set_interval(cleanup_sessions, 600) | |
# ์ธ์ ์ ๋ฆฌ ์์ | |
interface.load(cleanup_sessions) | |
return interface | |
# ์ธํฐํ์ด์ค ์์ฑ ๋ฐ ์คํ | |
if __name__ == "__main__": | |
logger.info("์ ํ๋ฆฌ์ผ์ด์ ์์") | |
interface = create_interface() | |
interface.queue() | |
interface.launch() |