|
|
|
from diffusers import UNet2DModel, DDIMScheduler, VQModel |
|
import torch |
|
import PIL.Image |
|
import numpy as np |
|
import tqdm |
|
|
|
seed = 3 |
|
|
|
|
|
|
|
|
|
unet = UNet2DModel.from_pretrained("./", subfolder="unet") |
|
vqvae = VQModel.from_pretrained("./", subfolder="vqvae") |
|
scheduler = DDIMScheduler.from_config("./", subfolder="scheduler") |
|
|
|
|
|
torch_device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
|
unet.to(torch_device) |
|
vqvae.to(torch_device) |
|
|
|
|
|
generator = torch.manual_seed(seed) |
|
noise = torch.randn( |
|
(1, unet.in_channels, unet.image_size, unet.image_size), |
|
generator=generator, |
|
).to(torch_device) |
|
|
|
|
|
scheduler.set_timesteps(num_inference_steps=200) |
|
|
|
image = noise |
|
for t in tqdm.tqdm(scheduler.timesteps): |
|
|
|
with torch.no_grad(): |
|
residual = unet(image, t)["sample"] |
|
|
|
|
|
prev_image = scheduler.step(residual, t, image, eta=0.0)["prev_sample"] |
|
|
|
|
|
image = prev_image |
|
|
|
|
|
with torch.no_grad(): |
|
image = vqvae.decode(image) |
|
|
|
|
|
image_processed = image.cpu().permute(0, 2, 3, 1) |
|
image_processed = (image_processed + 1.0) * 127.5 |
|
image_processed = image_processed.clamp(0, 255).numpy().astype(np.uint8) |
|
image_pil = PIL.Image.fromarray(image_processed[0]) |
|
|
|
|
|
|
|
|
|
from diffusers import LatentDiffusionUncondPipeline |
|
import torch |
|
import PIL.Image |
|
import numpy as np |
|
import tqdm |
|
|
|
pipeline = LatentDiffusionUncondPipeline.from_pretrained("./") |
|
|
|
|
|
generator = torch.manual_seed(seed) |
|
image = pipeline(generator=generator, num_inference_steps=200)["sample"] |
|
|
|
|
|
image_processed = image.cpu().permute(0, 2, 3, 1) |
|
image_processed = (image_processed + 1.0) * 127.5 |
|
image_processed = image_processed.clamp(0, 255).numpy().astype(np.uint8) |
|
image_pil = PIL.Image.fromarray(image_processed[0]) |
|
|
|
image_pil.save(f"generated_image_{seed}.png") |
|
|