Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
import numpy as np | |
import random | |
import spaces | |
import torch | |
import time | |
import os | |
from diffusers import DiffusionPipeline | |
from custom_pipeline import FLUXPipelineWithIntermediateOutputs | |
from transformers import pipeline | |
# λ²μ λͺ¨λΈ λ‘λ | |
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-ko-en") | |
# Constants | |
MAX_SEED = np.iinfo(np.int32).max | |
MAX_IMAGE_SIZE = 2048 | |
DEFAULT_WIDTH = 1024 | |
DEFAULT_HEIGHT = 1024 | |
DEFAULT_INFERENCE_STEPS = 1 | |
# Device and model setup | |
dtype = torch.float16 | |
pipe = FLUXPipelineWithIntermediateOutputs.from_pretrained( | |
"black-forest-labs/FLUX.1-schnell", torch_dtype=dtype | |
).to("cuda") | |
torch.cuda.empty_cache() | |
# νκΈ λ©λ΄ μ΄λ¦ dictionary | |
korean_labels = { | |
"Generated Image": "μμ±λ μ΄λ―Έμ§", | |
"Prompt": "ν둬ννΈ", | |
"Enhance Image": "μ΄λ―Έμ§ ν₯μ", | |
"Advanced Options": "κ³ κΈ μ΅μ ", | |
"Seed": "μλ", | |
"Randomize Seed": "μλ 무μμν", | |
"Width": "λλΉ", | |
"Height": "λμ΄", | |
"Inference Steps": "μΆλ‘ λ¨κ³", | |
"Inspiration Gallery": "μκ° κ°€λ¬λ¦¬" | |
} | |
def translate_if_korean(text): | |
if any('\u3131' <= char <= '\u3163' or '\uac00' <= char <= '\ud7a3' for char in text): | |
return translator(text)[0]['translation_text'] | |
return text | |
# Inference function | |
def generate_image(prompt, seed=42, width=DEFAULT_WIDTH, height=DEFAULT_HEIGHT, randomize_seed=False, num_inference_steps=DEFAULT_INFERENCE_STEPS): | |
prompt = translate_if_korean(prompt) | |
if randomize_seed: | |
seed = random.randint(0, MAX_SEED) | |
generator = torch.Generator().manual_seed(seed) | |
start_time = time.time() | |
# Only generate the last image in the sequence | |
for img in pipe.generate_images( | |
prompt=prompt, | |
guidance_scale=0, | |
num_inference_steps=num_inference_steps, | |
width=width, | |
height=height, | |
generator=generator | |
): | |
latency = f"μ²λ¦¬ μκ°: {(time.time()-start_time):.2f} μ΄" | |
yield img, seed, latency | |
# Example prompts | |
examples = [ | |
"λ¬μμ μμμ λΆννλ μμ μ°μ£Ό λΉνμ¬", | |
"μλ νμΈμ μΈμμ΄λΌκ³ μ°μΈ νμ§νμ λ€κ³ μλ κ³ μμ΄", | |
"λΉλ μλμ²Όμ μ λλ©μ΄μ μΌλ¬μ€νΈλ μ΄μ ", | |
"νλμ λλ μλμ°¨μ λ€μ¨ λΆλΉμ΄ μλ λ―Έλμ μΈ λμ νκ²½", | |
"κΈ΄ κ°μ μ¨μ΄λΈ 머리λ₯Ό μ¬λ € λ¬Άκ³ μκ²½μ μ΄ μ μ μ¬μ±μ μ¬μ§. κ·Έλ λ ν° νΌλΆμ λκ³Ό μ μ μ κ°μ‘°ν μμν νμ₯μ νμ΅λλ€. κ·Έλ λ κ²μμ μμλ₯Ό μ μμ΅λλ€. λ°°κ²½μ λμ 건물 μΈκ΄μΌλ‘ 보μ΄λ©°, νλΉμ΄ κ·Έλ μ μΌκ΅΄μ λ°λ»ν λΉμ λΉμΆκ³ μμ΅λλ€.", | |
"μ€ν°λΈ μ‘μ€λ₯Ό μ€νμμ¦ μν μΊλ¦ν°λ‘ μμν΄λ³΄μΈμ" | |
] | |
css = """ | |
footer { | |
visibility: hidden; | |
} | |
""" | |
# --- Gradio UI --- | |
with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo: | |
with gr.Column(elem_id="app-container"): | |
with gr.Row(): | |
with gr.Column(scale=3): | |
result = gr.Image(label=korean_labels["Generated Image"], show_label=False, interactive=False) | |
with gr.Column(scale=1): | |
prompt = gr.Text( | |
label=korean_labels["Prompt"], | |
placeholder="μμ±νκ³ μΆμ μ΄λ―Έμ§λ₯Ό μ€λͺ νμΈμ...", | |
lines=3, | |
show_label=False, | |
container=False, | |
) | |
enhanceBtn = gr.Button(f"π {korean_labels['Enhance Image']}") | |
with gr.Column(korean_labels["Advanced Options"]): | |
with gr.Row(): | |
latency = gr.Text(show_label=False) | |
with gr.Row(): | |
seed = gr.Number(label=korean_labels["Seed"], value=42, precision=0) | |
randomize_seed = gr.Checkbox(label=korean_labels["Randomize Seed"], value=False) | |
with gr.Row(): | |
width = gr.Slider(label=korean_labels["Width"], minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=DEFAULT_WIDTH) | |
height = gr.Slider(label=korean_labels["Height"], minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=DEFAULT_HEIGHT) | |
num_inference_steps = gr.Slider(label=korean_labels["Inference Steps"], minimum=1, maximum=4, step=1, value=DEFAULT_INFERENCE_STEPS) | |
with gr.Row(): | |
gr.Markdown(f"### π {korean_labels['Inspiration Gallery']}") | |
with gr.Row(): | |
gr.Examples( | |
examples=examples, | |
fn=generate_image, | |
inputs=[prompt], | |
outputs=[result, seed], | |
cache_examples="lazy" | |
) | |
# Event handling - Trigger image generation on button click or input change | |
enhanceBtn.click( | |
fn=generate_image, | |
inputs=[prompt, seed, width, height], | |
outputs=[result, seed, latency], | |
show_progress="hidden", | |
show_api=False, | |
queue=False | |
) | |
gr.on( | |
triggers=[prompt.input, width.input, height.input, num_inference_steps.input], | |
fn=generate_image, | |
inputs=[prompt, seed, width, height, randomize_seed, num_inference_steps], | |
outputs=[result, seed, latency], | |
show_progress="hidden", | |
show_api=False, | |
trigger_mode="always_last", | |
queue=False | |
) | |
# Launch the app | |
demo.launch() |