位置: IT常识 - 正文

Stable Diffusion 原理介绍与源码分析(一)(铡刀演示)

编辑:rootadmin
Stable Diffusion 原理介绍与源码分析(一) Stable Diffusion 原理介绍与源码分析(一)文章目录Stable Diffusion 原理介绍与源码分析(一)前言(与正文无关,可以忽略)总览说明Stable Diffusion 整体框架重要论文重要组成模块分析UNetModel 介绍ResBlock 的实现timestep_embedding 实现Prompt 文本 embedding 的实现SpatialTransformer 的实现小结前言(与正文无关,可以忽略)

推荐整理分享Stable Diffusion 原理介绍与源码分析(一)(铡刀演示),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:铡读什么字,铡刀演示,铡刀的视频,铡头视频,铡刀百科,铡头视频,铡头视频,铡这个字念什么,内容如对您有帮助,希望把文章链接给更多的朋友!

Stable Diffusion 是 Stability AI 公司开源的 AI 文生图扩散模型。之前在文章 扩散模型 (Diffusion Model) 简要介绍与源码分析 中介绍了扩散模型的原理与部分算法代码,满足基本的好奇心后便将其束之高阁,没成想近期 AIGC 的发展速度之快大大出乎我的意料,尤其是亲手跑出下面这张 AI 生成的图像, Stable Diffusion 终又重新回到我的视野:

作为一名算法工程师,需要有一双能看透事物本质的眼睛,这张图片最先吸引我的不是内容,而是其生成质量:图像高清、细节丰富,非之前看到的一些粗陋 Toy 可比,红框中标注出来的不协调之处,也是瑕不掩瑜。因此,进一步分析 Stable Diffusion 整个工程框架的原理,实在是迫在眉睫,期待日后能修复红框中的不协调之处,为 AIGC 的进一步发展做出一个技术人员应有的贡献。

总览

Stable Diffusion 整个框架的源码有上万行,没有必要全部分析。本文以 “文本生成图像(text to image)” 为主线,考察 Stable Diffusion 的运行流程以及各个重要的组成模块,在介绍时采用 “总-分” 的形式,先概括整体框架,再分析各个组件(如 DDPM、DDIM 等),另外针对代码中的部分非主流逻辑,比如 predict_cids、return_ids 这些小细节谈谈我的看法。文章内容较长,准备拆分成多个部分。

源码地址:Stable Diffusion

说明

之前我写过很多代码分析文章,但在我遇到问题重新去翻阅时,发现要快速定位到目标位置并准确理解代码意图,仍然存在很大困难,密密麻麻的整块代码,每一次阅读都仿若初见,不易理解,原因在于摘录时引入过多的实现细节,降低了信息的传播效率。

经过一番思考,我不再图省事,决定采用伪代码的方式记录核心原理。平时我深度分析代码时会采用这种方式,对代码进行额外的抽象,相对会耗些时间,但私以为这是有益处的。举个例子,比如 DDPM 模型前向 Diffusion 的代码,如果我用伪代码的方式去写,将是如下的效果:

可以看到,刨除掉无关的实现细节之后,DDPM 的实现是如此的简洁,倘若再配合一定的注释,可方便快速理解,让人获得一种整体而全面的掌控感。此外还应该在文中多增加框图、模型图等来对代码的实现细节进行更直观的展示。

可以在微信中搜索 “珍妮的算法之路” 或者 “world4458” 关注我的微信公众号, 可以及时获取最新原创技术文章更新.

另外可以看看知乎专栏 PoorMemory-机器学习, 以后文章也会发在知乎专栏中.

Stable Diffusion 整体框架

首先看下 Stable Diffusion 文本生成图像整体框架(文章绘图吐血…希望有一天 AI 能进行辅助):

上图框架内的模块较多,从上到下分为 3 块,我在图中使用 Part 1、2、3 进行了标注。框架包含训练 + 采样两个阶段,其中:

训练阶段 (查看图中 Part 1 和 Part 2),主要包含:

使用 AutoEncoderKL 自编码器将图像 Image 从 pixel space 映射到 latent space,学习图像的隐式表达,注意 AutoEncoderKL 编码器已提前训练好,参数是固定的。此时 Image 的大小将从 [B, C, H, W] 转换为 [B, Z, H/8, W/8],其中 Z 表示 latent space 下图像的 Channel 数。这一过程在 Stable Diffusion 代码中被称为 encode_first_stage;使用 FrozenCLIPEmbedder 文本编码器对 Prompt 提示词进行编码,生成大小为 [B, K, E] 的 embedding 表示(即 context),其中 K 表示文本最大编码长度 max length, E 表示 embedding 的大小。这一过程在 Stable Diffusion 代码中被称为 get_learned_conditioning;进行前向扩散过程(Diffusion Process),对图像的隐式表达进行不断加噪,该过程调用 UNetModel 完成;UNetModel 同时接收图像的隐式表达 latent image 以及文本 embedding context,在训练时以 context 作为 condition,使用 Attention 机制来更好的学习文本与图像的匹配关系;扩散模型输出噪声 ϵθ\epsilon_{\theta}ϵθ​,计算和真实噪声之间的误差作为 Loss,通过反向传播算法更新 UNetModel 模型的参数,注意这个过程中 AutoEncoderKL 和 FrozenCLIPEmbedder 中的参数不会被更新。

采样阶段(查看图中 Part 2 和 Part 3),也就是我们加载模型参数后,输入提示词就能产出图像的阶段。主要包含:

使用 FrozenCLIPEmbedder 文本编码器对 Prompt 提示词进行编码,生成大小为 [B, K, E] 的 embedding 表示(即 context);随机产出大小为 [B, Z, H/8, W/8] 的噪声 Noise,利用训练好的 UNetModel 模型,按照 DDPM/DDIM/PLMS 等算法迭代 T 次,将噪声不断去除,恢复出图像的 latent 表示;使用 AutoEncoderKL 对图像的 latent 表示(大小为 [B, Z, H/8, W/8])进行 decode(解码),最终恢复出 pixel space 的图像,图像大小为 [B, C, H, W]; 这一过程在 Stable Diffusion 中被称为 decode_first_stage。

经过上面的介绍,对 Stable Diffusion 整体会有个较清晰的认识,下面就可以按图索骥,将各个重点模块尽力去弄明白。限于个人精力与有限的空闲时间,目前除了 FrozenCLIPEmbedder 和 DPM 算法 (图中没写),Stable Diffusion 的其他模块都大致看了看,包括:

UNetModelAutoEncoderKL & VQModelInterface (也是一种变分自动编码器,图上没画)DDPM、DDIM、PLMS 算法Stable Diffusion 原理介绍与源码分析(一)(铡刀演示)

后面会简单介绍一下,记录学习过程。

重要论文

在阅读代码的过程中,发现有些重量级的论文必须得阅读一下。扩散模型的理论推导还是有些复杂的,有时候公式推导和代码实现相互结合看,可以加深对知识的理解。这里列一下对我阅读代码有很大帮助的论文:

Denoising Diffusion Probabilistic Models : DDPM,这个是必看的,推推公式Denoising Diffusion Implicit Models :DDIM,对 DDPM 的改进Pseudo Numerical Methods for Diffusion Models on Manifolds :PNMD/PLMS,对 DDPM 的改进High-Resolution Image Synthesis with Latent Diffusion Models :Latent-Diffusion,必看Neural Discrete Representation Learning : VQVAE,简单翻了翻,示意图非常形象,很容易了解其做法重要组成模块分析

下面对 Stable Diffusion 中的重要组成模块进行简要分析。主要包含:

UNetModelDDPM、DDIM、PLMS 算法AutoEncoderKL对部分非主流的逻辑,如 predict_cids、return_ids 等谈谈看法

首先介绍一下 UNetModel 结构,方便后续的文章直接进行引用。

UNetModel 介绍

画了一下 Stable Diffusion 中使用的 UNetModel,就不分析代码了,看图很容易将代码写出来。Stable Diffusion 采用 UNetModel 这种 Encoder-Decoder 结构来实现扩散的过程,对噪声进行预估, 网络结构如下:

模型的输入包含三个部分:

大小为 [B, C, H, W] 的图像 image; 注意不用在意表示大小时所用的符号,应将它们视作接口,比如 UNetModel 接收大小为 [B, Z, H/8, W/8] 的 noise latent image 作为输入时,这里的 C 就等于 Z, H 就等于 H/8, W 就等于 W/8;大小为 [B,] 的 timesteps大小为 [B, K, E] 的文本 embedding 表示 context, 其中 K 表示最大编码长度,E 表示 embedding 大小

模型使用 DownSample 和 UpSample 来对样本进行下采样和上采样,此外出现最多的模块是 ResBlock 以及 SpatialTransformer,其中图中每一个 ResBlock 接收来自上一个模块的输入以及 timesteps 对应的 embedding timestep_emb (大小为 [B, 4*M],M 是可配置的参数);而图中每一个 SpatialTransformer接收来自上一个模块的输入以及 context (Prompt 文本的 embedding 表示),使用 Cross Attention,以 context 为 condition,学习 Prompt 和图像的匹配关系。但图上只在虚线框中显示了两个模块有多个输入,其他模块没有画出来)

可以看到,最后模型的输出大小为 [B, C, H, W], 和输入大小相同,也就是说 UNetModel 不改变输入输出的大小。

下面再分别看看 ResBlock、timestep_embedding、context 以及 SpatialTransformer 的实现。

ResBlock 的实现

ResBlock 网络结构图如下,它接受两个输入,图像 x 以及 timestep 对应的 embedding:

timestep_embedding 实现

timestep_embedding 的生成方式如下,用的是 Tranformer(Attention is All you Need)这篇 paper 中的方法:

Prompt 文本 embedding 的实现

即 context 的实现。Prompt 使用 CLIP 模型进行编码,我没有对 CLIP 模型详细学习,暂时也没有深入看的打算,后续有机会再补充;代码中使用预训练好的 CLIP 生成 context:

SpatialTransformer 的实现

最后再看下 SpatialTransformer 的实现,其模块比较多,在接收图像作为输入时,还使用 context 文本作为 condition 信息,二者使用 Cross Attention 进行建模。进一步展开 SpatialTransformer, 发现包含 BasicTransformerBlock ,它实际调用 Cross Attention 模块,而在 Cross Attention 模块中,图像信息作为 Query,文本信息作为 Key & Value,模型会关注图像和文本各部分内容的相关性:

我觉得可以用一种朴素的想法来理解这里 Cross Attention 的作用,比如训练时给定一张马吃草的图,以及文本提示词:“一匹白色的马在沙漠吃草”,在做 Attention 时,文本中的 “马” 这个关键词和图像中的动物(也是 “马”)的关联性更强,因为权重也更大,而 “一匹”、 “白色”、“沙漠”、 “草” 等权重更低;此时,当模型被训练的很好后,模型不仅将可以学习到图像和文本之间的匹配关系,通过 Attention 还可以学习到文本中的各个关键词想突出图像中哪些主体。

而当我们输入提示词用模型来生成图像时,比如输入 “一匹马在吃草”,由于模型此时已经能捕捉图像和文本的相关性以及文本中的重点信息,当它看到文本 “马”,在黑盒魔法的运作下,会重点突出图像 “马” 的生成;当它看到 “草” 时,便重点突出图像 “草” 的生成,从而尽可能生成和文本进行匹配的图像。

至此,UNetModel 各个重要组件基本介绍完毕。

小结

由于 UNetModel 模型结构并不复杂,看图基本就能写出代码,一图胜千言啊。另外我标注了每个模块输出结果的大小,很方便在大脑中运行模型,哈哈哈。

本文大致介绍了一下 Stable Diffusion 文生图代码的整体框架,列出了扩散模型部分核心论文,简要分析了 UNetModel。后续再分析其他核心组件。

发现 AIGC 的发展实在太快了,学不过来啊… 愈发觉得庄子所言甚是:以有涯随无涯,殆矣!

本文链接地址:https://www.jiuchutong.com/zhishi/298370.html 转载请保留说明!

上一篇:Javascript 基础知识学习(javascript入门基础)

下一篇:Vue3通透教程【三】Vue3代码初体验找不同

  • 如何做好微信公众号的运营推广(如何做好微信公众号的用户分析)

    如何做好微信公众号的运营推广(如何做好微信公众号的用户分析)

  • 支付宝怎么看银行卡卡号全部数字(支付宝怎么看银行卡开户行地址)

    支付宝怎么看银行卡卡号全部数字(支付宝怎么看银行卡开户行地址)

  • oppo隐私相册照片在哪里找(oppo隐私相册照片删除怎么恢复)

    oppo隐私相册照片在哪里找(oppo隐私相册照片删除怎么恢复)

  • win7没有我的电脑图标(win7我的电脑没有了)

    win7没有我的电脑图标(win7我的电脑没有了)

  • 三网通充值卡使用步骤

    三网通充值卡使用步骤

  • iPhonexsmax喇叭电流声(iphone xs max 喇叭)

    iPhonexsmax喇叭电流声(iphone xs max 喇叭)

  • vivoz1怎么发只有字没有图片的朋友圈 (vivo手机微信朋友圈怎么只发文字不发图片)

    vivoz1怎么发只有字没有图片的朋友圈 (vivo手机微信朋友圈怎么只发文字不发图片)

  • 小米解锁bl一直显示未连接(小米解锁bl后)

    小米解锁bl一直显示未连接(小米解锁bl后)

  • 淘宝待发货待收货不显示数量怎么办(淘宝待发货待收怎么退款)

    淘宝待发货待收货不显示数量怎么办(淘宝待发货待收怎么退款)

  • xr闪光灯怎么设置(xr怎么设置闪光)

    xr闪光灯怎么设置(xr怎么设置闪光)

  • 信号hd怎么关闭(vivo手机hd怎么关闭)

    信号hd怎么关闭(vivo手机hd怎么关闭)

  • 怎样取消qq里面的隐藏会话(怎样取消qq里面的关注)

    怎样取消qq里面的隐藏会话(怎样取消qq里面的关注)

  • vivos6屏幕材质(vivos6屏幕材质是什么)

    vivos6屏幕材质(vivos6屏幕材质是什么)

  • 高通骁龙八核什么意思(高通骁龙八核手机)

    高通骁龙八核什么意思(高通骁龙八核手机)

  • 电话拉黑了是怎么提示(电话拉黑了是怎么回事儿)

    电话拉黑了是怎么提示(电话拉黑了是怎么回事儿)

  • 手机照片怎么加字幕(手机照片怎么加字)

    手机照片怎么加字幕(手机照片怎么加字)

  • 怎么解除绑定手机号(怎么解除绑定手机上的健康码)

    怎么解除绑定手机号(怎么解除绑定手机上的健康码)

  • ygps是什么(rgps是什么)

    ygps是什么(rgps是什么)

  • 闲鱼卖家设置自动回复(闲鱼卖家设置自提但是卖家发快递了有问题吗)

    闲鱼卖家设置自动回复(闲鱼卖家设置自提但是卖家发快递了有问题吗)

  • 苹果按键音怎么设置声音大小(苹果按键音怎么开)

    苹果按键音怎么设置声音大小(苹果按键音怎么开)

  • 华为p30pro呼吸灯在哪(华为p30pro有呼吸灯)

    华为p30pro呼吸灯在哪(华为p30pro有呼吸灯)

  • a9x和a9有什么区别(a9x与a9)

    a9x和a9有什么区别(a9x与a9)

  • opporeno和opporenoz有什么区别(opp reno z)

    opporeno和opporenoz有什么区别(opp reno z)

  • p30pro红外线怎么用(华为p30pro红外线功能)

    p30pro红外线怎么用(华为p30pro红外线功能)

  • 设置垂直框线为无word(垂直框列表怎么增加项目)

    设置垂直框线为无word(垂直框列表怎么增加项目)

  • Win10系统中,为什么打开WORD提示内存不足?(win10系统中为什么网络图标不能展开)

    Win10系统中,为什么打开WORD提示内存不足?(win10系统中为什么网络图标不能展开)

  • 如何用post的方式进行eventSource请求(post请求怎么用)

    如何用post的方式进行eventSource请求(post请求怎么用)

  • DINO 论文精度,并解析其模型结构 & DETR 的变体(精读论文分析)

    DINO 论文精度,并解析其模型结构 & DETR 的变体(精读论文分析)

  • 勒索软件、网络钓鱼、零信任和网络安全的新常态(勒索软件,网络不稳定)

    勒索软件、网络钓鱼、零信任和网络安全的新常态(勒索软件,网络不稳定)

  • 领用库存商品用于固定资产
  • 个税系统经营所得如何添加人员信息
  • 汇算清缴时有哪些需要调整的项目
  • 建筑业工会经费0.12% 怎么来的
  • 一次性支付一年房租怎么做账每月如何结转
  • 消费卡预付卡能入账吗
  • 行政单位预算资金拨付流程
  • 房产税计税依据
  • 补充医疗保险应享尽享方案
  • 企业租赁集体土地种植经济林如何补偿
  • 出口退税销项大于进项,需要交税吗
  • 建筑行业新老项目对比
  • 现金支票存根联需要盖章吗?
  • 进口后的技术服务费
  • 企业重组中撤资所得税有哪些处理规则?
  • 简易注销还要去找专管员
  • 广告发布税收编码
  • 房地产开发企业需要缴纳哪些税
  • 定金转为货款如何表述
  • 劳务收入不足800
  • 代发保险款收入
  • 费用报销交通费
  • 特种车辆租赁需要什么资质
  • 已计提月份的公式
  • macbookpro怎么添加文件夹
  • 增值税进项税已勾选没确认能自动生成吗
  • 个体户流水太大工商局会查吗
  • 应收账款转账
  • 官网下载的iso怎么用u盘安装
  • win7纯净版怎么联网
  • 增值税专用发票有几联?
  • 增值税发票要审核成功才能开吗
  • 高校教材pdf
  • 出口退税运费的账务处理
  • 房地产预售收入如何缴纳所得税
  • php获取文章内容图片
  • 企业所得税可以结转以后年度扣除的费用
  • php关闭错误报告
  • 2023 年值得关注的 9 个 Web3 发展趋势
  • 小程序设计制作
  • kill命令用法
  • 帝国cms是基于什么的
  • 未形成无形资产计入当期损益的
  • 对公帐户进出帐要交税吗
  • pythonif嵌套语句
  • 帝国cms灵动标签调用外表
  • 调整以前年度销项税怎么填申报表
  • 资产负债表中的货币资金怎么算
  • 购进已经折旧提完的二手车
  • 公司油票发票信息怎么查
  • 哪些所得需要去税务登记
  • mysql新手教程
  • 增值税税率为零的有哪些项目
  • 报销招待费的会计科目
  • 残疾人就业保障金是什么意思啊
  • 公益性捐赠会计利润总额计算方法
  • 收到银行利息记什么会计科目
  • 关于读书的名言名句
  • mysql获取当前行数
  • 系统诊断工具命令
  • win8.1输入法打不了中文
  • win8设备管理器在哪里打开
  • 如何进入xp系统
  • centos删除vg
  • win8超级按钮在哪
  • linux备份恢复
  • win7系统中怎样
  • java的理解
  • jquery的实现原理
  • wifi显示开发状态
  • 一个简单的小实验
  • 笔记本等待网络准备好
  • vue组件的使用步骤
  • 深入学习习总书记系列讲话精神
  • jquery移动div到另一个div中
  • jq点击图片让图片进行切换
  • unity二段跳
  • 数字图像处理软件idl和matlab有什么异同点
  • 福建地税网
  • 汽车票换票需要手续费吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设