【AIGC】Controlnet:基于扩散模型的文生图的可控性

前言

controlnet可以让stable diffusion的生图变得可控。

文章连接:https://arxiv.org/pdf/2302.05543.pdf 

摘要

  • 冻结了stable  diffusion的预训练模型并重用它的预训练编码层
  • 神经网络结构与零初始化卷积层连接,从零开始逐渐增加参数,并确保微调过程中不会有噪声影响
  • Controlnet在小数据集(小于5张万图)和大数据集(大于100万张图)上的训练表现都是稳定的

引言

  • 端到端方式学习大型文本到图像扩散模型的条件控制具有挑战性。
  • 带有条件的数据集难找,相比一般大模型数据集要小上很多倍。
  • 有限的数据如果直接微调预训练模型可能会导致过度拟合和灾难性遗忘。

解决方案:限制可训练参数的数量或等级来缓解。

        ControlNet 通过锁定stable diffusion参数制作其编码层的可训练副本来保留大型模型的质量和功能。此体系结构将大型预训练模型视为学习各种条件控制的强大骨干。可训练的副本和原始的锁定模型与零卷积层连接,权重初始化为零,以便在训练期间逐渐增长。这种架构确保了在训练开始时不会将有害噪声添加到大型扩散模型的深层特征中,并保护可训练副本中的大规模预训练骨干不会受到此类噪声的损害。

我们的实验表明,ControlNet 可以通过各种条件输入来控制 Stable Diffusion,包括 Canny 边缘、Hough 线、用户涂鸦、人类关键点、分割图、形状法线、深度等(图 1)。我们使用单个条件反射图像(带或不带文本提示)测试我们的方法,并演示了我们的方法如何支持多个条件的组合。此外,我们报告说,ControlNet 的训练在不同大小的数据集上是健壮和可扩展的,并且对于某些任务,如深度到图像调节在单个 NVIDIA RTX 3090Ti GPU 上训练 ControlNet 可以取得与在大型计算集群上训练的工业模型相媲美的结果。最后,我们进行消融研究,以调查模型中每个组成部分的贡献,并将我们的模型与几个强大的条件图像生成基线与用户研究进行比较。

相关工作

微调神经网络的一种方法是直接使用额外的训练数据继续训练它。但这种方法可能导致过拟合、模式崩溃和灾难性的遗忘。广泛的研究集中在开发避免此类问题的微调策略上

灾难性遗忘的原因:灾难性遗忘的根源在于神经网络的训练过程。神经网络在学习过程中采用梯度下降法,试图最小化当前任务的损失函数。然而,这种优化行为可能会破坏存储在网络权重中的原有知识。当网络学习新任务时,它需要改变自己的权重来适应新的数据,这可能会导致旧的知识被覆盖。

解决灾难性遗忘的策略

多经验回放(Experience Replay)策略通过保留旧任务的一部分数据,并在训练新任务时一同训种策略来解决灾难性遗忘问题。

弹性权重共享(Elastic Weight Consolidation, EWC),通过对网络权重施加额外的约束,使其在新旧任务之间找到一个平衡点,防止新任务过度改变旧任务的权重。

HyperNetwork旨在训练一个小型递归神经网络来影响一个大型神经网络的权重。已经被广泛用于生成对抗网络1、2。Heathen等[26]和Kurumuz[43]实现了HyperNetworks for Stable Diffusion [72]来改变其输出图像的艺术风格。

 Adapter在计算机视觉中,适配器用于增量学习[74]和领域适应[70]。这种技术通常与CLIP[66]一起使用,用于将预训练的骨干模型转移到不同的任务[23,66,85,94]。最近,适配器在视觉变压器[49,50]和ViT-Adapter[14]中取得了成功。在与我们同时进行的研究中,T2IAdapter [56] 使稳定扩散适应外部条件。

Additive Learning冻结原始模型权重并使用学习到的权重掩码 [51 , 74 ]、修剪 [52] 或硬注意力 [80] 添加少量新参数来规避遗忘。Side-Tuning [92 ] 使用侧分支模型通过线性混合冻结模型和添加网络的输出,以及预定义的混合权重表来学习额外的功能。

LORA通过学习低秩矩阵的参数偏移来防止灾难性的遗忘 [ 31 ],基于对许多过度参数化模型的观察,该模型位于低本征维子空间[2,47]。

Zero-Initialized Layers,Nichol等[59]讨论了如何在扩散模型中缩放卷积层的初始权重以改善训练,他们实现的“零模块”是将权重缩放到零的极端情况。Stability的模型卡[83]也提到了在神经层中使用零权重。ProGAN [36]、StyleGAN [37] 和 Noise2Noise [46] 中也讨论了如何操纵初始卷积权重。

  1. 原始操作: 神经块将特征图 x 作为输入,并输出另一个特征图 y。
  2. controlnet操作:为了将 ControlNet 添加到这样的块中,我们锁定原始块并创建一个可训练的副本,并使用零卷积层将它们连接在一起,即 1 × 1 卷积,权重和偏差都初始化为零。这里 c 是我们希望添加到网络中的条件向量。

Taming Transformer [19]是一种视觉transformer方法

StyleGANs可以通过额外的编码器控制[71],[3,22,38,39,55,60,65,71]中研究了更多应用。

方法论

ControlNet ControlNet 将附加条件注入到神经网络的模块中。在这里,我们使用术语网络块来指代一组神经层,这些神经层通常组合在一起形成神经网络的单个单元,例如,resnet 块、conv-bn-relu 块、多头注意力块、transformer 块等。假设 F(·; Θ) 就是这样一个经过训练的神经块,参数为 Θ,它转换输入特征图 x, 到另一个特征图 y 作为

y=F(x;\Theta )

Stable Diffusion 的 U-net 架构与编码器模块和中间模块上的 ControlNet 连接。锁定的灰色块显示了 Stable Diffusion V1.5(或 V2.1,因为它们使用相同的 U-net 架构)的结构。添加了可训练的蓝色块和白色零卷积层以构建 ControlNet。 

在我们的设置中,x 和 y 通常是 2D 特征图,即 x ∈ R,其中 {h, w, c} 分别作为图中的高度、宽度和通道数。为了将ControlNet添加到这样一个预先训练的神经块中,我们锁定(冻结)原始块的参数Θ同时将该块克隆到具有参数Θ的可训练副本可训练副本采用外部条件向量 c 作为输入。当这种结构应用于像 Stable Diffusion 这样的大型模型时,锁定的参数会保留使用数十亿张图像训练的生产就绪模型,而可训练的副本会重用这种大规模预训练模型来建立一个深度、鲁棒和强大的骨干,以处理不同的输入条件。

可训练副本连接到具有零卷积层的锁定模型,表示为 Z(·; ·)。具体来说,Z(·; ·) 是一个 1 × 1 卷积层,权重和偏差都初始化为零。为了构建 ControlNet,我们使用两个零卷积实例,参数分别为 \Theta_{z1} 和 \Theta_{z2}

Controlnet的计算公式

y_c = F(x;\Theta)+Z(F(x+Z(c;\Theta_{z1});\Theta_{c});\Theta_{z2})

 y_{c}是Controlnet模块的输出,在第一个训练步骤中,由于零卷积层的权重和偏置参数都初始化为零,因此等式(2)中的两个Z(·; ·)项的计算结果均为零

y_c=y

这样做法的好处

  • 零卷积通过消除初始训练步骤中的随机噪声作为梯度来保护该主干。
  1. 当训练开始时,有害噪声不会影响可训练副本中神经网络层的隐藏状态。
  2. 由于 Z(c; Θ) = 0,并且可训练副本也接收输入图像 x,因此可训练副本功能齐全,并保留了大型预训练模型的功能,使其能够作为进一步学习的强大骨干。

Controlnet结构解析

Stable Diffusion 本质上是一个 U-Net。带有编码器中间块跳层连接的解码器。编码器和解码器都包含 12 个块,完整模型包含 25 个块,包括中间块。在 25 个模块中,8 个模块是下采样或上采样卷积层,而其他 17 个模块是主模块,每个模块包含 4 个 resnet 层和 2 个视觉转换器 (ViT)。每个 ViT 都包含多个交叉注意力和自我注意力机制。例如,在图 3a 中,“SD 编码器块 A”包含 4 个 resnet 层和 2 个 ViT,而“×3”表示该块重复 3 次。文本提示使用CLIP文本编码层编码diffusion时间步使用一个位置编码的时间编码器表示

ControlNet 结构应用于 U-net 的每个编码器级别(图 3b)。特别是,我们使用 ControlNet 创建了 12 个编码块和 1 个 Stable Diffusion 中间块的可训练副本。这 12 个编码块有 4 种分辨率(64 × 64、32 × 32、16 × 16、8 × 8),每个分辨率复制 3 次。输出被添加到 U 网的 12 个跳跃连接和 1 个中间块。由于 Stable Diffusion 是典型的 U-net 结构,因此这种 ControlNet 架构可能适用于其他模型。

我们连接ControlNet的方式在计算上是高效的——由于锁定的复制参数被冻结,因此在最初锁定的编码器中不需要梯度计算来进行微调。这种方法可以加快训练速度并节省 GPU 内存。在单个 NVIDIA A100 PCIE 40GB 上测试时,使用 ControlNet 优化 Stable Diffusion 只需要增加约 23% 的 GPU 内存和 34% 的内存;与不使用 ControlNet 优化 Stable Diffusion 相比,使用 ControlNet 优化 Stable Diffusion 所需的 GPU 内存增加约 23%,每次训练迭代所需的时间增加 34%。

        图像扩散模型学习逐步对图像进行去噪,并从训练域生成样本。去噪过程可以发生在像素空间中,也可以发生在由训练数据编码的潜在空间中。Stable Diffusion 使用潜在空间图像作为训练域,因为在这个空间中工作已被证明可以稳定训练过程 [72 ]。具体来说,Stable Diffusion 使用类似于 VQ-GAN [19] 的预处理方法将 512 × 512 像素空间的图像转换为更小的 64 × 64 个潜在图像。为了将 ControlNet 添加到 Stable Difusion,我们首先将输入大小为 512 × 512 的每个输入条件图像(例如边缘、姿态、深度等)转换为与 Stable Diffusion 大小匹配的 64 × 64 特征空间向量。具体而言,我们使用一个由4个卷积层组成的微小网络\varepsilon(\cdot ),该卷积层具有4个4×4的卷积核和2个2*2步长(由ReLU激活,分别使用16、32、64、128个通道,用高斯权重初始化并与完整模型联合训练)将图像空间条件编码为特征空间条件向量c_f

c_f=\varepsilon(c_i)

将条件向量c_f传递到 ControlNet 中。

训练

 给定输入图像z_0,图像扩散算法逐渐往图像里添加噪声,并产生一个噪声图像z_{t},t表示添加噪声的步数。给定一组条件包括时间步t、文本提示词c_t、还有指定任务条件c_fc_f就是边缘、深度等条件控制),图像扩散算法通过网络\varepsilon_{\theta}来预测添加到噪声图片z_{t}中的噪声。

L = \mathbb{E}_{z_0,t,c_{t},c_{f},\epsilon\sim{N(0,1)} }[||\epsilon-\epsilon_{\theta}(z_{t},t,c_t,c_f)||_{2}^{2}]

 L是训练完整的扩散模型的目标函数。这个训练目标直接用来微调带有Controlnet的扩散模型。

 训练技巧

 训练过程中,使用空字符串随即替换掉50%的文本提示词c_{t}。这种方法增强了 ControlNet 直接识别输入条件图像中的语义(例如,边缘、姿势、深度等)的能力,以替代提示词。

训练的现象

 在训练过程中,由于零卷积不会给网络增加噪声,因此模型应该始终能够预测高质量的图像。我们观察到,该模型并没有逐渐学习控制条件,而是突然成功地跟踪了输入条件图像;通常在不到 10K 的优化步骤中。如图 4 所示,我们称之为“突然收敛现象”

 在6133步的时候,突然学习到了这个输入的额外控制条件。

推理 

 CFG-RW

Stable Diffusion依赖CFG技术来生成高质量图像。CFG 的公式为\epsilon_{prd}=\epsilon_{uc}+\beta_{cfg}(\epsilon_{c}-\epsilon_{uc}),其中 \epsilon_{prd},\epsilon_{uc},\epsilon_{c},\beta_{cfg}分别是模型的最终输出无条件输出条件输出用户指定的权重。当通过 ControlNet 添加调节图像时,可以将其添加到\epsilon_{uc}\epsilon_c ,也可以仅添加到\epsilon_c。在具有挑战性的情况下,例如,当没有给出提示时,将其添加到\epsilon_{uc}\epsilon_{c},将完全删除CFG指导(图b);仅使用\epsilon_c将使引导非常强(图c)。我们的解决方案是首先将条件反射图像添加到 \epsilon_c,然后根据每个块的分辨率 w= 64/h 将权重 w乘以 Stable Diffusion 和 ControlNet 之间的每个连接,其中 iblock 的大小,例如 h= 8, h= 16, ..., h= 64。通过降低 CFG 指导强度,我们可以获得图d 所示的结果,我们称之为 CFG 分辨率加权。

 多个Controlnet组合

将图像(例如,Canny 边缘和姿态)分配到 Stable Diffusion 的单个实例中,我们可以直接将相应 ControlNet 的输出添加到 Stable Diffusion 模型中(图 6)。这种组合不需要额外的加权或线性插值。

上图通过姿态和深度进行组合条件输入生成图像。

 实验

量化结果

消融实验 

此处省略,有兴趣自行查阅 

量化评估

与工业SDV2 Depth-to-Image模型对比,使用NVIDIA A100 集群、数千个 GPU 小时和超过 12M 的训练图像。我们使用 SD V2 的深度调节训练 ControlNet,但仅使用 200k 训练样本、一个 NVIDIA RTX 3090Ti 和 5 天的训练。我们使用每个 SDv2-D2I 和 ControlNet 生成的 100 张图像来教 12 个用户区分这两种方法。之后,我们生成 200 张图像,并要求用户说出每个图像是哪个模型生成的。用户的平均精度为0.52±0.17,表明两种方法产生的结果几乎无法区分。

讨论

训练数据集大小的影响

训练数据集即使只有1k,训练也不会坍塌,数据集的大小当然是越大越好,有助于泛化性的学习。

理解内容的能力

兼容社区模型 

由于Controlnets并没有改变预训练SD模型的拓扑结构,是可以与社区的SD模型兼容的。

 结论

 ControlNet 是一种神经网络结构,用于学习大型预训练文本到图像扩散模型的条件控制。它重用源模型的大规模预训练层来构建一个深度而强大的编码器来学习特定条件。原始模型和可训练副本通过“零卷积”层连接,以消除训练过程中的有害噪声。大量的实验验证了ControlNet可以在单个或多个条件下有效地控制稳定扩散,无论是否有提示。在不同条件数据集上的结果表明,ControlNet结构可能适用于更广泛的条件,并促进相关应用。

参考链接:

https://arxiv.org/pdf/2302.05543.pdf

GitHub - lllyasviel/ControlNet: Let us control diffusion models! 

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

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

相关文章

Matlab:toposort

语法: n toposort(G) %调用toposort函数,对有向图G进行拓扑排序,并将排序结果存储在变量n中 n toposort(G,Order,algorithm) [n,H] toposort(___) %使用了两个输出参数的形式来调用toposort函数。除了返回排序结果n外&am…

数字集成电路VLSI复习笔记

逻辑门符号 Inverter CMOS NAND Gate CMOS NOR Gate MOS Capacitor nmos cutoff Linear Saturation Channel Charge Carrier velocity nMOS Linear I-V nMOS Saturation I-V Summary nMOS Operation pMOS Operation Inverter Step Response Delay Definitions 3-input NAND Ca…

只不过孤岛罢了:我的2023年总结

2023已悄然过去,还记得跨年夜那天,我突然接到一星期要期末考的消息,我的内心是多么奔溃,先不说一天一门强度如此之高,重要的是矩阵论,工程优化等等科目,还要速成,于是麻木得预习一日…

怎么理解接口幂等,项目中如何保证的接口幂等

都 2024 年了,竟然还有人不知道接口幂等是什么东西。 hi,大家好,我是 浮生 今天正好有空,给大家分享一下 幂等的实现。 什么是幂等? 一、问题解析 简单来说,就是一个接口,使用相同的参数重复执…

2.右值引用和移动语义

文章目录 右值引用和移动语义&&的特性右值引用优化性能,避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…

哈希表的实现(1)----除留余数法实现

一,哈希表的介绍 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入,删除,查找。在这篇博客里面,我们便来实现一个通过除留余数法实现的一个哈希表。 …

IntersectionObserver

IntersectionObserver 这个API主要实现图片懒加载、加载更多等等。 该API作用是观察两个元素之间有没有交叉,有没有重叠 现在要做的是当图片跟视口有交叉的情况下,把data-src的图片路径替换给src属性 //第一个参数是 回调,第二个参数的 配置…

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染 if/else:条件渲染 ArkTS 提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用 if、else 和 else if 渲染对应状态下的 UI 内容。 写法和 TS 的一样,简单看一下即可…

【数据结构之树和二叉树】

数据结构学习笔记---007 数据结构之树和二叉树概念篇1、树的概念和结构1.1、树的相关概念1.2、树的存储结构 2、二叉树概念及结构2.1、二叉树概念2.2、满二叉树2.3、完全二叉树2.4、满二叉树或完全二叉树的存储形式 3、堆的概念及结构3.1、堆的性质3.2、堆的意义 4、二叉树的存…

python_selenium_安装基础学习

目录 1.为什么使用selenium 2.安装selenium 2.1Chrome浏览器 2.2驱动 2.3下载selenium 2.4测试连接 3.selenium元素定位 3.1根据id来找到对象 3.2根据标签属性的属性值来获取对象 3.3根据xpath语句来获取对象 3.4根据标签的名字获取对象 3.5使用bs4的语法来获取对象…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员,你是否也曾经遇到过这些问题: 同样的起点,同样的工作时间,为什么别人接那么多项目,你还是在点点点;为什么别人升职了,而你还在原地踏步? 同样的工作内容&#xf…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tiny…

【贪心】重构字符串

/*** 思路:如果s长度小于2,直接返回s,假设字符串s的长度为n。* n为偶数,如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。* n为奇数,如果字符串中的某个字符的数量超过 (n1&am…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了!距离截稿还有24天,想冲ICML的同学速度! ICML 全称 International Conference on Machine Learning,由国际机器学习学会(IMLS)举办,与NIPS一同被认为是人工智能、机器学…

debian 11 arm64 aarch64 D2000 平台编译 box86 box64 笔记

参考资料 https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md 源码地址 GitHub - ptitSeb/box86: Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices deb在线源地址(打不开): Itais box86…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台,通过可视化进行应用程序开发的方法,让不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发,实现了四个标准的隔离级别,默认为可重复读,并且通过间隙锁(next-key locking)策略防止幻读(查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战12(好友关注、Feed流(关注推送)、滚动分页查…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…