|
import gradio as gr |
|
import requests |
|
import base64 |
|
from PIL import Image |
|
from io import BytesIO |
|
from dotenv import load_dotenv |
|
import os |
|
import deepl |
|
|
|
load_dotenv() |
|
ENDPOINT_URL = "https://api.runpod.ai/v2/qkqui1t394hjws/runsync" |
|
INFERENCE_API_KEY = os.getenv("INFERENCE_API_KEY") |
|
TRANSLATE_API_KEY = os.getenv("TRANSLATE_API_KEY") |
|
|
|
def encode_image_to_base64(image): |
|
buffered = BytesIO() |
|
image.save(buffered, format="JPEG") |
|
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") |
|
return img_str |
|
|
|
|
|
def translate_en_to_ko(text): |
|
translator = deepl.Translator(TRANSLATE_API_KEY) |
|
try: |
|
result = translator.translate_text(text, target_lang="KO") |
|
return result.text |
|
except deepl.DeepLException as e: |
|
return f"λ²μ μ€ μ€λ₯ λ°μ: {str(e)}" |
|
|
|
|
|
def critic_image(image, language, category): |
|
img_base64 = encode_image_to_base64(image) |
|
payload = { |
|
"input": { |
|
"max_new_tokens": 512, |
|
"category": category, |
|
"image": img_base64 |
|
} |
|
} |
|
|
|
headers = { |
|
"Authorization": INFERENCE_API_KEY, |
|
"Content-Type": "application/json" |
|
} |
|
|
|
|
|
response = requests.post(ENDPOINT_URL, json=payload, headers=headers) |
|
result = response.json() |
|
|
|
analysis_result = result['output']['result'].strip() |
|
|
|
if language == "KO": |
|
return translate_en_to_ko(analysis_result) |
|
else: |
|
return analysis_result |
|
|
|
|
|
categories = [ |
|
'General Visual Analysis', 'Form and Shape', 'Symbolism and Iconography', |
|
'Composition', 'Color Palette', 'Light and Shadow', 'Texture', |
|
'Movement and Gesture', 'Line Quality', 'Perspective', 'Scale and Proportion' |
|
] |
|
|
|
|
|
demo = gr.Interface( |
|
fn=critic_image, |
|
inputs=[ |
|
gr.Image(type="pil"), |
|
gr.Radio(choices=["EN", "KO"], label="Select Language", value="EN"), |
|
gr.Dropdown(choices=categories, label="Select Category", value="General Visual Analysis") |
|
], |
|
outputs="text", |
|
title="Gemmarte", |
|
description="Upload an image and get a visual analysis in text form from the Gemmarte model." |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |