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

AI绘画Stable Diffusion原理之Autoencoder-Latent

前言

传送门:

stable diffusion:Git|论文

stable-diffusion-webui:Git

Google Colab Notebook:Git

kaggle Notebook:Git

今年AIGC实在是太火了,让人大呼许多职业即将消失,比如既能帮忙写代码,又能写文章的ChatGPT。当然,还有AI绘画,输入一段文本就能生成相关的图像,stable diffusion便是其中一个重要分支。自己对其中的原理比较感兴趣,因此开启这个系列的文章来对stable diffusion的原理进行学习(主要是针对“文生图”[text to image])。

上述的stable-diffusion-webui是AUTOMATIC1111开发的一套UI操作界面,可以在自己的主机上搭建,无限生成图像(实测2080ti完全能够胜任),如果没有资源,可以白嫖Google Colab或者kaggle的GPU算力。

其中stable diffusion的基础模型可以hugging face下载,而C站可以下载各种风格的模型。stable diffusion有一个很大的优势就是基于C站中各式各样的模型,我们可以进行不同风格的AI绘画。

而这篇文章,首先对其中的一个组件进行学习:Autoencoder。

原理简介

Stable Diffusion is a latent text-to-image diffusion model。stable diffusion本质是一种latent diffusion models(LDMs),隐向量扩散模型。diffusion models (DMs)将图像的形成过程分解为去噪自动编码器(denoising autoencoders)的一系列操作,但这些都是直接在像素空间上进行的操作,因此对于昂贵的计算资源,特别是高像素的图像。而LDMs则是引入隐向量空间,能够生成超高像素的图像。

这里,我们先整体地来了解下stable diffusion的结构组成,后面再对每个组件进行拆开逐一理解。整体结构如下图[Stable Diffusion Architecture]:

  1. 文本编码器:人类输入的文本即prompt,经过CLIP模型中的Text Encoder,转化为语义向量(Token Embeddings);
  2. 图像生成器(Image information Creator):U-Net、采样器以及Autoencoder组成。由随机生成的纯噪声向量(即下图中的Noisey Image)开始,通过Autoencoder编码映射到低维的隐空间,文本语义向量作为控制条件进行指导,由U-Net和采样器不断迭代生成新的越具有丰富语义信息的隐向量,这就是扩散过程diffusion;
  3. 图像解码器(Image Decoder)- Autoencoder:迭代了一定次数之后,得到了包含丰富语义信息的隐向量(Processed Image Info Tensor),低维的隐向量经过Autoencoder解码到原始像素;
  4. 第2步就是LDMs和DMs的区别,LDMs是在latent space进行扩散,而DMs则是在pixel space,这也是性能提升的关键。

Stable Diffusion Architecture

Autoencoder

[1] 论文:Taming Transformers for High-Resolution Image Synthesis

[2] Git:taming-transformers

图片的隐空间表征从何而来:Autoencoder,既能够将图片从像素空间压缩到隐空间,让扩散过程在latent space中进行,又可以让图片从隐空间重建到像素空间(即图片重建),简化的过程如下图所示:

  • 其中的encoder可以将一张图片从RGB空间即像素空间 x ∈ R H × W × 3 x\in \mathbb{R}^{H\times W \times 3} xRH×W×3,经过encoder编码到隐空间表征(latent representation) z = ε ( x ) z= \varepsilon(x) z=ε(x)
  • decoder则是将隐空间表征重建到图片RGB x ~ = D ( z ) = D ( ε ( x ) ) \tilde{x}=D(z)=D(\varepsilon(x)) x~=D(z)=D(ε(x))
  • 其中, z ∈ R h × w × c z\in \mathbb{R}^{h \times w \times c} zRh×w×c,重要的是,控制隐空间大小的是编码器的下采样因子(downsampling factors): f = H / h = W / w , f = 2 m , m ∈ N f=H/h=W/w,f=2^m,m \in \mathbb{N} f=H/h=W/wf=2mmN

上述仅仅是从整体架构层面简单地描述了图片的隐空间与像素空间的转换与重建过程,但其实整个过程的细节还是比较复杂的,方法是出自VQGAN [ 1 ] ^{[1]} [1],其结构如下图所示:

  • 论文认为高像素的图片合成需要模型能够理解图片的全局组成,使得局部和全局现实的生成能够保持一致。
  • 因此,论文使用codebook来对图片的丰富视觉组成进行表征,而不是像素表征,codebook即是隐空间的表现形式
  • codebook可以大大减少的图片组成长度(相比像素),也使得能用transformer来高效地对图片内部的全局交互( global interrelations)进行建模。

VQGAN

Codebook

给定一张图片 x ∈ R H × W × 3 x\in \mathbb{R}^{H\times W \times 3} xRH×W×3,需要将x表征为离散空间的codebook集合 z q ∈ R h × w × n z z_q \in \mathbb{R}^{h\times w \times n_z} zqRh×w×nz,其中 h ⋅ w h \cdot w hw可以认为是codebook中每个code的索引,而 n z n_z nz是code的维度。学习这样的codebook表征需要以下几个组件:

  • 一个离散的codebook Z = { z k } k = 1 K ∈ R n z Z=\{z_k\}^K_{k=1} \in \mathbb{R}^{n_z} Z={zk}k=1KRnz(可以当成embedding来理解,参数随机初始化,参与模型训练 ,但论文对这块没有清晰的描述,可以去看源码)
  • CNN结构的encoder E,可以将图片 x x x编码为 z ^ ∈ R h × w × n z \hat{z} \in \mathbb{R}^{h\times w \times n_z} z^Rh×w×nz
  • CNN结构的decoder G,能够将codebook z q z_q zq重建为图像 x ^ \hat{x} x^
  • quantization操作,将 z ^ \hat{z} z^映射到 z q z_q zq

具体的 z q z_q zq编码过程为:编码器E将x转化为 z ^ = E ( x ) ∈ R h × w × n z \hat{z}=E(x) \in \mathbb{R}^{h\times w \times n_z} z^=E(x)Rh×w×nz,然后通过element-wise quantization q ( ⋅ ) q(\cdot) q()将每个离散的code z ^ i j ∈ R n z \hat{z}_{ij} \in \mathbb{R}^{n_z} z^ijRnz编码到距离最近的codebook entry z k z_k zk(这里产生的最邻近的 z k z_k zk索引即为上图[VQGAN]的 s i s_i si,后续会用到)

这部分的损失函数如下式

其中 L r e c = ∣ ∣ x − x ^ ∣ ∣ 2 L_{rec}=||x-\hat{x}||^2 Lrec=∣∣xx^2重建loss s g [ ⋅ ] sg[\cdot] sg[]为stop-gradient操作。由于 z q z_q zq的quantization操作是不可微分的,因此需要用到梯度拷贝(出自straight-through gradient estimator)

Discriminator

论文:Image-to-Image Translation with Conditional Adversarial Networks

Git:https://github.com/phillipi/pix2pix

使用transformer来表征图片的隐性图像成分的分布,需要进一步逼近图片压缩的极限和学习更富含信息的codebook,因此,论文还训练一个patch-based的判别器D,让它能够区分真实和重建的图片

真实图像和重建图像都会经过一个CNN结构的Discriminator,然后得到每个patch的预估概率,模型的训练目标就是让真实图像的预估概率尽量都为1,而重建图像的预估概率尽量都为0,简而言之,就是让Discriminator能够识别每个patch是来自真实图像还是重建图像,如下图红框部分:

上述这两部分是联合训练:

其中, ∇ G L [ ⋅ ] \nabla_{G_L}[\cdot] GL[]是decoder最后一层网络的梯度,而 δ = 1 0 − 6 \delta=10^{-6} δ=106

Transformers

Latent Transformers.

编码器E和解码器G训练完成之后,按照上述同样的操作,通过E和quantization操作,可以将图片 x x x表征到codebook z q = q ( E ( x ) ) ∈ R h × w × n z z_q=q(E(x)) \in \mathbb{R}^{h \times w \times n_z} zq=q(E(x))Rh×w×nz h ⋅ w h \cdot w hw可以认为是codebook中每个code的索引 s i s_i si,然后将二维的索引变为一维的,相当于一个code序列 s ∈ { 0 , . . . , ∣ Z ∣ − 1 } h × w s \in \{0,...,|Z|-1\}^{h \times w} s{0,...,Z1}h×w

到这里,我们就可以按照NLP的自回归模型“预测下一个词”的思路来理解:给定code索引序列(上文) s < i s<i s<i,利用transformer来学习下一个code索引(下文)的概率分布 p ( s i ∣ s < i ) p(s_i|s<i) p(sis<i),最大化完整表征序列的似然估计 p ( s ) = ∏ i p ( s i ∣ s < i ) p(s)=\prod_ip(s_i|s<i) p(s)=ip(sis<i)

Conditioned Synthesis.

在许多图片合成任务中,往往会加入额外的信息来控制图片的合成过程,这个额外信息称为 c c c,它可以是一个对图片的标签描述或者另外的图片。那么,学习的似然估计则变为:

机制理解

在最后,通过源码仓库里的两个实操案例notebook来理解Autoencoder这些组建的工作机制。

图像重建.

VQGAN可以将图片输入编码到低维的codebook空间(隐空间),然后再对codebook空间重建为图片的像素空间,如下图所示。更重要的是,这个过程的中间产物-隐空间,相较于像素空间,能够以很小的特征空间来表征图片,可以迁移到attention机制底座的模型训练的下流任务,比如本文的主题:Stable Diffusion。

def reconstruct_with_vqgan(x, model):# could also use model(x) for reconstruction but use explicit encoding and decoding herez, _, [_, _, indices] = model.encode(x)print(f"VQGAN --- {model.__class__.__name__}: latent shape: {z.shape[2:]}")xrec = model.decode(z)return xrec

请添加图片描述

草图绘画.

这里主要是可以帮助理解VQGAN中Transformer的作用:

  • 草图经过VQGAN的编码器得到codebook索引序列c- s i s_i si(c-仅是前缀,为了与成品图进行区分);
  • 随机生成 成品图的codebook索引序列z- s i s_i si
  • 然后草图的索引序列c- s i s_i si作为控制条件,即上述提到Conditioned Synthesis章节中的 c c c,拼接在z- s i s_i si的前面(z- s i s_i si每次截取一段),输入到Transformer,去预测z- s i s_i si的每一个位置,预测得到的索引逐步替代随机生成的索引序列;
  • 最后,这个生成的索引序列再进入解码器G重建为图片(成品图)。

草图
成品图

相关文章:

AI绘画Stable Diffusion原理之Autoencoder-Latent

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook&#xff1a;Git kaggle Notebook&#xff1a;Git 今年AIGC实在是太火了&#xff0c;让人大呼许多职业即将消失&#xff0c;比如既能帮…...

C++核心知识点总结

学习一门新的程序设计语言得到最好方法就是练习编写程序&#xff01; C基础 变量和基本类型 基本内置类型 定义解释 算术类型 整型&#xff1a;包括字符和布尔类型&#xff0c;bool、char、wchar_t、char16_t、char32_t、short、int、long、long long、 浮点型&#xff1a;…...

echart折线图,调节折线点和y轴的间距(亲测可用)

options代码&#xff1a; options {tooltip: {trigger: axis, //坐标轴触发&#xff0c;主要在柱状图&#xff0c;折线图等会使用类目轴的图表中使用。},xAxis: {type: category,//类目轴&#xff0c;适用于离散的类目数据&#xff0c;为该类型时必须通过 data 设置类目数据。…...

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…...

redis 淘汰策略和持久化

文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…...

Redis学习路线(6)—— Redis的分布式锁

一、分布式锁的模型 &#xff08;一&#xff09;悲观锁&#xff1a; 认为线程安全问题一定会发生&#xff0c;因此在操作数据之前先获取锁&#xff0c;确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点&#xff1a; 简单粗暴缺点&#xff1a; 性能略低 &#x…...

一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image

1、创建自己的docker python容器环境 参考&#xff1a;https://blog.csdn.net/weixin_42357472/article/details/118991485 首先写Dockfile&#xff0c;注意不要有txt等后缀 Dockfile # 使用 Python 3.9 镜像作为基础 FROM python:3.9# 设置工作目录 WORKDIR /app# 复制当前…...

【Git】git企业开发命令整理,以及注意点

1.git企业开发过程 业务的分支大概有以下几个&#xff1a; master&#xff1a;代码随时可能上线 develop&#xff1a;代码最新 feature/xxx&#xff1a;实际业务开发分支 release/xxx&#xff1a;预发布分支 fix&#xff1a;修复bug分支 过程大概是这样的&#xff1a; 首…...

使用Django自带的后台管理系统进行数据库管理的实例

Django自带的后台管理系统主要用来对数据库进行操作和管理。它是Django框架的一个强大功能&#xff0c;可以让你快速创建一个管理界面&#xff0c;用于管理你的应用程序的数据模型。 使用Django后台管理系统&#xff0c;你可以轻松地进行以下操作&#xff1a; 数据库管理&…...

leetcode解题思路分析(一百四十五)1254 - 1266 题

统计封闭岛屿的数目 二维矩阵 grid 由 0 &#xff08;土地&#xff09;和 1 &#xff08;水&#xff09;组成。岛是由最大的4个方向连通的 0 组成的群&#xff0c;封闭岛是一个 完全 由1包围&#xff08;左、上、右、下&#xff09;的岛。请返回 封闭岛屿 的数目。 BFS或者DFS…...

使用 GORM 连接数据库并实现增删改查操作

步骤 1&#xff1a;安装 GORM 首先&#xff0c;我们需要安装 GORM 包。在终端中运行以下命令&#xff1a; shell go get -u gorm.io/gorm 步骤 2&#xff1a;导入所需的包 在 Go 代码的开头导入以下包&#xff1a; import ("gorm.io/driver/mysql" // 如果你使用…...

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…...

树莓派本地快速搭建web服务器,并发布公网访问

文章目录 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 随着科技的发展&#xff0c;电子工业也在不断进步&#xff0c;我们身边的电子设备也在朝着小型化和多功能化演进&#xff0c;以往体积庞大的电脑也在…...

集合中的数据结构

栈 先进后出入口跟出口在同一侧 队列 先进先出入口跟出口在不同的一层 数组 查询快、增删慢查询快是因为数组的地址是连续的&#xff0c;我们通过数组的首地址就可以找到数组&#xff0c;之后通过数组的下标就可以访问数组的每一个元素。增删慢是因为数组的长度是固定的&…...

CentOS 8 错误: Error setting up base repository

配置ip、掩码、网关、DNS VMware网关可通过如下查看 打开网络连接 配置镜像的地址 vault.centos.org/8.5.2111/BaseOS/x86_64/os/...

java外观模式

在Java中&#xff0c;外观模式&#xff08;Facade Design Pattern&#xff09;用于为复杂的子系统提供一个简单的接口&#xff0c;以方便客户端的使用。外观模式是一种结构型设计模式&#xff0c;它隐藏了系统的复杂性&#xff0c;将多个类的复杂操作封装在一个外观类中&#x…...

3秒快速打开 jupyter notebook

利用 bat 脚本&#xff0c;实现一键打开 minconda 特点&#xff1a; 1、可指定 python 环境 2、可指定 jupyter 目录 一、配置环境 minconda 可以搭建不同的 python 环境&#xff0c;所以我们需要找到 minconda 安装目录&#xff0c;把对应目录添加到电脑环境 PATH 中&#…...

数据安全

数据的备份与恢复 1. 数据备份技术 任何数据在长期使用过程中&#xff0c;都存在一定的安全隐患。由于认为操作失误或系统故障&#xff0c;例如认为错误、程序出错、计算机失效、灾难和偷窃&#xff0c;经常造成数据丢失&#xff0c;给个人和企业造成灾难性的影响。在这种情况…...

华为nat64配置

1.前期环境准备 环境拓扑 拓扑分为两个区域,左边为trust区域,使用IPv4地址互访,右边为untrust区域,使用IPv6地址互访 2.接口地址配置 pc1地址配置 pc2地址配置 FW接口配置 (1)首先进入防火墙配置界面 注:防火墙初始账号密码为user:admin,pwd:Admin@123,进入之后…...

从分片传输到并行传输之大文件传输加速技术

随着大文件的传输需求越来越多&#xff0c;传输过程中也会遇到很多困难&#xff0c;比如传输速度慢、文件安全性低等。为了克服这些困难&#xff0c;探讨各种大文件传输加速技术。其中&#xff0c;分片传输和并行传输是两种比较常见的技术&#xff0c;下面将对它们进行详细说明…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...