|
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 |
|
|