import gradio as gr import torch import numpy as np import random from diffusers import DiffusionPipeline device = "cuda" if torch.cuda.is_available() else "cpu" torch_dtype = torch.float16 if device == "cuda" else torch.float32 MAX_SEED = np.iinfo(np.int32).max MAX_IMAGE_SIZE = 1024 # 預設可選模型 available_models = [ "digiplay/AM-mix1", "digiplay/pan04", "digiplay/2K" ] def load_model(selected_model_id, custom_model_id): model_id = custom_model_id.strip() if custom_model_id.strip() else selected_model_id try: pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch_dtype).to(device) return pipe, model_id, f"✅ Model '{model_id}' loaded successfully!" except Exception as e: return None, "", f"❌ Failed to load model: {e}" def generate_image(pipe, prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps): if pipe is None: raise ValueError("No model loaded. Please load a model first.") if randomize_seed: seed = random.randint(0, MAX_SEED) generator = torch.Generator().manual_seed(seed) image = pipe( prompt=prompt, negative_prompt=negative_prompt, width=width, height=height, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, generator=generator, ).images[0] return image, seed with gr.Blocks(css="#container { max-width: 700px; margin: auto; }") as demo: gr.Markdown("## Text-to-Image Generator with Model Selector") pipe_state = gr.State(None) model_id_state = gr.State("") with gr.Column(elem_id="container"): gr.Markdown("### 1. Choose or Enter Model") with gr.Row(): selected_model = gr.Dropdown(label="Choose a model", choices=available_models, value=available_models[0]) custom_model = gr.Textbox(label="Or enter custom model ID", placeholder="e.g. runwayml/stable-diffusion-v1-5") load_button = gr.Button("Load Model") load_status = gr.Textbox(label="Model Load Status", interactive=False) load_button.click( fn=load_model, inputs=[selected_model, custom_model], outputs=[pipe_state, model_id_state, load_status] ) gr.Markdown("### 2. Generate Image") prompt = gr.Textbox(label="Prompt", placeholder="e.g. A futuristic city at night") negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="(optional)", value="", visible=True) with gr.Row(): width = gr.Slider(256, MAX_IMAGE_SIZE, step=32, value=512, label="Width") height = gr.Slider(256, MAX_IMAGE_SIZE, step=32, value=512, label="Height") with gr.Row(): guidance_scale = gr.Slider(0.0, 10.0, step=0.1, value=7.5, label="Guidance Scale") num_inference_steps = gr.Slider(1, 50, step=1, value=25, label="Inference Steps") with gr.Row(): seed = gr.Slider(0, MAX_SEED, step=1, value=0, label="Seed") randomize_seed = gr.Checkbox(label="Randomize Seed", value=True) generate_button = gr.Button("Generate Image") output_image = gr.Image(label="Result") final_seed = gr.Number(label="Used Seed", precision=0) generate_button.click( fn=generate_image, inputs=[pipe_state, prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps], outputs=[output_image, final_seed] ) if __name__ == "__main__": demo.launch()