Stable Diffusion是一种基于深度学习的文本到图像生成模型,其原理主要基于扩散模型(Diffusion Model)的变体,即潜在扩散模型(Latent Diffusion Model, LDM)。
原理
一、技术架构与组成
Stable Diffusion由三个主要部分组成:变分自编码器(VAE)、U-Net和一个文本编码器。
-
变分自编码器(VAE):
- VAE是一种生成模型,用于将图像压缩到低维的潜在空间(latent space)中,并能够从潜在空间中恢复出图像。
- VAE由编码器和解码器两部分组成。编码器将图像压缩为潜在空间中的低维表示,而解码器则负责从潜在空间中恢复出图像。
-
U-Net:
- U-Net是一个用于图像分割的神经网络架构,但在Stable Diffusion中,它被用作噪声预测器(noise predictor)。
- U-Net通过一系列卷积层、上采样和下采样操作,逐步去除图像中的噪声,并注入语义信息,从而生成与文本描述相匹配的图像。
-
文本编码器:
- 文本编码器通常使用预训练的CLIP模型(Contrastive Language-Image Pre-training),将文本描述转换为嵌入空间中的向量。
- 这些文本嵌入向量作为条件信息,引导U-Net在生成图像时遵循特定的文本描述。
二、工作原理
Stable Diffusion的工作原理可以分为前向扩散和反向扩散两个过程:
-
前向扩散(Forward Diffusion):
- 在前向扩散过程中,高斯噪声被迭代地添加到图像的潜在表示中,逐渐将图像转换为纯噪声图像。
- 这个过程类似于物理上的扩散现象,即噪声在图像中逐渐扩散并覆盖原始图像信息。
-
反向扩散(Reverse Diffusion):
- 反向扩散是前向扩散的逆过程,旨在从纯噪声图像中逐步恢复出原始图像。
- 在这个过程中,U-Net作为噪声预测器,逐步去除图像中的噪声,并注入与文本描述相匹配的语义信息。
- 通过多次迭代,U-Net能够生成与文本描述高度匹配的图像。
三、条件引导与文本嵌入
- 文本编码器将输入的文本描述转换为嵌入向量,这些向量作为条件信息引导U-Ne
文章来源于互联网:Stable Diffusion
相关推荐: 别再纠结AI写作工具怎么选!深度对比ChatGPT、Claude、DeepSeek,速来学DeepSeek玩法!
遨游AI江湖:挑个趁手“兵器” 家人们!现在这AI工具多到像超市货架上的商品,让人眼花缭乱。想从这一堆里挑出最适合自己的AI智能助手,就跟大海捞针似的,既让人激动又有点摸不着头脑。今儿个,咱就把当下超火的ChatGPT、Claude,还有咱国产AI里的大明星D…
1 作用
原始论文为High-Resolution Image Synthesis with Latent Diffusion Models,2022年发表在CVPR上。代码仓https://github. com/CompVis/latent-diffusion
稳定扩散模型的原名是潜扩散模型(Latent Diffusion Model, LDM)。正如它的名字所指出的那样,扩散过程发生在潜在空间中。这就是为什么它比纯扩散模型更快。
2 解释
整体架构图

潜在空间

首先训练一个自编码器,学习将图像数据压缩为低维表示。
通过使用训练过的编码器E,可以将全尺寸图像编码为低维潜在数据(压缩数据)。然后通过使用经过训练的解码器D,将潜在数据解码回图像。
潜在空间的扩散
将图像编码后,在潜在空间中进行正向扩散和反向扩散过程。

条件作用/调节
稳定扩散模型的真正强大之处在于它可以从文本提示生成图像。这是通过修改内部扩散模型来接受条件输入来完成的。


通过使用交叉注意机制增强其去噪 U-Net,将内部扩散模型转变为条件图像生成器。
上图中的开关用于在不同类型的调节输入之间进行控制:
- 对于文本输入,首先使用语言模型 𝜏θ(例如 BERT、CLIP)将它们转换为嵌入(向量),然后通过(多头)Attention(Q, K, V) 映射到 U-Net 层。
- 对于其他空间对齐的输入(例如语义映射、图像、修复),可以使用连接来完成调节。
训练

训练目标(损失函数)与纯扩散模型中的训练目标非常相似。唯一的变化是:
- 输入潜在数据zₜ而不是图像xₜ。
- U-Net增加条件输入𝜏θ(y)。
采样

由于潜在数据的大小比原始图像小得多,所以去噪过程会快得多。
架构的比较
比较纯扩散模型和稳定扩散模型(潜在扩散模型)的整体架构。
Diffusion Model

Stable Diffusion (Latent Diffusion Model)

快速总结一下:
- 扩散模型分为正向扩散和反向扩散两部分。
- 正扩散可以用封闭形式的公式计算。
- 反向扩散可以用训练好的神经网络来完成。
- 为了近似所需的去噪步骤q,我们只需要使用神经网络εθ近似噪声εₜ。
- 在简化损失函数上进行训练可以获得更好的样本质量。
- 稳定扩散(潜扩散模型)是在潜空间中进行扩散过程,因此比纯扩散模型快得多。
- 纯扩散模型被修改为接受条件输入,如文本、图像、语义等。
组件
| 组件 |
参数个数 |
文件大小 |
占比 |
| CLIP |
123,060,480 |
492 MB |
12% |
| VAE |
83,653,863 |
335 MB |
8% |
| UNet |
859,520,964 |
3.44 GB |
80% |
| Total |
1,066,235,307 |
4.27 GB |
100% |
Stable Diffusion是一种计算机生成图像的方法,它是Diffusion Model(扩散模型)的一种变体。扩散模型是一种深度学习模型,用于生成高质量、逼真的图像,同时保持一定的稳定性。Stable Diffusion的特点是能够生成高质量、多样化的图像,同时保持较低的计算成本和较快的生成速度。
Stable Diffusion的工作原理是通过对图像进行逐步的“去噪”和“重构”,从随机噪声开始,逐步恢复出高质量的图像。在这个过程中,模型会不断地调整噪声和图像的混合程度,直到最终生成出高质量的图像。这种方法可以有效地利用计算资源,生成出高质量的图像。
最基本的原理是:根据文字指示,把一张随机生成的全是噪点的图片,一步步去掉噪点生成跟文字描述匹配的图片。
Latent Space & VAE
图片太大了,如果图片用像素数据表示,现在 iPhone 拍的一张照片有最小有 500w 像素,即使做常见的图片压缩(JPG/PNG),也有几百K的数据大小,如果用原图按上面的流程跑下来,计算量巨大,显然我们要针对图片做降维(或者理解为压缩),把一张图片的数据量降低,再进行后续的训练和使用。所以需要一个降维模型做这个事,这个模型需要满足:
- 有 encode 和 decode,需要能从 encode 和处理后的低维数据 decode 成高清图片。
- 要压缩得尽量小,方便低成本做上述海量的计算。
- 信息要能保留得足够多。
- 信息要有语义,不然训练过程中不同图片的信息无法交叉融合。
VAE (Variational Autoencoders 变分自编码器)能做到这些,VAE 提供了 encoder 和 decoder,一张图片经过 VAE encode,可以压缩成仅有 64x64x4 的矩阵,这里经过 encode 后的数据空间,就称为隐空间(Latent Space),在这个空间里进行上述扩散模型的训练和生成流程,成本就非常低,这也是目前Stable Diffusion能跑在我们普通电脑上的原因。最后在隐空间里生成的图片数据,经过 VAE decoder,就能转换成高清图。
那 VAE 为什么能做到这样?一张图片转成 64x64x4 这么小的数据量,为什么能保存图片的信息?通俗理解是 VAE 把图片内容转成了语义概率表示,相当于变成了这张图片的描述,比如描述这张图片有猫的概率、有猫爪子的概率,猫在左边的概率,绿色的概率,类似这样,更深入就不了解了,这篇文章 有讲解到一些,也只了解到这里了
CLIP
VAE 解决图片编码问题,再来看看文本的编码。在控制生成里,文本实际上是怎样参与到模型训练和生成的过程?如果文本只是随便编码进入模型,模型可能只认得一些特定字符,不认识语义,也就在后续的图片生成中没法比较好地通过自由的prompt文案控制。
SD 使用 OpenAI 训练的 CLIP 模型,把文本转为对应的向量,为什么用它,因为 CLIP 模型本身是一个文本到图片的映射模型,它对文本转出来的向量,更贴近图片的特征空间。
稍微展开说下原理:
- 有N张图片、以及它们对应的 N 个对图片的描述文本
- 对图像进行编码,得到I,下图中,I1/I2/…/IN 表示从第 1 到 N 张图片的编码表示。
- 对文本片段进行编码,得到T,下图中,T1/T2…TN 表示从第 1 到 N 张图片对应的文本描述。
- 模型的任务是训练 TextEncoder 和 ImageEncoder的 参数:
- 让图中蓝色部分Ti和Ii相似度变高,它们原本就是一一对应的文本-图片,属于正样本。(数学上是计算余弦相似度,越大表示相似度越高,最大化这个值)
- 让白色部分相似度最低,它们的文本和图片是没有关系的,属于负样本。(数学上是余弦相似度值最小化)
这样训练后,最终使用这个模型时,TextEncoder出来的向量表示,就跟图片内容有很强的关系。比如下图第四行,猫的文字描述通过 TextEncode 出来的值,跟猫的图片的ImageEncode出来的值,相似度更高,跟其图片的encode相似度就低。

PS. 更细节的 CLIP 怎么跟 SD 生成过程结合,还没弄得很清楚,实际上SD 没有用 CLIP 里的 Image encoder,扩展模型训练过程中是用别的 Image Encoder,那就并没有用到文本和实际图片的对应映射关系,但可能CLIP出来的文本编码,语义和表现形式上已经是图片的模式,比如文字 cat,它能跟图片空间里猫所表示的形态(形状/位置)、视觉(眼睛/颜色/形状)、语义(宠物/动物)能比较接近地对应上,也能存储到相关信息,所以跟其他图片编码结合,也能起到很大作用?
采样器
编码和数据量的问题解决了,还有个问题没提到,就是上面流程里的步数太长了,最开始提出的扩散模型训练方案 DDPM(Denoising Diffusion Probabilistic Models 去噪扩散概率模型),正常需要 1000 步降噪过程(称为采样),才能生成一张不错的图片,即使上述隐空间已经降低了计算量,但生成一张图要1000步,还是达不到大规模可用。
为什么 DDPM 一定要这么多次采样?这篇文章说得比较清楚,不能直接减小步数(每次噪声加得很少,避免一步就破坏掉原图),不能跳步降噪(每一步状态都依赖前一步,号称马尔科夫性质)。
随后很快有人提出 DDIM(Denoising Diffusion Implicit Models 去噪扩散隐式模型) 方案,训练时还是 DDPM 一步步来,但生成时是可以做到跳步,同时还能让在步数变少的情况下保持生成的稳定。DDIM不是从头开始逐步去噪,而是选择几个关键的时间点,只在这些时间点上进行去噪操作,并且中间的步骤,比如从降噪100次的图片,下一步直接生成降噪90次的图片,跳10步,生成速度就快了10倍。为什么它能做到跳步,具体原因都是数学公式,就不展开了(还没全看懂),可以看回这篇文章。
Stable Diffusion 的 WebUI 上有很多采样器,Eular a,Karras,DPM 等,在去噪过程中通过不同的方法,有不同的多样化程度、图像质量、速度、收敛性的区别。
Stable Diffusion UNet 结构
最初的 DDPM(去噪扩散概率模型),和后来改良的 LDM(潜在扩散模型),对 UNet 网络逐步做了一些改造,以适合扩散模型图生成的过程,SD 是基于 LDM 实现的。
最后 SD 里的 UNet,整体结构流程跟上述一致,改造大部分是在上采样和下采样的每一层的实现里,最大的改造是引入了 ResnetBlock(残差模块)和 Transformer 模块。ResnetBlock 提升网络表达能力(原 UNet 是简单卷积模块),而 Transformer 模块的交叉注意力机制,将文本提示(prompt)的嵌入与图像特征进行融合,实现基于文本条件的图像生成。
SD UNet 每个模块的组成如图(图片来源):

左边下采样每层由2个残差模块和2个Transformer模块连接组成,右边上采样是各3个,中间层是2个残差模块和1个Transformer模块。(高维的d4和u1没有接入Transformer模块,原因不明,可能是试过加入后效果不佳,在高维这里加入 Prompt 交叉注意机制,文字权重太大?)
细分模块结构
里面每一块具体的结构这篇文章画得很详细,摘录学习一下。我们拿其中一个下采样模块看看:

两个残差模块,两个Transformer模块。这图表示了 SD 生图的三个输入:input(噪声图)、prompt_embdding(文字 Prompt)、time_embdding(步数)在这几个模块的流转和处理。这里每一个小模块处理完后,输出的可以近似认为都是一个预测的噪声图的数据表示。
残差模块的输入输出 噪声图+步数 → 预测噪声图,Transformer 模块的输入输出是 噪声图+ Prompt → 预测噪声图。
Transformer 模块
再细看一下 Transformer 模块,Transformer 模块由下图所示好几个部分组成,最主要的是 自注意力模块(SelfAttention)和交叉注意力模块(CrossAttention):

展开看看这两个模块:

自注意力模块,Transformer 结构里的 QKV 输入都是图片特征(上一层的处理结果,就是降噪图的特征),这样做可以让模型获得包含整个输入图像的感受野,捕捉图片特征中不同位置之间的关系, 全局感受力是 Transformer 架构的特点。
交叉注意力模块,它的作用是融合不同模态的输入,在这里就是融合噪声图和文本特征,Q的输入是图片特征,KV的输入是文字 prompt_embedding,让图片特征可以关注到文字输入,根据注意力权重调整图片的生成方向。文字 prompt 在整个Transformer模块中只作用在交叉注意力这部分里。
Transformer 的机制原理、QKV的含义,是另一个比较大的话题,可以先看看网上其他相关讲解,比如这篇,后续再细拆深入。
回顾
关键几个模块的组成了解了,再回到整个UNet的构成:

现在通过这些结构图,可以大致看到 UNet 网络里的整体处理流程,以及关键模块的作用,经过这些模块的逐个叠加,组合成一个个采样模块,再组合成 UNet 网络架构,完成整个生图运算。
这里面还有很多需要深入学习的点,当前先了解到这个维度,已经可以帮助大致理解后续 ControlNet 等网络的机制原理。

Stable Diffusion总结
最后总结说下 Stable Diffusion。上面整个过程和概念,是一个个解决问题的方法,把它们组合起来,逐渐建立起基于扩散模型生成图片的方法大厦,谁都可以用这些公开的理论方法建一套自己的生图模型。
Stable Diffusion 就在这些基础上做一些改进,建立一套稳定的框架、训练出基础模型,开源让所有人可以用,整个 SD 就是多种能力的组合,这些能力可以分别不断升级替换,模型本身还有很多方式去做更强的控制干预(controlNet / LORA等),使得它可定制性可玩性很强,生态越来越繁荣。
最后让我们用一个图串起整个流程和讲解到的概念。
- Part1 是用 CLIP 模型对文本做编码。
- Part2 在模型训练过程中,图片经过 AutoencoderKL(VAE编码器的实现)生成隐空间下图片的表示,随机生成一个 noise 噪声,加到这个图片里,同时把通过 CLIP 模型编码的图片对应描述文本加入进来,一起进入 UNet 模型,训练预测加了多少 noise 噪声的能力。
- Part3 在模型推理过程中,输入一个完全随机噪点,在隐空间里通过不同的采样器,结合prompt 文本输入(图上没表示出来,文本数据会参与到降噪过程),在 UNet 模型里迭代多步做降噪预测,生成隐空间里的图片,再通过 VAE AutoencoderKL 解码出图片。

了解整个基础流程和概念后,现在看 Stable Diffusion 论文中的这张架构图,应该也大致能理解是什么意思了。
总结
DiffusionModel VIT、DIT、UVIT与Stable Diffusion的联系与区别
| 特性 |
Diffusion Model |
ViT |
DiT |
U-ViT |
Stable Diffusion |
| 目标 |
通用生成框架 |
图像分类、检测等任务 |
高质量图像生成 |
高分辨率图像生成 |
高效文本到图像生成 |
| 主干架构 |
通常基于 U-Net |
Transformer |
基于 ViT 的扩散模型 |
ViT + U-Net |
U-Net + 条件模块(CLIP) |
| 特征处理 |
局部特征为主 |
全局特征建模 |
全局特征建模 |
全局与局部结合 |
潜空间局部处理 + 条件控制 |
| 条件能力 |
基础条件控制 |
无条件 |
强条件(时间步、文本) |
强条件(多模态任务) |
强条件(文本、图像) |
| 应用场景 |
图像生成、修复、去噪 |
分类、检测、多模态任务 |
条件和无条件生成 |
多模态、高分辨率生成 |
文本到图像、多模态生成 |
参考资料
- https://www.bilibili.com/video/BV1wZ421h7w7/?vd_source=9c2f477a97bce8e38909b83b89e244e2
- 详细介绍SD中相关技术
-
# 手写stable-diffusion
- 源码手写SD
- https://zhuanlan.zhihu.com/p/639952809
- unet网络结构
https://zhuanlan.zhihu.com/p/682706598
https://openai.com/index/video-generation-models-as-world-simulators/
Sora
stablediffusion
SD相关资料
# Stable Diffusion 图片生成原理简述
# 理解 Stable Diffusion UNet 网络
# Stable diffusion — High-Resolution Image Synthesis with Latent Diffusion Models
# Diffusion Models
# Stable Diffusion 原理 | 深度学习算法
# Stable Diffusion 原理介绍与源码分析(一)
# The Illustrated Stable Diffusion
# 零基础读懂Stable Diffusion(II):怎么训练
ICCV 2023 | 最全AIGC梳理,5w字30个diffusion扩散模型方向,近百篇论文!
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
# 技术神秘化的去魅:Sora关键技术逆向工程图解
文章来源于互联网:Stable Diffusion
相关推荐: AI辅助编程工具对比:Cursor AI、Windsurf AI 和 GitHub Copilot
功能和特性 1. Cursor AI 基于VS Code构建,集成了GPT-4等多个AI模型,提供高级智能支持。 支持AI代码补全、错误修正以及通过自然语言执行命令。 具备多文件编辑和上下文理解能力,能够在复杂项目中提供跨文件的智能建议。 提供标签功能,允许用…
一、Stable Diffusion简介
Stable Diffusion是一种生成对抗网络(GAN)的变体,专注于高质量图像生成。它利用扩散过程和去噪技术逐步生成图像,并且在各类图像生成任务中表现出色。本文将详细介绍Stable Diffusion的原理、实现步骤以及一些实际应用案例。
二、Stable Diffusion的核心原理
2.1 扩散过程(Diffusion Process)
扩散过程是一种从噪声逐渐生成图像的技术。其核心思想是将随机噪声通过一系列逐步去噪的步骤转化为高质量的图像。这个过程包含了以下几个步骤:
-
初始噪声生成:生成一个完全随机的噪声图像。
-
逐步去噪:通过多次迭代,将噪声图像逐步转化为目标图像。
2.2 去噪过程(Denoising Process)
去噪过程使用深度学习模型对噪声图像进行逐步去噪。在每一步,模型会预测当前图像的去噪版本,并且随着步骤的增加,图像的细节逐步清晰。
2.3 模型架构
Stable Diffusion通常采用UNet架构来进行图像生成。UNet是一种常用于图像处理任务的卷积神经网络,具有跳跃连接(skip connections),可以在高分辨率和低分辨率特征之间传递信息。
三、Stable Diffusion的实现步骤
3.1 环境准备
首先,需要准备好运行环境,包括安装必要的库和工具。这里以Python和PyTorch为例。
pip install torch torchvision torchaudio
pip install diffusers
3.2 数据准备
为了训练Stable Diffusion模型,需要准备好高质量的图像数据集。这里以CIFAR-10数据集为例。
from torchvision import datasets, transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
3.3 模型定义
定义UNet模型,用于逐步去噪图像。
import torch
import torch.nn as nn
class UNet(nn.Module):
def __init__(self):
super(UNet, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=4, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1),
nn.ReLU()
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
nn.ReLU(),
nn.ConvTranspose2d(64, 3, kernel_size=4, stride=2, padding=1),
nn.Tanh()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
3.4 训练过程
训练过程中,使用逐步去噪的方式生成图像。
import torch.optim as optim
model = UNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for data in train_loader:
inputs, _ = data
noise = torch.randn_like(inputs)
noisy_inputs = inputs + noise
optimizer.zero_grad()
outputs = model(noisy_inputs)
loss = criterion(outputs, inputs)
loss.backward()
optimizer.step()
print(f"Epoch [{epoch+1}/10], Loss: {loss.item():.4f}")
四、实际应用案例
4.1 图像生成
使用训练好的Stable Diffusion模型生成新图像。
import matplotlib.pyplot as plt
model.eval()
with torch.no_grad():
noise = torch.randn(1, 3, 32, 32)
generated_image = model(noise).squeeze().permute(1, 2, 0).numpy()
plt.imshow((generated_image + 1) / 2)
plt.show()
4.2 图像修复
Stable Diffusion不仅可以生成图像,还可以用于图像修复。例如,在原神游戏中,如果某些角色的图片损坏,可以通过Stable Diffusion模型修复。
def add_noise(img, noise_factor=0.5):
noisy_img = img + noise_factor * torch.randn_like(img)
return torch.clip(noisy_img, 0., 1.)
noisy_image = add_noise(original_image)
model.eval()
with torch.no_grad():
restored_image = model(noisy_image.unsqueeze(0)).squeeze().permute(1, 2, 0).numpy()
plt.imshow((restored_image + 1) / 2)
plt.show()
五、结论
Stable Diffusion通过逐步去噪的方式实现高质量的图像生成和修复,具有广泛的应用前景。无论是在娱乐领域(如原神角色图像生成)还是在实际应用(如图像修复)中,都能发挥重要作用。
希望这篇博客能帮助你更好地理解和使用Stable Diffusion。如果你有任何问题或建议,欢迎在评论区留言。
文章来源于互联网:Stable Diffusion详解
相关推荐: AI绘画ComfyUI | 圈内人都在用的免费工作流网站
对于SD深度使用用户来说,基本都非常熟悉ComfyUl工作流,ComfyUl具有高度的自定义性和灵活性,允许用户通过构建节点图来定义生成过程,从而实现名种独特的创作。 ComfyUl能够生成精美的图像、富有创意的设计等,用户可以根据自己的想法和需求,自由组合各…
前言
Stable Diffusion在图像生成方面取得了很大的成功,其核心原理是LDM(Latent Diffusion Models),在论文《High-Resolution Image Synthesis with Latent Diffusion Models》中被提出,使用潜在扩散模型进行高分辨率图像生成,发表在CVPR2022上。LDM作者和VQGAN的作者相同。接下来对LDM这篇论文进行详细介绍。
一、LDM原理
Diffusion Model(DM)的训练和推理速度太慢,需要占用大量的计算资源。因此LDM想解决的就是在不降低DM的图像生成能力的基础上降低计算量。

论文中总结到,对于基于最大似然的模型,训练可以分为两部分,先是进行感知压缩(perceptual compression),然后进行语义压缩(semantic compression)。(图像感知指的是图像的细节,图像语义指的是图像的主体是什么)。对于DM来说,在进行图像生成的时候,在前面的步骤中先是进行图像的语义生成,也就是确定图像的内容大概是什么东西,接下来的很多步骤都是进行图像的感知生成,也就是负责图像的细节生成。由于DM是在像素层面进行生成,所以计算量很大,并且DM的很多计算量都集中在图像的感知(细节)生成方面。
基于此LDM的目标就是想让DM只负责图像语义方面,而图像的感知(细节)方面交给其他的模型去负责。也就是让DM在潜在空间上去训练和推理。
二、模型结构

LDM的模型结构如上图所示。其主体是由自编码器部分(粉色)、DM部分(绿色)以及条件机制(灰色)三部分组成。在进行图像生成时,首先使用DM进行扩散获得具有语义信息的特征图,然后使用自编码器的解码器进行图像的感知生成获得最终的图片。
这样做有三个好处:1.DM在低维潜在空间进行扩散,计算量减少。2.利用了DM中的UNet模型的归纳偏置,这使得模型可以获得图像的空间结构,不用像之前VQVAE,VQGAN对于输入图像的极致压缩而失去了图像原有的空间结构。3.获得了一个通用的压缩模型,其潜在空间可以用于训练多个生成模型。接下里对LDM的三个部分分别进行介绍。
图像感知压缩
图像感知压缩模型(粉色部分)是基于之前的VQGAN工作,由自编码器组成,在训练时结合了感知损失和对抗损失,避免了只使用L1或L2损失引入的模糊现象。
对于输入的图像,编码器将其进行编码变换到潜在空间,然后解码器在潜在空间重构图像。为了避免高方差分布的潜在空间,LDM引入了两种正则化。一种是KL正则化,一种是VQ正则化。(在VQGAN中通过将潜在空间进行离散化避免高方差,而LDM的潜在空间是连续的。)
VQGAN在潜在空间进行自回归建模生成采样的时候,是使用的Transformer模型,相当于采样的是一维的序列,没有图片的空间结构。而LDM在潜在空间进行采样时,是由DM生成的具有归纳偏置的二维分布,具有空间特征结构。因此,LDM生成的图像更好的保留了细节部分。
同时,VQGAN由于使用的是Transformer进行建模采样,受Transformer自身特性影响,其序列长度是一维的且不会很长,这就导致最后将一维序列Reshape成二维特征图的时候特征图尺寸不会很大,所以其采样是高度压缩的,自然生成的图像失去了很多细节。而LDM使用DM生成的本身就是具有归纳偏置的二维特征采样,所以具有生成效果好。
DM
DM模型就是使用经典的DDPM模型,只不过扩散和采样从图像的像素空间转移到了潜在空间。对于DDPM的详细介绍可以看一下这篇博文:
DDPM详解
通过在潜在空间训练DM,可以使DM集中于图片中重要的语义信息减少计算量。
条件机制
在进行条件生成时是在DM的UNet中使用cross-attention机制实现。为了对不同的模态进行处理,使用不同利用的专业编码器
τ
θ
tau_theta
τθ(上图灰色部分)对条件进行编码获得
τ
θ
(
y
)
tau_theta(y)
τθ(y),然后将其输入到UNet中的cross-attention作交叉注意力计算。在进行条件生成的时候,LDM中的DM训练可以表示为下述公式:

三、模型训练与推理
LDM的训练与VQGAN一样是分为两部分。首先是先训练感知自编码器(粉色部分),接着在潜在空间上训练DM。
在进行推理的时候,先使用DM在潜在空间进行采样获得特征图,然后将其给解码器进行最终的图片生成。
总结
LDM通过在潜在空间进行DM训练采样,在没有降低图像生成质量的情况下大大提高了训练和推理速度,同时基于cross-attention条件机制,LDM与当时的SOTA方法相比取得了很好的结果。
文章来源于互联网:Stable Diffusion详解
相关推荐: 大厂是如何用好AI的?收下智行设计团队的AIGC实践报告
推荐阅读 引言 自 2023 年初以来,AIGC 蓬勃发展,对视觉设计领域产生了深远的影响。各式 AI 工具层出不穷,其中 Stable Diffuson 和 Midjourney 由于其丰富的模型、实用的性能,已成为设计师不可缺少的创意生产工具,它们不仅改变…
StableDiffusion基础知识
- Checkpoint可以简单理解, 模型就是画风, 但是画风不仅仅由模型决定, 还可以用Lora和VAE影响画风
- 想要换画风就切换模型
- 想要提高细节, 就增加迭代步数
- 像增加元素就增加提示词
- 随机种子不固定式, -1就是随机种子
模型下载的网站:
1,civitai.com
2,liblibai.com
备注:
下载模型时
1, 有的模型会有一个 xxx.vae.pt, 代表这是亮度对比的修正档版本, 会让画面的输出亮度, 对比度, 饱和度都变高; 如果你发现你下载的模型, 灰蒙蒙的, 亮度不够, 可以去对应模型找是否有.vae版本的
2, 有的模型会带着 xxx-pruned.ckpt, 代表是纯净版, 有部分删减, 有可能pruned版本会将部分风格移除掉
3, 有些模型会分为xxx-ema.safetensors或者xxx-nonema-safetensors模型, 简单说, 是代表使用模型的自由度是否高, 如果需要模型自由发挥, 可以选不同的ema版本
Checkpoint:
下载下来的Checkpoint, 底模
下载下来的模型放在根目录下models/Stable-diffusion文件夹下, 之后在页面刷新就可以看到checkpoint了
以前的格式可能为.ckpt, 后来格式都统一成.safetensors, 所以优先下载.safetensors, 他的载入速度会更快
一般checkpoint都在几G左右, 几百M的需要自己识别是否有安全风险
下载时
文章来源于互联网:Stable Diffusion
相关推荐: whisper之初步使用记录
文章目录 前言 一、whisper是什么? 二、使用步骤 1.安装 2.python调用 3.识别效果评估 4.一点封装 5.参考链接 总结 前言 随着AI大模型的不断发展,语音识别等周边内容也再次引发关注,通过语音转文字再与大模型交互,从而实现语音与大模型交…
1. 字生图
1.content
2.想要什么
3.成品

4. 不想要什么

5.文生图参数说明


6.迭代的作用 – 图片更细致

7.尺寸有最低要求 512*768, 不然会畸形

2.修复
1.面部修复(先保留种子)
1.设置


- 重绘修复面部
2. 平铺生成连续性图案支持任何图片

使用前(先保留种子)

使用后的结果

你就说连续不连续吧ヾ(●´∀`●)
3.高清修复(放大图像)
default size: 512*512, 这个尺寸是生成图片的基准, 太大的尺寸会生成畸形的图片
放大图片的高清算法下图这个比较合适.

迭代和重绘只适用Latent算法(重绘
1.选择放大比例 宽和高的N倍(先保留种子)

2.放大两倍展示

结果如下

感觉没变化 再来一次
开始


结果:

结论: 首先这次放的是原图, 不是截图, 所以没有很亮. 然后确实放大了并且不模糊, 图片内容也是没有变化的
3.图生图
根据现有的一副图像生成新的图像
1. 根据已有图像生图
根据提示词按重绘幅度的参数修改上传图片.
1.上传一副图像


2. 输入提示词
analog style 模拟风格
3.设置参数

结果
0.7的

我的默认值是0.75

反正没看出来有哪些相似, 在低点我看看
0.5 的

你能看出我的提示词是 Yang M,masterpiece,best quality,
Yang Mi 好吧 我打少了一个字母
2.仅调整大小 (需要按原图比例)
仅修改图片尺寸
本质是将每个像素放大, 会导致模糊, 建议使用调整大小(浅空间放大)

修改为原来长宽的2分之一 结果: 我是没看出什么区别啦╥﹏╥

但是从下图可以看出确实变成了原来的四分之一.

不按比例的结果如下

3.裁剪后缩放
横向拉伸, 纵向裁掉多的
要求的尺寸远大于原来的长宽
结果是按要求尺寸的比例截取原图的一部分,
然后进行尺寸的缩放(放), 生成的图像虽然只是是原图的一部分但是尺寸确实很大

3.缩放后填充
用边缘的颜色进行填充
目标尺寸>原尺寸, 结果:

目标尺寸 在原图的基础上填充至目标尺寸比例

4.调整大小(浅空间放大)
注意调整 重绘幅度至少0.5

200*200:

0.5 这什么玩意??(#`O′)

使用原尺寸 0.5重绘幅度, 这是给我整了个 狗美少女的节奏吗

5. CLIP反推
根据上传图片反推出一句话.

我…

换张简单的
还是不行, 不知道啥问题, 下一个
6. DpBooru 根据上传图片反推提示词
根据图片分析 得出提示词



重绘为0:

重绘为0.5:(加了其他的提示词, 不然有点吓人 o(╥﹏╥)o )

重绘为1:(尺寸调为1/4) 和原图没有关系了

重绘为0.7:(尺寸调为1/4)

重绘为0.5:(尺寸调为1/4) 0.3 0.45 都有点吓人

7.涂鸦 圆你画家梦想

注意 改修饰词了

我感觉自己可能用这个功能画不出什么像样的图片. o(╥﹏╥)o
8. 局部重绘 修复图片
这个是我刚刚准备的 兔兔残疾图(不是故意的, 实数能力不足)

从结果来看, 1. 用得好这是个p图神器(但我没学会) 2. 但是我解锁了新世界 (不是故意的)

本子又多了一个出处 (/ω\)
9.蒙版边缘模糊度
又名 mask blur 高斯模糊, 范围0-64,默认为4. 64时, 蒙版几乎消失. 就是说和原图是一样的

试一试
为0时, 提示词: Yellow skin,thick lips,
注意蒙版模式:
1.

2.

原图:

结果:

为64时,和原图没有区别

10.蒙版区域处理

以下结果都是重绘幅度为零的结果
填充


原版


潜空间噪声:


空白潜空间:


##11. 涂鸦重绘
就是将涂鸦和重绘结合起来.
The last update was on June 30, 2024 at 23:42:21
文章来源于互联网:Stable Diffusion
相关推荐: 【AIGC】AI作图最全提示词prompt集合(收藏级)
目录 一、正向和负向提示词 二、作图参数 你好,我是giszz. AI做图真是太爽了,解放生产力,发展生产力。 但是,你是不是也总疑惑,为什么别人的图,表现力那么丰富呢,而且指哪打哪,要什么有什么,而你只能等着AI“智能推荐”?从多次重复中,选一个勉强可用的呢…