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

news2024/12/24 8:40:55

前言

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.coloradmin.cn/o/1382051.html

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

相关文章

C练习——汉诺塔

题目: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆…

extern static 在linux 和 qt下差别

从五个点来说 1.p3.h 中 静态定义一个const的int 变量并且赋值 2.p5.h 声明函数test2的定义 3. 直接extern 引用声明 test1() 函数 而不是像p5.h一样 把函数声明写到头文件 在别的.c文件直接包含头文件 第二点和第三点 是引用声明函数的两种用法 4.main函数 中static静态定…

GCC工具源码编译

文章目录 背景一、下载源码二、编译前依赖准备2.1 相关工具依赖2.2 相关lib(gmp/ mpfr /mpc)依赖2.2.1 lib源码下载2.2.2 lib源码编译 三、编译GCC3.1 编译3.2 链接 四、报错处理 背景 日常可能涉及到系统里自带GCC版本与被编译源码存在不兼容&#xff…

64位ATT汇编语言整数乘法printf输出

multiplyWithPrint.s里边的内容如下 .section .datastringToShow:.ascii "%d\n\0" .global main .section .text main:movq $4,%raxmovq $2,%rdi# mulq 默认带上rax进行乘积,可以省略rax中的乘数,最后积会放到rax里边。mulq %rdi# C语言的pri…

解决MPICH的GPU初始化失败:一次深入探索

今天来分享“MPICH:MPII_Init_thread(222): gpu_init failed”这个问题的解决方式 文章目录 前言问题原因解决方案 前言 如果在安装MPICH的时候没有注意要一些选项,那么当使用mpicxx mpi_send.cpp -o send && mpirun -n 2 ./send进行编译输出的…

如何调整 Windows 11 任务栏位置、对齐方式,及自定义任务栏

更新于:2023-11-22 分类:Windows 阅读(115407) 评论(12) 如果你是 Windows 11 用户中的一员,一定在不断尝试它的新功能。Windows 11 操作系统采用了全新设计的外观,具有重新设计的 Windows 资源管理器、圆润的窗口边缘和默认将应用…

管理软件供应链中网络安全工具蔓延的三种方法

软件开发组织不断发展,团队成长,项目数量增加。技术堆栈发生变化,技术和管理决策变得更加分散。 在这一演变过程中,该组织的 AppSec 工具组合也在不断增长。在动态组织中,这可能会导致“工具蔓延”。庞大的 AppSec 工…

设计模式 代理模式(静态代理 动态代理) 与 Spring Aop源码分析 具体是如何创建Aop代理的

代理模式 代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对真实对象的访问。这种模式可以用于提供额外的功能操作,或者扩展目标对象的功能。 在代理模式中,代理对象与真实对象实现相同的接口,以便在任何地方都可以使…

爬虫补环境jsdom、proxy、Selenium案例:某条

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为,使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…

OceanBase 4.2特性解读:Show Trace全链路跟踪,助力快速问题定位与精准诊断

在分布式数据库环境下,慢 SQL 诊断是运维人员面临的一大挑战。在无法及时发现问题根本原因的情况下,可能会严重影响用户体验,甚至会导致业务服务不可用。相对于单机数据库,分布式数据库系统涉及多个节点、多组件的协同工作&#x…

Python之jieba分词相关介绍

1.jieba分词的安装 直接在cmd窗口当中pip install即可 2.jieba分词的介绍 jieba分词是目前比较好的中文分词组件之一,jieba分词支持三种模式的分词(精确模式、全模式、搜索引擎模式),并且支持自定义词典(这一点在特定的领域很重要,有时候…

【计算机网络】内容整理

概述 分组交换 分组交换则采用存储转发(整个包必须到达路由器,然后才能在下一个链路上传输)技术。 在发送端,先把较长的报文划分成较短的、固定长度的数据段。 电路交换 在端系统间通信会话期间,预留了端系统间沿路径通信所需…

开源云原生安全的现状

近年来,人们非常重视软件供应链的安全。尤其令人担忧的是开源软件发行版中固有的风险越来越多。这引发了围绕云原生开源安全的大量开发,其形式包括软件物料清单 (SBOM)、旨在验证 OSS 包来源的项目等。 许多组织循环使用大型开源包,但只使用…

第 3 场 小白入门赛(1~6) + 第 3 场 强者挑战赛 (1 ~ 5)

第 3 场 小白入门赛 1、厉不厉害你坤哥(暴力) 2、思维 3、暴力,前缀和,贪心 4、二分 5、DP 6、容斥,双指针 第 3 场 强者挑战赛 2、BFS 5、树上倍增求第k祖先 1. 召唤神坤 题意: 可以发现,如果我…

2023 IoTDB Summit:天谋科技高级开发工程师苏宇荣《汇其流:如何用 IoTDB 流处理框架玩转端边云融合》...

12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题,多位学术泰斗、企业代表、开发者,深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Git相关3 —— 命令及添加Gitee的公钥

1.Git相关命令1 -- 工作目录、暂存区、本地仓库、 使用平台有:cmd、Git bash、VSCode window系统修改VSCode默认终端为git bash git init 初始化 --- 新增.git 文件夹 git status 查看 文件/文件夹 状态 git add 需要追踪的文件名/文件夹名 提交到暂存区 git add…

【JavaSE语法】图书管理系统实现详解

图片出处:The worlds biggest drone photo and video sharing platform | SkyPixel.com 导言 在学完JavaSE语法后,我们就可以去尝试写一个简单的图书管理系统来进一步提升我们面对对象编程的思想。在该系统中会涉及到数组,接口,封…

OceanBase架构概览

了解一个系统或软件,比较好的一种方式是了解其架构,下图是官网上的架构图,基于V 4.2.1版本 OceanBase 使用通用服务器硬件,依赖本地存储,分布式部署在多个服务器上,每个服务器都是对等的,数据库…

YOLOv8改进 | 注意力篇 | 实现级联群体注意力机制CGAttention (全网首发)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

【国内访问github不稳定】可以尝试fastgithub解决这个问题

1、下载 https://github.com/dotnetcore/FastGithub https://github.com/dotnetcore/FastGithub/releases 官网下载即可,比如,我用的是这个:fastgithub_osx-x64.zip(点这里下载) 2、安装 如下图双击启动即可 3、…