Stable Diffusion学习

news2024/11/18 16:28:27

参考 Stable Diffusion原理详解_stable diffusion csdn-CSDN博客

Stable Diffusion是stability.ai开源的图像生成模型,可以说Stable Diffusion的发布将AI图像生成提高到了全新高度,其效果和影响不亚于Open AI发布ChatGPT。

图像生成的发展

在Stable Diffusion诞生之前,计算机视觉和机器学习方面最重要的突破是 GAN(Generative Adversarial Networks 生成对抗网络)。GAN让超越训练数据已有内容成为可能,从而打开了一个全新领域——现在称之为生成建模。

GAN的主要问题在于:

  • 图像生成缺乏多样性
  • 模式崩溃
  • 多模态分布学习困难
  • 训练时间长
  • 由于问题表述的对抗性,不容易训练

随着算力的增长,一些过去算力无法满足的复杂算法得以实现,其中有一种方法叫“扩散模型”——一种从气体扩散的物理过程中汲取灵感并试图在多个科学领域模拟相同现象的方法。该模型在图像生成领域展现了巨大的潜力,成为今天Stable Diffusion的基础。

扩散模型

扩散模型是一种生成模型,用于生成与训练数据相似的数据。简单的说,扩散模型的工作方式是通过迭代添加高斯噪声来“破坏”训练数据,然后学习如何消除噪声来恢复数据。

一个标准扩散模型有两个主要过程:正向扩散反向扩散

在正向扩散阶段,通过逐渐引入噪声来破坏图像,直到图像变成完全随机的噪声。

在反向扩散阶段,使用一系列马尔可夫链逐步去除预测噪声,从高斯噪声中恢复数据1。

通过缓慢添加(去除)噪声来生成样本的正向(反向)扩散过程的马尔可夫链(图片来源: Jonathan Ho, Ajay Jain, Pieter Abbeel. 2020)

对于噪声的估计和去除,最常使用的是 U-Net。该神经网络的架构看起来像字母 U,由此得名。U-Net 是一个全连接卷积神经网络,这使得它对图像处理非常有用。U-Net的特点在于它能够将图像作为入口,并通过减少采样来找到该图像的低维表示,这使得它更适合处理和查找重要属性,然后通过增加采样将图像恢复回来。
具体的说,所谓去除噪声就是从时间帧 t tt 向时间帧 t − 1 t-1t−1 的变换,其中 t tt 是 t 0 t_0t 
0(没有噪声)到 t m a x t_{max}t max(完全噪声)之间的任意时间帧。变换规则为:

输入时间帧 t tt 的图像,并且在该时间帧上图像存在特定噪声;
使用 U-Net 预测总噪声量;
然后在时间帧 t tt 的图像中去除总噪声的“一部分”,得到噪声较少的时间帧 t − 1 t-1t−1 的图像。

向图片逐步增加/删除噪声

从数学上讲,执行此上述方法 T TT 次比尝试消除整个噪声更有意义。通过重复这个过程,噪声会逐渐被去除,我们会得到一个更“干净”的图像。比如对于带有噪声的图,我们通过在初始图像上添加完全噪声,然后再迭代地去除它来生成没有噪声的图像,效果比直接在原图上去除噪声要好。
由于扩散模型能够保持数据的语义结构,因此不会受到模式崩溃的影响。

实现扩散模型存在一些困难。因为所有马尔可夫状态都需要一直在内存中进行预测,这意味着内存中要一直保存多个大型深度网络的实例,从而导致扩散模型非常吃内存。此外,扩散模型可能会陷入图像数据中难以察觉的细粒度复杂性中,导致训练时间变得太长(几天到几个月)。矛盾的是,细粒度图像生成是扩散模型的主要优势之一,我们无法避免这个“甜蜜的烦恼”。由于扩散模型对计算要求非常高,训练需要非常大的内存和电量,这使得早前大多数研究人员无法在现实中实现该模型。

Transformer

Transformer是来自 NLP 领域的非常著名的模型方法。

Transformer在语言建模和构建对话式 AI 工具方面取得了巨大成功。 在视觉应用中,Transformer 表现出了泛化和自适应的优势,这使得它们非常适合通用学习。 它们比其他技术能够更好地捕捉文本甚至图像中的语义结构。

Transformer可以与扩散模型结合,通过Transformer的“词嵌入”可以将文本插入到模型中。这意味着将词Token化后,然后将这种文本表示添加到U-Net的输入(图像)中,经过每一层U-Net神经网络与图像一起进行变换。从第一次迭代开始到之后的每一次迭代都加入相同的文本,从而让文本“作为指南”生成图像,从有完整噪声的第一次迭代开始,然后进一步向下应用到整个迭代。

Stable Diffusion

扩散模型最大的问题是它的时间成本和经济成本都极其“昂贵”。Stable Diffusion的出现就是为了解决上述问题。如果我们想要生成一张 1024 × 1024 1024 \times 10241024×1024 尺寸的图像,U-Net 会使用 1024 × 1024 1024 \times 10241024×1024 尺寸的噪声,然后从中生成图像。这里做一步扩散的计算量就很大,更别说要循环迭代多次直到100%。一个解决方法是将大图片拆分为若干小分辨率的图片进行训练,然后再使用一个额外的神经网络来产生更大分辨率的图像(超分辨率扩散)。
2021年发布的Latent Diffusion模型给出了不一样的方法。 Latent Diffusion模型不直接在操作图像,而是在潜在空间中进行操作。通过将原始数据编码到更小的空间中,让U-Net可以在低维表示上添加和删除噪声。

潜在空间(Lantent Space)
潜在空间简单的说是对压缩数据的表示。所谓压缩指的是用比原始表示更小的数位来编码信息的过程。比如我们用一个颜色通道(黑白灰)来表示原来由RGB三原色构成的图片,此时每个像素点的颜色向量由3维变成了1维度。维度降低会丢失一部分信息,然而在某些情况下,降维不是件坏事。通过降维我们可以过滤掉一些不太重要的信息你,只保留最重要的信息。
假设我们像通过全连接的卷积神经网络训练一个图像分类模型。当我们说模型在学习时,我们的意思是它在学习神经网络每一层的特定属性,比如边缘、角度、形状等……每当模型使用数据(已经存在的图像)学习时,都会将图像的尺寸先减小再恢复到原始尺寸。最后,模型使用解码器从压缩数据中重建图像,同时学习之前的所有相关信息。因此,空间变小,以便提取和保留最重要的属性。这就是潜在空间适用于扩散模型的原因。

Latent Diffusion
“潜在扩散模型”(Latent Diffusion Model)将GAN的感知能力、扩散模型的细节保存能力和Transformer的语义能力三者结合,创造出比上述所有模型更稳健和高效的生成模型。与其他方法相比,Latent Diffusion不仅节省了内存,而且生成的图像保持了多样性和高细节度,同时图像还保留了数据的语义结构。

任何生成性学习方法都有两个主要阶段:感知压缩和语义压缩。
感知压缩
在感知压缩学习阶段,学习方法必须去除高频细节将数据封装到抽象表示中。此步骤对构建一个稳定、鲁棒的环境表示是必要的。GAN 擅长感知压缩,通过将高维冗余数据从像素空间投影到潜在空间的超空间来实现这一点。潜在空间中的潜在向量是原始像素图像的压缩形式,可以有效地代替原始图像。

用自动编码器 (Auto Encoder) 结构捕获感知压缩。 自动编码器中的编码器将高维数据投影到潜在空间,解码器从潜在空间恢复图像。

语义压缩
在学习的第二阶段,图像生成方法必须能够捕获数据中存在的语义结构。 这种概念和语义结构提供了图像中各种对象的上下文和相互关系的保存。 Transformer擅长捕捉文本和图像中的语义结构。 Transformer的泛化能力和扩散模型的细节保存能力相结合,提供了两全其美的方法,并提供了一种生成细粒度的高度细节图像的方法,同时保留图像中的语义结构。

感知损失

潜在扩散模型中的自动编码器通过将数据投影到潜在空间来捕获数据的感知结构。论文作者使用一种特殊的损失函数来训练这种称为“感知损失”的自动编码器。该损失函数确保重建限制在图像流形内,并减少使用像素空间损失(例如 L1/L2 损失)时出现的模糊。

扩散损失
扩散模型通过从正态分布变量中逐步去除噪声来学习数据分布。换句话说,扩散模型使用长度为 T TT 的反向马尔可夫链。这也意味着扩散模型可以建模为时间步长为 t = 1 , … , T t =1,\dots,Tt=1,…,T 的一系列“T”去噪自动编码器。
 

条件扩散
扩散模型是依赖于先验的条件模型。在图像生成任务中,先验通常是文本、图像或语义图。为了获得先验的潜在表示,需要使用转换器(例如 CLIP)将文本/图像嵌入到潜在向量τ \tauτ中。因此,最终的损失函数不仅取决于原始图像的潜在空间,还取决于条件的潜在嵌入。
 

注意力机制

潜在扩散模型的主干是具有稀疏连接的 U-Net 自动编码器,提供交叉注意力机制2。Transformer 网络将条件文本/图像编码为潜在嵌入,后者又通过交叉注意力层映射到 U-Net 的中间层。

文本-图像合成
在 Python 实现中,我们可以使用使用 LDM v4 的最新官方实现来生成图像。 在文本到图像的合成中,潜在扩散模型使用预训练的 CLIP 模型3,该模型为文本和图像等多种模态提供基于Transformer的通用嵌入。 然后将Transformer模型的输出输入到称为“diffusers”的潜在扩散模型Python API,同时还可以设置一些参数(例如,扩散步数、随机数种子、图像大小等)。

图像-图像合成

相同的方法同样适用于图像到图像的合成,不同的是需要输入样本图像作为参考图像。生成的图像在语义和视觉上与作为参考给出的图像相似。这个过程在概念上类似于基于样式的 GAN 模型,但它在保留图像的语义结构方面做得更好。

潜在扩散模型的架构(图片来源:Rombach & Blattmann, et al. 2022)

上图中 x 表示输入图像,x~表示生成的图像;ε 是编码器,D  是解码器,二者共同构成了感知压缩;z是潜在向量;z T 是增加噪声后的潜在向量;τ θ 是文本/图像的编码器(比如Transformer或CLIP),实现了语义压缩。
本质上Stable Diffusion属于潜在扩散模型(Latent Diffusion Model)。潜在扩散模型在生成细节丰富的不同背景的高分辨率图像方面非常稳健,同时还保留了图像的语义结构。 因此,潜在扩散模型是图像生成即深度学习领域的一项重大进步。 Stable Diffusion只是将潜在扩散模型应用于高分辨率图像,同时使用 CLIP 作为文本编码器。
 

参考:Stable Diffusion 超详细讲解-CSDN博客

Diffusion Model 概览

Diffusion Model的训练可以分为两部分:

  1. 正向扩散过程 → 为图像添加噪声。
  2. 反向扩散过程 → 去除图像中的噪声。
正向扩散过程

正向扩散过程将高斯噪声逐步添加到输入图像中。

逆向扩散过程
由于逆向扩散过程不可直接计算(计算代价太高),我们通过训练神经网络 来近似。

训练
每一轮训练过程如下:

为每个训练样本(图像)选择一个随机时间步长 t tt。
将高斯噪声(对应于 t tt)应用于每个图像。
将时间步长转换为嵌入(向量)。

下面详细解释一下训练步骤是如何工作的:

采样

采样意味着从高斯噪声图中绘制出图像。下图展示了我们如何使用经过训练的 U-Net 生成图像:

扩散速度问题
如你所见,扩散(采样)过程迭代地将全尺寸图像提供给 U-Net 来获得最终结果。当总扩散步数 T TT 和图像很大时,这种纯扩散模型会非常慢。

为了解决这个问题,Stable Diffusion 应运而生。

Stable Diffusion

Stable Diffusion 一开始的名称是“潜在扩散模型”(Latent Diffusion Model)。顾名思义,Stable Diffusion 发生在潜在空间中。这就是它比纯扩散模型更快的原因。

潜在空间

我们首先训练一个自动编码器来学习如何将图像数据压缩成低维表示。

通过使用经过训练的编码器 E ,我们可以将全尺寸图像编码为低维潜在数据(压缩数据)。
通过使用经过训练的解码器 D ,我们可以将潜在数据解码回图像。

Latent Diffusion

将图像编码为潜在数据后,将在潜在空间中进行正向和反向扩散过程。

  1. 正向扩散过程 → 向潜在数据添加噪声。
  2. 逆向扩散过程 → 从潜在数据中去除噪声。
调节机制

Stable Diffusion 真正强大之处在于它可以根据文本提示生成图像。这是通过接受调节输入修改内部扩散模型来实现的。

通过使用交叉注意机制增强其去噪 U-Net,将内部扩散模型转变为条件图像生成器。

上图中的开关用于在不同类型的调节输入之间进行控制:

对于文本输入,首先使用语言模型 τ θ(例如 BERT、CLIP)将文本转换为嵌入(向量),然后通过(多头)注意力 A t t e n t i o n ( Q , K , V ) Attention(Q, K, V)Attention(Q,K,V) 映射到 U-Net 层。
对于其他空间对齐的输入(例如语义映射、图像、修复),可以使用连接来完成调节。

训练

Stable Diffusion 的训练目标(损失函数)与纯扩散模型中的目标非常相似。

采样

由于潜在数据的大小比原始图像小得多,因此去噪过程会快得多。

总结

  • Stable Diffusion(潜在扩散模型)在潜在空间中进行扩散过程,因此它比纯扩散模型快得多。
  • 扩散模型核心被修改为接受条件输入,如文本、图像、语义图等。

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

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

相关文章

代码随想录算法训练营第41天|343. 整数拆分、96.不同的二叉搜索树

文章目录 343. 整数拆分思路代码 96.不同的二叉搜索树思路代码 343. 整数拆分 题目链接:343. 整数拆分 文章讲解:代码随想录|343. 整数拆分 视频讲解:整数拆分 思路 1.dp[i]:整数i拆分成k个数的最大乘积 2.dp[i] max(dp[i], max((i - j) *…

DAY08_SpringBoot—整合Mybatis-Plus

目录 1 MybatisPlus1.1 MP介绍1.2 MP的特点1.3 MybatisPlus入门案例1.3.1 导入jar包1.3.2 编辑POJO对象1.3.3 编辑Mapper接口1.3.4 编译YML配置文件1.3.5 编辑测试案例 1.4 MP核心原理1.4.1 需求1.4.2 原理说明1.4.3 对象转化Sql原理 1.5 MP常规操作1.5.1 添加日志打印1.5.2 测…

unity刷新grid,列表

获取UIGrid 组件,更新列表 listParent.GetComponent().repositionNow true;

书生·浦语大模型--第四节课笔记--XTuner大模型单卡低成本微调

文章目录 Finetune简介指令跟随微调增量预训练微调LoRA QLoRA XTuner介绍快速上手 8GB显卡玩转LLM动手实战环节 Finetune简介 增量预训练和指令跟随 通过指令微调获得instructed LLM 指令跟随微调 一问一答的方式进行 对话模板 计算损失 增量预训练微调 不需要问题只…

C++高精度问题

高精度前言 C中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。 高精度总体思路 由于int和long long的限制,我们要想存放很长的数就需…

国标GB28181协议EasyCVR启动失败报错“Local Machine Check Error”的解决方法

国标GB28181安防监控系统EasyCVR平台采用了开放式的网络结构,可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。安防视频监控平台EasyCVR还能支持GIS电子地图模式,基于监控摄像头的经纬度地理位置信息,将场景中的整体安防布…

感性负载对电路稳定性有什么影响?

感性负载是指带有电感元件的负载,如电动机、变压器等。在电路中,感性负载对电路稳定性有很大的影响。本文将从以下几个方面来分析感性负载对电路稳定性的影响: 当感性负载接通或断开时,会产生一个瞬时电流,这个瞬时电流…

大数据开发之Spark(RDD弹性分布式数据集)

第 1 章:rdd概述 1.1 什么是rdd rdd(resilient distributed dataset)叫做弹性分布式数据集,是spark中最基本的数据抽象。 代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 1.1…

安装vcenter7.0问题汇总

1.Windows server 2016安装vcenter7.0出现:无法获取目标服务器证书的 SSL 指纹。 第一个检查点: 防火墙:关闭或者开放443端口 第二个检查点: 检查自己的虚拟网卡是否开启 第三个检查点: 我标记的第一个大框中我这…

Zabbix分布式监控系统

实验过程 ps: 阿里云盘Xnode1获取 xnode1 https://www.alipan.com/s/HgLXfoeBWG2 提取码: eb70 1、xnode1克隆两台虚拟机并修改ip zabbix-server192.168.224.3 zabbix-agent192.168.224.4 2、修改主机名 [rootlocalhost ~]# hostnamectl set-hostname zabbix-se…

Vue3 ref与reactive

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

php比较运算,强相等(===)弱相等(==)表

弱相等() 符号为: 规则为:只比较值,不比较类型,只要值对就为true 样例:比较整型123和字符串"123",运行结果给出了true 弱相等表:* 代表在 PHP 8.0.0 之前为…

【网站项目】新冠疫情隔离人员信息管理系统(有源码)

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板,帮助书写开题报告。作者完整代码目录供你选择: 《Springboot网站项目…

S7-1500与多台200SMART之间无线以太网通讯搭建方法

这是一个不用编程即可瞬间实现S7-200smart与S7-1500的以太网通讯的方法,这种控制方式下最多可以控制128台S7-200SMART。本方案以组态王与S7-1500和2台S7-200smart为例,介绍S7-1500与多台 S7-200smart在Profinet协议下的自组网无线通信实现过程。在本方案…

大数据平台红蓝对抗 - 磨利刃,淬精兵!

背景 目前大促备战常见备战工作:专项压测(全链路压测、内部压测)、灾备演练、降级演练、限流、巡检(监控、应用健康度)、混沌演练(红蓝对抗),如下图所示。随着平台业务越来越复杂&a…

AI一键换衣,阿里Outfit Anyone来了,电商人的福音!

继谷歌推出Tryon Diffusion虚拟试穿后,国内的头部电商阿里也推出的Outfit Anyone虚拟试穿技术。该技术采用双流条件扩散模型,处理模特和服装数据,通过衣物图像实现逼真的虚拟试穿效果,结合Animate Anyone技术,轻松制作…

5118优惠码vip、svip、专业版和旗舰版使用yhm666

5118大数据平台会员优惠码【yhm666】,结算时勾选“使用优惠码”,然后在优惠码窗口中输入yhm666,然后点确定即可享受特价会员价格。阿腾云atengyun.com分享如下图: 5118会员优惠码【yhm666】 5118会员价格和使用优惠码之后的价格对…

Go 复合数据类型

1. 数组(array)(OK) 数组数组的概念数组是具有固定长度且拥有零个或多个相同数据类型元素的序列 i. 元素的数据类型相同 ii. 长度固定的序列 iii. 零个或多个元素的序列 与 slice 对比 由于数组的长度固定,所以在 G…

电脑硬盘数据恢复?这3个方法不要错过!

“我在使用电脑办公时,不小心将电脑硬盘里的数据误删了。这些数据对我来说都是比较重要的!有什么比较简单的方可以恢复吗?” 电脑硬盘中一般会保存用户很多重要的资料和数据,如果这些资料误删了,可能会带来各种麻烦和不…

自定义线程工厂规范【开发手册】

一、介绍 最近在看一些编码以及设计的规范,觉得有些还是很有用的,在这分享给大家。主要学习阿里的Java开发规范(黄山版),这篇主要是对日常大家使用线程池或者线程时,为何应该制定有意义的线程名称等。 二…