Spaces:
Runtime error
Runtime error
# Copyright (c) 2025 All rights reserved. | |
import os | |
import torch | |
import gradio as gr | |
import huggingface_hub | |
from huggingface_hub import snapshot_download | |
from PIL import Image, ImageDraw, ImageFont | |
# Import the base pipeline from diffusers | |
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel | |
from transformers import CLIPTextModel, CLIPTokenizer | |
# Define default parameters | |
DEFAULT_SEED = 42 | |
DEFAULT_STEPS = 30 | |
DEFAULT_GUIDANCE_SCALE = 7.5 | |
RED_BG_COLOR = "#ffcccc" # Light red background | |
# Initialize the model | |
def download_model(): | |
# Download the model (using a simple SD model as example) | |
snapshot_download(repo_id='runwayml/stable-diffusion-v1-5', local_dir='./models/stable-diffusion', local_dir_use_symlinks=False) | |
def init_pipeline(): | |
# Initialize a simple text-to-image pipeline | |
pipeline = StableDiffusionControlNetPipeline.from_pretrained( | |
"./models/stable-diffusion", | |
torch_dtype=torch.float16, | |
safety_checker=None | |
) | |
pipeline = pipeline.to("cuda") | |
return pipeline | |
# Generate image function | |
def generate_image(prompt, seed, num_steps, guidance_scale): | |
try: | |
# Make sure we have a valid seed | |
if seed == 0: | |
seed = torch.seed() & 0xFFFFFFFF | |
# Set up generator for reproducibility | |
generator = torch.Generator("cuda").manual_seed(seed) | |
# Generate the image | |
image = pipeline( | |
prompt=prompt, | |
num_inference_steps=num_steps, | |
guidance_scale=guidance_scale, | |
generator=generator | |
).images[0] | |
# Add watermark | |
image = add_safety_watermark(image) | |
except Exception as e: | |
print(f"Error generating image: {e}") | |
return gr.update() | |
return gr.update(value=image, label=f"Generated Image, seed = {seed}") | |
# Add watermark to image | |
def add_safety_watermark(image, text='AI Generated'): | |
width, height = image.size | |
draw = ImageDraw.Draw(image) | |
# Set font size based on image height | |
font_size = int(height * 0.028) | |
font = ImageFont.load_default() | |
# Calculate text position | |
text_width = len(text) * font_size * 0.6 # Approximate width | |
x = width - text_width - 10 | |
y = height - font_size - 20 | |
# Add shadow and text | |
draw.text((x+2, y+2), text, fill="black") | |
draw.text((x, y), text, fill="white") | |
return image | |
# Create example function | |
def generate_example(prompt, seed): | |
return generate_image(prompt, seed, DEFAULT_STEPS, DEFAULT_GUIDANCE_SCALE) | |
# Sample examples | |
sample_list = [ | |
['A majestic mountain landscape with snow peaks and pine trees', 123], | |
['A futuristic city with flying cars and tall skyscrapers', 456], | |
['A serene beach scene with clear blue waters', 789], | |
] | |
# Create the Gradio interface | |
with gr.Blocks(css=f".gradio-container {{ background-color: {RED_BG_COLOR} !important; }}") as demo: | |
gr.HTML(""" | |
<div style="text-align: center; max-width: 800px; margin: 0 auto;"> | |
<h1 style="font-size: 2rem; font-weight: 700;">Simple Text to Image Generator</h1> | |
<h2 style="font-size: 1.2rem; font-weight: 300; margin-bottom: 1rem;">Convert your text descriptions into images</h2> | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
# Input components | |
ui_prompt_text = gr.Textbox(label="Text Prompt", value="A beautiful landscape with mountains and trees") | |
ui_seed = gr.Number(label="Seed (0 for random)", value=DEFAULT_SEED) | |
ui_steps = gr.Slider(minimum=10, maximum=50, value=DEFAULT_STEPS, step=1, label="Number of Steps") | |
ui_guidance_scale = gr.Slider(minimum=1.0, maximum=15.0, value=DEFAULT_GUIDANCE_SCALE, step=0.5, label="Guidance Scale") | |
ui_btn_generate = gr.Button("Generate Image") | |
with gr.Column(scale=3): | |
# Output components | |
image_output = gr.Image(label="Generated Image", interactive=False, height=512) | |
gr.Examples( | |
sample_list, | |
inputs=[ui_prompt_text, ui_seed], | |
outputs=[image_output], | |
fn=generate_example, | |
cache_examples=True | |
) | |
ui_btn_generate.click( | |
generate_image, | |
inputs=[ui_prompt_text, ui_seed, ui_steps, ui_guidance_scale], | |
outputs=[image_output] | |
) | |
gr.Markdown( | |
""" | |
### How to Use: | |
1. Enter a detailed text description of the image you want to create | |
2. Adjust the parameters if needed (or leave as default) | |
3. Click "Generate Image" and wait for the result | |
### Tips: | |
- Detailed prompts work better than short ones | |
- Try different seeds for different variations | |
- Higher guidance scale values make the image follow the prompt more closely | |
""" | |
) | |
# Initialize and launch | |
print("Downloading models...") | |
download_model() | |
print("Initializing pipeline...") | |
pipeline = init_pipeline() | |
print("Launching Gradio interface...") | |
demo.launch() |