Stable diffusion 简介

Stable diffusion 是 CompVis、Stability AI、LAION、Runway 等公司研发的一个文生图模型,将 AI 图像生成提高到了全新高度,其效果和影响不亚于 Open AI 发布 ChatGPT。Stable diffusion 没有单独发布论文,而是基于 CVPR 2022 Oral —— 潜扩散模型 (Latent Diffusion Model, LDM)。

Stable diffusion 模型并不是直接在像素空间上操作图像,而是在隐空间中进行操作:通过将原始数据编码到更小的隐空间中,让 U-Net 可以在低维表示上添加和删除噪声,这样可以显著提高模型的训练和生成效率。此外,stable diffusion 还引入了 CLIP,将输入文本的特征与模型生成的图像做比对以输出最符合文本的图像。

在这里插入图片描述

目录

  • 一. 背景
  • 二. Stable diffusion 模型
    • 1. Autoencoder
    • 2. CLIP text encoder
    • 3. U-Net
  • 三. 训练方法
  • 四. 图像生成
  • 五. 实验
  • 六. 总结
  • 七. 复现

一. 背景

在 Stable Diffusion 诞生之前,AIGC 最主要的模型是生成对抗网络 GAN,通过同时训练两个网络进行对抗训练,实现高质量的图像生成。GAN 让超越训练数据已有内容成为可能,从而打开了一个全新领域 —— 生成建模。1 然而,在经历了一段蓬勃发展后,GAN 开始暴露出一些瓶颈和弊病:图像生成缺乏多样性、模式崩溃、多模态分布学习困难、训练时间长,GAN 由此进入瓶颈期。

Diffusion 的出现打破了 AIGC 的僵局,通过向数据中添加噪声再去噪恢复数据,从而实现图像的自由生成。Diffusion 自 DDPM 的提出就迅速收获大量好评,现在大火的最 GLIDE、DALLE2、Imagen,以及一系列的 Image Editing 方法,都是基于 diffusion。然而,diffusion 的训练时间和经济成本都极其昂贵,于是出现了 stable diffusion。

Stable diffusion 模型不直接在像素空间上操作图像,而是在隐空间中进行操作。通过将原始数据编码到更小的隐空间中,让 U-Net 可以在低维表示上添加和删除噪声,这样能够加速 U-Net 处理数据的速度,实现更高的生成效率。2
在这里插入图片描述

为了实现文生图的效果,stable diffusion 还在 U-Net 中引入了 CLIP text encoder 提取文本特征,从而生成更加符合文本的图像。

二. Stable diffusion 模型

Stable diffusion 是一个基于 latent 的扩散模型,采用一个 autoencoder 将图像压缩到 latent 空间,然后用扩散模型来生成图像的 latents,最后送入 decoder 模块就可以得到生成的图像。Stable diffusion 还在 U-Net 中引入 text condition 实现了基于文本的生成图像。3
在这里插入图片描述

Stable diffusion 模型的主体结构如图所示,主要包括三个模型:

  • Autoencoder:将图像在 pixel 空间和 latent 空间之间压缩和解压缩;
  • CLIP text encoder:提取输入文本的 text embeddings 传入 U-Net;
  • U-Net:扩散模型的主体,用来实现文本引导下的图像 latents 生成。

1. Autoencoder

为了让 stable diffusion 能够在像素空间和隐空间之间做变换,引入了编码器和解码器:

  • 编码器 E E E:将全尺寸图像编码为低维潜在数据;
  • 解码器 D D D:将潜在数据解码回全尺寸图像;
    在这里插入图片描述

Autoencoder 将 H × W × 3 H \times W \times 3 H×W×3 大小的 RGB 图像 x x x 压缩成 h × w × c h \times w \times c h×w×c 大小的隐空间表示, f = H / h = W / w f = H/h = W/w f=H/h=W/w 称为下采样率 (downsampling factor)。LDM 尝试了 f = 2 m f=2^m f=2m 的不同取值,权衡生成质量和收敛速度。

2. CLIP text encoder

为了实现文生图的效果,stable diffusion 使用预训练的 CLIP text encoder 提取文本特征 text embeddings 传入 U-Net,以指导其图像生成。Stable diffusion 采用的 CLIP text encoder 是 clip-vit-large-patch14 的 text encoder,是一个 12 层、768 特征维度的 transformer 模型,得到 77x768 特征维度的 text embeddings,将其送入 U-Net 的 Cross-Attention 中。
在这里插入图片描述

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

  • 对于文本输入,首先使用语言模型 τ θ \tau_{\theta} τθ 将文本转换为嵌入向量,然后通过 Multi-Head Attention 映射到 U-Net;
  • 对于其他模态的对齐输入(例如语义映射、图像、修复),使用连接来完成调节;

3. U-Net

U-Net 是扩散模型的主体,用来实现文本引导下的图像 latents 生成。为了实现文本指导,stable diffusion 通过使用 cross-attention 机制增强 U-Net,将内部扩散模型转变为条件图像生成器。

Stable Diffusion 的训练目标与 diffusion 的目标较为相似,需要改进的地方是 4

  • 图像 x t x_t xt 变为了隐空间中的变量 z t z_t zt
  • U-Net 中添加了条件输入 τ θ ( y ) \tau_{\theta}(y) τθ(y)

因此 Stable Diffusion 的损失函数如下:
L L D M = E t , z 0 , ϵ , y [ ∥ ϵ − ϵ θ ( z t , t , τ θ ( y ) ) ∥ 2 2 ] L_{\mathrm{LDM}}=\mathbb{E}_{t, z_0, \epsilon, y}\left[\left\|\epsilon-\epsilon_\theta\left(z_t, t, \tau_\theta(y)\right)\right\|_2^2\right] LLDM=Et,z0,ϵ,y[ϵϵθ(zt,t,τθ(y))22]

更多介绍见 stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,喂到你嘴里。

三. 训练方法

在这里插入图片描述

四. 图像生成

在这里插入图片描述

五. 实验

六. 总结

七. 复现

Stable diffusion 开源了预训练好的权重:the CompVis organization at Hugging Face,可以直接拿来做下游任务:

  • 平台:AutoDL
  • 显卡:RTX 3090 24G
  • 镜像:PyTorch 1.11.0、Python 3.8(ubuntu20.04)、Cuda 11.3
  • 源码:https://github.com/CompVis/stable-diffusion

Hugging Face 上提供了预训练好的不同版本的 checkpoints,以 stable-diffusion-v-1-1 为例,可以直接下载模型参数:CompVis/stable-diffusion-v-1-1-original。Hugging Face 上还将 stable diffusion 封装成 diffusers 库,可以直接调用完成下游任务,demo 如下:

import torch
from torch import autocast
from diffusers import StableDiffusionPipelinemodel_id = "CompVis/stable-diffusion-v1-1"
device = "cuda"pipe = StableDiffusionPipeline.from_pretrained(model_id)
pipe = pipe.to(device)prompt = "a photo of an astronaut riding a horse on mars"
with autocast("cuda"):image = pipe(prompt).images[0]  image.save("astronaut_rides_horse.png")

实验记录

  1. 一开始在 Notebook 里运行,即使进行学术资源加速,还是会报错 SSLCertVerificationError。后来直接在终端执行 python 文件就可以正常连接了;
    在这里插入图片描述

  2. 执行 image = pipe(prompt)["sample"][0] 时出现 KeyError: 'sample',将其修改为 image = pipe(prompt).images[0] 5 就可以正常使用了;

  3. 第一次执行需要下载模型文件和加载管道组件,费时较长,耐心等待即可。以后每次调用就可以直接加载;
    在这里插入图片描述

实验结果

a photo of an astronaut riding a horse on mars:
在这里插入图片描述

a photo of a Lamborghini racing on the track:
在这里插入图片描述

a photo of the night scenery of Chongqing:
在这里插入图片描述

a photo of the Great Wall:
在这里插入图片描述

A poster of Ferrari:
在这里插入图片描述

A wallpaper of NBA stars:
在这里插入图片描述


  1. Stable Diffusion原理详解 ↩︎

  2. Diffusion 和Stable Diffusion的数学和工作原理详细解释 ↩︎

  3. 文生图模型之Stable Diffusion ↩︎

  4. Stable Diffusion 超详细讲解 ↩︎

  5. KeyError: ‘sample’ #402 ↩︎

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

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

相关文章

面试经典150题(20)

leetcode 150道题 计划花两个月时候刷完,今天(第八天)完成了1道(20)150: 这个题花了我快 2个小时。。。 20:(6. N 字形变换)题目描述: 将一个给定字符串 s 根据给定的行数 numRow…

Linux 之 性能优化

uptime $ uptime -p up 1 week, 1 day, 21 hours, 27 minutes$ uptime12:04:11 up 8 days, 21:27, 1 user, load average: 0.54, 0.32, 0.23“12:04:11” 表示当前时间“up 8 days, 21:27,” 表示运行了多长时间“load average: 0.54, 0.32, 0.23”“1 user” 表示 正在登录…

cfa一级考生复习经验分享系列(二)

本人学历背景:毕业于普通二本学校,本科专业为金融学,所以还算是有一定的基础,今年19年6月份参加了cfa一级的考试,最终通过了一级的考试,虽然成绩一般,但是已经知足了,因为自己复习的…

在接口实现类中,加不加@Override的区别

最近的软件构造实验经常需要设计接口,我们知道Override注解是告诉编译器,下面的方法是重写父类的方法,那么单纯实现接口的方法需不需要加Override呢? 定义一个类实现接口,使用idea时,声明implements之后会…

cfa一级考生复习经验分享系列(三)

从总成绩可以看出,位于90%水平之上,且置信区间全体均高于90%线。 从各科目成绩可以看出,所有科目均位于90%线上或高于90%线,其中,另类与衍生、公司金额、经济学、权益投资、固定收益、财报分析表现较好,目测…

芯知识 | 什么是可重复擦写(Flash型)语音芯片?

什么是可重复擦写(Flash型)语音芯片? 可重复擦写(Flash型)语音芯片是一种嵌入式语音存储解决方案,采用了Flash存储技术,使得语音内容能够被多次擦写、更新,为各种嵌入式系统提供了灵…

QEMU源码全解析 —— virtio(1)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! virtio简介 对于一台虚拟机而言,除了要虚拟化CPU和内存&…

.360勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 在数字化时代,.360勒索病毒如影随形,威胁个人和组织的数据安全。本文将深入介绍.360病毒的特征、威胁,以及如何有效地恢复被加密的数据文件,同时提供预防措施,助您更好地保护数字资产。如不幸感染这…

原生小程序中对特定数据进行计算(wxml中wxs的使用)

背景&#xff1a;商品详情页对好评数进行统计&#xff0c;但是现在只有商品数据 使用wxs编写方法&#xff0c;module.exports导出&#xff0c;wxml中使用module名进行获取{{goodsRate.getRate(goodsInfoList)}} <wxs module"goodsRate">module.exports {get…

一站式查询热门小程序排名,助力小程序运营决策

如今小程序数量激增,竞争日益激烈,如何能在众多同类小程序中脱颖而出,提高曝光度与下载量,是每一个小程序运营者都极为关心的问题。对此,及时准确地查询自己小程序的热门排名,分析强劲对手,找出自己的短板,都是提高小程序竞争力的重要一环。那我们该如何方便快捷地查询到这些关…

Java通过documents4j和libreoffice把word转为pdf

文章目录 word转pdf的相关第三方jar说明Linux系统安装LibreOffice在线安装离线安装word转pdf验证 Java工具类代码 word转pdf的相关第三方jar说明 docx4j 免费开源、稍微复杂点的word&#xff0c;样式完全乱了&#xff0c;且xalan升级为2.7.3后会报错。poi 免费开源、官方文档少…

DNS:从域名解析到网络连接

目录 解密 DNS&#xff1a;从域名解析到网络连接的不可或缺 1. DNS的基本工作原理 1.1 本地解析器查询 1.2 递归查询 1.3 迭代查询 1.4 TLD 查询 1.5 权威 DNS 查询 2. DNS的重要性与作用 2.1 地址解析与负载均衡 2.2 网络故障处理与容错 2.3 安全性与防护 3. DNS的…

Flink 流处理流程 API详解

流处理API的衍变 Storm&#xff1a;TopologyBuilder构建图的工具&#xff0c;然后往图中添加节点&#xff0c;指定节点与节点之间的有向边是什么。构建完成后就可以将这个图提交到远程的集群或者本地的集群运行。 Flink&#xff1a;不同之处是面向数据本身的&#xff0c;会把D…

PyTorch 的 10 条内部用法

欢迎阅读这份有关 PyTorch 原理的简明指南[1]。无论您是初学者还是有一定经验&#xff0c;了解这些原则都可以让您的旅程更加顺利。让我们开始吧&#xff01; 1. 张量&#xff1a;构建模块 PyTorch 中的张量是多维数组。它们与 NumPy 的 ndarray 类似&#xff0c;但可以在 GPU …

【springboot】【easyexcel】excel文件读取

目录 pom.xmlExcelVo逐行读取并处理全部读取并处理向ExcelListener 传参 pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> </dependency>ExcelVo 字段映射…

基于 Webpack5 Module Federation 的业务解耦实践

前言 本文中会提到很多目前数栈中使用的特定名词&#xff0c;统一做下解释描述 dt-common&#xff1a;每个子产品都会引入的公共包(类似 NPM 包) AppMenus&#xff1a;在子产品中快速进入到其他子产品的导航栏&#xff0c;统一维护在 dt-common 中&#xff0c;子产品从 dt-com…

c/c++ | 少量内存溢出不会影响程序的正常运行

常见 通过指针 获得 字符串“aaaaaaaaaaaaaaaaaaaaaaaaaaa” 数据&#xff0c;然后通过strcpy 拷贝到对象 char str1[5] 中&#xff0c;事实是造成了内存溢出&#xff0c;但是 &#xff0c;最后 str1 打印输出的结果 是上面的 “aaaaaaaaaaaaaaaaaaaaaaaaaaa” 这是不正常的&am…

Draw.io or diagrams.net 使用方法

0 Preface/Foreword 在工作中&#xff0c;经常需要用到框图&#xff0c;流程图&#xff0c;时序图&#xff0c;等等&#xff0c;draw.io可以完成以上工作。 official website:draw.io 1 Usage 1.1 VS code插件 draw.io可以扩展到VS code工具中。

百度搜索展现服务重构:进步与优化

作者 | 瞭东 导读 本文将简单介绍搜索展现服务发展过程&#xff0c;以及当前其面临的三大挑战&#xff1a;研发难度高、架构能力欠缺、可复用性低&#xff0c;最后提出核心解决思路和具体落地方案&#xff0c;期望大家能有所收货和借鉴。 全文4736字&#xff0c;预计阅读时间12…

产品入门第四讲:Axure动态面板

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还…