当前位置: 首页 > article >正文

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

目录

  • 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)
  • DDPM 原理图
  • Stable Diffusion 原理
    • Stable Diffusion的原理解释
    • Stable Diffusion 和 Diffusion 的区别
    • Stable Diffusion 的Unet图讲解
    • Stable Diffusion 和Diffusion 的Unet对比
  • 参考

DDPM 原理图

​ DDPM包括两个过程:前向过程(forward process)反向过程(reverse process),其中前向过程又称为扩散过程(diffusion process),如下图所示。无论是前向过程还是反向过程都是一个参数化的马尔可夫链(Markov chain),其中反向过程可以用来生成图片。

在这里插入图片描述

DDPM 整体大概流程

​ 图中,由高斯随机噪声 x T x_T xT 生成原始图片 x 0 x_0 x0 为反向过程,反之为前向过程(噪音扩散)。

Stable Diffusion 原理

Stable Diffusion的原理解释

Stable Diffusion的网络结构图如下图所示:

在这里插入图片描述

Stable Diffusion 的网络结构图
  • 我们可以发现Stable Diffsion,其实还是大部分基于Diffusion的,基本的扩散方式没有发生改变
  • 前向扩散阶段:还是先进行前向扩散(如图中的上半部分所示),得到扩散后的 x t x_t xt ,就类似这里的 z T z_T zT,只不过这里把原本的图像(就是我们之前提的 x )利用 AE,VAE,VQVAE等自编码器,进行了图像特征提取,把隐变量(z)作为原本的真实清晰图像,从而一定程度上减少了计算量(改动1)。
  • 训练阶段:如图中下半部分所示,仍然是随机生成的批量t,利用公式得到批量的z_t,然后对Unet输入z_t,不过这里添加了一定的引导信息 ( 比如 MNist数据集中的label,也可以是文字信息等等(改动2) ) ,然后生成下个阶段的噪声图。损失也仍然是上个个时刻的噪声图和预测出来的噪声图之间的差距。
  • 去噪阶段:如图中下半部分所示,输入噪声图,引导词,经过T次的去噪,然后生成清晰的图像,只不过这里图像是经过特征提取过的,所以最后利用 AE,VAE,VQVAE等自编码器的解码器,进行解码即可(改动3)

Stable Diffusion 和 Diffusion 的区别

  • 改动1:利用 AE,VAE,VQVAE 等自编码器,进行了图像特征提取,利用正确提取特征后的图像作为自己原本在Diffusion中的图像
  • 改动2:在训练过程中,额外添加了一些引导信息,促使图像生成,往我们所希望的方向去走,这里添加信息的方式主要是利用交叉注意力机制(这里我看图应该是只用交叉注意力就行,但是我看视频博主用的代码以及参照的Stable-Diffusion Unet图上都是利用的Transoformer的编码器,也就是得到注意力值之后还得进行一个feedforward层)。
  • 改动3:利用 AE,VAE,VQVAE 等自编码器进行解码。(这个实质上和第一点是重复的)
  • 注意:本次的代码改动先只改动第二个,也就是添加引导信息,对于编码器用于减少计算量,本次改进先不参与(555~,因为视频博主没教),后续可能会进行添加(因为也比较简单)

Stable Diffusion 的Unet图讲解

Stable Diffusion 和Diffusion 的Unet对比

在这里插入图片描述

原本的Unet图像

在这里插入图片描述

Stable Diffusion的 Unet 图像
  • 我们可以发现,两者之间的区别主要在于,在卷积完了之后添加了一个Transformer的模块,也就是其编码器将两个信息进行了融合,其他并没有改变。
  • 所以主要区别在卷积后的那一部分,如下图。

在这里插入图片描述

卷积后的区别
  • 这个ResnetBlock就是之前的卷积模块,作为右边的残差部分,所以这里写成 了ResnetBlock。
  • 因此,如果我们将Tranformer模块融入到Restnet模块里面,并且保持其输入卷积的图像和transformer输出的图像形状一致的话,那么就其他部分完全不需要改变了,只不过里面多添加了一些引导信息(MNIST数据集中是label,但是也可以添加文本等等引导信息) 而已。

参考

视频讲解:进化为stable的diffusion模型(可指定生成数字图片)_哔哩哔哩_bilibili

原理博客:手撕Diffusion系列 - 第一期 - DDPM原理-CSDN博客


http://www.kler.cn/a/519839.html

相关文章:

  • 力扣算法题——11.盛最多水的容器
  • JJJ:Linux - 高精度定时器 hrtimer
  • 免费SSL证书申请,springboot 部署证书
  • C++ list 容器用法
  • 【Project】CupFox电影网站数据爬取分析与可视化
  • 微信小程序date picker的一些说明
  • mysql create table的用法
  • INCOSE需求编写指南-第 2 节:需求和要求陈述的特征
  • PD协议(Power Delivery)高效安全解决充电宝给笔记本供电
  • Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)
  • javascript格式化对象数组:ES6的模板字符串、map
  • 深度学习|表示学习|卷积神经网络|Pooling(池化是在做什么)|13
  • 通过循环添加组件
  • 消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)
  • Maui学习笔记-身份认证和授权案例
  • MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器
  • RACER:基于去中心化多无人机系统的快速协同探索
  • Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
  • AI导航工具我开源了利用node爬取了几百条数据
  • SpringBoot整合Swagger UI 用于提供接口可视化界面
  • Java进阶(一)
  • 【字节青训营-5】:初探存储系统与数据库及技术原理,解析关系型、非关系型数据库
  • 文明6mod发布并开源:更多的蛮族营地扫荡收益mod
  • 【2024年华为OD机试】 (A卷,200分)- 计算网络信号、信号强度(JavaScriptJava PythonC/C++)
  • 【架构面试】一、架构设计认知
  • 软件测试压力太大了怎么办?