先上结论,一句话总结即: SD 图片的输入\输出尺寸(高或宽) = Unet 输入\输出的样本尺寸(高或宽) x VAE 的缩放尺寸
在使用生成模型时,特别是图像生成任务中,理解 UNet 和 VAE(变分自编码器)之间的关系是非常重要的。本文将详细介绍 UNet 和 VAE 的工作原理,并解释它们如何协同工作来生成高质量的图像。我们将以 diffusers
库为例,展示生成图像尺寸与 UNet 和 VAE 之间的关系。
什么是 UNet?
UNet 是一种卷积神经网络架构,最初设计用于生物医学图像分割。其结构类似于一个对称的 U 字形,由编码器(下采样)和解码器(上采样)组成。编码器逐步提取图像特征并缩小空间维度,解码器则将这些特征还原到原始的空间维度,同时逐步增加分辨率。
UNet 的关键特性:
- 对称结构:编码器和解码器对称分布。
- 跳跃连接:直接将编码器的中间层输出传递到解码器的对应层,保留了高分辨率特征。
- 多尺度特征提取:在不同尺度上提取特征,提升了网络对细节的捕捉能力。
什么是 VAE(Variational AutoEncoder)?
VAE 变分自编码器是一种生成模型,通过学习输入数据的潜在表示来生成新数据。VAE 由编码器和解码器组成:
- 编码器:将输入图像转换为潜在空间的分布(
均值和方差
),下图中的 m 和 sigma。 - 解码器:从潜在空间的采样生成新图像。
VAE 的关键特性:
- 概率模型:VAE 学习输入数据的概率分布,从而生成多样化的样本。
- 连续潜在空间:潜在空间中的小变化会导致生成图像的小变化,具有很好的连续性。
图像尺寸与 UNet 和 VAE 的关系
在图像生成任务中,输入图像的尺寸需要匹配 UNet 和 VAE 的预期输入输出尺寸。diffusers
库中的 MimicBrushPipeline
通过以下代码设置默认的图像尺寸:
height = height or self.unet.config.sample_size * self.vae_scale_factor
width = width or self.unet.config.sample_size * self.vae_scale_factor
下面详细解释为什么使用这种方式来设置默认的图像尺寸。
设置默认图像尺寸
-
UNet 的输入尺寸要求:UNet 处理图像时,输入图像的最小尺寸需要符合其配置要求。
self.unet.config.sample_size
提供了这个最小尺寸的基准值,例如 64。 -
VAE 的缩放需求:VAE 在编码和解码过程中会对图像进行缩放处理。为了确保图像在经过多次缩放后仍能被 VAE 正确处理,需要考虑
self.vae_scale_factor
,例如 8。
通过相乘,我们得到一个符合两者需求的图像尺寸:
height = 64 * 8 = 512
width = 64 * 8 = 512
这意味着默认的输入图像尺寸将是 512x512。这样的设置确保了图像在经过 VAE 的缩放处理后,仍能满足 UNet 的最小输入尺寸要求,且两者在处理过程中尺寸是对齐的。
总结
- 理解 UNet 和 VAE 之间的关系以及它们在图像生成任务中的角色,对于高效使用
diffusers
库生成高质量图像至关重要。 - 通过合理设置图像尺寸,我们可以确保生成过程中的每个阶段都能顺利进行,最终生成出符合预期的图像。
- 希望本文对你理解和应用 UNet 和 VAE 以及
diffusers
库有所帮助。
相关官方文档:常用的 Unet👉 UNet2D 和 VAE 👉 AutoencoderKL