草庐IT

AI绘画新思路:国产开源50亿参数新模型,合成可控性、质量实现飞跃

机器之心 2023-03-28 原文


  • 论文地址:https://arxiv.org/pdf/2302.09778v2.pdf
  • 项目地址:https://github.com/damo-vilab/composer
近年来,在大数据上学习的大规模生成模型能够出色地合成图像,但可控性有限。可控图像生成的关键不仅依赖于条件,而且更重要的是依赖于组合性。后者可以通过引入巨大数量的潜在组合来指数级地扩展控制空间(例如 100 个图像,每个有 8 个表征,产生大约 100^8 种组合)。类似的概念在语言和场景理解领域得到了探索,其中的组合性被称为组合泛化,即从有限的已知成分中识别或生成潜在的无限数量的新组合的技能。

最新的一项研究提供了一种新的生成范式 —— 可以在灵活控制输出图像(如空间布局和调色板)的同时保持合成质量和模型创造力。

这项研究以组合性为核心思想,首先将图像分解为具有代表性的因子,然后以这些因子为条件训练扩散模型,对输入进行重组。在推理阶段,丰富的中间表征形式作为可组合元素,为可定制内容的创建提供了巨大的设计空间 (即与分解因子的数量成指数比例)。值得注意的是,名为 Composer 的方法支持各种级别的条件,例如将文本描述作为全局信息,将深度图和草图作为局部指导,将颜色直方图作为低级细节等。

除了提高可控性之外,该研究还确认了 Composer 可以作为通用框架,在无需再训练的情况下促进广泛的经典生成任务。

方法

本文所介绍的框架包括分解阶段(图像被分为一组独立的组件)与合成阶段(组件利用条件扩散模型重新组合)。这里首先简要介绍扩散模型和使用 Composer 实现的制导方向,然后将详细说明图像分解和合成的实现。 

2.1. 扩散模型

扩散模型是一种生成模型,通过迭代去噪过程从高斯噪声中产生数据。通常使用简单的均方误差作为去噪目标: 

其中,x_0 是具有可选条件 c 的训练数据,是加性高斯噪声,a_t、σ_t 是 t 的标量函数,是具有可学习参数 θ 的扩散模型。无分类器引导在最近的工作中得到了最广泛的应用,用于扩散模型的条件数据采样,其中预测的噪声通过以下方式进行调整: 

公式

中, ω 为引导权重。DDIM 和 DPM-Solver 经常被用于加速扩散模型的采样过程。DDIM 还可以用于将样本 x_0 反推到其纯噪声潜在 x_T,从而实现各种图像编辑操作。

引导方向:Composer 是一个可以接受多种条件的扩散模型,可以在无分类器引导下实现各种方向:

c_1 和 c_2 是两组条件。c_1 和 c_2 的不同选择表征对条件的不同强调。

(c_2 \ c_1) 内的条件强调为 ω, (c_1 \ c_2) 内的条件抑制为 (1−ω), c1∩c2 内的条件的指导权重为 1.0.。双向指导:通过使用条件 c_1 将图像 x_0 反转到潜在的 x_T,然后使用另一个条件 c_2 从 x_T 采样,研究能够使用 Composer 以一种解纠缠的方式操作图像,其中操作方向由 c_2 和 c_1 之间的差异来定义。

分解

研究将图像分解为捕捉图像各个方面的去耦表征,并且描述了该任务中使用的八种表征,这几种表征都是在训练过程中实时提取的。

说明(Caption):研究直接使用图像 - 文本训练数据中的标题或描述信息(例如,LAION-5B (Schuhmann et al., 2022))作为图像说明。当注释不可用时,还可以利用预训练好的图像说明模型。研究使用预训练的 CLIP ViT-L /14@336px (Radford et al., 2021) 模型提取的句子和单词嵌入来表征这些标题。

语义和风格(Semantics and style):研究使用预先训练的 CLIP ViT-L/14@336px 模型提取的图像嵌入来表征图像的语义和风格,类似于 unCLIP。

颜色(Color):研究使用平滑的 CIELab 直方图表征图像的颜色统计。将 CIELab 颜色空间量化为 11 个色调值,5 个饱和度和 5 个光值,使用平滑 sigma 为 10。经验所得,这样设置的效果更好。

草图(Sketch):研究应用边缘检测模型,然后使用草图简化算法来提取图像的草图。草图捕捉图像的局部细节,具有较少的语义。

实例(Instances):研究使用预训练的 YOLOv5 模型对图像应用实例分割来提取其实例掩码。实例分割掩码反映了视觉对象的类别和形状信息。

深度图(Depthmap):研究使用预训练的单目深度估计模型来提取图像的深度图,大致捕捉图像的布局。

强度(Intensity):研究引入原始灰度图像作为表征,迫使模型学习处理颜色的解纠缠自由度。为了引入随机性,研究统一从一组预定义的 RGB 通道权重中采样来创建灰度图像。

掩码(Masking):研究引入图像掩码,使 Composer 能够将图像生成或操作限制在可编辑的区域。使用 4 通道表征,其中前 3 个通道对应于掩码 RGB 图像,而最后一个通道对应于二进制掩码。

需要注意的是,虽然本文使用上述八种条件进行了实验,但用户可以使用 Composer 自由定制条件。

构成

研究使用扩散模型从一组表征中重新组合图像。具体来说,研究利用 GLIDE 架构并修改其调节模块。研究探索了两种不同的机制来根据表征调整模型:

全局调节:对于包括 CLIP 句子嵌入、图像嵌入和调色板在内的全局表征,研究将它们投影并添加到时间步嵌入中。此外,研究还将图像嵌入和调色板投射到八个额外的 token 中,并将它们与 CLIP 词嵌入连接起来,然后将其用作 GLIDE 中交叉注意的上下文,类似于 unCLIP 。由于条件要么是相加的,要么可以在交叉注意中选择性地掩盖,所以在训练和推理期间可以直接放弃条件,或者引入新的全局条件。

局部化调节:对于局部化表征,包括草图、分割掩码、深度映射、强度图像和掩码图像,研究使用堆叠卷积层将它们投射到与噪声潜在 x_t 具有相同空间大小的均维嵌入中。然后计算这些嵌入的和,并将结果连接到 x_t,然后将其输入到 UNet。由于嵌入是可添加的,因此很容易适应缺失的条件或合并新的局部化条件。

联合训练策略:设计一种联合训练策略,使模型能够从各种条件组合中学习解码图像,这一点很重要。研究对几种配置进行了实验,并确定了一个简单而有效的配置,其中对每个条件使用独立的退出概率为 0.5,删除所有条件的概率为 0.1,保留所有条件的概率为 0.1。对于强度图像使用 0.7 的特殊退出概率,因为它们包含了关于图像的绝大多数信息,并且在训练过程中可能会弱化其他条件。

基本扩散模型产生 64 × 64 分辨率的图像。为了生成高分辨率图像,研究训练了两个无条件扩散模型用于上采样,分别将图像从 64 × 64 提升到 256 × 256,以及从 256 × 256 提升到 1024 × 1024 分辨率。上采样模型的架构是从 unCLIP 修改的,其中研究在低分辨率层中使用更多通道,并引入自注意块来扩大容量。此外还引入了一个可选的先验模型,该模型从字幕生成图像嵌入。根据经验,先验模型能够在特定的条件组合下提高生成图像的多样性。

实验

变体:使用 Composer 可以创建与给定图像相似的新图像,但通过对其表征的特定子集所进行的条件反射在某些方面有些不同。通过仔细选择不同表征的组合,人们可以灵活地控制图像变化的范围 (图 2a)。在纳入更多的条件后,研究所介绍的方法比仅以图像嵌入为条件的 unCLIP 生成变体:使用 Composer 可以创建与给定图像相似的新图像,但通过对其表征的特定子集进行条件反射,在某些方面有所不同。通过仔细选择不同表征的组合,人们可以灵活地控制图像变化的范围 (图 2a)。在纳入更多的条件后,研究所介绍的方法比仅以图像嵌入为条件的 unCLIP 的重建准确率更高。

有关AI绘画新思路:国产开源50亿参数新模型,合成可控性、质量实现飞跃的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

随机推荐