【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! 

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

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

相关文章

python入门,数据容器:set集合

set最大的特点就是不支持重复元素,可以进行元素的去重处理,但不有序,不保证元素顺序正确 所以就不能使用下标索引的访问 1.集合的定义 集合的定义使用的是大括号{ } 对ok这个字符串进行了去重 2.add添加新元素 3.remove移除元素 4.pop随机…

鸿蒙Harmony--AppStorage--应用全局的UI状态存储详解

无所求必满载而归,当你降低期待,降低欲望,往往会得到比较好的结果,把行动交给现在,用心甘情愿的态度,过随遇而安的生活,无论结果如何,都是一场惊喜的获得! 目录 一,定义 …

浅析Linux进程地址空间

前言 现代处理器基本都支持虚拟内存管理,在开启虚存管理时,程序只能访问到虚拟地址,处理器的内存管理单元(MMU)会自动完成虚拟地址到物理地址的转换。基于虚拟内存机制,操作系统可以为每个运行中的进程创建…

DHCP中继【新华三】

理论【DHCP服务器可以对其直连的网段中的pc,分配其IP地址等服务,但是,对于跨网段进行分配IP地址,需要中间有DHCP中继进行传达,由DHCP中继指定DHCP服务器的位置,可以很好的对其跨网段分配IP地址起到指引的作…

如何激活数据要素价值

文章目录 前言一、数据作为生产要素的背景二、数据作为新型生产要素,是价值创造的重要源泉(一)生产要素是经济活动中的基本要素(二)激活数据要素价值,要从理论上认识数据要素的基本特征(三&…

爬虫—中信证券资管产品抓取

爬虫—中信证券资管产品抓取 中信证券资管产品板块网址:http://www.cs.ecitic.com/newsite/cpzx/jrcpxxgs/zgcp/ 页面截图如下: 目标:抓取上图中红框内的所有资产信息 按F12进入开发者工具模式,在Elements板块下,在…

大数据StarRocks(七):数据表创建

1. 基本概念 1.1 Row & Column 一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。 ⚫ 在默认的数据模型中,Column 只分为排序列和非排序列。存储引擎会按照排序列对…

Flask 小程序菜品搜索

mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…

中仕公考:2024年上半年中小学教师资格考试(笔试)报名已开始

2024年上半年中小学教师资格考试(笔试)报名工作于1月12日开始&#xff0c;此次笔试在31个省(自治区、直辖市)举办&#xff0c;各省(自治区、直辖市)的报名公告将陆续上网。 个别地区报名截止时间有所差异&#xff0c;上海1月13日报名截止&#xff0c;浙江、天津、河南1月14日截…

Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合

文章目录 背景知识补充CLIP (Contrastive Language-Image Pre-training)&#xff1a;打破文字和图像之间的壁垒DINO(Data-INterpolating Neural Network)&#xff1a;视觉 Transformer 的自监督学习Stable Diffusion&#xff1a;从文本描述中生成详细的图像Open-set Detector开…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《与新能源互补和独立参加多级市场的抽蓄电站容量分配策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到抽蓄电站在能源系统中的角色&#xff0c;特别是在多级市场中的参与&#xff0c;并强调了新能源的互补性以及抽蓄电站的独立性。下面我将…

java swing UI第三方设计器JFormDesiner和FlatLaf UI

安装JFormDesiner 官网&#xff1a;https://www.formdev.com/ 先去IDEA的插件市场安装吧 JFormDesiner是非开源&#xff0c;且付费的插件&#xff0c;可以自己去找找不付费的使用方法。在swing可视化设计UI非常高效快捷&#xff0c;初学者可能需要一定时间探索&#xff0c;熟…

最左前缀法则

概念 最左前缀法则是针对于复合索引而言的&#xff0c;也就是说一个索引有多个字段那么索引的查询从最左列开始&#xff0c;并且不跳过索引的列&#xff0c;如果跳过索引中的某一列&#xff0c;那么&#xff0c;会导致索引部分失效(跳过列之后的索引失效)如果出现了范围查询(&…

学习redis有效期和数据类型

1、安装redis和连接redis 参考&#xff1a;ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis&#xff1a;redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)六

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

UISegmentedControl控件定制

1.在xib中设计如下: 背景颜色: 段标题与数量 : 2.在代码中控制 关联控件 注册控件事件 控件事件处理函数实现: 定制Title颜色 4 --- > UIControlStateSelected 0 --- > UIControlStateNormal 最终实现效果: 取控件选中时的索引与显示文本: 输出:

我在代码随想录|写代码Day7之454.四数相加II ,​ 383. 赎金信​,​ 15. 三数之和​

454.四数相加II 题目 解题思路 四个数字相加的和为0,我们要选俩数组,让他们的笛卡尔积储存在哈希表中,然后我们要找的是这俩数和的相反数,然后就是将后面俩数组相加在后面的数组和中找相反数. 383. 赎金信 解题思路 题目意思是让在字符串1中找到字母组成字符串2所以找字符串1…

Sentinel微服务保护

文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.…

【C++】wxWidgets库实现窗体程序

一、安装wxWidgets库 在Debian系统上使用wxWidgets库来创建一个基本的窗体程序&#xff0c;首先需要确保已经安装了wxWidgets相关的库和开发工具。下面是安装wxWidgets的步骤&#xff1a; 打开终端&#xff0c;使用下述命令安装wxWidgets库及其开发文件&#xff1a; sudo ap…

Tomcat解压打包文件和并部署

一、文件压缩和上传解压 1.本地打包好dist.tar.gz文件 2.通过xftp拖拽上传到知道文件夹下,或者通过命令: cp dist.tar.gz /path/to/destination/folder注:将dist.tar.gz复制到 /path/to/destination/folder文件夹下,该文件夹只是举个例子怎么复制和解压! 3.进入/path/…