from diffusers import StableDiffusionControlNetPipeline, ControlNetModel from diffusers import UniPCMultistepScheduler import gradio as gr import torch # Constants low_threshold = 100 high_threshold = 200 # Models controlnet_pose = ControlNetModel.from_pretrained( "lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16 ) controlnet_canny = ControlNetModel.from_pretrained( "lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16 ) pipe = StableDiffusionControlNetPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", controlnet=[controlnet_pose,controlnet_canny], safety_checker=None, torch_dtype=torch.float16 ) pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) # This command loads the individual model components on GPU on-demand. So, we don't # need to explicitly call pipe.to("cuda"). pipe.enable_model_cpu_offload() # xformers pipe.enable_xformers_memory_efficient_attention() # Generator seed, generator = torch.manual_seed(0) def generate_images(pose_image, canny_image, prompt): output = pipe( prompt, [pose_image, canny_image], generator=generator, num_images_per_prompt=3, num_inference_steps=20, ) all_outputs = [] all_outputs.append(pose_image, canny_image) for image in output.images: all_outputs.append(image) return all_outputs gr.Interface( generate_images, inputs=[ gr.Image(type="pil"), gr.Image(type="pil"), gr.Textbox( label="Enter your prompt", max_lines=1, placeholder="best quality, extremely detailed", ), ], outputs=gr.Gallery().style(grid=[2], height="auto"), title="Generate controlled outputs with Mult-ControlNet and Stable Diffusion using 🤗Diffusers", description="This Space uses pose lines and canny edged image as the additional conditioning. Please refer to the \"Examples\" for what kind of images are appropriate.", examples=[["sample_pose_body.png", "sample_canny_hand.png", "best quality, extremely detailed"]], allow_flagging=False, ).launch(enable_queue=True)