07.Diffusion Model概述

news2024/11/23 12:52:40

文章目录

  • Diffusion Model原理
    • Reverse Process
    • Denoise模块
    • Forward Process(Diffusion Process)
  • 文字生成图片by Diffusion Model
  • 文字生成图像的常见套路
    • Text Encoder
      • Fréchet Inception Distance
      • Contrastive Language-Image Pre-Training(CLIP)
    • Decoder
    • Generation Model

部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索。
论文地址: Denoising Diffusion Probabilistic Models (DDPM)

Diffusion Model原理

从搞屎分布里面采样出一个向量,该向量大小应该和你想要生成的图片大小一样。
在这里插入图片描述

Reverse Process

然后一步步通过Denoise模块,逐步将图片显示出来,每一步都会有一个编号,这里的蓝色Denoise模块用的都是同一个。
在这里插入图片描述
The sculpture is already complete within the marble block, before I start my work. lt isalready there, I just have to chisel away the superfluous material. - Michelangelo,
米开朗基罗·博那罗蒂代表作:大卫
在这里插入图片描述

Denoise模块

由于Reverse Process用的是同一个Denoise模块,但是每次输入都不一样,要想逐步得到清晰的图片,还需要有额外的输入,就是可以代表当前图片中noise多少的编号,例如下图中就是第1000和第1个编号作为额外输入的例子:
在这里插入图片描述
Denoise模块内部结构如下图所示,先是将输入图片和当前编号丢进噪音预测模块,得到当前噪声图片,然后通过与输入图片相减得到输出结果。
在这里插入图片描述
为什么要先预测噪音,而不是直接预测要输出的图片?
直接产生带猫咪的图片和产生噪音的图片难度不一样,前者隐含我们的Ground Truth,是模型未知的内容,如上图中的模型能生成带噪音的猫咪,那就意味模型基本上会生成猫咪了,干嘛还要训练?

Forward Process(Diffusion Process)

Denoise模块的训练就是要根据输入得到图片中的噪音,大概流程如下图,但如何找到类似的训练数据?
在这里插入图片描述
去掉噪音可能很难,但是加噪音很简单,这个过程称为Forward Process(Diffusion Process),具体如下图所示,找一张图片,然后从搞屎分布随机采样一个噪音,加入图片,一直重复多次。
在这里插入图片描述
从上面的不断加噪音的过程中,无形中就得到了Denoise模块的训练数据:
输入1:带有噪音的图片(下图蓝框图片)
输入2:编号(下图中的step 2)
输出:输入1中的噪音(下图红框图片)
在这里插入图片描述

文字生成图片by Diffusion Model

上面的Diffusion Model只是生成图片,如果要完成文字生成图片任务,还需要成对的文字+图片的训练数据
在这里插入图片描述
当前比较知名的文字生成图片训练数据集是:LAION-5B,大概有58.5亿个图片与文字的数据,文字还包含多个语种。
每个Denoise模块当然还要吃文字作为输入。
在这里插入图片描述
Denoise模块内部也没有太大编号
在这里插入图片描述
Denoise模块的训练数据的生成过程没有什么变化,文字并不需要参与加噪音的过程:
在这里插入图片描述
只是将输入加了一个:
输入1:带有噪音的图片(上图蓝框图片)
输入2:编号(上图中的step 2)
输入3:图片对应的文字描述
输出:输入1中的噪音(上图红框图片)
在这里插入图片描述

文字生成图像的常见套路

常见的文字生成图像的模型通常由三个魔祖:
1.文字的编码器,吃文字得到embedding表示;
2.Diffusion模型,吃文字的embedding和从高斯分布采样出来的噪音(粉色方块),得到中间产物(可以是模糊图片,也可以是看不懂的图片);
3.解码器,吃中间产物,得到目标图片。
这三个魔祖分开训练,然后合体。
在这里插入图片描述
这些模型中比较知名的就是Stable Diffusion Model:High-Resolution Image Synthesis with Latent Diffusion Models,三个模块分别从右到左:灰色,绿色,粉红,值得注意的是,灰色部分不但可以吃文字,还可以吃其他非结构化的信息。
在这里插入图片描述

还有DALL-E系列:
Hierarchical Text-Conditional Image Generation with CLIP Latents
Zero-Shot Text-to-Image Generation
在这里插入图片描述
Figure 2: A high-level overview of unCLIP. Above the dotted line, we depict the CLIP training process, through which we learn a joint representation space for text and images. Below the dotted line, we depict our text-to-image generation process: a CLIP text embedding is first fed to an autoregressive or diffusion prior to produce an image embedding, and then this embedding is used to condition a diffusion decoder which produces a final image. Note that the CLIP model is frozen during training of the prior and decoder.
这里不一样的是在第二魔祖里面有两种选择,Autoregressive和Diffusion,后者优先。

谷歌的Imagen:
Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding
在这里插入图片描述
这里蓝色对应魔祖1,然后用红色Diffusion模型生成一个小图(大小是64×64),然后再用魔祖3(黄色和绿色,这里也算不上是decoder,也是Diffusion模型)将图片加大到1024×1024。

下面分别介绍三个魔祖。

Text Encoder

Text Encoder技术上之前已经讲过很多,在谷歌的Imagen里面给出了该魔祖对图像生成任务的影响:
在这里插入图片描述
这里用的T5,纵轴是FID,越小越好;横轴是CLIP Score,越大越好。上面的图a表示模型越大生成图像的品质越好。
仅凭LAION中那一丢丢文字语料是无法获得很好的文字embedding表达的,有很多未知词汇在语料中都没有见过,因此使用预训练的大模型可以有效提升图像生成任务的性能,也就是说能看懂文字是生成图像的前提,若是准星有问题是无法命中目标的。
相较魔祖1而言,魔祖2的大小就没有这么重要了,上图b也显示了该结果。

Fréchet Inception Distance

该指标来自文章:GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium
由于图片生成的结果没有标准答案,因此该文章提出了一种评判生成图像与真实图像之间差异的标准。
先要有一个预先训练好的图像分类模型(CNN就阔以),然后把生成图像与真实图像都丢进分类模型,将进入Softmax之前的图像embedding拿出来如下图所示:
在这里插入图片描述
其中黄色点表示真实图片,蓝色点表示生成图片,Fréchet Inception Distance就表示两类图片分布的距离。这里的分布距离不好算,这里直接假设两个分布都是搞屎(你肯定想问为什么不是别的分布,我只能告诉你这是一个假设,等你写论文的时候就可以做主用其他分布)。距离越小代表生成图片与真实图片越接近。
这个方法的缺点是需要大量图片来拟合分布,上面的FID 10K就表示sample了10000张图片来完成FID的计算。

Contrastive Language-Image Pre-Training(CLIP)

CLIP来自文章:Learning Transferable Visual Models From Natural Language Supervision
这个玩意很简单,吃文字和图片,分别经过文字和图片的Encoder,得到各自的embedding表达,然后计算二者的距离作为CLIP值,距离越近得分越大,CLIP值越大越好。
在这里插入图片描述
这个模型在400万个图片文字对上进行了训练。原文做zero-shot prediction下游任务还做为结果做了处理,这里不需要。
在这里插入图片描述

Decoder

这个魔祖不需要文字与图片对进行训练,只需要无文本标记的图片就可以训练。
根据Generation Model生成的中间产物不一样,训练Decoder的方法也不同。
如果中间中间产物小图(谷歌的Imagen),Decoder需要将分辨率小的图片生成高分辨率的图片,则我们可以线找高清图片,然后对图片进行downsample操作得到小图,就可以得到训练数据与GroundTruth:在这里插入图片描述
如果中间产物是embedding表征(DALL-E、Stable Diffusion):
在这里插入图片描述

则可以使用Auto-Encoder的套路来训练Decoder,结构如下图所示,目的就是要使得两处的图片越接近越好:

在这里插入图片描述
训练好了就可以把Decoder拿出来用。

把上面两种方法结合起来,若我们把输入图片的维度看成 H × W × 3 H\times W\times 3 H×W×3,中间产物无论是压缩的小图也好还是embedding也好,都可以看做是一个 h × w × c h\times w\times c h×w×c的向量。

Generation Model

上面的Forward Process(Diffusion Process)在讲解原理是,是将Noise加到图片上的,但是在实作的时候,从下图可以看到,Noise是加到中间产物上的,这里需要注意的是,Noise的维度大小要和中间产物一致。
在这里插入图片描述
根据原理,Generation Model的输入如下图所示:
在这里插入图片描述
具体包括:
输入1:带有噪音的中间产物(上图蓝框黄色矩阵)
输入2:编号(上图中的step 2)
输入3:图片的文字描述的embedding(上图蓝色向量)

输出:输入1中的噪音(上图红框中的矩阵)
在这里插入图片描述

同理,Reverse Process如下图所示:
在这里插入图片描述
midjourney在生成图片的过程中并不是从噪音慢慢变成图片,而是把每一步的噪音接到Decoder把中间过程放出来,所以我们看到感觉是图片在变清晰。

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

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

相关文章

大数据毕业设计选题推荐-收视点播数据分析-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Leetcode实战

我们今天来利用这段时间的学习实操下我们的oj题。 int removeElement(int* nums, int numsSize, int val){int dst0;int src0;while(src<numsSize){if(nums[src]!val){nums[dst]nums[src];}elsesrc;}return dst;}我们这里用用两个下标&#xff0c;src来移动&#xff0c;如果…

抵押贷款巨头 Mr. Cooper 遭受网络攻击,影响 IT 系统

导语 近日&#xff0c;美国抵押贷款巨头 Mr. Cooper 遭受了一次网络攻击&#xff0c;导致该公司的 IT 系统受到影响。这一事件引起了广泛的关注&#xff0c;使得 Mr. Cooper 的在线支付平台无法正常运行。本文将为大家详细介绍这次网络攻击事件的具体情况及其对用户和公司造成的…

Alfred 5 for mac(最好用的苹果mac效率软件)中文最新版

Alfred 5 Mac是一款非常实用的工具&#xff0c;它可以帮助用户更加高效地使用Mac电脑。用户可以学会使用快捷键、全局搜索、快速启动应用程序、使用系统维护工具、快速复制粘贴文本以及自定义设置等功能&#xff0c;以提高工作效率。 Alfred for Mac 的一些主要功能包括&#…

项目实战:根据关键字检索,查找相应的水果

1、在index.html绑定查询点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"…

Python之字符串详解

目录 一、字符串1、转义字符与原始字符串2、使用%运算符进行格式化 一、字符串 在Python中&#xff0c;字符串属于不可变、有序序列&#xff0c;使用单引号、双引号、三单引号或三双引号作为定界符&#xff0c;并且不同的定界符之间可以互相嵌套。 ‘abc’、‘123’、‘中国’…

大数据Doris(十六):Doris表的数据划分

文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分

力扣:有效的括号

自己编写的代码 。 自己的思路&#xff1a; class Solution { private:unordered_map<char,int>symbolValues{{(,1},{),2},{{,4},{},5},{[,8},{],9}, };public:bool isValid(string s) {bool flagfalse;int lenss.length();if (lens % 2 ! 0){flag false;}for…

花了三年时间开发的开源项目,终于500 个 Star 了!快收藏

waynboot-mall 商城项目从疫情开始初期着手准备&#xff0c;到现在已经经过了 3 年多的时间&#xff0c;从项目初期到现在&#xff0c;一个人持续迭代&#xff0c;修复漏洞&#xff0c;添加功能&#xff0c;经历了前端开发工具从 vue2、vue-cli 切换到 vue3、vite 的转变&#…

Spring Security OAuth 2.0 资源服务器— JWT

目录 一、JWT的最小依赖 二、JWT的最基本配置 1、指定授权服务器 2、初始预期&#xff08;Startup Expectations&#xff09; 3、运行时预期&#xff08;Runtime Expectations&#xff09; 三、JWT认证是如何工作的 四、直接指定授权服务器 JWK Set Uri 五、提供 audie…

Linux编译器gcc/g++介绍

gcc/g编译器介绍 编译器的功能就是把代码经过一系列处理变成可执行文件&#xff0c;然后就可以执行文件实现代码的功能。 gcc编译器编译C语言文件&#xff0c;g编译C文件&#xff0c;g也可以编译C语言&#xff0c;但gcc不能编译C文件。 gcc使用方法&#xff1a;gcc [选项] 要编…

【漏洞复现】fastjson_1.2.24_unserializer_rce

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞检测3、漏洞验证 1.5、深度利用1、GetShell 说明内容漏洞编号漏洞名称fastjson 1.2.24 反序列化导致…

vbox虚拟机导出减少体积:压缩VDI文件

前言部分&#xff1a; 网上找了一些virtualBox虚拟机压缩方法&#xff0c;做了测试。虚拟机导出体积有了明显减少。 参考文档&#xff1a;https://blog.csdn.net/mr__bai/article/details/129147223 里面有一些注意事项&#xff0c;包括我在实践时遇到的一些问题&#xff0c;在…

Redis7.x 高级篇

Redis7.x 高级篇 Redis版本发行时间Redis单线程说的是什么东西 Redis版本发行时间 Redis单线程说的是什么东西

微信小程序获取剪切板的内容到输入框中

xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …

FreeRTOS-定时器\二值信号互斥信号\事件组

FreeRTOS整体知识框架可以参考下文: FreeRTOS整体知识框架 一. FreeRTOS定时器 FreeRTOS定时器 博文路径 FreeRTOS提供了一种软件定时器&#xff0c;用来快速实现一些周期性的操作&#xff0c;并且节约了硬件定时器。不过尽量还是不要做过多的操作&#xff0c;以免影响其他…

文件夹重命名与大小写转换:提高文件检索准确性的技巧

在文件管理中&#xff0c;文件夹的命名和大小写转换是非常重要的操作。正确的文件夹命名和大小写转换可以提高文件检索的准确性&#xff0c;从而提高工作效率和文件管理的便利性。现在来看云炫文件管理器如何进行文件夹重命名和大小写转换的技巧&#xff0c;以帮助您更好地管理…

python 成绩统计,输出及格率和优

题目描述&#xff1a; 小蓝给学生们组织了一场考试&#xff0c;卷面总分为100分&#xff0c;每个学生的得分都是一个0到100的整数。 如果得分至少是60分&#xff0c;则称为及格。如果得分至少为85分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表示&am…

C++入门讲解第一篇

大家好&#xff0c;我是Dark Fire&#xff0c;终于进入了C的学习&#xff0c;我知道面对我的将是什么&#xff0c;就算变成秃头佬&#xff0c;也要把C学好&#xff0c;今天是C入门第一篇&#xff0c;我会尽全力将知识以清晰易懂的方式表达出&#xff0c;希望我们一起加油&#…

电脑出现emp.dll文件缺失的错误提示怎么办,教你一键解决dll丢失问题

今天&#xff0c;我想和大家分享一下关于emp.dll文件丢失的4个解决方法&#xff0c;希望能对大家有所帮助。 首先&#xff0c;我们要明确emp.dll文件的作用。emp.dll是一个动态链接库文件&#xff0c;这个文件对于许多程序的正常运行至关重要&#xff0c;一旦丢失&#xff0c;…