Stable diffusion 简介

news2024/12/23 6:54:15

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 StableDiffusionPipeline

model_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.coloradmin.cn/o/1310941.html

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

相关文章

如何用开关电源测试系统测试电源峰值电流?

一、用万用表、示波器测量峰值电流 首先将待测电路输入信号线分别连接到测试电路的输入端和地端。待测电路的电源端连接电源。然后将示波器设置为AC耦合模式,通道1连接待测电路输入端,通道2连接待测电路地端。调整数字万用表为电流测量模式。打开电源&am…

【动手学深度学习】(十三)深度学习硬件

文章目录 一、CPU和GPU二、更多的芯片1.DSP:数字信号处理2.可编程阵列(FPGA)3.AI ASIC 三、单机多卡并行 一、CPU和GPU 提升CPU利用率 在计算ab之前,需要准备数据 主内存->L3->L2->L1->寄存器(数据只有进入寄存器才可以参与运算) 提升空间和时间的内存…

USB2.0 Spec 中文篇

体系简介 线缆 USB 是一种支持热拔插的高速串行传输总线,使用一对(两根)差分信号来传输数据,半双工。要求使用屏蔽双绞线。 供电 USB 支持 “总线供电” 和 “自供电” 两种供电模式。在总线供电方式下,设备最多可…

C++学习笔记—— C++内存管理方式:new和delete操作符进行动态内存管理

系列文章目录 http://t.csdnimg.cn/d0MZH 目录 系列文章目录http://t.csdnimg.cn/d0MZH 比喻和理解a.比喻C语言开空间C开空间 b.理解a、C语言的内存管理的缺点1、开发效率低(信息传递繁琐)2、可读性低(信息展示混乱)3、稳定性差&…

【MATLAB】基于VMD分解的信号去噪算法(基础版)

代码的使用说明 基于VMD分解的信号去噪算法(基础版) 代码流程图 代码效果图 本文代码:阿里云盘分享 获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复VMD去噪 本公众号致力于解决找代…

铭飞CMS list 接口 SQL注入漏洞复现

0x01 产品简介 铭飞CMS是一款基于java开发的一套轻量级开源内容管理系统,铭飞CMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案 0x02 漏洞概述 铭飞CMS在5.2.10版本以前list 接口处存在sql注入…

AI抽烟识别系统研发关键

为了设计一个有效的AI抽烟识别系统,我们需要考虑几个关键组成部分:图像捕捉、数据处理、模型训练、以及实际应用场景。下面是这个方案的详细阐述: 1. 图像捕捉与数据收集 摄像头部署:首先,在需要监控的区域安装高分辨…

社交网络分析1:起源发展、不同领域的应用、核心概念

社交网络分析1:社交网络相关定义和概念 写在最前面关于课程 社交网络、社交网络分析社交网络发展阶段(自己感兴趣)1. 社交网络的起源2. 社交网络的演变3. 社交网络的成熟4. 发展阶段补充和展望 2023社交大变革(自己感兴趣的点&…

带你手把手解读firejail沙盒源码(0.9.72版本) (三) fcopy

文章目录 main.c该模块的各个函数功能详解selinux_relabel_pathcopy_filemkdir_attrcopy_linkproc_pid_to_selffs_copydircheckduplicate_dirduplicate_fileduplicate_linkmain Makefile main.c 文件总结 ├── fcopy │ ├── Makefile │ └── main.cmain.c #include…

深度学习中的高斯分布

1 高斯分布数学表达 1.1 什么是高斯分布 高斯分布(Gaussian Distribution)又称正态分布(Normal Distribution)。高斯分布是一种重要的模型,其广泛应用与连续型随机变量的分布中,在数据分析领域中高斯分布占有重要地位。高斯分布是一个非常常见的连续概…

【Spring】03 容器

文章目录 1. 定义2. BeanFactory1)惰性加载2)基本的容器功能3)XML配置 3. ApplicationContext1)主动加载2)AOP支持3)事件发布与监听4)国际化支持5)注解支持 4. Spring容器的生命周期…

正则表达式(6):分组与后向引用

正则表达式(6):分组与后向引用 总结 本博文转载自 在本博客中,”正则表达式”为一系列文章,如果你想要从头学习怎样在Linux中使用正则,可以参考此系列文章,直达链接如下: 在Linux中…

ThinkPHP连接ORACLE数据库教程

目录 概念基本步骤详细操作问题排除参考 概念 要连接Oracle数据库,必须有两个东西,一个PHP官方写的扩展,一个Oracle官方写的客户端PHP是通过扩展去操作oralce客户端连接的服务端数据库,所以两个都不能少,而且版本必须…

arthas统计大循环方法时的注意事项

背景 arthas是我们日常查找各种问题的利器,不过我们也需要意识到arthas本身也是有性能损耗的,所以当老板对你提问为什么使用arthas分析时这个方法比生产上正常运行时这个方法的耗时要长很多,你可以向他进行解释,进而由于arthas的…

边缘检测@获取labelme标注的json黑白图掩码mask

import cv2 as cv import numpy as np import json import os from PIL import Imagedef convertPolygonToMask(jsonfilePath):

MySQL——数据类型

目录 一.数据类型分类 二. 数值类型 1.tinyint类型 2.bit类型 3.float类型 4.decimal 三.字符串类型 1.char 2.varchar 四.日期和时间类型 五.enum和set 一.数据类型分类 关于数据库的数据类型有非常多,但是并非所有的数据类型都是我们常用的&#xff…

《信息技术时代》期刊杂志论文发表投稿

《信息技术时代》期刊收稿方向:通信工程、大数据、计算机、办公自动化、信息或计算机教育、电子技术、系统设计、移动信息、图情信息研究、人工智能、智能技术、信息技术与网络安全等。 刊名:信息技术时代 主管主办单位:深圳湾科技发展有限…

vs2019比较两个代码的区别方法

vs2019比较两个代码的区别方法 效果代码 效果 代码 Tools.DiffFiles 3d_mig(1).c 3d_mig_xin0.c

UDP内网穿透和打洞原理与代码实现

1、众所周知,现在主流网络用的还是IPV4协议,理论上一共有2^3243亿个地址,除去私有网段、网络ID、广播ID、保留网段、本地环回127.0.0.0网段、组播224.0.0.0网段、实际可用就是36.47亿个;全球的服务器、PC机、手机、物联网设备等需…

08.CSS盒模型

CSS盒模型 1.介绍 CSS 会把所有的 HTML 元素都看成一个盒子,所有的样式也都是基于这个盒子 2.盒模型构成 介绍 margin(外边距):盒子与外界的距离border(边框):盒子的边框padding&#xff0…