Stable Diffusion 文生图技术原理
图像生成模型简介
图片生成领域来说,有四大主流生成模型:生成对抗模型(GAN)、变分自动编码器(VAE)、流模型(Flow based Model)、扩散模型(Diffusion Model)。
从2022年开始,主要爆火的图片生成模型是Diffusion Model(扩散模型)为主。

Diffusion Model:扩散模型,当前DALL-E, Midjourney, Stable Diffusion图片生成的核心都是Diffusion Model,它就是通过不停去除噪音期望获得好结果的生成模型。

早期的扩散模型在AI绘画中效果不好,而且单张图生成需要10-15分钟,后来英国 Stability AI 公司对模型进行了改进并开源,把图片生成稳定性和质量都大幅提高,图片生成速度提高了100倍,意味着以前需要10-15分钟(600-900秒)现在只需要6-10秒就可以生成一张图。
在Stable Diffusion(稳定扩散模型)出现之前,是有一个稳定扩散模型(Latent Diffusion),是Latent Difusion论文中的text2image模型。
Latent Diffusion Model: 潜在扩散模型,是扩散模型的一种变体,最大的区别是,它把图片压缩,降维,压缩后的空间叫Latent Space(潜在空间或隐空间),这样可以大幅减少计算量,有了这个技术我们才可以在普通GPU上生成图片。另外,Diffusion model不仅可以生成图像,还可以生成音频、视频。

Stability Al改进了Latent diffusion,新模型叫做 Stable Diffusion。改进点包括:
(1) 训练数据:Latent diffusion是采用laion-400M数据训练的,而Stable diffusion是在laion-2B.en数据集上训练的,明显后者用了更多的训练数据,而且后者也采用了数据筛选来提升数据质量,比如去掉有水印的图像以及选择美学评分较高的图像
(2) text-encoder:Latent diffusion采用一个随机初始化的transformer来编码text,而Stable difusion采用一个预训练好的CLIP text encoder来编码text,预训练的text model往往要优于从零开始训练的模型
(3) 训练尺寸:Latent diffusion只是在256x256分辨率上训练,而Stable diffusion先在256x256分辨率上预训练,然后再在512x512分辨率上Finetune
总结:Stable diffusion使用了更好的text encoder在更大的数据集上训练,并且能生成更高分辨率图像,所以目前图片生成效果 Stable Diffusion更好。
Stable Diffusion推理过程

更细化的推理过程:

过程:prompt text(cat girl) -> CLIP -> text embedding -> diffusion(U-Net + Scheduler)-> VAE -> generate image
Stable Diffusion底层工作机制
Step 1. 输入提示词,解析提示词:文本图片编码器CLIP
Step 2. 基于提示词表征生成图像表征:基于U-Net的Diffusion过程(U-Net + Scheduler)
Step 3. 图片输入输出的处理转换:VAE(图像解码器负责latent space到pixel space的图像生成)
下面分别解析每一步骤的原理。
CLIP
CLIP(Contrastive Language-Image Pre-training): 图文对比学习的预训练模型

CLIP不是完全的理解语义,只是想个方法把文字和图像对应起来:

文本编码为text embedding只是CLIP的中间产物。
CLIP的训练集:

训练集:400 million image-text pairs(4亿)
训练过程

同一个batch里面对比学习,对角线为正样本,其他的均为负样本,CLIP的训练目标就是最大 N 个正样本的相似度,同时最小化 N^2 - N 个负样本的相似度。
这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系:同义的图文对得分高,不同的得分低。
简单说:就是把文字和图片放到一个矩阵空间里,用来解决文本到图片的映射和相似性交集,方便通过文本找到对应图像的分布。
trick:batch越大训练效果越好。

需要多大CLIP模型?
论文:《Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding》
paper:https://arxiv.org/abs/2205.11487

说明:FID↓ CLIP Score ↑
增加语言模型的encoder大小比增加图像扩散模型的大小更能提高图像-文本对齐。
FID(Fréchet Inception Distance)
paper:https://arxiv.org/abs/1706.08500

FID是度量真实图像和生成图像的特征分布(假设是高斯分布)的距离,要求需要很多特征分布(FID-10K是10K张图),FID得分越小越好,代表生成的图越像真图。
Diffusion Model
基于Diffusion Model的思路实现DDPM(Denoising Diffusion Probabilistic Models,去噪扩散概率模型)。
DDPM就是通过对数据不断加噪成为真实噪声,和从真实噪声不断去噪还原成原始数据的过程中,学习到去噪的过程,进而就能对真实噪声进行随机采样,还原(生成)成各式各样的数据了。

前向过程(forward process,也叫扩散过程diffusion process)是指的对数据逐渐增加高斯噪音直至数据变成随机噪音的过程。
反向过程(reverse process 逆向过程)是一个去噪的过程,如果我们知道反向过程的每一步的真实分布,那么从一个随机噪音开始,逐渐去噪就能生成一个真实的样本,所以反向过程也就是生成数据的过程。
为啥要加噪声,为啥一步一步加噪声?
1)直接移除像素会导致信息丧失,添加噪声可以让模型学习到图片特征;
2)随机噪声还可以增加模型生成时的多样性;
3)一步一步的来可以控制这一过程,同时提供了去噪过程中的稳定性
每一步要加多少噪声?
这个根据schedule来,一般先少后多比较好,图片特征损失的比较慢

去噪的过程,可以类比为雕刻,米开朗基罗说:塑像本来就在石头里,我只是把不需要的部分去掉。
如何训练?
直接把随机噪声分step的添加到图片,这个过程就叫diffusion process(也叫Forward process,扩散/加噪),每个step就有ground truth的图片,训练模型还原图片。

还原图片的过程:

1)输入原图(覆盖了step=50的noise)和step=50,用U-Net预测图片的noise,这里每个step都共用相同的U-Net
2)噪声很多时,U-Net无法预测精准的图片细节,只能预测很模型的图片大概轮廓

3)这样不断重复预测,直到得到原图
实际DDPM的加噪过程是不需要逐步处理,可以一次把指定step的高斯噪声加到位,然后逐步预测噪声。
论文:《Denoising Diffusion Probabilistic Models》
paper: https://arxiv.org/abs/2006.11239

论文:《Understanding Diffusion Models: A Unified Perspective》
paper:https://arxiv.org/abs/2208.11970
噪声采样方案
扩散模型很大的过程在于噪音的采样,模型采样需要从纯噪声图片出发,一步一步不断地去噪,最终得到清晰的图片。在这个过程中,模型必须串行地计算至少 50 到 100 步才可以获得较高质量的图片,这导致生成一张图片需要的时间是其它深度生成模型的 50 到 100 倍,极大地限制了模型的部署和落地。
这些采样过程,映射到Stable Diffusion里主要就是一个个 Scheduler,在 Stable Diffusion 中 Scheduler(调度)的主要作用是按照当前生成噪音是第几步(Step)然后输出生成图片噪声的系数,它简单计算公式是:( 图像噪声 = 随机生成噪声 * scheduler输出的系数 )。
在采样频次和速度的驱动要求下,扩散模型很重要的是加噪和去噪的采样方案,包括 DDPM、DDIM、PLMS 、DPM-Solver 等等。
DDPM(Denoising Diffusion Probabilistic Model)默认采用的是线性的加噪采样方案 (linear schedule)。
DDIM(Denoising Diffusion Implicit Models,去噪扩散隐式模型),DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程。
DPM-Solver(Diffusion Process Model Solver,扩散处理模型求解器)是清华大学朱军教授带领的TSAIL团队所提出的,一种针对于扩散模型特殊设计的高效求解器:该算法无需任何额外训练,同时适用于离散时间与连续时间的扩散模型,可以在 20 到 25 步内收敛,并且只用 10 到 15 步也能获得非常高质量的采样。在 Stable Diffusion 上,采样速度翻倍。
图片生成过程加入Text embedding

1)U-Net为了融入文本特征,网络结构里面补充了attention机制(QKV)
![]()
2)为了强化文本引导作用,这里用到了classifier free guidance的方法,这里的7.5参数就是guidance scale
不同guidance scale的图片效果:

扩散模型的核心就在于训练噪音预测模型,由于噪音和原始数据是同维度的,所以我们可以选择采用AutoEncoder架构来作为噪音预测模型。DDPM所采用的模型是一个基于residual block和attention block的U-Net模型。
Unet是2015年《U-Net: Convolutional Networks for Biomedical Image Segmentation》提出的模型。
UNet就是一个语义分割模型,其执行过程:
首先利用卷积进行下采样,然后提取出一层又一层的特征,利用这一层又一层的特征,其再进行上采样,最后得出一个每个像素点对应其种类的图像。
U-Net网络结构:

Unet的优势:
1. 网络层越深得到的特征图,有着更大的视野域;
2. 浅层卷积关注纹理特征,深层网络关注本质特征,所以深层浅层特征都有意义;
3. 通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征拼接,来实现边缘特征找回;
4. Unet简单、高效、易懂、容易构建,可以从小数据集构建,在diffusion model中简单好用。
VAE
VAE的作用:性能友好,可以在潜在空间插值和操作,控制图像生成

这里的编码器encoder和解码器decoder不是把图像缩小、放大,而是把图像做了编码,举个例子,音乐编码为乐谱,再通过乐谱演奏出乐曲,这里可以类比把声音编码为乐谱了。
VAE的结构

在编码器的训练过程中,VAE通过最小化重构误差来学习如何将输入数据映射到潜在空间中的概率分布。
在解码器的训练过程中,VAE通过最小化KL散度来学习如何从潜在空间中的随机向量生成原始数据。
VAE vs Diffusion Model:

VAE 的encoder是学习一个概率分布,所以VAE也可以随机采样生成图片,但VAE图片还原效果很弱,生成的图像模糊,效果不如diffusion model
VAE的好处:减少训练和推理时间,降低GPU硬件要求
原图512x512x3->压缩到64x64x4,Stable Diffusion用的是KL-f8的VAE,下采样系数为8,缩小了48倍

VAE的坏处:是压缩后再还原,图片细节会损失掉
Stable Diffusion的结构

Latent diffusion的论文:《High-Resolution Image Synthesis with Latent Diffusion Models》
paper:https://arxiv.org/abs/2112.10752

拆分解释:

Latent Diffusion Models整体框架如图,首先需要训练好一个自编码模型(AutoEncoder,包括一个编码器 E 和一个解码器 D )。这样一来,我们就可以利用编码器对图片进行压缩,然后在潜在表示空间上做diffusion操作,最后我们再用解码器恢复到原始像素空间即可,论文将这个方法称之为感知压缩(Perceptual Compression)。
Stable Diffusion的Control方法
Textual Inversion

调整CLIP让它输出符合新图片的文本特征,如双耳铃铛闹钟,迪迦奥特曼,只需要保存学习到的特征。
ControlNet

训练一个新的网络去调整U-Net的resnet block,这个新网络可以输入那些用来作为控制条件的图像,如canny线稿、骨骼图等。
结论
Diffusion Model 与常规过去的GAN、VAE、Flow 等常见的生成模型的机制不同,它是采用从高斯噪音中逐步依照一定条件 “采样” 特殊的分布,随着“采样”轮次的增加最终得到生成图片。 换句话说,Diffusion Model 的合成过程是通过一次次迭代在噪声中提取出所需要的图像,随着迭代步数的增加,合成质量也在越来越好 。
这种机制的好处是显而易见的,合成质量和合成速度之间变得可控了。当时间宽裕时可以通过高轮次的迭代获得高质量的合成样本,同时较低轮次的快速合成也可以得到没有明显瑕疵的合成样本。而高低轮次迭代之间完全不需要重新训练模型,只用手动调整一些轮次相关的参数。
这听起来有点匪夷所思,但其背后有着极强的数学逻辑支撑。这些数学主要就是马尔科夫链和朗之万公式。
参考文献
英文
Latent Diffusion论文:https://arxiv.org/pdf/2112.10752.pdf
Diffusion Models详细公式:What are Diffusion Models? | Lil'Log
各种微调模型方法对比:https://www.youtube.com/watch?v=dVjMiJsuR5o
Scheduler对比图来自论文: https://arxiv.org/pdf/2102.09672.pdf
VAE结构图出处:https://towardsdatascience.com/vae-variational-autoencoders-how-to-employ-neural-networks-to-generate-new-images-bdeb216ed2c0
柯基图来自DALLE2论文:https://cdn.openai.com/papers/dall-e-2.pdf
CLIP模型的介绍:https://github.com/openai/CLIP
OpenCLIP:https://github.com/mlfoundations/open_clip
Textual Inversion: An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion
LoRA论文:https://arxiv.org/pdf/2106.09685.pdf
Dreambooth 论文:https://arxiv.org/pdf/2208.12242.pdf
ControlNet 论文:https://arxiv.org/pdf/2302.05543.pdf
简单易懂的 Diffusion Model 解释:https://www.youtube.com/watch?v=1CIpzeNxIhU
很棒的Stable Diffusion解释:The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time.
同样很棒的SD解释:https://medium.com/@steinsfu/stable-diffusion-clearly-explained-ed008044e07e
GLIDE论文:https://arxiv.org/abs/2112.10741
CLASSIFIER-FREE DIFFUSION GUIDANCE论文:https://arxiv.org/pdf/2207.12598.pdf
中文
Stable Diffusion UNET 结构:Stable Diffusion UNET 结构 - 知乎
LoRA应用心得:你真的会用LORA吗?超详细讲解LORA分层控制 - 知乎
很棒的Stable Diffusion解释:扩散模型[译]_于建民的博客-CSDN博客
Stable Diffusion非常详细的介绍:【原创】万字长文讲解Stable Diffusion的AI绘画基本技术原理 - 知乎
扩散模型相关的解释:https://www.youtube.com/watch?v=hO57mntSMl0
相关文章:
Stable Diffusion 文生图技术原理
图像生成模型简介 图片生成领域来说,有四大主流生成模型:生成对抗模型(GAN)、变分自动编码器(VAE)、流模型(Flow based Model)、扩散模型(Diffusion Model)。…...
Jumpserver堡垒机管理(安装和相关操作)-------从小白到大神之路之学习运维第89天
第四阶段 时 间:2023年8月28日 参加人:全班人员 内 容: Jumpserver堡垒机管理 目录 一、堡垒机简介 (一)运维常见背黑锅场景 (二)背黑锅的主要原因 (三)解决背黑…...
伦敦金走势多变怎么办
投资知识比较丰富的朋友,应该知道一个品种的价格过于波动,对投资者来说并是一件不友好的事情,因为频繁的价格变化,对于收益的稳定性会产生负面的影响,也可能让投资者的持仓陷入进退维谷的尴尬境地。 黄金作为贵金属市场…...
MybatisPlus-插件篇
文章目录 一、前言二、插件1、分页插件2.1.1、引入依赖2.1.1、配置分页插件2.1.3、使用分页方法 2、乐观锁插件2.1、引入依赖2.2、添加版本字段2.3、配置乐观锁插件2.4、执行更新操作 三、总结 一、前言 本文将详细介绍mybatisplus中常用插件的使用。 二、插件 1、分页插件 …...
数学建模:熵权法
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 熵权法 构建原始矩阵 D a t a Data Data 形状为 m ∗ n m *n m∗n ,其中 m m m 为评价对象, n n n 为评价指标。对 D a t a Data Data矩阵的指标进行正向化处理,得到…...
软件测试实训系统建设方案
一 、系统概述 软件测试实训系统是软件开发过程中的一项重要测试活动,旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作,以实现整个软件系统的功能和性能。以下是软件测试实训系统的一般流程和步骤…...
部署 ssm 项目到云服务器上(购买云服务器 + 操作远程云服务器 + 服务器中的环境搭建 + 部署项目到服务器)
部署 Web 项目 1、获取 Linux 环境1.1、如何去买一个云服务器1.2、远程操作云服务器1.3、在 Linux 系统中搭建 Java Web 的运行环境。1)安装 JDK(使用包管理器 yum 来安装)2) 安装Tomcat3)安装 MySQL。 1.4、在云服务器…...
python爬虫-使用selenium自动登录微博
环境准备:anaconda、pycharm编辑器、chromedriver(记得下载) 首先查看本地anaconda的python环境和selenium版本号(不同版本的api接口可能不同) conda list python输出 # Name Version Build Channel ipython …...
Python 面试:可变类型和不可变类型作为函数参数,关键字参数
1. 可变类型作为参数 可变对象: list/set/dict 参数会指向可变对象的副本的地址,每次修改的是同一个对象。 def flist(l):l.append(0)print(l)ll [] flist(ll) flist(ll)输出为: [0] [0, 0] # 注意:l只是ll的一个副本,修改l不…...
Web3.0时代什么时候到来,Web3.0有什么机会?
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…...
vue心得
不是专业的前端开发,但因为E2E开发和架构设计的需要,必须对前端框架有一些了解。这两年项目前端在用vue,就记录一下vue的使用心得。 心得 component component: vue组件,可在其中完成界面呈现(V…...
JavaScript—数据类型、对象与构造方法
js是什么? JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。 js有哪些特点呢…...
自定义node-red节点中,如何编写节点的配置信息弹窗
前言 最近有读者通过博客向我咨询,在自定义node-red节点时,如何编写该节点的配置页面,就是我们通常见到的,双节节点打开的信息弹窗。如下图: 上面两张图,展示了inject节点与mqtt in 节点的配置弹窗。 在弹窗中,除了上面的删除,取消,完成,和下面的失效按钮。 中间…...
数据之美:探索数据可视化设计的奇妙世界
在信息时代的浪潮中,海量的数据正在影响着我们的生活和决策。然而,数据本身虽然有力量,但如何将其有机地呈现给我们,却成为了一个挑战。数据可视化设计应运而生,它不仅让枯燥的数字变得生动,还带来了一场视…...
docker初始化
避免僵尸进程 使用dump-init FROM node:16 AS builderRUN apt install dumb-init... ...ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["node", "dist/main"]使用tini docker run --init .......开启docker内部ssh docker exec -…...
【C语言】结构体变量引用的一个例子
文件test_funcs.c: #include <stdio.h> #include <stdlib.h>struct t_Test {int n1;int n2; };struct t_Test *alloc_Test(void) {struct t_Test *pTestNULL;pTestmalloc(sizeof(struct t_Test));pTest->n1 1;return pTest; }void func1(struct t_…...
美团笔试题之合并 K 个升序链表
文章目录 题目详情分析暴力求解两两合并链表 Java完整实现代码总结 题目详情 23 美团笔试真题 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 分析 暴力求解 将所有数值存入一个数组ÿ…...
C语言(第三十一天)
6. 调试举例1 求1!2!3!4!...10!的和,请看下面的代码: #include <stdio.h> //写一个代码求n的阶乘 int main() {int n 0;scanf("%d", &n);int i 1;int ret 1;for(i1; i<n; i){ret * i;}printf("%d\n", ret);return …...
【C/C++】虚析构 | 抽象类
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
MySQL 的隐式转换导致诡异现象的案例一则
正是因为 MySQL 对字符串进行隐式转换时会截断再转,而不是像 Oracle、SQL Server 这些数据库针对这种问题直接报错,所以才出现了这个诡异的问题。 作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
