|
import numpy as np |
|
import torch |
|
import sys |
|
import os |
|
|
|
from diffusers import ( |
|
StableDiffusionControlNetPipeline, |
|
AutoencoderKL, |
|
UNet2DConditionModel, |
|
) |
|
from diffusers.utils import load_image |
|
|
|
test_prompt = "best quality, extremely detailed" |
|
test_negative_prompt = "lowres, bad anatomy, worst quality, low quality" |
|
|
|
|
|
def generate_image(seed, control): |
|
image = pipe( |
|
prompt=test_prompt, |
|
negative_prompt=test_negative_prompt, |
|
width=512, |
|
height=512, |
|
generator=torch.Generator(device="cuda").manual_seed(seed), |
|
image=control, |
|
).images[0] |
|
return image |
|
|
|
|
|
if __name__ == "__main__": |
|
output_image_root_folder = "./canny" |
|
model_id = f"../../control_sd15_canny" |
|
base_model_id = sys.argv[1] if len(sys.argv) == 2 else None |
|
canny_edged_image = load_image( |
|
"https://huggingface.co/takuma104/controlnet_dev/resolve/main/vermeer_canny_edged.png" |
|
) |
|
|
|
if base_model_id: |
|
unet = UNet2DConditionModel.from_pretrained(base_model_id, subfolder="unet").to( |
|
"cuda" |
|
) |
|
vae = AutoencoderKL.from_pretrained(base_model_id, subfolder="vae").to("cuda") |
|
output_types = [ |
|
base_model_id.split("/")[1] + suffix for suffix in ["_unet", "_unet_vae"] |
|
] |
|
else: |
|
output_types = ["sd15"] |
|
|
|
for output_type in output_types: |
|
if output_type == "sd15": |
|
print("SD15 no override config") |
|
pipe = StableDiffusionControlNetPipeline.from_pretrained(model_id).to( |
|
"cuda" |
|
) |
|
elif output_type.endswith("_unet"): |
|
print(f"{base_model_id} unet only override config") |
|
pipe = StableDiffusionControlNetPipeline.from_pretrained( |
|
model_id, unet=unet |
|
).to("cuda") |
|
elif output_type.endswith("_unet_vae"): |
|
print(f"{base_model_id} unet & vae override config") |
|
pipe = StableDiffusionControlNetPipeline.from_pretrained( |
|
model_id, unet=unet, vae=vae |
|
).to("cuda") |
|
output_folder = f"{output_image_root_folder}/{output_type}" |
|
os.makedirs(output_folder, exist_ok=True) |
|
for seed in range(32): |
|
image = generate_image(seed=seed, control=canny_edged_image) |
|
image.save(f"{output_folder}/output_{seed:02d}.png") |
|
|