Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录

    • LDM
      • 概述
      • 原理
      • 模型架构
        • 自编码器模型
        • 扩散模型
        • 条件引导模型
        • 图像生成过程
      • 实验结果
        • 指标定义
          • IS(越大越好)
          • FID(越小越好)
        • 训练成本与采样质量分析
        • 不带条件的图片生成
        • 基于文本的图片生成
        • 基于语义框的图片生成
        • 基于语义图的图片生成
        • 超分辨率图像生成
        • 图像重绘
    • 其他文生图模型
      • DALL-E
      • Imagen

在上一章,我们了解了扩散模型的基本原理,但它离实现Stable Diffusion的文生图或图生图功能显然还有一段距离,那就是如何将文字或图片信息融入到生成图片的过程中,比如,像下图这样?
在这里插入图片描述
除此之外,扩散模型的一个重要特点就是维度的不变性,这就限制了生成图片大小的上限,原始论文中最大的图片生成大小也就是256×256,这意味着所有的中间表示也是这个尺度,如果再大一点,显卡和耐心可能就不够用了。

LDM

为了解决上述两个难题,我们需要在隐空间中重新审视扩散过程,并基于此重新设计生成模型,这也是Stable Diffusion的直接原理。这里我们要读一篇发表于CVPR2022的论文:《High-Resolution Image Synthesis with Latent Diffusion Models》

概述

论文提出了一个名为Latent Diffusion Models (LDM)的新模型,旨在减少直接在像素空间中训练扩散模型所带来的计算复杂度。论文的主要内容和贡献如下:

  • 提出了两阶段训练方法:首先训练一个自动编码器,学习一个低维的潜在空间表示,然后在自动编码器的潜在空间中训练扩散模型。这显著降低了训练和推理的计算复杂度。
  • 引入交叉注意力机制:通过将交叉注意力层添加到UNet中,LDM可以处理各种条件输入,如文本或语义布局,并实现高质量的图像生成。
  • 在多个任务上取得了最先进或竞争性的性能,包括无条件图像生成、文本到图像生成、语义合成、超分辨率和图像修复等。相比像素级扩散模型,LDM的训练和推理成本大大降低。

原理

作者认为任何生成性学习方法都有两个主要阶段:感知压缩语义压缩

感知压缩指的是在训练过程中,自动编码器通过学习去除图像中不太重要的细节信息,保留基本的结构和语义信息。在这个过程中,图像的高频细节信息被过滤掉,留下低频语义信息。这种压缩方式对减少计算复杂度和模型参数是有帮助的。

语义压缩则是指生成模型学习语义和概念层面的信息,通过生成过程来弥补感知压缩过程中丢失的细节。这种压缩方式能够有效提升模型的生成能力,同时减少对不重要的细节的建模。

两种压缩相结合,也就是自编码器和扩散过程相结合,也就有了LDM模型。

模型架构

模型的总体架构如下图所示,包括了左侧用来实现感知压缩的变分自编码器模型(VAE)、中间在潜空间完成扩散过程的Unet模型,以及右侧的条件引导模型。
在这里插入图片描述

自编码器模型

给定原始图像 x ∈ R H × W × 3 x \in R^{H \times W \times 3} xRH×W×3,编码器 E \mathcal{E} E将其编码为隐空间中的表示,即 z = E ( x ) z=\mathcal{E}(x) z=E(x),其中 z ∈ R h × w × c z \in R^{h \times w \times c} zRh×w×c。这里我们定义降采样率 f = H / h = W / w f=H/h=W/w f=H/h=W/w

解码器 D \mathcal{D} D用来实现从隐空间到像素空间的转换,即 x ~ = D ( z ) = D ( E ( x ) ) \tilde{x}=\mathcal{D}(z)=\mathcal{D}(\mathcal{E}(x)) x~=D(z)=D(E(x))

自编码器单独训练,单独的图片数据集即可训练完成。
在这里插入图片描述

扩散模型

这一段非常简单,先看看原始的扩散公式
在这里插入图片描述
再看看潜空间版,区别一目了然
在这里插入图片描述
下面是一个训练过程中的示意图
在这里插入图片描述

条件引导模型

所谓的条件引导,就是输入文字或者图片后,引导模型生成与之相关的图片,也就是文生图或图生图的过程。

如果将上述这些条件统一表述为 y y y,那么去噪自编码器需要重写为条件去噪自编码器,即 ϵ θ ( z t , t , y ) \epsilon_\theta\left(z_t, t, y\right) ϵθ(zt,t,y)

那这个条件如何作用呢?对于输入的条件 y y y,使用域自适应的编码器 τ θ \tau_\theta τθ得到其中间表示 τ θ ( y ) ∈ R M × d τ \tau_\theta(y) \in \mathbb{R}^{M \times d_\tau} τθ(y)RM×dτ,再利用自注意力机制将其与UNet融合,其中 φ i ( z t ) ∈ R N × d ϵ i \varphi_i\left(z_t\right) \in \mathbb{R}^{N \times d_\epsilon^i} φi(zt)RN×dϵi是UNet的中间层参数。

在这里插入图片描述
在这里插入图片描述

以Stable Diffusion为例,它使用下图所示的基于图文相似度配对而成的CLIP ViT-L/14 (PMLR2021论文:Learning Transferable Visual Models From Natural Language Supervision)作为文本编码器 τ θ \tau_\theta τθ。这个编码器会将句子的长度限制为最大77个字符,如果长度超出,模型会对其进行截断。编码后输出的矩阵维度是77x768,其中768是隐藏层的大小。
如果输入条件包含图片,那么可以用自编码器中的编码器部分作为图片编码器 τ θ \tau_\theta τθ

在这里插入图片描述

最终优化的目标函数如下,其中 τ θ \tau_\theta τθ ϵ θ \epsilon_\theta ϵθ被联合优化
在这里插入图片描述

图像生成过程

在训练完成后,模型在隐空间随机产生一个噪音,与输入条件相结合,经过扩散过程去噪之后输入解码器,得到一张图像。
在这里插入图片描述
你可能会疑惑,为什么使用Stable Diffusion的时候,可以看到一个图片由模糊变清晰的过程呢?隐空间的表示难道不是肉眼不可见的吗?其实这很简单,让每一步去噪后的隐空间表示都由解码器处理一遍即可,但要注意并不是把它直接输入解码器,而是要通过上一章的扩散公式转换成隐空间的 z 0 z_0 z0表示,再输入解码器。

实验结果

指标定义
IS(越大越好)

nception Score(IS)是一个用于评估生成模型(如生成对抗网络GANs)性能的指标。它是由Tim Salimans等人于2016年在论文《Improved Techniques for Training GANs》中提出的。Inception Score的主要思想是使用一个预训练的Inception模型(通常是一个在ImageNet数据集上训练的深度卷积网络)来评估生成图像的质量和多样性。
Inception Score的计算步骤如下:

  1. 分类概率:首先,将生成的图像输入到预训练的Inception模型中,得到每个图像属于ImageNet数据集中1000个类别的概率分布。

  2. 图像质量:对于每个生成的图像,选择概率最高的类别,计算该类别的概率(即图像被正确分类的置信度)。这个过程反映了图像的质量,因为清晰的图像应该有一个高的最大概率。

  3. 图像多样性:计算所有生成图像的平均分类概率的熵。熵越高,说明生成的图像属于不同类别的分布越均匀,即图像的多样性越好。

  4. 综合评分:最后,将图像质量的指标和图像多样性的指标相乘,得到最终的Inception Score。公式可以表示为:

    I S = e x p ( E x [ D K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) ] ) IS = exp(\mathbb{E}_x[D_{KL}(p(y|x) || p(y))]) IS=exp(Ex[DKL(p(yx)∣∣p(y))])
    其中, p ( y ∣ x ) p(y|x) p(yx) 是模型对图像 x x x的分类概率分布, p ( y ) p(y) p(y)是所有图像的平均分类概率分布, D K L D_{KL} DKL是KL散度,用于衡量两个概率分布的差异。

Inception Score的一个缺点是它主要关注图像的多样性,而不是图像的真实性。因此,即使生成的图像非常多样,但如果不真实,Inception Score也可能很高。为了解决这个问题,研究人员提出了其他指标,如Fréchet Inception Distance (FID),它同时考虑了图像的质量和真实性。

FID(越小越好)

IFréchet Inception Distance (FID) 是一种用于评估生成模型(如生成对抗网络 GANs)生成图像质量的指标。FID 通过比较生成图像的特征分布与真实图像的特征分布之间的差异来衡量图像的真实性。FID 值越低,表明生成图像的质量越高,因为它们在特征空间中与真实图像更接近。
FID 的计算步骤如下:

  1. 特征提取:首先,使用一个预训练的 Inception-v3 模型(通常在 ImageNet 数据集上训练)来提取图像的特征。这个模型在最后一个池化层之前有一个瓶颈层,可以输出一个 2048 维的特征向量。
  2. 计算特征向量:对于一组真实图像和一组生成图像,分别计算它们通过 Inception-v3 模型得到的特征向量的平均值 μ \mu μ和协方差矩阵 Σ \Sigma Σ
  3. Fréchet 距离:然后,计算两个特征分布之间的 Fréchet 距离。这个距离是一个统计距离,用于衡量两个多元高斯分布之间的差异。Fréchet 距离定义为两个分布的均值之间的欧氏距离和它们协方差矩阵之间的加权几何距离的平方根。
    F I D = ∥ μ 1 − μ 2 ∥ 2 + T r ( Σ 1 + Σ 2 − 2 ( Σ 1 Σ 2 ) 1 / 2 ) FID = \|\mu_1 - \mu_2\|^2 + Tr(\Sigma_1 + \Sigma_2 - 2(\Sigma_1\Sigma_2)^{1/2}) FID=μ1μ22+Tr(Σ1+Σ22(Σ1Σ2)1/2)
    其中, μ 1 \mu_1 μ1 μ 2 \mu_2 μ2分别是真实图像和生成图像的特征向量的平均值, Σ 1 \Sigma_1 Σ1 Σ 2 \Sigma_2 Σ2是它们的协方差矩阵, T r Tr Tr表示矩阵的迹。

FID 的优势在于它同时考虑了生成图像的多样性和真实性,因为它比较了整个特征分布而不是单个图像。FID 值低意味着生成图像不仅在视觉上接近真实图像,而且在统计上也非常相似。因此,FID 是评估 GANs 和其他生成模型性能的一个非常有用的工具,其示意图如下。
在这里插入图片描述

训练成本与采样质量分析

分析了不同降采样率 f f f对模型训练成本和采样质量的影响。结果表明,LDM-4和LDM-8在下采样率与采样质量之间达到了平衡,训练成本低,采样质量高。
在这里插入图片描述
在这里插入图片描述

不带条件的图片生成

下面是降采样率为4的LCM模型在不同数据集上的生成指标和实际效果
在这里插入图片描述
在这里插入图片描述

基于文本的图片生成

论文中使用BERT-tokenizer和transformer作为文本域的 τ θ \tau_\theta τθ,其指标和效果如下。
在这里插入图片描述
在这里插入图片描述

基于语义框的图片生成

使用来自OpenImages的带语义框标注的图像作为数据集训练,并在coco上微调。
在这里插入图片描述
在这里插入图片描述

基于语义图的图片生成

这一块的亮点主要在于它在生成图片时在分辨率上有泛化性,可以生成比训练分辨率更大的图片。
在这里插入图片描述

超分辨率图像生成

输入的是一个低分辨率图片,并且 τ θ \tau_\theta τθ仅做了保持原状的操作,除了用指标,还使用了人为打分来评估效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图像重绘

重绘任务(Inpainting task)通常指的是图像修复或图像补全的任务。这个任务的目标是填充或修复图像中的缺失部分,使得修复后的图像在视觉上尽可能自然和连贯。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

其他文生图模型

根据上面所解释的Stable Diffusion模型架构,其实可以抽象出文生图模型的通用结构,它包含三部分,一个是文本编码器,一个是从噪音开始的中间产物生成模型,一个是将中间产物映射回像素空间的解码器。下面就简单介绍一下其他文生图模型的结构。
在这里插入图片描述

DALL-E

DALL-E的名称是“DAL”和“E”的组合,其中“DAL”代表“扩散变换自回归解码器”(Diffusion Autoregressive Decoder),而“E”代表“变换器”(Encoder),这是DALL-E模型中使用的两种主要神经网络架构。
在这里插入图片描述

Imagen

Imagen是基于扩散模型(diffusion models)构建的,包括小图生成和大图上采样两步。
在这里插入图片描述

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

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

相关文章

Open3D在点云上画直线

想在点云上做一些标识,发现画直线比较方便,下面是我画了一个三角形。可以根据自己的情况改变坐标画出不同的形状 pcd.translate(np.array([0,0,20])) points np.asarray(pcd.points) centroid points.mean(axis0) x1 length1[1] y1 centroid[1] z1…

virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”

文章目录 问题现象排查解决总结 问题现象 2月7日下午四点多,我已经休假了,某县的客户运维方打来电话,说平台挂了,无法访问客户是提供的一台Windows server机器部署平台,是使用virtualbox工具安装的CentOS7.9虚拟机和运…

Mysql事务原理与优化

概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题&…

华为配置旁挂二层组网隧道转发示例

配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络,以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时,不影响用户的业务使用。 组网需求 AC组…

基于python的租车管理平台/汽车租赁网站

功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、详情页、用户中心、家政入驻模块。后台功能包括:总览、车辆管理、分类管理…

第7集《佛遗教经》

和尚尼慈悲,诸位法师、诸位居士,阿弥陀佛! 请大家打开讲义第十三面,丙三、对治灭烦恼法要 基本上,从事宗教的修学,目的是为了改造我们的生命,希望透过宗教的修学,使生命离开痛苦&a…

【python学习篇1】python基本语法

目录 一、第一个python程序 二、基本语法,数据类型,字面量,循环语句等内容 2.1字面量 2.2注释 2.2.1单行注释 2.2.2多行注释 2.3变量 2.3.1认识变量 2.3.2查看数据类型 2.3.3数据类型转换 2.3.4字符串的三种定义方式 2.3.5字符串…

Flutter开发环境和打包流程

Flutter开发环境和打包流程 1.本地开发环境 1.1.安装flutter 官网安装flutter有2种方式,一种是下载flutter的sdk包,一种是VS Code直接安装,照着官网的安装flutter的流程走没有什么问题 1.2.安装Android Studio 去Android Studio的官网直…

Node响应Vue axios请求方法说明

1、安装 npm install axios import axios from "axios"; 2、Vue前端 get请求使用 axios.get(url, { params: { key:value } }) 来请求 post请求使用 axios.post(url, { key: value }) 来请求 3、Node后端 get请求使用 req.query[params_name] 来获取 post请求使…

若依不分离版本部署流程

一、分离与不分离的区别 参考博客:前后端分离与不分离的本质区别!_前后端分离本质-CSDN博客 概念适用场景前后端不分离前端页面看到的效果都是由后端控制,由后端渲染页面或重定向适合纯网页应用前后端分离后端仅返回前端所需的数据&#xf…

Android widget基础指南

widget的概念最早是由一名叫Rose的苹果工程师提出,后来经过多方面机缘巧合的发展下,便有了今天Android平台上的小组件widget,一般APP开发可能应用场景较少,最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学&#xf…

C 练习实例71-结构体

题目&#xff1a;编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 代码&#xff1a; #include <stdio.h> typedef struct{char name[20];char sex[2];int age; }student; //定义了一种新的数据类型&#xff0c;叫做&#xff1a;student void input(…

WebRTC最新版报错解决:FileNotFoundError: LASTCHANGE.committime (二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…

【Linux取经路】文件系统之重定向的实现原理

文章目录 一、再来理解重定向1.1 输出重定向效果演示1.2 重定向的原理1.3 dup21.4 输入重定向效果演示1.5 输入重定向代码实现 二、再来理解标准输出和标准错误2.1 同时对标准输出和标准错误进行重定向2.2 将标准输出和标准错误重定向到同一个文件 三、再看一切皆文件四、结语 …

书生开源大模型训练营-第3讲笔记

5.Langchain和InternLM搭建知识库 5.1环境 还是一样&#xff0c;开发机中创建镜像&#xff0c;以及所需依赖 pip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.15.2模…

python之GIL

GIL&#xff08;global interpreter lock&#xff09;&#xff0c;即全局解释器锁 在单核时代&#xff0c;崇尚优美、清晰、简单的 Python 之父选择在解释器层面实现了一把全局互斥锁&#xff0c;来保护 Python 对象从而实现对单核 CPU 的使用率&#xff0c;这种做法在单核时代…

git操作(二)

之前我们对于git已经有了一定的了解&#xff0c;现在我们学习一些关于git的新内容。 一.修改⽂件 首先&#xff0c;我们先来认识一个命令&#xff1a; git status //⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改,注意指的是仓库和工作区对比 关于三区的内容&#xff…

如何有效利用API接口进行数据采集

在当今数字化的世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为数据交换的桥梁&#xff0c;对于电商企业来说尤为重要。它们允许企业从丰富的数据源中提取必要的信息&#xff0c;为商业决策提供数据支持。本文将围绕如何高效地利用API进行数据采集展开讨论…

实际生产中的一次非典型的基于jmeter的接口自动化实践

实际工作中遇到过一次自动化巡检的需求&#xff0c;作为测试人员没法从源代码入手&#xff0c;加之数据库也不熟悉&#xff0c;故采取接口自动化的方式来实现巡检&#xff0c;算是一种歪门邪道吧&#xff0c;应该不是接口自动化的常规使用方式。jmeter在这里的作用实际上也只是…