import gradio as gr import torch import numpy as np from PIL import Image from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler from diffusers.utils import make_image_grid import cv2 controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny") pipe = StableDiffusionControlNetPipeline.from_pretrained( "stable-diffusion-v1-5/stable-diffusion-v1-5", controlnet=controlnet ) pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) pipe.to("cpu") def generate_image(input_image, text_prompt): original_image = np.array(input_image) low_threshold = 100 high_threshold = 200 edges = cv2.Canny(original_image, low_threshold, high_threshold) edges = edges[:, :, None] canny_image = np.concatenate([edges, edges, edges], axis=2) canny_image_pil = Image.fromarray(canny_image) output_image = pipe(text_prompt, image=canny_image_pil).images[0] result_grid = make_image_grid([input_image, canny_image_pil, output_image], rows=1, cols=3) return result_grid with gr.Blocks() as demo: gr.Markdown("# Image Transformation with ControlNet and Stable Diffusion (CPU Only)") with gr.Row(): with gr.Column(): input_image = gr.Image(type="pil", label="Upload Image") text_prompt = gr.Textbox(label="Enter a prompt for the transformation") generate_button = gr.Button("Generate Image") result = gr.Image(label="Result") generate_button.click(fn=generate_image, inputs=[input_image, text_prompt], outputs=result) demo.launch()