零基础看懂免费开源的Stable Diffusion

文章目录

  • 前言
  • Diffusion模型
    • 推理过程
    • 训练过程
  • Stable Diffusion模型
  • 参考

前言

前面一篇文章主要讲了扩散模型的理论基础,还没看过上篇的小伙伴可以点击查看:DDPM理论基础。这篇我们主要讲一下一经推出,就火爆全网的Stable Diffusion模型。Stable Diffusion因其免费,开源,生成图像质量高等优点,一经推出,就火爆全网,后面stable-diffusion-webui的推出,更是降低了使用Stable Diffusion模型作画的门槛,一时刷爆了整个社区。今天笔者详细的带大家看一下Stable Diffusion背后的原理。

Diffusion模型

这里为了让大家更好的理解Stable Diffusion模型,我们先来简单介绍一下Diffusion模型。下图展示了diffusion模型在训练和推理的过程。从图中可以看出,扩散过程主要包括几个主要的模型,分别是text encoder(文本编码器),unet,image decoder(图像解码器)。其中,text encoder的作用主要是将输入的文本,即prompt,编码为token embeddings,这个token embeddings就是代表文本的一个个向量。这一个个文本向量会通过某种方式注入到unet中,用来控制unet生成符合文本描述的图像。

在这里插入图片描述

推理过程

在推理阶段,扩散过程是一个多步去噪的过程,主要就是一个unet网络结构,其输入和输出具有相同的形状,输入为含噪声的图像和时间戳 t t t,输出为图像上添加的噪声,进而得到去掉该噪声的图像。就这样经过unet的一步步去噪,逐步生成一个不含噪声的,符合文本描述的图像。有很多人会问,为什么不直接一步预测出噪声,然后直接将该噪声去掉,生成不含噪声的图像呢?其实这样的话,噪声很大,网络很难预测出准确的噪声分布。上图中的N即扩散过程执行的步数,该参数可以由我们自己指定,一般步数设置的越大,生成的图像会越精细。经过扩散过程后会生成低分辨率的,不含噪声的图像,为了生成更高分辨率的图像,这时就会在后面再接一个image decoder,用来扩大图像的分辨率,image decoder输出的图像即为最后我们想要的高分辨率图像。

文本特征主要是通过cross attention模块加入的,我们来大致拆解一下unet内部的网络结构。如下图,unet内部主要是由多个resnet block和attention模块组成的,两者交替出现。每一个attention模块接受resnet block输出的图像特征和文本特征向量作为输入,将两种特征进行融合,从而达到以文本为条件,控制图像生成的目的。

在这里插入图片描述

attention内部的计算过程如下图。图像特征和文本特征分别通过三个参数矩阵映射到Q,K,V,然后Q与K的转置点乘除以scale因子后经过softmax计算,最后点乘V,得到最后的特征。当然现在都是基于multi-head的多头attention操作,multi-head只是多次执行下面的操作,得到多个 Z i Z^i Zi,最后再将 Z i Z^i Zi拼接在一起,经过最后一个参数矩阵映射得到最终的 Z Z Z

在这里插入图片描述

训练过程

diffusion模型的训练过程主要涉及unet网络的学习,需要让unet具备能力:
给它输入一张含噪图像,unet能够预测出含噪图像上的噪声
这样我们就可以去掉含噪图像上的噪声,得到一张干净的、不含噪声的图像。训练数据的构造如下图:

在这里插入图片描述

首先第一步,选择一张图片;第二步,随机生成一个基础噪声;第三步从0到 T T T的时间范围内,随机选择一个时间戳 t t t,通过 t t t和基础噪声计算出最终要添加的噪声,时间戳 t t t越大,代表噪声添加的次数越多,也即添加噪声的强度越大。第四步就是将第三步生成的噪声加到图像上,得到一个含噪声的图像。此时,步骤四中得到的含噪图像作为unet网络的输入,步骤三生成的噪声作为unet学习的目标,用来训练unet网络。

通过上面的1,2,3,4步,我们可以生成很多训练数据,训练过程中就是不断将训练数据喂给unet,让其自主学习如何预测出含噪图像上的噪声,以达到去噪的目的。

Stable Diffusion模型

stable diffusion的最大贡献就是没有直接在像素空间进行图像的加噪和去噪,而是先将图像进行压缩(下采样),压缩到一个图像表征维度更低的隐空间(latent),然后在隐空间中进行扩散过程,这不仅加快了扩散过程的速度,同时减少了计算资源的消耗,而且在隐空间中操作依然能够保证生成图像的质量。举个例子,如果原图像的分辨率是256x256,现在将它下采样8倍,到32x32,那么在32x32分辨率的图像上操作肯定比直接在256x256分辨率的图像上操作更快且节省资源。256x256分辨率的原图即为像素空间特征,压缩后的32x32分辨率的图就是隐空间特征。

在这里插入图片描述

stable diffusion模型在推理和训练阶段的流程图如上图所示。与diffusion模型相比,最大的变化就是在推理阶段,扩散过程的输入由原来的随机噪声图像image变成了随机噪声latent,其实两者本质上都是纯噪声,只不过latent的分辨率比image的分辨率低,所以经过扩散过程生成的latent(Generated low resolution latent)也要比生成的image(Generated low resolution image)分辨率低,如果stable diffusion最终要生成与diffusion模型相同分辨率的图像的话,这里image decoder的放大倍率就要更大。
那么在训练阶段,主要进行前向过程,也就是给图像加噪声。下图就是stable diffusion生成训练数据的过程。可见,和diffusion相比,只是多了一步将原图压缩到latent的过程,后面的添加噪声都是在latent上进行的。

在这里插入图片描述

下面我们放一张stable diffusion论文中的原图。
在这里插入图片描述
其中 E \mathcal E E为图像编码器,用来压缩图像尺寸, D \mathcal D D为图像解码器用来恢复图像尺寸。图中的Diffusion Process即为前向过程,原图像 x x x经过编码器 E \mathcal E E压缩到隐空间 z z z后,在 z z z上进行加噪,生成 z T z_T zT。生成过程为逆向过程,给定隐空间噪声,经过多步去噪,生成不含噪声的压缩后的 z z z,再经过图像解码器恢复原始图像的尺寸。

参考

https://www.cnblogs.com/gczr/p/14693829.html
https://jalammar.github.io/illustrated-stable-diffusion/
https://readpaper.com/pdf-annotate/note?pdfId=4665140328076951553&noteId=1834381375833065728

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django中使用ajax发送请求

1、ajax简单介绍 浏览器向网站发送请求时 是以URL和表单的形式提交的post 或get 请求,特点是:页面刷新 除此之外,也可以基于ajax向后台发送请求(异步) 依赖jQuery 编写ajax代码 $.ajax({url: "发送的地址"…

filebeat多实例运行,kibana组件的基本使用

filebeat多实例运行: 1)需求 一台服务器上&#xff0c;需要运行多个filebeat实例 2)启动filebeat实例1 cat > config/11-log_tcp-to-console.yaml <<EOF filebeat.inputs: - type: log paths: - /tmp/oldboyedu-linux82/*.log # 监听TCP的参数 - type:…

centos 安装docker

1.更新你的系统: sudo yum update -y2.安装必需的软件包: Docker 需要 yum-utils, device-mapper-persistent-data 和 lvm2 软件包来运行。安装它们&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm23.设置 Docker 的仓库: 使用以下命令添加 D…

关于Redis,你需要学习了解的知识

关于 Redis &#xff0c;涵盖多个方面&#xff0c;从基础概念到高级应用&#xff0c;以及最佳实践等。比如以下内容&#xff1a; 认识 Redis&#xff1a; Redis 是什么&#xff1f;它的特点和优势是什么&#xff1f;Redis 的数据结构&#xff1a;字符串、哈希、列表、集合、有序…

Kafka的下载安装以及使用

一、Kafka下载 下载地址&#xff1a;https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把文件夹内容…

Redis 持久化

一、RDB 1.1 RDB持久化流程 fork子进程是阻塞的&#xff0c;如果同时开启RDB和AOF&#xff0c;默认使用AOF。 1、Redis父进程首先判断: 当前是否在执行save&#xff0c;或bgsave/bgrewriteaof (aof文件重写命令)的子进程&#xff0c;如果在执行则bgsave命令直接返回。 2、父进…

剑指offer专题2:队列和栈

用两个栈模拟队列 class CQueue {stack<int> stack1;stack<int> stack2; public:CQueue() {}void appendTail(int value) {stack1.push(value);}int deleteHead() {int val-1;if(!stack2.empty()){val stack2.top();stack2.pop();}else if(!stack1.empty()){while…

【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题

第18节 题目1&#xff1a;汉诺塔问题&#xff08;变体&#xff09; 体系学习班18节有讲暴力递归的汉诺塔原题。 给定一个数组arr&#xff0c;长度为N&#xff0c;arr中的值只有1&#xff0c;2&#xff0c;3三种 arr[i] 1&#xff0c;代表汉诺塔问题中&#xff0c;从上往下第…

Terraform 系列-批量创建资源时如何根据某个字段判断是否创建

系列文章 Terraform 系列文章Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terraform Provider 创建 Datasource. 这几天碰到这么一个现实需求&#xff1a; 使用 Terraform 批量创建日志数据源时, 有的数据源类型是 El…

MongoDB 数据库详细介绍

MongoDB 数据库详细介绍 MongoDB&#xff08;来自“Humongous”&#xff0c;意为巨大的&#xff09;是一个开源、高性能、无模式&#xff08;NoSQL&#xff09;、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。MongoDB 使用 JSON 格式的文档来存…

主从同步介绍、主从同步原理、主从同步结构、构建思路、配置一主一从、配置一主多从、读写分离介绍、工作原理、配置mycat服务、添加数据源、创建集群、指定主机角

Top NSD DBA DAY07 案例1&#xff1a;MySQL一主一从案例2&#xff1a;配置一主多从结构案例3&#xff1a;数据读写分离 1 案例1&#xff1a;MySQL一主一从 1.1 问题 数据库服务器192.168.88.53配置为主数据库服务器数据库服务器192.168.88.54配置为从数据库服务器客户端192…

网络编程(8.14)TCP并发服务器模型

作业&#xff1a; 1. 多线程中的newfd&#xff0c;能否修改成全局&#xff0c;不行&#xff0c;为什么&#xff1f; 2. 多线程中分支线程的newfd能否不另存&#xff0c;直接用指针间接访问主线程中的newfd,不行&#xff0c;为什么&#xff1f; 多线程并发服务器模型原代码&…

排查docker无法启动问题

查看Linux系统操作日志(最后200行就可以排查)&#xff1a; tail -200f /var/log/messages

数据分析--帆软报表--大数据大屏

进入国企公司学习有一段时间了&#xff0c;岗位是数据分析方向------ 母前使用的是帆软工具进行的开发。 可以进行大数据大屏 也可使嵌入到手机端。 下面是例子

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

数据库连接池

什么是数据库连接池 使用数据库连接池的好处是减少了连接的创建和关闭的开销&#xff0c;提高了数据库访问的性能和效率。 为什么我们要使用数据库连接池 我们使用数据库连接池的主要原因是为了提高应用程序访问数据库的性能和效率。使用数据库连接池的好处: 连接重用&…

【Apple】Logic Pro导入7.1.4.wav并自动分析多声道

Step1: 创建空项目 Step2: 选中下图“使用麦克风或...”这一项&#xff0c;底下要创建的轨道数填1就行。 点击创建之后&#xff1a; Step3: 拖动文件、拖动文件、拖动文件到项目中&#xff0c;并选中复选框“所有所选文件都源自一个项目&#xff08;将创建一个智能速度多轨道集…

[NLP]LLM 训练时GPU显存耗用量估计

以LLM中最常见的Adam fp16混合精度训练为例&#xff0c;分析其显存占用有以下四个部分&#xff1a; GPT-2含有1.5B个参数&#xff0c;如果用fp16格式&#xff0c;只需要1.5G*2Byte3GB显存, 但是模型状态实际上需要耗费1.5B*1624GB. 比如说有一个模型参数量是1M&#xff0c;在…

什么是前端框架?怎么学习? - 易智编译EaseEditing

前端框架是一种用于开发Web应用程序界面的工具集合&#xff0c;它提供了一系列预定义的代码和结构&#xff0c;以简化开发过程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的库和工具&#xff0c;用于构建交互式、动态和响应式的用户界面。 学习前端框架可以让您更高效…

nginx的负载均衡

nginx的负载均衡 文章目录 nginx的负载均衡1.以多台虚拟机作服务器1.1 在不同的虚拟机上安装httpd服务1.2 在不同虚拟机所构建的服务端的默认路径下创建不同标识的文件1.3 使用windows本机的浏览器分别访问3台服务器的地址 2.在新的一台虚拟机上配置nginx实现反向代理以及负载均…