浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents

  该文提出一种基于层级式扩散模型的由文本生成图像的方法,也就是大名鼎鼎的DALLE·2。在DALLE·2之前呢,OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了,其中DALLE是基于VQVAE方法的与现在流行的扩散模型不同,所以我就不详细展开了。而DALLE·2其实与同样基于扩散模型的GLIDE关系更为密切,关于GLIDE的介绍,可以参见笔者之前的博客。DALLE·2所做的工作其实在题目里面就说的很清楚了,作者首先用一个训练好的CLIP模型,将输入的文本描述转换成潜在的文本特征,然后利用一个先验模型(Prior)将这个文本特征映射成对应的图像特征,最后有一个解码器(Decoder)生成对应的图像。层级式是因为原始输出只有64 * 64的分辨率,作者通过两个级联的上采样器将其分辨率逐步提升至256 * 256和1024 * 1024。整体过程如下图所示
在这里插入图片描述
  首先,作者需要按照CLIP的模式训练一个文本编码器,简单来说就是收集一些文本-图像对,用一个文本编码器将文本转换成文本特征(Text embedding),用一个图像编码器将图像转换成图像特征(Image embedding),然后利用对比学习的方法对模型进行训练,最终得到一个文本编码器和图像编码器,这个过程如图中虚线以上的部分所示。CLIP的效果非常强大,应用也是非常广泛,具体可以参考其他的讲解文章和论文。
  然后,作者将训练好的文本编码器权重锁定,给定一个文本会输出一个确定的文本特征 z t z_t zt,将文本特征输入到一个先验模型(Prior)中,将其转化成一个图像特征 z i z_i zi。这个先验模型有两种实现形式:基于自回归机制(Autoregressive, AR)和基于扩散模型。AR其实是作者先前的工作DALLE中采用的技术,实验表明,二者的效果接近,但扩散模型的计算效率更高,因此作者最终采用了基于扩散模型的方案,下文中我们也主要介绍基于扩散模型的方案。得到图像特征 z i z_i zi后,作者再次利用一个基于扩散模型的图像解码器生成对应的图像。这整个过程就像是将CLIP反过来,从由图到特征,变为由特征到图,因此作者其实是称自己的模型为unCLIP。下面我们详细介绍下基于扩散模型的先验模型和图像解码器的实现方法

先验模型 Prior

   在训练阶段,我们将文本的编码(这里是指采用BPE编码的编码结果,而不是CLIP输出的文本特征),CLIP输出的文本特征,扩散时间步数嵌入特征和加入随机噪声的CLIP输出的图像特征一起输入到一个带有causal attention 掩码的Transformer的解码器中。解码器直接输出无噪声的图像特征,并与真实的无噪声图像特征 z i z_i zi计算均方差损失来训练模型,如下式所示 L prior  = E t ∼ [ 1 , T ] , z i ( t ) ∼ q t [ ∥ f θ ( z i ( t ) , t , y ) − z i ∥ 2 ] L_{\text {prior }}=\mathbb{E}_{t \sim[1, T], z_{i}^{(t)} \sim q_{t}}\left[\left\|f_{\theta}\left(z_{i}^{(t)}, t, y\right)-z_{i}\right\|^{2}\right] Lprior =Et[1,T],zi(t)qt[ fθ(zi(t),t,y)zi 2]这里的先验模型与常见的扩散模型有很多不同,首先,其输入是文本特征 z t z_t zt,输出是图像特征 z i z_i zi,其更接近StableDiffusion中的方法,在特征层面上进行扩散和采样。其次,先验模型采用的是Casual Transformer模型而不是常见的UNet模型。最后,模型直接预测的是采样结果,即无噪声的图像特征,而不是常见的噪声均值。
   在推理阶段,我们还是可以根据输入的文本描述得到对应的文本编码和文本特征,然后从随机高斯分布中采样得到 t t t时刻的图像特征 z i ( t ) z_i^{(t)} zi(t)并与时间步数 t t t编码一起输入到训练好的先验模型中,得到去噪后的图像特征 z i z_i zi

这里其实有一点疑问,就是如果按照典型的扩散模型采样流程,应该是先预测得到 t − 1 t-1 t1时刻的图像特征 z i ( t − 1 ) z_i^{(t-1)} zi(t1),然后再逐步的去噪得到最终的图像特征 z i z_i zi。但是按照训练过程来看,他是直接预测去噪后的图像特征 z i z_i zi的,因此这一点可能还需要阅读代码来确认。

解码器 Decoder

   这里的解码器也与很多AE中的解码器概念不太一样,它并不是直接把前面得到的图像特征解码重建得到图像,而是依旧采用一个扩散模型,将前文得到的图像特征与输入的文本特征一起作为一个条件引导信息,来引导扩散模型完成图像的采样。那么图像特征和文本特征如何构成条件来引导扩散模型呢?一方面,图像特征经过映射后直接加到时间步数嵌入上作为一个条件输入,另一方面,图像特征映射为四个额外的Token并与文本特征序列级联起来也作为一个条件输入。扩散模型采用IDDPM,随机采样 t t t时刻噪声图像,与上述两个条件一起输入到模型中输出噪声分布的均值,然后从中采样得到一个噪声,经过去噪后得到 t − 1 t-1 t1时刻的图像,迭代上述过程直至得到无噪声图像 x 0 x_0 x0下图引用自知乎用户“莫叶何竹”的博文
在这里插入图片描述
   在训练过程中,作者也采用了无分类器引导扩散模型(CDM)中的训练技巧,随机抛弃掉10%的图像特征输入和50%的文本特征。最后,为了提升生成图像的分辨率,作者训练了两个级联的基于卷积模型的上采样器,逐步将图像分辨率提升至256 * 256 和 1024 * 1024。
   作者在MS-COCO数据集上测试了文本-图像的生成效果,并与其他方法做了对比,效果如下
在这里插入图片描述
   此外,作者还做了许多有趣的实验。首先,给定一幅照片经过编码处理后可得到图像特征 z i z_i zi,然后将其作为条件信息与随机采样的噪声图像一起输入到解码器中就可以得到重建后的图像,如下图所示。可以看到重建后的图像与原图保持了风格和基本布局上的一致,但在细节上呈现了更多的多样性。
在这里插入图片描述
   然后,作者实现了两个图像的融合,分别从两幅图像得到对应的特征 z i 1 z_{i_1} zi1 z i 2 z_{i_2} zi2,然后采用球形插值得到插值后的图像特征 z i θ = slerp ⁡ ( z i 1 , z i 2 , θ ) z_{i_{\theta}}=\operatorname{slerp}\left(z_{i_{1}}, z_{i_{2}}, \theta\right) ziθ=slerp(zi1,zi2,θ) θ \theta θ的取值范围是[0,1]。将插值后的特征输入到编码器中,就能得到两幅图像逐渐融合的过程,如下图所示
在这里插入图片描述
   最后,作者还尝试了文本差异引导图像生成,假设原始图像的文本描述特征为 z t 0 z_{t_0} zt0,目标文本描述特征为 z t z_{t} zt,则可以计算文本特征差异 z d = norm ( z t − z t 0 ) z_d=\text{norm}(z_{t}-z_{t_0}) zd=norm(ztzt0),将 z d z_d zd与图像特征 z i z_i zi进行球形插值 z θ = slerp ⁡ ( z i , z d , θ ) z_{{\theta}}=\operatorname{slerp}\left(z_{i}, z_{d}, \theta\right) zθ=slerp(zi,zd,θ),再进行图像生成,就能得到从原始图像过渡到目标图像之间的过程,如下图所示
在这里插入图片描述
   即使DALLE·2已经取得了非常惊艳的生成效果,但在许多任务中仍存在一定的缺陷和局限性。例如,无法将图像的内容和属性对齐,如下图它无法理解“把红色方块放到蓝色方块”上的操作,只是生成了包含红色方块和蓝色方块的图片,这一点上GLIDE表现得要更好
在这里插入图片描述
   此外,在生成一个带有文本的图像时,DALLE·2的生成效果也是一塌糊涂,字母的顺序都是凌乱的。
在这里插入图片描述
   由于图像是从低分辨率图像逐渐上采样得到高分辨率图像的,因此在生成高质量图像时,经常出现许多细节上的缺失和错乱,如下图所示
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fabric部署调用合约示例

一 打包智能合约 ①进入fabric-samples文件夹下的chaincode/fabcar/go目录下执行 GO111MODULEon go mod vendor下载依赖(文件夹下已经有go.mod,不需要使用go mod init生成该module文件)②进入到test-network文件下使用以下命令将二进制文件…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据计算过程计算结果) 1、时间:2002-2021年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、人均受教育年…

Footprint Analytics 与 Core Chain 达成战略合作

​ 领先的区块链数据解决方案提供商 Footprint Analytics 与比特币驱动、EVM 兼容的 Layer 1 区块链 Core Chain 宣布达成战略合作。此次合作旨在将 Footprint Analytics 的前沿数据解决方案与 Core Chain 的区块链基础设施相结合,共同引领区块链领域的创新发展。 …

苹果挖走大量谷歌人才,建立神秘人工智能实验室;李飞飞创业成立「空间智能」公司丨 RTE 开发者日报 Vol.197

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Apache.commons.lang3 的 isNumber 将会在 lang 4 的时候丢弃

在判断输入的字符串是不是一个数字的时候,我们通常用的最多的方法就是 : NumberUtils.isNumber("12"); 但是这个方法将会在 Lang 4.0 版本中被丢弃。 可以使用的替代方法为:isCreatable(String) 通过查看源代码,我们…

【数据结构】有关环形链表题目的总结

文章目录 引入 - 快慢指针思考 - 快慢指针行走步数进阶 - 寻找环形链表的头 引入 - 快慢指针 141-环形链表 - Leetcode 关于这道题,大家可以利用快慢指针,一个每次走两步,一个每次走一步,只要他们有一次相撞了就代表说这是一个链…

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

python爬虫(一)之 抓取极氪网站汽车文章

极氪汽车文章爬虫 闲来没事&#xff0c;将极氪网站的汽车文章吃干抹尽&#xff0c;全部抓取到本地&#xff0c;还是有点小小的难度。不能抓取太快&#xff0c;太快容易被封禁IP&#xff0c;不过就算被封了问题也不大&#xff0c;大不了重启路由器&#xff0c;然后你的IP里面又…

谷歌明年6月关闭 Google Fit 运动记录API,要求开发者迁移至Android Health平台 | 最新快讯

5 月 6 日消息&#xff0c;谷歌近日发布官方新闻稿&#xff0c;宣布将在明年 6 月使用 Android Health 平台取代 Google Fit 运动记录 API&#xff0c;开发人员应当尽早启动迁移计划。 谷歌自 2022 年起逐渐扩大对 Android Health 平台的投资&#xff0c;旨在减少平台碎片化&am…

在uni-app开发的小程序中引入阿里的多色图标

uniapp不支持阿里多色图标&#xff0c;需要使用工具iconfont-tools进行处理 1.首先 在阿里图标库将 需要的图标添加到项目中 并下载压缩包&#xff0c;取出iconfont.js文件 2.安装iconfont-tools,安装完成会显示出安装到了电脑的那个目录 3&#xff0c;进入目录就会看到下面的…

Maria DB 安装(含客户端),看这一篇就够了

文章目录 一 安装前准备1 版本与Win平台对应2 推荐安装 二 安装步骤1 安装主体程序2 添加系统路径Path 三 客户端 一 安装前准备 1 版本与Win平台对应 版本对应关系可参考&#xff1a; https://www.codebye.com/mariadb-deprecated-package-platforms.html。 2 推荐安装 经…

STM32F4xx开发学习—GPIO

GPIO 学习使用STM32F407VET6GPIO外设 寄存器和标准外设库 1. 寄存器 存储器映射 存储器本身是不具有地址的&#xff0c;是一块具有特定功能的内存单元&#xff0c;它的地址是由芯片厂商或用户分配&#xff0c;给存储器分配地址的过程就叫做存储区映射。给内存单元分配地址之后…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

excel中数据筛选技巧

1、筛选excel中破折号前后都为空的数据 在Excel中查找破折号前后为空的数据&#xff0c;你可以结合使用Excel的查找和筛选功能&#xff0c;或者利用一些公式来判断。以下是两种常用的方法&#xff1a; 方法一&#xff1a;使用筛选功能选中数据范围&#xff1a;首先&#xff0c…

题目:排序疑惑

问题描述&#xff1a; 解题思路&#xff1a; 做的时候没想到&#xff0c;其实这是以贪心题。我们可以每次排最大的区间&#xff08;小于n&#xff0c;即n-1大的区间&#xff09;&#xff0c;再判断是否有序 。因此只需要分别判断排&#xff08;1~n-1&#xff09;和&#xff08;…

GateWay检查接口耗时

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>创建一个LogTimeGateWayFilterFactory类&#xff0c;可以不是这个名字但是后面必须是x…

遭遇.halo勒索病毒怎么办?如何识别和应对.halo勒索病毒

导言&#xff1a; 近年来&#xff0c;网络安全问题愈发严峻&#xff0c;其中勒索病毒成为了威胁企业和个人数据安全的重要隐患。在2023年初&#xff0c;一种新的勒索病毒——.halo勒索病毒开始在网络上肆虐&#xff0c;给广大用户带来了极大的困扰。本文91数据恢复将对.halo勒…

NEO 学习之session7

文章目录 选项 A&#xff1a;它涉及学习标记数据。 选项 B&#xff1a;它需要预定义的输出标签进行训练。 选项 C&#xff1a;它涉及在未标记的数据中寻找模式和关系。 选项 D&#xff1a;它专注于根据输入-输出对进行预测。 答案&#xff1a;选项 C 描述了无监督学习的本质&am…

【Pytorch】2.TensorBoard的运用

什么是TensorBoard 是一个可视化和理解深度爵溪模型的工具。它可以通过显示模型结构、训练过程中的指标和图形化展示训练的效果来帮助用户更好地理解和调试他们的模型 TensorBoard的使用 安装tensorboard环境 在终端使用 conda install tensorboard通过anaconda安装 导入类Sum…

判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数

一、判断dll/lib是32/64位 原文链接&#xff1a;https://www.cnblogs.com/bandaoyu/p/16752602.html 1. 简便方法&#xff1a; 直接用记事本或者notepad(或txt文本)打开exe文件&#xff08;dll文件&#xff09;&#xff0c;会有很多乱码&#xff0c;不要头疼&#xff0c;接下…