【前沿模型解析】潜在扩散模 1 | LDM第一阶段-感知图像压缩总览

文章目录

  • 0 开始~
  • 1 感知压缩的目的
  • 2 自回归编码器-解码器生成模型一览
    • 2.1 AE 自编码器
    • 2.2 VAE 变分自编码器
    • 2.3 VQ-VAE
    • 2.4 VQ-GAN
  • 3 代码部分讲解总览

0 开始~

从今天起呢,我们会剖析LDM(潜在扩散模型)

从去年开始,大量的生成模型涌现出来

而你如果在阅读系列文章的时候,发现很多都是基于扩散模型的~

那么LDM在扮演着一个什么角色呢?

我认为

  1. 开创性:他是AIGC领域非常重要的模型之一,他将图像生成带到了一个新的高度,为Stable Diffusion这类经典开源AIGC模型奠定了基础
  2. 综合性:同时他也是一个很综合的模型,网上很多一些博客将VAE,GAN,扩散模型这些生成模型分割开来,但是从某种意义来说,你在LDM里面可以同时见到三种模型的影子,也就是说他集成了三类模型的智慧,怪不得他这么强~
  3. 传递性:他也是一个承前启后的模型,前有DDPM,DDIM等工作带火了扩散模型,后有如潜在一致性模型(LCM),ControlNet等模型,深入了解这一部分内容,方便我们更好地去了解AIGC模型大家族~

那么学习过程中可能会遇到什么问题呢?

首先最重要的是网络结构本身复杂,再者代码也不容易看懂,LDM代码是通过包含着大量的动态导入包,Pytorch_lighting框架实现,不是我们所熟悉的pytorch框架,因而会对代码阅读造成更大的困难~

我会从理论到代码实践全方位剖析LDM,方便大家后续的学习~

LDM是两阶段模型

  • 第一阶段:对于图像进行压缩提取特征
  • 第二阶段:压缩后在隐空间上进行扩散

我们首先讲LDM的第一阶段(代码中往往看到first_stage即这个阶段)图片压缩,实现从像素空间到隐空间的转换

1 感知压缩的目的

首先回答最重要的一个问题

为什么要进行像素空间的压缩?

  • 同时压缩对应的可以减小之后扩散模型的计算量,高效快捷,原本像素空间比如是256*256*3 现在变成了16*16*3

具体怎么实现压缩的呢?

那就不得不提到我们的编码器-解码器家族系列了

2 自回归编码器-解码器生成模型一览

2.1 AE 自编码器

在这里插入图片描述

z = e ( x ) z=e(x) z=e(x)

AE (Auto-Encoder)即自编码器,是比较早提出进行图片压缩的

AE包含一个编码器和一个解码器。

训练时,输入图像 x x x会被编码成一个较短的向量 z z z,再被解码回和 x x x相同形状的 x ‾ \overline x x ,最小化 x x x x ‾ \overline x x 的差异,让重建出来的图像尽可能和原图相似 即 z = a r g m i n z ∣ ∣ x − x ‾ ∣ ∣ 2 z=argmin_z||x-\overline x||^2 z=argminz∣∣xx2

解码器部分可以看做压缩,那么编码器部分就是一个生成模型呀!

所以我们只要拿到一个向量 z z z,就可以得到一个图片

但是问题来了,解码器只认得从编码器来的向量,而不认识其他向量,导致解码器不能很好的进行随机生成图片

所以VAE就来了~

2.2 VAE 变分自编码器

AE距离生成图像就差一步,想一想,如果我们编码后的向量服从某一个规律,比如服从正态分布,那么这时候从这个正态分布随机采样一个向量,就可以生成图片了,这时候还可以生成一些多样的原本没有的图片

VAE就是如此

对于任意输入图像 x i x_i xi,VAE编码器会得到一个对应的均值和方差,对应的某一个正态分布就得到了

最后从这个正态分布采样得到隐变量 z z z传入生成器里面得到重构后的 x ‾ i \overline x_i xi 最小化 x x x x ‾ i \overline x_i xi 的差异,让重建出来的图像尽可能和原图 x i x_i xi相似

在这里插入图片描述

但是这里注意,如果我们就这样停止了,那么会有一个问题。模型为了恢复的更好,会将编码后的方差逐渐变为0(方差可以理解为噪声),这时候实际上就退化成了AE了,为了避免退化,VAE让编码后的向量尽可能服从0均值1方差

综上,接近标准正态分布的好处就是

1 我们可以从正态分布采样隐藏变量z,方便生成

2 避免退化为AE

训练完成后,我们就可以扔掉编码器,用来自标准正态分布的随机向量和解码器来实现随机图像生成了。

需要强调的是,VAE编码出来的向量是连续向量,也就是向量的每一维都是可能为任意小数,如1.154,1.342。如果把向量的某一维稍微改动那么一丢丢,解码器还是认得这个向量,并且会生成一张和原向量对应图片差不多的图片。

而之后的一些改进,如VQ-VAE就是离散的了,是量子化的,也就是说,只能是某些特定的离散的小数,比如1.1,1.2,1.3 不存在中间态

(科学空间有图)

2.3 VQ-VAE

VQ-VAE提出codebook,并且进行离散编码

为什么要离散编码?

有几个直观理解

  • 离散编码更自然,我们会说某一个人是男的还是女的,而不会说性别是0.5
  • 虽然自然界的各种信号不论是图像还是语言,他都是连续的,但当我们处理这些问题时,往往是将问题离散化后再进行处理,如图像划分成像素、语音也是经过抽样
  • 如果使用VAE的方式,样本的分布并不是很好学,VQ-VAE就使用了一个codebook去替代了VAE中学习样本分布的过程

预先生成一个离散数值的codebook,实际中可以通过(nn.Embedding实现)

我们假设codebook是 K × D K×D K×D 维的,其中 K K K 是指codebook的长度,一般设定为8192维,从0,1,2,3编号,而 D D D则是每一维向量的长度,一般设为512,codebook的长度 K K K可以简单的理解为codebook对应于 K K K个聚类中心。

1 将一张图片送入Encoder以后,会得到一个 H × W × D H×W×D H×W×D的 特征图 z e ( x ) z_e(x) ze(x)

2 将 H × W H×W H×W D D D维度向量和刚刚codebook的8192个分量计算相似度,找到最近的那一个分量的编号,最后可以得到 H × W H×W H×W的索引矩阵 q ( z ∣ x ) q(z|x) q(zx)

3 然后用索引对应向量去做替换原本的特征,得到新的特征图 p ( x ∣ z ) p(x|z) p(xz)该特征图作为Decoder的输入,最终通过Decoder得到重构后的图片。

在这里插入图片描述

离散向量的一个问题是它不好采样。回忆一下,VAE之所以把图片编码成符合正态分布的连续向量,就是为了能在图像生成时把编码器扔掉,让随机采样出的向量也能通过解码器变成图片。现在倒好,VQ-VAE把图片编码了一个离散向量,这个离散向量构成的空间是不好采样的。

这个问题是无解的。没错!VQ-VAE根本不是一个图像生成模型。它和AE一样,只能很好地完成图像压缩,把图像变成一个短得多的向量,而不支持随机图像生成。VQ-VAE和AE的唯一区别,就是VQ-VAE会编码出离散向量,而AE会编码出连续向量。

那怎么做生成?

就是通过其他网络,在压缩后的“小特征图”上做生成,比如用PixelCNN和扩散,生成后再用Decoder将“小特征图”翻译成最后的原图

轻松理解 VQ-VAE:首个提出 codebook 机制的生成模型 - 知乎 (zhihu.com)

VQ-VAE解读 - 知乎 (zhihu.com)

2.4 VQ-GAN

在VQ-VAE的损失函数的基础上

加入了对抗loss

在这里插入图片描述

当然,我们要注意:VQ-GAN也有重构损失,即也会缩小重构后的图像和原本的图像的差距~

详解VQGAN(一)| 结合离散化编码与Transformer的百万像素图像生成 - 知乎 (zhihu.com)

3 代码部分讲解总览

直接阅读的难点,我们刚刚提到了

网络结构本身复杂

所以我们给大家做了可视化

并且我们会从小到大依次给大家实现

先实现小的快,再实现更大的组件~

在这里插入图片描述

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

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

相关文章

【mac操作】brew指令集

brew指令集记录 1. brew search 【软件名称】2. rm -rf $(brew --cache)3. brew install 【软件名】4. brew uninstall 【软件名】5. 未完待续,,,, 官网路径: Homebrew官网 最上面就来一个homebrew安装指令吧&#xf…

三、Jenkins相关操作

Jenkins操作 一、插件管理1.修改公共插件源2.下载中文汉化插件2.1 安装插件2.2 重启2.3 设置为中文 3.远程部署插件 二、用户权限管理1.安装权限插件2.开启权限3.创建角色3.1 Global roles3.2 Item roles 4.创建用户5.给用户分配角色 三、凭证管理四、Git管理1.账号密码方式1.1…

深入浅出 -- 系统架构之Keepalived搭建双机热备

Keepalived重启脚本双机热备搭建 ①首先创建一个对应的目录并下载keepalived安装包(提取码:s6aq)到Linux中并解压: [rootlocalhost]# mkdir /soft/keepalived && cd /soft/keepalived [rootlocalhost]# wget https://www.keepalived.…

【Flutter】Getx设计模式及Provider、Repository、Controller、View等

本文基于Getx 4,x 本本 1、引入 再次接触到Flutter项目,社区俨然很完善和活跃。pubs.dev 寻找状态管理的时候看到很熟悉的Getx时间,俨然发现Getx的版本已到是4.x版本,看到Getx的功能已经非常强大了,庞大的API俨然成为一种开发框架…

c# wpf LiveCharts 简单试验

1.概要 1.1 说明 1.2 环境准备 NuGet 添加插件安装 2.代码 <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"…

基于单片机电子密码锁系统设计

**单片机设计介绍&#xff0c;基于单片机电子密码锁系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子密码锁系统设计概要主要包括以下几个方面&#xff1a; 一、系统概述 基于单片机电子密码锁系统是一个…

c++11的重要特性2

可变参数模板在3中。 目录 ​编辑 1、统一的列表初始化&#xff1a; std::initializer_list&#xff1a; std::initializer_list是什么类型&#xff1a; std::initializer_list使用场景&#xff1a; 让模拟实现的vector也支持{}初始化和赋值 2、声明 auto decltype nul…

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段&#xff0c;我们简单聊了下集群的基本知识&#xff0c;以及快速过了一下逻辑处理型集群的内容&#xff0c;下面重点来看看存储型集群&#xff0c;毕竟这块才是重头戏&#xff0c;集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

SQL注入---POST注入

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一. POST提交概述 在Webshell文章中介绍过post提交和get提交的区别&#xff0c;这里不再赘述 post提交和get提交的区别&#xff1a; get方式提交URL中的参数信息&#xff0c;post方式则是将信…

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

知识融合与消歧:完善知识图谱的关键步骤

知识融合与消歧&#xff1a;完善知识图谱的关键步骤 一、引言&#xff1a;知识融合与消歧的重要性 在今天的数据驱动时代&#xff0c;知识图谱已成为组织和理解海量信息的关键技术。它们使得复杂的数据关系可视化&#xff0c;为人工智能提供了丰富的知识基础。然而&#xff0c…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具&#xff0c;可以与任何集成开发环境&#xff08;IDE&#xff09;一起使用&#xff0c;并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

python文件打包找不到文件路径

引用&#xff1a;【将Python代码打包成exe可执行文件】 https://www.bilibili.com/video/BV1P24y1o7FY/?p4&share_sourcecopy_web&vd_sourced5811f31a0635dfc69a182c7bf1adb8b 在代码中&#xff0c;我们想读取文件a&#xff0c;一般使用如下方法。 import osdir os…

【Ubuntu20.04.6】VMWare Station 17安装Ubuntu20.04.6虚拟机系统

步骤1&#xff1a;下载Ubuntu20.04.6镜像ISO文件 Ubuntu20.04.6镜像ISO文件下载&#xff1a; https://mirrors.ustc.edu.cn/ubuntu-releases/20.04/ 步骤2&#xff1a;下载安装VMWare Station 17 下载和安装教程&#xff1a; https://blog.csdn.net/u012621175/article/deta…

【Docker】搭建开源免费的书签管理系统 - OneNav

【Docker】搭建开源免费的书签管理系统 - OneNav 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 OneNav是一个基于PHP的轻量级网址导航系统&#xff0c;旨在帮助用户整理和访问他们的常用网站。 OneNav的主要特点如下&#xff1a; 美观易用&#x…

分享一个基于Multi-SLAM+3DGS的新一代三维内容生产技术

基于智能空间计算&#xff0c;新一代超逼真三维内容生成技术。 可自动化生成超逼真的大场景三维模型&#xff0c;并在各类终端和空间计算设备中&#xff0c;实现前所未有的沉浸式体验。 更可接入专业三维软件和应用平台&#xff0c;进行深度的模型开发与场景落地。 支持超大复杂…

“进击的巨人”:服务器硬件基础知识解析

引言&#xff1a; 服务器是网络环境中负责处理数据、运行应用程序和服务多用户的高性能计算机系统。了解服务器的硬件构成有助于更好地管理和优化IT资源。 服务器和普通PC的差异&#xff1a; 服务器具有比个人电脑更高的处理能力、稳定性和可靠性&#xff0c;它们通常运行在没…

SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容&#xff1a;SystemC入门书中的简单测试平台编写示例。 模块文件编写 带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。 sync_mux41.h文件 #include <systemc.h>SC_MODULE(sync_mux41) {sc_in<bool> clock, reset;sc_in<sc_uint<…

opencv+python(通道的分离与合并)笔记

分割图像通道&#xff1a; 通过函数mvsplit(img)&#xff1b;mv返回的通道&#xff1b; RGB有3个通道&#xff1b;灰度图只有一个通道&#xff1b; b,g,r cv2.split(img)cv2.imshow("b",b)#通道bcv2.imshow("g",g)#通道gcv2.imshow("r",r)#通道…