| | import gradio as gr |
| | import numpy as np |
| | from PIL import Image |
| | import torch |
| | from rudalle.pipelines import generate_images, show |
| | from rudalle import get_rudalle_model, get_tokenizer, get_vae |
| | from rudalle.utils import seed_everything |
| | import warnings |
| | warnings.filterwarnings("ignore") |
| |
|
| | |
| | device = "cuda" if torch.cuda.is_available() else "cpu" |
| | model = get_rudalle_model("Malevich", pretrained=True, fp16=True, device=device) |
| | tokenizer = get_tokenizer() |
| | vae = get_vae(dwt=False).to(device) |
| |
|
| | def generate_images(prompt, negative_prompt="", progress=gr.Progress()): |
| | """Generate 4 images using ruDALLE Malevich model""" |
| | if not prompt.strip(): |
| | prompt = "beautiful landscape" |
| | |
| | try: |
| | |
| | images = [] |
| | pil_images = [] |
| | |
| | with progress.tqdm(total=4, desc="Generating images") as pbar: |
| | for i in range(4): |
| | |
| | _pil_image = generate_images( |
| | prompt, |
| | tokenizer, |
| | model, |
| | vae, |
| | top_k=2048, |
| | top_p=0.995, |
| | temperature=1.0, |
| | image_count=1 |
| | )[0] |
| | |
| | images.append(_pil_image) |
| | pil_images.append(_pil_image) |
| | pbar.update(1) |
| | |
| | return pil_images |
| | |
| | except Exception as e: |
| | print(f"Error generating images: {e}") |
| | |
| | placeholder = Image.new('RGB', (512, 512), color='gray') |
| | return [placeholder] * 4 |
| |
|
| | def show_selected_image(gallery, evt: gr.SelectData): |
| | """Display the selected image in larger view""" |
| | if gallery and evt.index < len(gallery): |
| | return gallery[evt.index] |
| | return None |
| |
|
| | with gr.Blocks() as demo: |
| | gr.Markdown("# 🎨 ruDALLE Malevich Image Generation") |
| | gr.Markdown("Generate beautiful images using the ai-forever/rudalle-Malevich model. [Built with anycoder](https://huggingface.co/spaces/akhaliq/anycoder)") |
| | |
| | with gr.Row(): |
| | with gr.Column(scale=3): |
| | prompt_input = gr.Textbox( |
| | label="Prompt", |
| | placeholder="Enter your prompt here (optional)", |
| | lines=2 |
| | ) |
| | negative_prompt_input = gr.Textbox( |
| | label="Negative Prompt", |
| | placeholder="What to avoid in the image (optional)", |
| | lines=2 |
| | ) |
| | |
| | with gr.Row(): |
| | generate_btn = gr.Button("🎨 Generate Images", variant="primary", size="lg") |
| | clear_btn = gr.Button("🗑️ Clear", size="lg") |
| | |
| | with gr.Column(scale=2): |
| | gr.Markdown(""" |
| | ### Instructions: |
| | - Enter a prompt or leave empty for random generation |
| | - Add negative prompts to exclude elements |
| | - Click Generate to create 4 images |
| | - Click any image to view it larger |
| | """) |
| | |
| | with gr.Row(): |
| | gallery = gr.Gallery( |
| | label="Generated Images", |
| | columns=2, |
| | rows=2, |
| | height="auto", |
| | allow_preview=True, |
| | show_label=True, |
| | elem_id="gallery" |
| | ) |
| | |
| | with gr.Row(): |
| | selected_image = gr.Image( |
| | label="Selected Image (Click an image above)", |
| | height=512, |
| | width=512, |
| | interactive=False |
| | ) |
| | |
| | |
| | generate_btn.click( |
| | fn=generate_images, |
| | inputs=[prompt_input, negative_prompt_input], |
| | outputs=[gallery], |
| | api_visibility="public" |
| | ) |
| | |
| | gallery.select( |
| | fn=show_selected_image, |
| | inputs=[gallery], |
| | outputs=[selected_image], |
| | api_visibility="public" |
| | ) |
| | |
| | clear_btn.click( |
| | fn=lambda: (None, None, None), |
| | outputs=[prompt_input, negative_prompt_input, gallery], |
| | api_visibility="public" |
| | ) |
| | |
| | |
| | demo.load( |
| | fn=lambda: generate_images(""), |
| | outputs=[gallery], |
| | api_visibility="public" |
| | ) |
| |
|
| | |
| | demo.launch( |
| | theme=gr.themes.Soft( |
| | primary_hue="blue", |
| | secondary_hue="indigo", |
| | neutral_hue="slate", |
| | font=gr.themes.GoogleFont("Inter"), |
| | text_size="lg", |
| | spacing_size="lg", |
| | radius_size="md" |
| | ).set( |
| | button_primary_background_fill="*primary_600", |
| | button_primary_background_fill_hover="*primary_700", |
| | block_title_text_weight="600", |
| | ), |
| | css=""" |
| | #gallery { |
| | border: 2px solid var(--primary_200); |
| | border-radius: 12px; |
| | padding: 10px; |
| | background: var(--background_fill_secondary); |
| | } |
| | .gradio-container { |
| | max-width: 1200px !important; |
| | } |
| | """, |
| | footer_links=[ |
| | {"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"}, |
| | {"label": "ruDALLE Model", "url": "https://huggingface.co/ai-forever/rudalle-Malevich"} |
| | ] |
| | ) |