Spaces:
Build error
Build error
| 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 | |
| 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() |