| | import torch |
| | from diffusers import StableDiffusionXLControlNetPipeline, ControlNetModel, AutoencoderKL, UniPCMultistepScheduler |
| |
|
| | device = None |
| | pipe = None |
| |
|
| |
|
| | def init(): |
| | global device, pipe |
| |
|
| | device = "cuda" if torch.cuda.is_available() else "cpu" |
| |
|
| | print("Initializing depth ControlNet...") |
| |
|
| | depth_controlnet = ControlNetModel.from_pretrained( |
| | "diffusers/controlnet-depth-sdxl-1.0", |
| | use_safetensors=True, |
| | torch_dtype=torch.float16 |
| | ).to(device) |
| |
|
| | print("Initializing autoencoder...") |
| |
|
| | vae = AutoencoderKL.from_pretrained( |
| | "madebyollin/sdxl-vae-fp16-fix", |
| | torch_dtype=torch.float16, |
| | ).to(device) |
| |
|
| | print("Initializing SDXL pipeline...") |
| |
|
| | pipe = StableDiffusionXLControlNetPipeline.from_pretrained( |
| | "stabilityai/stable-diffusion-xl-base-1.0", |
| | controlnet=[depth_controlnet], |
| | vae=vae, |
| | variant="fp16", |
| | use_safetensors=True, |
| | torch_dtype=torch.float16 |
| | |
| | ).to(device) |
| |
|
| | pipe.enable_model_cpu_offload() |
| | |
| | pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) |
| | |
| | pipe.enable_xformers_memory_efficient_attention() |
| |
|
| |
|
| | def run_pipeline(image, positive_prompt, negative_prompt, seed): |
| | if seed == -1: |
| | print("Using random seed") |
| | generator = None |
| | else: |
| | print("Using seed:", seed) |
| | generator = torch.manual_seed(seed) |
| |
|
| | images = pipe( |
| | prompt=positive_prompt, |
| | negative_prompt=negative_prompt, |
| | num_inference_steps=30, |
| | num_images_per_prompt=4, |
| | controlnet_conditioning_scale=0.65, |
| | guidance_scale=10.0, |
| | generator=generator, |
| | image=image |
| | ).images |
| |
|
| | return images |
| |
|