Stable Diffusion扩散模型【详解】新手也能看懂!!

前言

文章目录
    • 1、Diffusion的整体过程
    • 2、加噪过程
      • 2.1 加噪的具体细节
      • 2.2 加噪过程的公式推导
    • 3、去噪过程
      • 3.1 图像概率分布
    • 4、损失函数
    • 5、 伪代码过程

此文涉及公式推导,需要参考这篇文章: Stable Diffusion扩散模型推导公式的基础知识

1、Diffusion的整体过程

扩散过程是模拟图像加噪的逆向过程,也就是实现去噪的过程,
加噪是如下图从右到左的过程,称为反向扩散过程,
去噪是从左往右的过程,称为前向扩散过程,

在这里插入图片描述

2、加噪过程

加噪过程如下图,下一时刻的图像是在上一时刻图像的基础上加入噪音生成的,
图中公式的含义: x t x_t xt​表示 t 时刻的图像, ϵ t \epsilon_t ϵt​ 表示 t 时刻生成的随机分布的噪声图像, β t \beta_t βt​表示 t 时刻指定的常数,不同时刻的 β t \beta_t βt​不同,随着时间 t 的递增而增加,但需要注意 β t \beta_t βt​的值始终是比较小的,因为要让图像的数值占较大的比例,

在这里插入图片描述

本次教程将使用AI绘画工具 Stable Diffusion 进行讲解,如还未安装SD的小伙伴可以扫描免费获取哦~在这里插入图片描述
2.1 加噪的具体细节

A、将图像 x x x像素值映射到[-1,1]之间

图像加噪不是在原有图像上进行加噪的,而是通过把图片的每个像素的值转换为-1到1之间,比如像素的值是 x x x,则需要经过下面公式的处理 x 255 × 2 − 1 \frac{x}{255}\times2-1 255x​×2−1,转换到范围是-1到1之间,

代码:

def get_transform():class RescaleChannels(object):def __call__(self, sample):return 2 * sample - 1return torchvision.transforms.Compose([torchvision.transforms.ToTensor(), RescaleChannels()])

B、生成一张尺寸相同的噪声图片,像素值服从标准正态分布
ϵ ∼ N ( 0 , 1 ) \epsilon \sim N(0,1) ϵ∼N(0,1)

x = {Tensor:(2, 3, 32, 32)}
noise = torch.randn_like(x)

C、 α \alpha α和 β \beta β
每个时刻的 β t \beta_t βt​都各不相同,0 < β t \beta_t βt​< 1,因为 β t \beta_t βt​是作为权重存在的,且 β 1 < β 2 < β 3 < β T − 1 < β T \beta_1< \beta_2< \beta_3< \beta_{T-1}< \beta_T β1​<β2​<β3​<βT−1​<βT​,

代码:

betas = generate_linear_schedule(args.num_timesteps,args.schedule_low * 1000 / args.num_timesteps,args.schedule_high * 1000 / args.num_timesteps)

β \beta β的取值代码,比如 β 1 \beta_1 β1​取值low, β T \beta_T βT​取值high,

# T:1000 Low/β1: 0.0001 high/βT: 0.02
def generate_linear_schedule(T, low, high):return np.linspace(low, high, T)

α t = 1 − β t \alpha_t=1-\beta_t αt​=1−βt​,

alphas = 1.0 - betas
alphas_cumprod = np.cumprod(alphas)
to_torch = partial(torch.tensor, dtype=torch.float32)
self.registerbuffer("betas", totorch(betas))
self.registerbuffer("alphas", totorch(alphas))
self.register_buffer("alphas_cumprod", to_torch(alphas_cumprod))
self.register_buffer("sqrt_alphas_cumpnod", to_torch(np.sqrt(alphas_cumprod)))
self.register_buffer("sart_one_minus_alphas_cumprod", to_torch(np.sqrt(1 - alphas_cumprod)))
self.registerbuffer("reciprocal sart_alphas", totorch(np.sart(1 / alphas)))
self.register_buffer("remove_noise_coeff", to_torch(betas / np.sqrt(1 - alphas_cumprod)))
self.registerbuffer("siqma",to_torch(np.sqrt(betas)))

D、任一时刻的图像 x t x_t xt​都可以由原图像 x 0 x_0 x0​直接生成(可以由含 x 0 x_0 x0​的公式直接表示)

x t x_t xt​与 x 0 x_0 x0​的关系: x t = 1 − α t ‾ ϵ + α t ‾ x 0 x_t=\sqrt{1-\overline{\alpha_t}}\epsilon+\sqrt{\overline{\alpha_t}}x_0 xt​=1−αt​​ ​ϵ+αt​​ ​x0​, α t = 1 − β t \alpha_t=1-\beta_t αt​=1−βt​, α t ‾ = α t α t − 1 . . . α 2 α 1 \overline{\alpha_t}=\alpha_t\alpha_{t-1}…\alpha_2\alpha_1 αt​​=αt​αt−1​…α2​α1​

由上式可知, β t \beta_t βt​是常数,则 α t \alpha_t αt​, 1 − α t ‾ \sqrt{1-\overline{\alpha_t}} 1−αt​​ ​, α t ‾ \sqrt{\overline{\alpha_t}} αt​​ ​也是常数, ϵ \epsilon ϵ也是已知的,所以可以直接由 x 0 x_0 x0​生成 x t x_t xt​,

def perturb_x(self, x, t, noise):return (extract(self.sqrt_alphas_cumprod, t, x.shape) * x +extract(self.sqrt_one_minus_alphas_cumprod, t, x.shape) * noise)
def extract(a, t, x_shape):b, *_ = t.shapeout = a.gather(-1, t)return out.reshape(b, *((1,) * (len(x_shape) - 1)))
2.2 加噪过程的公式推导

加噪过程:

在这里插入图片描述

加噪过程的公式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

在这里插入图片描述

3、去噪过程

去噪是加噪的逆过程,由时间T时刻的图像逐渐去噪到时刻为0的图像,
下面介绍一下由时刻为T的图像 x T x_T xT​去噪到时刻为T-1的图像 x T − 1 x_{T-1} xT−1​,输入为时刻为t的图像 x t x_t xt​和时刻t,喂给Unet网络生成 ϵ θ \epsilon_\theta ϵθ​,其中 θ \theta θ是Unet网络的所有参数,然后由下图中的 x t − 1 {\bf x}_{t-1} xt−1​的公式即可生成时刻为t-1的图像 x t − 1 {\bf x}_{t-1} xt−1​,

在这里插入图片描述

3.1 图像概率分布

去噪过程的2个假设:
(1)加噪过程看作马尔可夫链,假设去噪过程也是马尔可夫链,
(2)假设去噪过程是高斯分布,

在这里插入图片描述

假设数据集中有100张图片,每张图片的shape是4x4x3,假设每张图片的每个channel的每个像素点都服从正态分布, x t − 1 x_{t-1} xt−1​的正态分布的均值 μ \mu μ 和方差 σ 2 \sigma^2 σ2 只和 x t x_t xt​有关,已知在t时刻的图像,求t-1时刻的图像,

在这里插入图片描述

1、因为均值和方差 μ ( x t ) \mu(x_t) μ(xt​), σ 2 ( x t ) \sigma^2(x_t) σ2(xt​) 无法求出,所以我们决定让网络来帮我们预测均值和方差,
2、因为每一个像素都有自己的分布,都要预测出一个均值和方差,所以网络输出的尺寸需要和图像尺寸一致,所以我们选用 UNet 网络,
3、作者在论文中表示,方差并不会影响结果,所以网络只要预测均值就可以了,也就是说UNet网络输出只需要输出均值就可以了,

4、损失函数

在这里插入图片描述
我们要求极大似然的最大值,需要对 μ \mu μ和 σ \sigma σ求导,但是对于扩散的过程是不可行的,如下面的公式无法求出,因为 x 1 : x T x_1:x_T x1​:xT​的不同组合所求出的 x 0 x_0 x0​的值也不同,
p ( x 0 ) = ∫ x 1 : x T p ( x 0 ∣ x 1 : x T ) d x 1 : x T p(x_0)=\int_{x_1:x_T}p(x_0|x_1:x_T)d_{x_1:x_T} p(x0​)=∫x1​:xT​​p(x0​∣x1​:xT​)dx1​:xT​​

为了实现对极大似然函数的求导,把对极大似然求导的问题转换为ELBO :Evidence Lower Bound

在这里插入图片描述

对ELBO的公式继续进行化简,

在这里插入图片描述
在这里插入图片描述
首先来看 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1​∣xt​,x0​)表示已知 x 0 x_0 x0​和 x t x_t xt​的情况下推导 x t − 1 x_{t-1} xt−1​,这个公式是可以求解的,如上图公式推导; p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{t-1}|x_t) pθ​(xt−1​∣xt​)需要使用 Unet 预测出该分布的均值,

q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1​∣xt​,x0​)公式的推导如下:

在这里插入图片描述
在这里插入图片描述

综上可知,UNet是在预测下面的公式,下面的公式中除了 ϵ \epsilon ϵ之外都是已知量,所以UNet网络实际预测的就是 ϵ \epsilon ϵ,
在这里插入图片描述

5、 伪代码过程

下图是训练阶段的伪代码,第1行和第6行表示第2行到第5行的代码一直在循环,直到模型收敛,
第2行:从数据集中筛选出一张图像,即为 x 0 \bf{x}_0 x0​,
第3行:从0到 T T T的均匀分布中筛选出 t t t,源码中 T T T的范围设为1000,
第4行:从均值为0,方差为1的标准正态分布中采样出 ϵ \epsilon ϵ, ϵ \epsilon ϵ的size和 x 0 \bf{x}_0 x0​的size是相同的,
第5行: x t x_t xt​和从0到 T T T的均匀分布中筛选出的 t t t 喂给Unet,输出 ϵ θ \epsilon_\theta ϵθ​,和第4行代码采样出的 ϵ \epsilon ϵ, ∣ ∣ ϵ − ϵ θ ( . . . ) ∣ ∣ 2 ||\epsilon-\epsilon_\theta(…)||^2 ∣∣ϵ−ϵθ​(…)∣∣2的均方差作为损失函数,对这个损失函数求梯度进行参数更新,参数是Unet所有参数的集合 θ \theta θ,

在这里插入图片描述

下图是推导/采样/生成图片阶段的伪代码,

第1行:从随机分布中采样一个 x T {\bf x}_T xT​,
第2行:遍历从 T T T到1,
第3行:从随机分布中采样一个 z \bf{z} z,
第4行:已知 z \bf{z} z、 α t \alpha_t αt​、 σ t \sigma_t σt​, ϵ θ \epsilon_\theta ϵθ​是Unet网络生成的,就可以得到 x t − 1 {\bf x}_{t-1} xt−1​
循环2-4行代码,

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

这里分享给大家一份Adobe大神整理的《AIGC全家桶学习笔记》,相信大家会对AIGC有着更深入、更系统的理解。

有需要的朋友,可以点击下方免费领取!

在这里插入图片描述

AIGC所有方向的学习路线思维导图

这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。如果下面这个学习路线能帮助大家将AI利用到自身工作上去,那么我的使命也就完成了:
在这里插入图片描述

AIGC工具库

AIGC工具库是一个利用人工智能技术来生成应用程序的代码和内容的工具集合,通过使用AIGC工具库,能更加快速,准确的辅助我们学习AIGC
在这里插入图片描述

有需要的朋友,可以点击下方卡片免费领取!

在这里插入图片描述

精品AIGC学习书籍手册

书籍阅读永不过时,阅读AIGC经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验,结合自身案例融会贯通。

在这里插入图片描述

AI绘画视频合集

我们在学习的时候,往往书籍源码难以理解,阅读困难,这时候视频教程教程是就很适合了,生动形象加上案例实战,科学有趣才能更方便的学习下去。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548985.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构 ——— 顺序表oj题:编写函数,删除有序数组中的重复项

目录 题目要求 代码实现 题目要求 一个升序排列的数组 nums &#xff0c;要求原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;并返回删除后数组的新长度&#xff0c;元素的相对顺序应该保持一致 代码实现 代码演示&#xff1a; int removeDuplicate…

你要的Air201录音和播放录音功能?直接拿去!

最近拼拼收到同学们的疑问&#xff1a;Air201是否支持录音、播放录音功能&#xff1f; 必须支持&#xff01;Air201可是高集成化设计&#xff0c;并且Air201自带了ES8311音频解码芯片&#xff08;Audio Codec&#xff09;及MIC麦克&#xff0c;可支持本地的录音功能&#xff1…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章&#xff1a;SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例&#xff1a; 我们都知道自…

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品&#xff0c;简川訸执导&#xff0c;纪静蓉编剧&#xff0c;侯鸿亮任制片&#xff0c;殷桃、王骁领衔主演&#xff0c;章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 &#xff0c;改编自纪静蓉的小说《我不是废柴》。该剧于2…

上位机通讯汇川Plc3U和5U

开发过程中需要调用到汇川官网的两个动态库(ModbusTcpAPI.dll&#xff1b;StandardModbusApi.dll) 解压完成后找到上面的动态库复制到自己项目的根目录下面然后就可以进行下一步操作了 UI界面&#xff1a; 通讯类集成了3U和5U的连接断开以及读写方法&#xff1a; public clas…

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一&#xff09;变量定义(二&#xff09;变量的使用(三&#xff09;删除变量(四&#xff09;添加环境变量(五&#xff09;内部变量(六&#xff…

开源链动2+1模式AI智能名片小程序源码:放大特色,构建独特竞争力

摘要&#xff1a;本文探讨在当今社会背景下&#xff0c;开源链动21模式AI智能名片小程序源码如何通过坚持与众不同来构建独特竞争力。在信息传播便捷但个体易同质化的时代&#xff0c;拥有特色是脱颖而出的关键&#xff0c;而这种模式下的小程序源码具有独特的发展潜力。 一、引…

有效解决配置管理混乱,麒麟桌面操作系统V10 sp1 2403最新版本推出统一配置系统

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 当前桌面操作系统中可通过配置定义的应用有限&a…

使用 Git 帮助文档

聊聊如何更好地查阅官方文档。 ‍ git help 学习某个工具&#xff0c;官方文档是少不了的&#xff0c;也是最权威的。我们可以使用 git help 来查看帮助&#xff0c;该命令会列举出常用的命令和介绍&#xff1a; > git help usage: git [--version] [--help] [-C <pa…

十一假期地区人流量出行大数据分析:技术驱动下的深度洞察

随着国庆黄金周的临近&#xff0c;旅游市场再次迎来了一年一度的出行高峰。在这个数字化时代&#xff0c;如何利用大数据、第三方接口等先进技术进行数据采集与分析&#xff0c;以更精准地预测人流量、优化资源配置、提升旅游体验&#xff0c;成为了行业内外关注的焦点。 一、…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

Python 从入门到实战30(高级文件的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

MySQl查询分析工具 EXPLAIN ANALYZE

文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料&#xff1a;https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

高级前端进阶:揭秘 MemFire Cloud 的强大助力

在前端开发的道路上&#xff0c;我们总是在追求效率与速度的平衡&#xff0c;如何写出优雅的代码&#xff0c;如何让开发流程更加顺滑成为了每个前端开发者的目标。对于那些希望提升效率、减少繁琐开发步骤的开发者来说&#xff0c;MemFire Cloud&#xff0c;一款国产的一站式应…

Java生成Markdown格式内容

前一篇写的是markdown格式的文本内容转换保存为word文档&#xff0c;是假定已经有一个现成的markdown格式的文本&#xff0c;然后直接转换保存为word文档&#xff0c;不过在开发中&#xff0c;通常情况下&#xff0c;数据是从数据库中获取&#xff0c;拿到的数据映射到java对象…

嵌入式学习--LinuxDay04

嵌入式学习--LinuxDay04 shell脚本 1.1数组 1.1.1数组的赋值 1.1.2数组的调用 1.2函数 1.2.1函数的定义方式 1.2.2函数的调用 2.分文件编程 2.1源文件 2.2头文件 3.编译工具 3.1 gcc编译工具 3.2 gdb调试 4.make工具 4.1定义 4.2Makefile格式 4.3Makefile管理多个文件 4.4Makef…

Gartner 魔力象限:单一供应商安全访问服务边缘 2024,Palo Alto Networks 再次荣膺领导者

Gartner Magic Quadrant for Single-Vendor SASE 2024 Gartner 魔力象限&#xff1a;单一供应商安全访问服务边缘 2024&#xff0c;Palo Alto Networks 再次荣膺领导者 请访问原文链接&#xff1a;https://sysin.org/blog/gartner-magic-quadrant-single-vendor-sase-2024/&a…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代&#xff0c;抖音作为短视频直播的超级流量池&#xff0c;正深刻改变着人们的购物习惯。无数商家蜂拥而至&#xff0c;渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务&#xff0c;成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…