File size: 9,290 Bytes
40462a0
7aafe2f
 
 
 
 
c82ffd4
21e68e9
7ed38a8
40462a0
7aafe2f
 
 
 
5fd4d69
 
40462a0
7ed38a8
 
 
7aafe2f
 
21e68e9
35f3b0f
4dffcc7
35f3b0f
4dffcc7
7aafe2f
 
7ed38a8
 
 
 
 
 
 
7aafe2f
7d90483
34a0f74
7ed38a8
 
 
7aafe2f
 
c82ffd4
7aafe2f
b7bdba8
7ed38a8
7aafe2f
 
34a0f74
7aafe2f
b7bdba8
d588de2
7aafe2f
 
 
64e25f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e966fc
dbc482d
 
34a0f74
 
81a5368
 
 
 
 
d588de2
81a5368
 
 
 
 
d22e6d3
81a5368
 
34a0f74
 
 
a10076f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import gradio as gr
import numpy as np
import random
import spaces
import torch
import time
from diffusers import DiffusionPipeline, AutoencoderTiny
from custom_pipeline import FluxWithCFGPipeline
from transformers import pipeline

# Constants
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 2048
DEFAULT_WIDTH = 1024
DEFAULT_HEIGHT = 768
DEFAULT_INFERENCE_STEPS = 4

# Initialize translator
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-ko-en")

# Device and model setup
dtype = torch.float16
pipe = FluxWithCFGPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-schnell", torch_dtype=dtype
)
pipe.vae = AutoencoderTiny.from_pretrained("madebyollin/taef1", torch_dtype=dtype)
pipe.to("cuda")
torch.cuda.empty_cache()

# Translation function
def translate_to_english(text):
    if any(ord('가') <= ord(char) <= ord('힣') for char in text):
        translated = translator(text)[0]['translation_text']
        return translated
    return text

# Inference function
@spaces.GPU(duration=25)
def generate_image(prompt, seed=24, width=DEFAULT_WIDTH, height=DEFAULT_HEIGHT, randomize_seed=False, progress=gr.Progress(track_tqdm=True)):
    # Translate prompt if Korean
    english_prompt = translate_to_english(prompt)
    
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)
    generator = torch.Generator().manual_seed(int(float(seed)))

    img = pipe.generate_images( 
            prompt=english_prompt,
            width=width,
            height=height,
            num_inference_steps=DEFAULT_INFERENCE_STEPS,
            generator=generator
        )
    return img, seed

# Example prompts
examples = [
"해변에서 밀짚모자를 쓰고 플로럴 드레스를 입은 여성이 'I Love'라고 적힌 작은 카드를 모래에 두고 있습니다. 황금빛 석양이 여유로운 해변 분위기를 자아냅니다.",    
"화려한 금발의 여성이 고급 호텔 스위트룸에서 포즈를 취하고 있으며, 스파클이 빛나는 황금빛 드레스를 입고 'I Love'라고 적힌 흰색 카드를 들고 있습니다. 부드러운 조명이 고급스러운 분위기를 자아냅니다.",
"근육질의 남성이 최신식 체육관에서 셔츠를 벗고 포즈를 취하고 있으며, 한 손에 단백질 쉐이크를 들고 있고 다른 손에는 'I Love '라고 적힌 카드가 있습니다. 밝고 깨끗한 조명이 그의 피지컬을 강조합니다.",
"자연스러운 해변 웨이브와 태닝된 피부를 가진 여성 여행 블로거가 열대 해변에서 황혼을 바라보며 앉아 있습니다. 흐르는 흰 드레스를 입고 있으며, 'I Love '라고 적힌 오래된 엽서를 들고 있습니다. 황금빛 조명이 따뜻한 분위기를 연출합니다.",
"도시 거리에서 완벽하게 스타일링된 머리와 수염을 가진 트렌디한 남성 패션 인플루언서가 세련된 정장을 입고 있으며, 'I Love '라고 적힌 검정색 명함을 들고 있습니다. 도심의 불빛이 세련된 분위기를 더합니다.",
"화장대에 앉아 자연스러운 메이크업을 한 젊은 뷰티 크리에이터가 파스텔 핑크색 가운을 입고 있으며, 'I Love '라고 적힌 메이크업 팔레트를 들고 있습니다. 부드러운 조명이 그녀의 피부를 빛나게 합니다.",
"네온사인으로 가득한 도시 야경 앞에 서 있는 스타일리시한 여성이 검은 가죽 재킷과 반짝이는 크롭탑을 입고 'I Love '라고 적힌 홀로그램 명함을 들고 있습니다. 사이버펑크 분위기의 화려한 네온 조명이 더해져 있습니다.",
"붉은 장미들 속에서 우아한 버건디 드레스를 입은 여성이 'I Love 라고 적힌 은색 카드를 들고 있습니다. 부드러운 조명이 그녀의 기품 있는 매력을 돋보이게 합니다.",
"고급 레스토랑에서 세련된 수트를 입은 남성이 와인 잔을 들고 있으며, 'I Love '라고 적힌 흰색 명함을 손에 들고 있습니다. 은은한 조명이 로맨틱한 분위기를 만듭니다.",
"빈티지 스타일의 서재 앞에 서 있는 여성이 체크무늬 코트를 입고 있으며, 'I Love '라고 적힌 옛 책을 들고 있습니다. 따뜻한 색감의 조명이 서재의 아늑한 느낌을 더합니다.",
"비 오는 밤의 어두운 골목길에서 회색 트렌치코트를 입은 남성이 'I Love '라고 적힌 검정색 카드를 들고 서 있습니다. 빗방울이 반사되어 긴장감 있는 분위기를 만듭니다.",
"고급 오피스 건물의 창가에 서 있는 남성이 슬림한 검정색 카드에 'I Love '라고 적힌 명함을 들고 있으며, 도시의 야경이 세련된 비즈니스 분위기를 연출합니다.",
"햇살이 비치는 화사한 정원에서 레이스 드레스를 입은 여성이 'I Love '라고 적힌 작은 손수건을 들고 있습니다. 부드러운 햇살이 따뜻한 분위기를 만들어줍니다.",
"푸른 호수를 배경으로 캐주얼하게 서 있는 남성이 청바지와 셔츠를 입고 'I Love '라고 적힌 나무판자를 들고 있습니다. 자연의 맑은 날씨가 상쾌함을 더해줍니다.",
"다채로운 조명 아래 화려한 디저트 테이블 앞에 서 있는 여성이 로맨틱한 드레스를 입고 있으며, 'I Love'라고 적힌 작은 케이크를 들고 있습니다. 축제 분위기를 더합니다.",
"바람이 휘날리는 바다 절벽 위에서 자유롭게 서 있는 남성이 흰 셔츠를 입고 있으며, 'I Love '라고 적힌 조약돌을 들고 있습니다. 하늘과 바다가 상쾌한 분위기를 연출합니다.",
"예술 갤러리에서 붉은 립스틱을 바르고 화려한 드레스를 입은 여성이 'I Love '라고 적힌 작은 그림 액자를 들고 있습니다. 조명이 그녀의 예술적 감각을 돋보이게 합니다.",
"가을 숲 속에서 두툼한 코트와 스카프를 두른 남성이 'I Love '라고 적힌 나뭇잎을 들고 있습니다. 차가운 가을의 분위기가 느껴집니다.",
"고풍스러운 서재에 앉아 있는 남성이 빈티지한 양복을 입고 있으며, 'I Love '라고 적힌 낡은 책을 들고 있습니다. 은은한 조명이 고급스러운 느낌을 더해줍니다.",
"별빛 가득한 밤하늘 아래 파란색 드레스를 입고 앉아 있는 여성이 'I Love '라고 적힌 별 모양 소품을 들고 있습니다. 몽환적이고 신비로운 분위기를 자아냅니다.",    
]    

css = """
footer {visibility: hidden;}
.container {max-width: 1200px; margin: auto; padding: 20px;}
.generate-box, .image-box {
    background-color: #f0f0f0;
    border-radius: 10px;
    padding: 20px;
    margin-bottom: 20px;
    height: 600px;  /* 고정된 높이 설정 */
    display: flex;
    flex-direction: column;
}
.image-box img {
    max-height: 100%;
    width: 100%;
    object-fit: contain;
}
.generate-box .row {display: flex; align-items: center; margin-bottom: 10px;}
.generate-box .row > * {margin-right: 10px;}
.generate-box .row > *:last-child {margin-right: 0;}
.advanced-options {background-color: #e0e0e0; border-radius: 10px; padding: 20px; margin-top: 20px;}
.examples-gallery {margin-top: 30px;}
"""

# --- Gradio UI ---
with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
    with gr.Column(elem_id="container"):
        gr.Markdown("# Open FLUX 1.1 Pro")
        gr.Markdown("Flux Schnell-based with no commercial restrictions, 4-step fast image generation with quality enhancement, and improved memory efficiency (VAE).")        

        with gr.Row():
            with gr.Column(scale=2):
                result = gr.Image(label="Generated Image", show_label=False, interactive=False, elem_classes="image-box")
            with gr.Column(scale=1):
                with gr.Column(elem_classes="generate-box"):
                    prompt = gr.Text(
                        label="Prompt (한글 입력 가능)",
                        placeholder="섹시한 여자와 남자, 속옷, 전신, 일요일",
                        lines=3,
                    )
                    generateBtn = gr.Button("Generate Image", variant="primary")

                    with gr.Column(elem_classes="advanced-options"):
                        with gr.Row():
                            seed = gr.Number(label="Seed", value=42)
                            randomize_seed = gr.Checkbox(label="Randomize Seed", value=True)
                        with gr.Row():
                            width = gr.Slider(label="Width", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=DEFAULT_WIDTH)
                            height = gr.Slider(label="Height", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=DEFAULT_HEIGHT)

        with gr.Column(elem_classes="examples-gallery"):
            gr.Markdown("### Gallery")
            gr.Examples(
                examples=examples,
                fn=generate_image,
                inputs=[prompt],
                outputs=[result, seed],
                cache_examples="lazy" 
            )

    generateBtn.click(
        fn=generate_image,
        inputs=[prompt, seed, width, height, randomize_seed],
        outputs=[result, seed],
        show_progress="full",
        api_name="GenerateImage",
    )

# Launch the app
demo.launch()