介绍
Stable Diffusion是一种文本到图像模型,在来自LAION-5B 数据集子集的 512x512 图像上进行训练。
本笔记本的目标是演示使用🤗 Diffusers库实现文本到图像生成是多么容易,该库是用于生成图像、音频和图像的最先进的预训练扩散模型的首选库3D结构。
然而,在开始编写代码之前,我们需要知道什么是Stable Diffusion。
什么是稳定扩散?
Stable Diffusion 基于一种称为 Latent Diffusion 的扩散模型,详细信息可以在论文High-Resolution Image Synthesis with Latent Diffusion Models中看到。
扩散模型是一种生成模型,经过训练可以对图像等对象进行去噪以获得感兴趣的样本。 该模型被训练为在每个步骤中对图像进行轻微去噪,直到获得样本。这个过程可以在下面看到:
近年来,这些扩散模型越来越受欢迎,特别是因为它们能够在生成图像数据方面取得最先进的结果。但是,扩散模型会消耗大量内存并且计算量大。
****另一方面,潜在扩散通过在较低维度的潜在空间上应用扩散过程来降低复杂性和内存使用。 在潜在扩散中,模型经过训练以生成图像的压缩表示。
潜在扩散有三个主要组成部分。
1. 自动编码器(VAE)。
2. U网。
3. 文本编码器。
自动编码器 (VAE)
变分自动编码器 (VAE) 是一种由编码器和解码器组成的模型。编码器用于将图像转换为低维潜在表示以服务于 U-Net 模型的输入,而解码器将潜在表示转换回图像。
优网
U-Net 是一种卷积神经网络,广泛应用于图像分割任务。它还有一个编码器和一个解码器,均由 ResNet 块组成。编码器将图像压缩成较低分辨率的图像,而解码器将此较低分辨率图像解码回原始的较高分辨率,这应该是噪声较小的。
文本编码器
文本编码器负责将文本输入提示转换为 U-Net 可以理解的嵌入空间。它通常是一个简单的基于转换器的编码器,将输入标记序列映射到潜在文本嵌入序列。
带有🤗扩散器的稳定扩散管道
这StableDiffusionPipeline是一个由 🤗 Diffusers 库创建的管道,它允许我们使用 Python 中的几行代码从文本生成图像。它有许多可用的版本和检查点,您可以通过访问库文档的文本到图像生成页面来获取这些内容。
对于此笔记本,我们将使用 Stable Diffusion 1.4 版 ( CompVis/stable-diffusion-v1-4 )。我们还使用torch_dtype = torch.float16加载 fp16 权重,这有助于降低内存使用成本。
让我们通过安装扩散器库来开始我们的项目。
# Installing diffusers library
!pip install diffusers
我们现在可以导入所有相关的库
# Library imports
# Importing PyTorch library, for building and training neural networks
import torch
# Importing StableDiffusionPipeline to use pre-trained Stable Diffusion models
from diffusers import StableDiffusionPipeline
# Image is a class for the PIL module to visualize images in a Python Notebook
from PIL import Image
让我们创建一个管道实例。
这.from_pretrained("CompVis/stable-diffusion-v1-4")将使用预训练的权重和设置初始化扩散模型,以及预训练的 VAE、U-Net 和文本编码器以从文本生成图像。
将torch_dtype = torch.float16模型的数据类型设置为 float16(一种精度较低的浮点格式),以帮助加快推理速度。
# Creating pipeline
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4",
torch_dtype=torch.float16)
现在,我们可以定义一个函数来创建和显示使用 Stable Diffusion 生成的图像网格。
# Defining function for the creation of a grid of images
def image_grid(imgs, rows, cols):
assert len(imgs) == rows*cols
w, h = imgs[0].size
grid = Image.new('RGB', size = (cols*w,
rows * w))
grid_w, grid_h = grid.size
for i, img in enumerate(imgs):
grid.paste(img, box = (i%cols*w, i // cols*h))
return grid
接下来,我们使用 PyTorch 的to方法将我们的管道移动到 GPU,从而加速神经网络的训练和推理。
# Moving pipeline to GPU
pipeline = pipeline.to('cuda'
现在,我们终于可以使用 Stable Diffusion 从文本生成图像了!
在下面的代码中,n_images用于定义将生成多少图像。而prompt将用于生成我们想要生成的图像的文本。
n_images = 6 # Let's generate 6 images based on the prompt below
prompt = ['Sunset on a beach'] * n_images
images = pipeline(prompt).images
grid = image_grid(images, rows=2, cols = 3)
grid
n_images = 6
prompt = ['Portrait of Napoleon Bonaparte'] * n_images
images = pipeline(prompt).images
grid = image_grid(images, rows=2, cols = 3)
grid
n_images = 6
prompt = ['Skyline of a cyberpunk megalopolis'] * n_images
images = pipeline(prompt).images
grid = image_grid(images, rows=2, cols = 3)
grid