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", "") | |
| os.environ["REPLICATE_API_TOKEN"] = REPLICATE_API_TOKEN | |
| # ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ๋ชจ๋ธ ID๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ์จ๊น ์ฒ๋ฆฌ | |
| BACKGROUND_REMOVER_MODEL = os.getenv("BACKGROUND_REMOVER_MODEL", "") | |
| # ์ธ์ ๋ณ ์ด๋ฏธ์ง ์ ์ฅ์ฉ ๋์ ๋๋ฆฌ | |
| 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 get_korean_timestamp(): | |
| """ํ๊ตญ ์๊ฐ ํ์์คํฌํ ์์ฑ""" | |
| korea_time = datetime.utcnow() + timedelta(hours=9) | |
| return korea_time.strftime('%Y%m%d_%H%M%S') | |
| def remove_background(image, session_id): | |
| """๋ฐฐ๊ฒฝ ์ ๊ฑฐ ๊ธฐ๋ฅ - Replicate API ์ฌ์ฉ""" | |
| logger.info(f"์ธ์ {session_id}: ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์์") | |
| # ๋ชจ๋ธ ID๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ | |
| if not BACKGROUND_REMOVER_MODEL: | |
| logger.error("๋ฐฐ๊ฒฝ ์ ๊ฑฐ ๋ชจ๋ธ ID๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.") | |
| return image | |
| # ์์ ํ์ผ๋ก ์ด๋ฏธ์ง ์ ์ฅ | |
| 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๋ก ๋ฐฐ๊ฒฝ ์ ๊ฑฐ ์์ฒญ - ํ๊ฒฝ ๋ณ์์์ ๋ชจ๋ธ ID ๊ฐ์ ธ์ค๊ธฐ | |
| output = replicate.run( | |
| BACKGROUND_REMOVER_MODEL, # ํ๊ฒฝ ๋ณ์๋ก ๋ณ๊ฒฝ | |
| 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 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() |