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

零基础看懂免费开源的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

相关文章:

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

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础,还没看过上篇的小伙伴可以点击查看:DDPM理论基础。这篇我们主要讲一下一经推出,就火爆全网的Stable Diffusion模型。St…...

Zmq适配Win7 SP0 / Win XP/ Win 2k

1.目的 由于发布版本的libzmq使用了较多新的系统特性,导致在低版本windows平台上无法使用。 因此,需要对zmq源码进行修改以适配低版本的系统,如Win7 SP0,Win XP,Win2003等等。 2.Win7 SP0 #if defined ZMQ_HAVE_WIN…...

掌握Python的X篇_30_使用python解析网页HTML

本篇将会介绍beutifulsoup4模块,可以用于网络爬虫、解析HTML和XML,对于没有接触过前端,不了解HTML是如何工作的,需要先解释一下什么事HTML。 1. HTML 网页中的各种布局等的背后都是非常简单的纯文本格式,那种格式称为…...

广联达OA前台sql注入+后台文件上传漏洞复现分析

文章目录 前言资产特征前台sql注入后台文件上传解决办法 前言 最近看到广联达OA的前端sql注入和后端文件上传漏洞联动的poc 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑,提供一百余款基于“端云大数据”产品/服务,提供产业大数据、产业…...

No view found for id 0x7f0901c3 for fragment解决以及线上bug排查技巧

情景再现 开发这么久,不知道你们是否也经历过这样的情况,测试或者用户,反馈app闪退,结果你自己打开开发工具,去调试,一切正常,然后闪退还是存在,只是在开发环境中不能重现。这种情况…...

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例,什么是竞价实例?竞价实例和按量付费相类似,优势是价格更划算,缺点是云服务器实例有被自动释放风险,腾讯云服务器网来详细说下什么是竞价实例?以及…...

Kali Linux助您网络安全攻防实战

Kali Linux:黑客与防御者的神器 Kali Linux是一款专为网络安全测试和攻防实践而设计的操作系统。它汇集了大量的安全工具,可以用于渗透测试、漏洞扫描、密码破解等任务,不仅为黑客提供了强大的攻击能力,也为安全防御者提供了测试和…...

JavaEE初阶:多线程 - 编程

1.认识线程 我们在之前认识了什么是多进程,今天我们来了解线程。 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 引入进程这个概念,主要是为了解决并发编程这样的…...

一种多策略下RabbitMQ的延时队列实现

1.为什么会用到延时队列? 场景: 最近在开发一款系统中遇到这样一个场景,A系统开通套餐需要把套餐信息以邮件的形式发送给相关工作人员,经过人工审核通过后,在B系统里面开通,A系统会调B系统套餐列表接口查询套餐是否开通成功,开通成功则从A系统去完成订单,假如超过设定时间未开…...

解密 AI 客服;在不同硬件设备上运行大型语言模型的可能性

🦉 AI新闻 🚀 微软必应首席执行官称必应聊天优于OpenAI的GPT-4,但成本更高 摘要:微软必应的首席执行官米哈伊尔・帕拉欣表示,必应聊天表现优于OpenAI的GPT-4,但使用了更高成本的检索增强推理技术。必应聊…...

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题 场景复现 1 new String() 2 快捷方式生成变量 final修饰的 final String s new String();步骤一:确保settings配置信息 settings-----》Editor------》Code Style--------》java下的这两个选项不…...

SpringBoot基于Zookeeper实现分布式锁

文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁,基于ZK实现,需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作,Zookeeper入…...

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: //发送端…...

九耶丨阁瑞钛伦特-请说说你在工作中的PRD文档是如何撰写的?

1、背景说明(解释清楚为什么要做这样一件事,以及做这件事的价值,先把观点拉齐,才方便接下来的工作开展) 简要介绍与项目相关的背景信息、项目要满足的用户需求、开展项目的主要原因、项目期望上线时间、项目涉及的具体…...

Android免打包多渠道统计如何实现

摘要: 实际上只要完成1-2步即可实现多渠道打包,这也意味着,只要每次更新App时给出一个原始包,运营人员就能在后台自己进行操作管理,简单快捷到全程无需开发人员参与。 我们都知道,Android 市场被分割成几十…...

Apipost CICD怎么配置?

配置CI/CD Apipost自动化测试新增CI/CD,配置运行环境、循环次数、间隔停顿后点击保存会生成命令,在安装Apipost的服务器中输入命令即可运行测试脚本。 自动化测试 创建自动化测试脚本在创建好的测试用例中选择「CICD」,点击新建&#xff0c…...

utf-8和utf-8 mb4区别

UTF-8(Unicode Transformation Format-8)和UTF-8MB4(UTF-8 Multibyte 4-byte)是字符编码方案,用于表示 Unicode 字符集中的字符。它们之间的主要区别在于编码范围。 UTF-8:UTF-8 是一种变长编码方式&#x…...

考研 408 | 【计算机网络】 应用层

导图 网络应用模型 客户/服务器(c/s)模型 P2P模型 DNS 域名 域名服务器 域名解析过程 文件传输协议FTP FTP服务器和用户端 FTP工作原理 电子邮件 电子邮件的信息格式 组成结构 邮件服务器的功能: 1.发送&接收邮件 2.给发件人报告邮…...

设计模式-单例

概述 在类加载后,整个系统只有一个实例类 饿汉式 public class Mg1 {private static final Mg1 INSTANCE new Mg1();private Mg1(){}public static Mg1 getInstance(){return INSTANCE;}public static void main(String[] args) {System.out.println(Mg1.getIns…...

mysql截取最后一个字符之前的数据

1、mysql截取最后一个字符之前的数据 select --截取斜杠之前的数据REVERSE(SUBSTR(REVERSE(SPNH-dfg-2012) ; --截取斜杠后的数据 INSTR(REVERSE(SPNH-fg-2012),-)1))2、mysql获取最后一个字符后的数据 select SUBSTRING_INDEX(SPNH-dfg-2012,-,-1) 3、mysql更新某个字段…...

【iOS(swift)笔记-13】App版本不升级时本地数据库sqlite更新逻辑一

App版本不升级时,又想即时更新本地数据库怎么办? 办法一:直接从服务器下载最新的sqlite数据库替换掉本地的 具体逻辑 1、首先本地数据库里一定要有一个字段(名字自己取) 比如dbVersion,可用数字&#x…...

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中,高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器(如药盒状态传感器、机械臂限位开关)需接入先进EtherCAT高速实时网络时,JH-DVN-ECT疆鸿智能…...

MySQL安装及启用详细教程(Windows版)

MySQL安装及启用详细教程(Windows版) 📋 概述 本文档将详细介绍MySQL数据库在Windows系统下的下载、安装、配置和启用过程。 📥 MySQL下载 官方下载地址 官方网站: https://dev.mysql.com/downloads/社区版本: https://dev.my…...

C++ STL vector容器详解:从原理到实践

引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…...

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…...

关于BackgroundScheduler的pause

在APScheduler中,pausedTrue参数的作用对象取决于其使用场景: 1. ‌作用于调度器(Scheduler)‌ 当在start()方法中使用时(如 scheduler.start(pausedTrue)) 表示‌调度器本身启动后立即进入暂停状态‌&…...

python打卡day42

Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度,但标准的前向传播和反向传播过程通常是一个黑盒,很难直接访问中间层的信息。PyT…...

权威认证与质量保障:第三方检测在科技成果鉴定测试中的核心作用

科技成果鉴定测试是衡量科研成果技术价值与应用潜力的关键环节,其核心目标在于通过科学验证确保成果的可靠性、创新性和市场适配性。第三方检测机构凭借其独立性、专业性和权威性,成为科技成果鉴定测试的核心支撑主体。本文从测试流程、第三方检测的价值…...

1.3HarmonyOS NEXT统一开发范式与跨端适配:开启高效跨设备应用开发新时代

HarmonyOS NEXT统一开发范式与跨端适配:开启高效跨设备应用开发新时代 在HarmonyOS NEXT的技术体系中,统一开发范式与跨端适配是两大关键特性,它们为开发者打破了设备边界,极大地提升了开发效率与应用体验。本章节将深入探讨方舟…...

函数的定义、调用、值传递、声明、非安全函数

函数 函数(英文“function”)把一些经常用到的代码封装起来,这样可以减少一些冗余代码、重复的代码。一个大的程序,它是由很多很多程序块组成的,每个模块实现一个特定的功能。 函数的定义 格式 英文版 return_typ…...