Spaces:
Running
on
Zero
Running
on
Zero
| import os | |
| import gradio as gr | |
| import torch | |
| import numpy as np | |
| import random | |
| from diffusers import StableDiffusion3Pipeline, SD3Transformer2DModel, FlowMatchEulerDiscreteScheduler | |
| import spaces | |
| from PIL import Image | |
| import requests | |
| from translatepy import Translator | |
| os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1" | |
| translator = Translator() | |
| HF_TOKEN = os.environ.get("HF_TOKEN", None) | |
| # Constants | |
| model = "stabilityai/stable-diffusion-3-medium" | |
| MAX_SEED = np.iinfo(np.int32).max | |
| CSS = """ | |
| .gradio-container { | |
| max-width: 690px !important; | |
| } | |
| footer { | |
| visibility: hidden; | |
| } | |
| """ | |
| JS = """function () { | |
| gradioURL = window.location.href | |
| if (!gradioURL.endsWith('?__theme=dark')) { | |
| window.location.replace(gradioURL + '?__theme=dark'); | |
| } | |
| }""" | |
| # Ensure model and scheduler are initialized in GPU-enabled function | |
| if torch.cuda.is_available(): | |
| pipe = StableDiffusion3Pipeline.from_pretrained(model, torch_dtype=torch.float16, revision="refs/pr/26").to("cuda") | |
| # Function | |
| def generate_image( | |
| prompt, | |
| negative="low quality", | |
| width=1024, | |
| height=1024, | |
| scale=1.5, | |
| steps=30, | |
| clip=3): | |
| seed = random.randint(0, MAX_SEED) | |
| generator = torch.Generator().manual_seed(seed) | |
| prompt = str(translator.translate(prompt, 'English')) | |
| print(f'prompt:{prompt}') | |
| image = pipe( | |
| prompt, | |
| negative_prompt=negative, | |
| width=width, | |
| height=height, | |
| guidance_scale=scale, | |
| num_inference_steps=steps, | |
| clip_skip=clip, | |
| generator = generator, | |
| ) | |
| return image.images[0] | |
| examples = [ | |
| "a cat eating a piece of cheese", | |
| "a ROBOT riding a BLUE horse on Mars, photorealistic", | |
| "Ironman VS Hulk, ultrarealistic", | |
| "a CUTE robot artist painting on an easel", | |
| "Astronaut in a jungle, cold color palette, oil pastel, detailed, 8k", | |
| "An alien holding sign board contain word 'Flash', futuristic, neonpunk", | |
| "Kids going to school, Anime style" | |
| ] | |
| # Gradio Interface | |
| with gr.Blocks(css=CSS, js=JS, theme="soft") as demo: | |
| gr.HTML("<h1><center>SD3M🦄</center></h1>") | |
| gr.HTML("<p><center><a href='https://huggingface.co/stabilityai/stable-diffusion-3-medium'>sd3m</a> text-to-image generation</center><br><center>Multi-Languages. Adding default prompts to enhance.</center></p>") | |
| with gr.Group(): | |
| with gr.Row(): | |
| prompt = gr.Textbox(label='Enter Your Prompt', value="best quality, HD, aesthetic", scale=6) | |
| submit = gr.Button(scale=1, variant='primary') | |
| img = gr.Image(label='SD3M Generated Image') | |
| with gr.Accordion("Advanced Options", open=False): | |
| with gr.Row(): | |
| negative = gr.Textbox(label="Negative prompt", value="low quality") | |
| with gr.Row(): | |
| width = gr.Slider( | |
| label="Width", | |
| minimum=512, | |
| maximum=1280, | |
| step=8, | |
| value=1024, | |
| ) | |
| height = gr.Slider( | |
| label="Height", | |
| minimum=512, | |
| maximum=1280, | |
| step=8, | |
| value=1024, | |
| ) | |
| with gr.Row(): | |
| scale = gr.Slider( | |
| label="Guidance", | |
| minimum=3.5, | |
| maximum=7, | |
| step=0.1, | |
| value=7, | |
| ) | |
| steps = gr.Slider( | |
| label="Steps", | |
| minimum=1, | |
| maximum=50, | |
| step=1, | |
| value=50, | |
| ) | |
| clip = gr.Slider( | |
| label="Clip Skip", | |
| minimum=1, | |
| maximum=10, | |
| step=1, | |
| value=3, | |
| ) | |
| gr.Examples( | |
| examples=examples, | |
| inputs=prompt, | |
| outputs=img, | |
| fn=generate_image, | |
| cache_examples="lazy", | |
| ) | |
| prompt.submit(fn=generate_image, | |
| inputs=[prompt, negative, width, height, scale, steps, clip], | |
| outputs=img, | |
| ) | |
| submit.click(fn=generate_image, | |
| inputs=[prompt, negative, width, height, scale, steps, clip], | |
| outputs=img, | |
| ) | |
| demo.queue().launch() |