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

news2025/2/12 22:04:43

文章目录

  • 前言
  • 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.coloradmin.cn/o/864105.html

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

相关文章

最大限度增加销售额!亚马逊提醒卖家准备Q4季度促销库存!

亚马逊美国站发布公告称为了最大限度提高卖家销售额,确保您的亚马逊物流库存在第四季度的促销活动中按时到达亚马逊运营中心,亚马逊建议卖家检查补货库存并及时将库存送到运营中心,以下是公告内容: 为了最大限度地提高您的假期销…

【Linux取经路】揭秘进程的父与子

文章目录 1、进程PID1.1 通过系统调用接口查看进程PID1.2 父进程与子进程 2、通过系统调用创建进程-fork初始2.1 调用fork函数后的现象2.2 为什么fork给子进程返回0,给父进程返回pid?2.3 fork函数是如何做到返回两次的?2.4 一个变量怎么会有不…

微信可以设置延迟到账了!让资金更安全!

微信几乎已经成为了每个人离不开的交流、通讯、支付工具,微信支付也是离不开的移动支付手段。 如果我们在微信转账时出现转错账的情况怎么办?其实微信转账是可以设置到账时间的。 什么是延时到账? 延时到账是指,收款方在确认了你的…

VIOOVI的ECRS工时分析软件分析:SOP的核心和特征是什么?

制定SOP的主要目的是为企业做技术储备、提供企业的工作效率、防止同样的错误反复出现、让员工作业有标准化的行为准则。以规定的成本、规定的工作时间,生产质量均匀、符合规范的产品。为了能够达到上述要求,如果制造现场的操作混乱,比如制作工…

在vue3+vite项目中使用jsx语法

如果我掏出下图,阁下除了私信我加入学习群,还能如何应对? 正文开始 前言一、下载资源二、利用vite工具引入babel插件总结 前言 最近在为部署人员开发辅助部署的工具,技术栈是vue3viteelectron,在使用jsx语法时&#x…

【学习】若依源码(前后端分离版)之 “ 数据的导入导出功能”

大型纪录片:学习若依源码(前后端分离版)之 “ 数据的导入导出功能” 前言导入功能实现前端部分后端部分 导出功能实现前端部分后端部分8月9日补充:自定义隐藏属性列导出对象的子列表 结语 前言 在实际开发中,碰到大批…

【java实习评审】对推电影详情模块的基本电影模型设计到位,并能考虑到特色业务的设计

大家好,本篇文章分享一下【校招VIP】免费商业项目"推电影"第一期 电影详情模块 Java同学的开发文档周最佳作品。该同学来自暨南大学电子信息专业。 本项目的商业出发点: 豆瓣评分越来越水,不太符合年青人的需求,我们推…

React Dva项目小优化之redux-action

之前 我们讲过 models 接下啦 我们来给大家讲一个新的库 这个库的话 有最好 没有影响也不大 它主要是帮助我们处理 action的 我们直接在 GitHub 官网上搜索 redux-action 我们搜出来 第一个就是 从星数来看 还是非常优秀的 我们拉下来 找到这个Documentation 然后点击进去 进…

【WiFi】WiFi 6E最新支持的国家和频段

信道Map图 国家和频段 CountryStatus Spectrum Andorra Adopted Considering 5945-6425 MHz 6425-7125 MHz ArgentinaAdopted5925-7125 MHzAustralia Adopted Considering 5925-6425 MHz 6425-7125 MHz Austria Adopted Considering 5945-6425 MHz 6425-7125 MHz BahrainA…

IOC容器 - Autofac

DI(依赖注入):DI(Dependency Injection)是一种实现松耦合和可测试性的软件设计模式。它的核心思想是将依赖关系的创建与管理交给外部容器,使得对象之间只依赖于接口而不直接依赖于具体实现类。通过依赖注入…

MySQL多表连接查询3

目录 表结构 创建表 表数据 查询需求: 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息 4.从s…

【boost网络库从青铜到王者】第一篇:visual studio 系列配置boost网络库

文章目录 1、asio网络库的介绍2、asio网络库的下载和编译3、visual studio 配置boost头文件以及库文件4、使用boost网络库来写一段代码测试 1、asio网络库的介绍 ASIO(Asynchronous I/O) 是一个C网络库,由Boost C 库的一部分衍生而来&#x…

PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串

/*** 获取两字符串所有公共子序列【不连续的】 例:abc ac > ac** param string $str1 字符串1* param string $str2 字符串2** return array*/ function public_sequence(string $str1, string $str2): array {$data [[-1, -1, , 0, ]]; // 子序列容器【横坐标 …

project_serial_port

文章目录 效果![在这里插入图片描述](https://img-blog.csdnimg.cn/77ab9856af714b06b69f2ca959dc8ea3.png)源码widget.cppwidget.h 效果 源码 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent)…

Java学习内容有什么?这篇全是干货

Java 是目前应用非常广泛的一种计算机高级编程语言,它是一种计算机程序设计语言,被广泛应用于各大行业和领域,如金融、汽车、医疗、电子、互联网等等。Java 诞生之后风靡全球,并且一直保持其高人气,因此 Java 的学习也…

自动清洁离子风机一般具有什么特点?

自动清洁离子风机是一种能够自动清洁空气中的离子,并同时进行空气净化的设备。它采用先进的离子生成技术,可以释放负离子并吸附空气中的污染物,如细菌、病毒、灰尘、花粉等,将它们沉积在设备表面。当设备侦测到需要清洁时&#xf…

那些年的Xposed开发经验记录

把之前写的Xposed相关文章合并到一块,方便查阅 目录 多进程App的Hook问题XposedHelper中的静态变量demo的AndroidManifest.xml的测试核心代码结论限制handleLoadPackage被单个进程多次执行的问题 多dex Hook问题为应用增加权限利用Xposed删除权限参考 Hook框架集锦…

《漫画算法:小灰的算法之旅》——赠书活动

我想应该有很多人对我今天推荐的书籍不陌生,《漫画算法:小灰的算法之旅》已经是圈内人熟知的“红人”了,但也存在不断有新人入坑,这里就好好介绍一下这本包上“糖衣”的算法“炮弹”吧,整个过程如同本书形象“Q弾可爱&…

热成像技术创新,助力人工智能炼就黑夜中的火眼金睛

原创 | 文 BFT机器人 普渡大学(Purdue University)的研究人员利用他们正在申请专利的方法来改进传统的机器视觉和感知,从而推动机器人技术和自动控制领域的发展。 埃尔莫尔家族电气与计算机工程学院(Elmore Family School of Ele…

Git使用教程(看完会了也懂了)

本文简单的记录一下Git的一些基本的概念和基础的操作,主要是弄懂基本的东西,能够快速的上手并开始使用;但是更多深层的原理和应用还是需要另外去进一步学习的。 创建版本库 我们先整一个git仓库,再来看看基本概念; 新…