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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

策略模式(C++)

定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换((变化)。该模式使得算法可独立手使用它的客户程序稳定)而变化(扩展,子类化)。 ——《设计模式》GoF 使用场景 在软件构建过程中,某些对象使用的算法可能多种多…

神码ai伪原创【php源码】

大家好,小编为大家解答python必备常用英语词汇笔记的问题。很多人还不知道python中常用的英语单词,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 一.什么是注释 注释是对一段代码的解释,不参与程序运行&…

dubbo之整合SpringBoot

目录 zookeeper安装 1.拉取ZooKeeper镜像 2.新建文件夹 3.挂载本地文件夹并启动服务 4.查看容器 5.进入容器(zookeeper) Dubbo Admin安装 1.下载dubbo-admin 2.zip包解压 3.修改配置文件 4.打包项目 5.启动jar 6.访问 构建项目 api模块 1.创建…

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …

将vsCode 打开的多个文件分行(栏)排列,实现全部显示,便于切换文件

目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能,如下为Visual Studio 2022的该功能界面: 图 1 图 2 当在Visual Studio 2022打开很多文件时,可以按照图1、图2所示找到自…

伺服系统::编码器

一、主要分类 二、组成与原理 光电编码器 磁编码器:N-->磁感元件(0);S-->磁感元件(1)》脉冲 增量编码器的分辨率、倍频与细分技术 (99 封私信 / 81 条消息) 编码器有什么分类? - 知乎 (z…

安卓:UDP通信

目录 一、介绍 网络通信的三要素: (1)、IP地址: IPv4: IPv6: IP地址形式: IP常用命令: IP地址操作类: (2)、端口: (3)、协议: UDP协…

搭建Docker环境

目录 一、docker环境搭建 1、卸载旧版本docker 2、安装依赖和设置仓库 3、安装docker 4、启动并加入开机启动 5、验证是否安装成功 二、利用docker搭建nginx 1、拉取镜像 2、启动容器,部署nginx 一、docker环境搭建 1、卸载旧版本docker yum remove docke…

SD NAND FLASH : 什么是pSLC?

一、什么是pSLC pSLC(Pseudo-Single Level Cell)即伪SLC,是一种将MLC/TLC改为SLC的一种技术,现Nand Flash基本支持此功能,可以通过指令控制MLC进入pSCL模式,存储时在MLC的每个单元中仅存储1bit数据&#x…

基于k8s job设计与实现CI/CD系统

方案一:Jenkinsk8sCICD 方案二:kanikok8s jobCICD CICD 基于K8s Job设计流水线 CI方案 工具镜像 云原生镜像打包工具 kaniko的使用 与Jenkins对比 可用性与易用性

IntelliJ IDEA 2021/2022关闭双击shift全局搜索

我这里演示的是修改,删除是右键的时候选择Remove就好了 IDEA左上角 File-->Settings 找到Navigate -->Search Everywhere ,右键添加快捷键。 OK --> Apply应用

高端百度地图开发1:自定义水滴头像(自定义标注覆盖物、Overlay覆盖类)

自定义水滴头像&自定义标注覆盖物 一、引入百度地图JSAPI库二、构建map容器1. CSS样式表2.HTML容器 三、核心代码1.百度地图API功能2.定义构造函数并继承Overlay3.初始化自定义覆盖物4.绘制覆盖物5.添加覆盖物 自定义标注覆盖物(Custom Overlay)是百…

从小白到大神之路之学习运维第78天-------Kubernetes集群应用部署测试

第四阶段 时 间:2023年8月11日 参加人:全班人员 内 容: Kubernetes集群应用部署测试 目录 应用部署测试 应用部署测试 下面我们部署一个简单的Nginx WEB服务,该容器运行时会监听80端口。 (一)环境…

UE5、CesiumForUnreal接入WMTS格式地图瓦片,如ArcGIS、Mapbox、天地图

文章目录 1.实现目标2.实现过程2.1 WMTS与TMS2.2 cesium-native改造2.3 CesiumForUnreal插件改造2.4 WMTS瓦片加载测试2.5 EPSG:3857与43263.参考资料1.实现目标 通过改造cesium-native和CesiumForUnreal插件,参考tms的栅格瓦片地图加载逻辑,实现在UE5中通过CesiumForUnreal…

使用Java根据表名导出与导入Sql

前言 很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。 嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入…

CTFshow web93-104关

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关 93关 看代码 进行分析 他的主函数 include("flag.php"); highlight_file(__FILE__); if(isset($_GET[num])){ $num $_GET[num]; if($num4476){ die("no no no!"); …

支付总架构解析

一、支付全局分层 一笔支付以用户为起点,经过众多支付参与者之后,到达央行的清算账户,完成最终的资金清算。那么我们研究支付宏观,可以站在央行清算账户位置,俯视整个支付金字塔,如图1所示: 图…

Docker介绍

1. docker是什么 1.1 为什么会有docker出现? 假设你在开发一个项目的时候,你使用的是windows系统而且你的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。你正在开发的应用依赖于你当前的配置而且还要依赖于某些配置文件。此外&#xf…

Kafka基本概念

文章目录 概要整体架构broker和集群ProducerConsumer和消费者组小结 概要 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于 zookeeper协调的分布式日志系统(也可以当做MQ系统)&#xff…

通讯协议036——全网独有的OPC HDA知识一之聚合(五)计数

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…