ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models

news2024/9/23 19:27:00

Adding Conditional Control to Text-to-Image Diffusion Models (Paper reading)

Lvmin Zhang and Maneesh Agrawala, Stanford University, arXiv, Cited:113, Code, Paper

1. 前言

我们提出了一种名为ControlNet的神经网络结构,用于控制预训练的大规模扩散模型,以支持额外的输入条件。ControlNet以端到端的方式学习任务特定的条件,并且即使训练数据集较小(< 50k),学习效果也很稳健。此外,训练ControlNet的速度与微调扩散模型的速度一样快,而且该模型可以在个人设备上进行训练。或者,如果有强大的计算集群可用,该模型可以扩展到大量(百万到十亿级)的数据。我们报告了使用ControlNet扩展稳定扩散等大规模扩散模型的结果,以实现诸如边缘映射、分割映射、关键点等条件输入。这可以丰富控制大规模扩散模型的方法,并进一步促进相关应用。

2. 问题声明

随着大型文本到图像模型的出现,仅凭用户输入的简短描述性提示即可生成具有视觉吸引力的图像。在输入一些文本并获得图像后,我们可能会自然而然地提出几个问题:这种基于提示的控制是否满足我们的需求?例如,在图像处理中,考虑到许多既定的、具有明确问题表述的任务,这些大型模型是否可以应用于促进这些特定任务?我们应该构建什么样的框架来处理广泛的问题条件和用户控制?在特定任务中,大型模型是否能保留从数十亿张图像中获得的优势和能力?

为了回答这些问题,我们研究了各种图像处理应用,并得出了三个发现。首先,任务特定领域中可用的数据规模并不总是与图像文本领域中的数据规模一样大。许多特定问题(例如对象形状/法线、姿势理解等)的最大数据集大小通常不超过100k,即比LAION5B小5×104倍。这将要求具有稳健神经网络训练方法,以避免过拟合并在大型模型针对特定问题进行训练时保持泛化能力。

其次,在使用数据驱动的解决方案处理图像处理任务时,并不总是可以使用大型计算集群。这使得快速训练方法对于在可接受的时间和内存空间内优化大型模型以适应特定任务非常重要(例如在个人设备上)。这还需要利用预训练权重以及微调策略或迁移学习。

第三,各种图像处理问题具有不同形式的问题定义、用户控制或图像注释。在解决这些问题时,尽管可以以“过程化”的方式调节图像扩散算法,例如限制去噪过程、编辑多头注意力激活等,但这些手工制定的规则行为基本上是由人类指令规定的。考虑到一些特定任务,如深度到图像、姿势到人类等,这些问题基本上需要将原始输入解释为对象级或场景级的理解,使得手工制定的过程化方法不太可行。在许多任务中实现学习的解决方案是不可或缺的,需要端到端学习。

2. 整体思想

大模型微调的一种范式,用另一个path来辅助大模型,主要的思想是固定大模型,copy大模型中去噪器的一些结构,然后对于不同任务训练这些结构,condition使用的是edge等,可以控制生成一些内容。

4. 方法

ControlNet是一种神经网络架构,可以通过任务特定条件增强预训练的图像扩散模型。我们在第4.1节介绍了ControlNet的基本结构,并解释了每个部分的动机。在第4.2节中,我们详细说明了将ControlNet应用于图像扩散模型的方法,以Stable Diffusion为例。在第4.3节中,我们详细描述了学习目标和通用训练方法,然后在第4.4节中描述了在极端情况下改善训练的几种方法,例如在一台笔记本电脑上进行训练或使用大规模计算集群。最后,在第4.5节中,我们提供了几个具有不同输入条件的ControlNet实现的详细信息。

4.1 ControlNet

ControlNet通过操作神经网络块的输入条件来进一步控制整个神经网络的行为。在这里,“网络块”指的是一组作为经常使用的单元组合在一起构建神经网络的神经层,例如“resnet”块、“conv-bn-relu”块、多头注意力块、变换器块等。以2D特征为例,给定一个特征图 x ∈ R h × w × c x ∈ R^{h×w×c} xRh×w×c,其中 h , w , c {h, w, c} h,w,c表示高度、宽度和通道数,一个具有一组参数 Θ Θ Θ的神经网络块 F ( ⋅ ; Θ ) F(·; Θ) F(⋅;Θ) x x x转换为另一个特征图 y y y,其形状为 y = F ( x ; Θ ) y=F(x; Θ) y=F(x;Θ)。如图:
在这里插入图片描述

零卷积是权重初始化为0

我们将 Θ Θ Θ中的所有参数锁定,然后将其克隆为一个可训练的副本 Θ c Θ_c Θc。复制后的 Θ c Θ_c Θc将与外部条件向量 c c c一起进行训练。在本文中,我们将原始参数和新参数称为“锁定副本”和“可训练副本”。采用这种复制的动机是为了避免在数据集较小时出现过拟合,并保持从数十亿张图像中学习到的大型模型的产品可用质量。神经网络块通过一种称为“零卷积”的独特类型的卷积层连接,即使用零进行初始化的 1 × 1 1×1 1×1卷积层,包括权重和偏置。我们用 Z ( ⋅ ; ⋅ ) Z(·; ·) Z(⋅;⋅)表示零卷积操作,并使用两个参数实例 Θ z 1 , Θ z 2 Θ_{z1},Θ_{z2} Θz1Θz2组成ControlNet结构。应用0卷积时,我们训练的第一步是完全使用了锁定副本的信息。在第一次训练步骤中,神经网络块的可训练副本和锁定副本的所有输入和输出与不存在ControlNet时的输入和输出一致。换句话说,在对某些神经网络块应用ControlNet之前,在任何优化之前,它不会对深层神经特征产生任何影响。任何神经网络块的能力、功能和结果质量都完全保留,任何进一步的优化将变得与微调一样快速(与从头开始训练这些层相比)。

4.2 ControlNet in Image Diffusion Model

我们以Stable Diffusion [44]作为例子,介绍了如何使用ControlNet来控制具有任务特定条件的大型扩散模型。Stable Diffusion是一个在数十亿张图像上训练的大型文本到图像扩散模型。该模型本质上是一个U-Net,包括一个编码器、一个中间块和一个跳连解码器。编码器和解码器都有12个块,完整的模型包含25个块(包括中间块)。在这些块中,有8个块是下采样或上采样的卷积层,17个块是主要块,每个块包含四个ResNet层和两个Vision Transformer(ViT)。每个ViT包含几个交叉注意力和/或自注意力机制。文本使用OpenAI CLIP进行编码,扩散时间步使用位置编码进行编码。
在这里插入图片描述

Stable Diffusion使用类似于VQ-GAN的预处理方法,将整个512×512的图像数据集转换为较小的64×64的“潜在图像”,以进行稳定训练。这需要使用ControlNet将基于图像的条件转换为64×64的特征空间,以匹配卷积的大小。我们使用一个小型网络 E ( ⋅ ) E(·) E(),包含四个卷积层,内核大小为 4 × 4 4×4 4×4,步长为 2 × 2 2×2 2×2(通过ReLU激活,通道数为16、32、64、128,使用高斯权重初始化,与完整模型一起进行联合训练),将图像空间的条件 c i c_i ci编码为特征图,大小为 64 × 64 64×64 64×64。具体而言,我们使用ControlNet创建了Stable Diffusion的12个编码块和1个中间块的可训练副本。这12个块分布在4个分辨率(64×64、32×32、16×16、8×8)中,每个分辨率有3个块。输出被添加到U-net的12个跳跃连接和1个中间块中。由于SD是一个典型的U-net结构,这种ControlNet架构很可能在其他扩散模型中也可以使用。

4.3 训练

给定一个图像 z 0 z_0 z0,扩散算法逐渐向图像添加噪声,产生一个带有噪声的图像 z t z_t zt,其中 t t t表示添加噪声的次数。当 t t t足够大时,图像逼近纯噪声。给定一组条件,包括时间步长 t t t、文本提示 c t c_t ct以及任务特定条件 c f c_f cf,图像扩散算法学习一个网络 θ θ θ来预测添加到噪声图像 z t z_t zt中的噪声:
L = E z 0 , t , c t , c f , ϵ ∼ N ( 0 , 1 ) [ ∣ ∣ ϵ − ϵ θ ( z t , t , c t , c f ) ∣ ∣ 2 2 ] \mathcal{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=Ez0,t,ct,cf,ϵN(0,1)[∣∣ϵϵθ(zt,t,ct,cf)22]
在训练过程中,我们随机将50%的文本提示ct替换为空字符串。这有助于ControlNet从输入条件图中识别语义内容,例如Canny边缘图或人工涂鸦等。这主要是因为当SD模型看不到提示时,编码器倾向于从输入控制图中学习更多的语义作为提示的替代。

4.4 改进训练

我们讨论了几种改进ControlNet训练的策略,特别是在计算设备非常有限的极端情况下(例如,在笔记本电脑上)或计算能力非常强大的情况下(例如,在具有大规模GPU的计算集群上)。在我们的实验中,如果使用了这些策略,我们将在实验设置中进行提及。

小规模训练:当计算设备有限时,我们发现部分断开ControlNet和Stable Diffusion之间的连接可以加快收敛速度。默认情况下,我们将ControlNet连接到“SD Middle Block”和“SD Decoder Block 1,2,3,4”,如图3所示。我们发现断开与解码器1,2,3,4的连接,仅连接中间块可以将训练速度提高约1.6倍(在RTX 3070TI笔记本GPU上测试)。当模型在结果和条件之间显示合理的关联时,可以重新连接这些断开的连接,进行进一步的训练以便于精确控制。

大规模训练:在这里,大规模训练是指同时具有强大的计算集群(至少8个Nvidia A100 80G或等效的GPU)和大规模数据集(至少100万个训练图像对)的情况。这通常适用于数据易于获取的任务,例如Canny检测到的边缘图。在这种情况下,由于过拟合的风险相对较低,我们可以先对ControlNet进行足够多的迭代训练(通常超过5万步),然后解锁Stable Diffusion的所有权重,联合训练整个模型。这将导致更加针对特定问题的模型

4.5 实现

我们提供了几种使用不同基于图像的条件来控制大规模扩散模型的ControlNet实现。

  1. Canny边缘:我们使用Canny边缘检测器(使用随机阈值)从互联网上获取了300万个边缘-图像标题对。该模型在Nvidia A100 80G上进行了600个GPU小时的训练。基础模型是稳定扩散1.5。
    在这里插入图片描述

  2. Canny边缘(改变):我们对上述Canny边缘数据集的图像分辨率进行了排序,并采样了包含1,000、10,000、50,000、500,000个样本的子集。我们使用相同的实验设置来测试数据集规模的影响。显然训练数据越大效果越好啊!
    在这里插入图片描述

  3. Hough线:我们使用基于学习的深度霍夫变换从Places2中检测直线,然后使用BLIP生成标题。我们获得了60万个边缘-图像-标题对。我们使用上述Canny模型作为起始检查点,并在Nvidia A100 80G上进行了150个GPU小时的训练。
    在这里插入图片描述

  4. HED边界:我们使用HED边界检测从互联网上获取了300万个边缘-图像-标题对。该模型在Nvidia A100 80G上进行了300个GPU小时的训练。基础模型是稳定扩散1.5。
    在这里插入图片描述

  5. 用户草图:我们使用HED边界检测和一组强大的数据增强方法(随机阈值、随机屏蔽一定百分比的草图、随机形态变换和随机非极大值抑制)从图像中合成人类涂鸦。我们从互联网上获取了50万个涂鸦-图像-标题对。我们使用上述Canny模型作为起始检查点,并在Nvidia A100 80G上进行了150个GPU小时的训练。注意,我们还尝试了一种更“类似人类”的合成方法,但该方法比简单的HED方法慢得多,我们没有注意到明显的改进。
    在这里插入图片描述

  6. 人体姿势:我们使用基于学习的姿势估计方法从互联网上“找到”人类,使用一个简单的规则:具有人体的图像必须至少检测到整个身体关键点的30%。我们获得了8万个姿势-图像-标题对。注意,我们直接使用可视化的带有人体骨架的姿势图像作为训练条件。该模型在Nvidia RTX 3090TI上进行了400个GPU小时的训练。基础模型是稳定扩散2.1。
    在这里插入图片描述

  7. 人体姿势: 我们使用基于学习的姿势估计方法在上述Openpifpaf设置中找到互联网上的人类,使用相同的规则。我们获得了20万个姿势-图像-标题对。注意,我们直接使用可视化的带有人体骨架的姿势图像作为训练条件。该模型在Nvidia A100 80G上进行了300个GPU小时的训练。其他设置与上述Openpifpaf相同。
    在这里插入图片描述

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

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

相关文章

element中table的列标题自定义

一、需求 工作中要求表格table中的某一列标题为红色如图 二、方案一 使用el-table-column自带的:render-header"renderHeader"函数 render-header列标题 Label 区域渲染使用的 FunctionFunction(h, { column, $index })—— 使用有点像v-html插入代码片段&#xf…

PubChem介绍及API及PubChempy

PubChem 【官网 https://pubchem.ncbi.nlm.nih.gov/】 简介 PubChem is the world’s largest collection of freely accessible chemical information. Search chemicals by name, molecular formula, structure, and other identifiers. Find chemical and physical proper…

casbin基于RBAC的权限管理案例

在RBAC模型中新定义了角色和继承关系&#xff0c;用户可以通过角色区分不同的权限&#xff0c;继承不同的角色时用户有多个权限。 [role_definition] g _, _ g2 _, _g 是一个 RBAC系统, g2 是另一个 RBAC 系统。 _, _表示角色继承关系的前项和后项&#xff0c;即前项继承后项…

局部探索测试的要素

局部探索测试的要素 局部探索测试是软件测试过程中的一种方法&#xff0c;旨在发现一个系统、软件或应用程序的局部缺陷和问题。局部探索测试不是全面测试&#xff0c;而是通过对特定功能、模块或环节进行测试来检查其中潜在的缺陷&#xff0c;从而提高软件的质量和可靠性。 局…

【白话机器学习系列】白话Broadcasting

白话 Broadcasting 文章目录 什么是 BroadcastingBroadcasting 的规则逐元素操作向量与标量运算矩阵与向量运算行向量列向量 张量与向量运算张量与矩阵运算 矩阵与张量的点积总结 什么是 Broadcasting 在 《白话张量》 中我们讲过&#xff0c;张量之间进行运算需要满足一定的…

Hadoop之MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗&#xff08;ETL&#xff09;进一步分析MapTask和Red…

Jenkins+RF持续集成测试(二) 定时更新SVN完成构建

在上一篇中讲了Jenkins的安装&#xff0c;这篇将介绍 定时从SVN库中&#xff08;git库与之类似&#xff0c;这里就不具体介绍了&#xff0c;有需要自己折腾&#xff09;拉取最新的测试脚本&#xff0c;完成jenkins的定时构建。这是我们做自动化测试最基本的环节&#xff0c;每天…

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性&#xff0c;越来越多地被用作服务器的操作系统(当然&#xff0c;有人会较真地说一句&#xff1a;Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统&#xff0c;是否我们就能保证我们的服务做到7*24地稳定呢&#xff1f;非也&#xff0c;要…

06.05

1.二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法&#xff1a;先将 aaa 和 bbb 转化成十进制数&#xff0c;求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算&#xff0c;我们可以很简单地写出这…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言&#xff1a; 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言&#xff1a; 自动化测试是软件开发中必不可少的一环&…

shell简单命令

命令入门&#xff1a; [rootlocalhost ~]# #/root [jinxflocalhost ~]$ #/home/jinxf 用户名主机名 当前目录 #系统权限 $普通权限 命令格式 命令 选项 参数&#xff08;三者之间要有空格&#xff0c;区分大小写&#xff09; command [-options] [args]…

004-从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…

最厉害的缓存框架,没有之一!

Redis有多火爆&#xff1f; 现在阿里、腾讯这样的大厂和大部分互联网公司&#xff0c;基本上都需要使用到Redis技术。网上发布的Java开发工程师岗位的招聘信息&#xff0c;对Redis的要求都是熟练掌握。 而且现在大厂的大部分面试题都和Redis有关&#xff0c;尤其是在阿里、字节…

在 iPhone 和 Android 上恢复已删除的微信消息/聊天的 3 种方法

微信是一款面向移动用户的免费即时通讯应用程序。它适用于 iOS 和 Android。 好消息是&#xff0c;在微信 经历了如此艰难的运行之后&#xff0c;它仍在我们身边&#xff0c;并将在其新所有者恢复工具的帮助下继续发展。 微信 是一个相当受欢迎消息应用程序。非常简单易用&am…

【论文阅读】Megatron-LM要点

Megatron-LM论文要点 本文主要是对李沐老师的b站分享做一下自己的理解和总结。 李沐老师b站分享 模型结构无非就是那样&#xff0c;相比而言&#xff0c;想要训练更大的模型而又能平稳进行&#xff0c;是一项非常高超的技术&#xff01; nvidia 跟gpipe类似&#xff0c;也是…

mysql中sql语句之分组(group by)

文章目录 前言分组查询定义语法说明 group by使用group by group_concat()的使用group by 聚合函数的使用group by having的使用group by with rollup的使用分组查询小结 前言 今天遇到公司新来的小伙伴咨询问题&#xff0c;统计集团内部的在职员工与离职员工数量&#xf…

负载不堵塞,稳定可靠,企业性能测试指南!

目录 前言&#xff1a; 基准测试 - 确认你的产品在正常使用条件下的性能 负载测试 - 确认你的产品在高负荷下的性能 压力测试 - 确认你的产品的极限性能 稳定性测试 - 确认你的产品在长时间高负荷下的表现 总结 前言&#xff1a; 在当今竞争激烈的商业环境中&#xff0c;…

我敢说,这是科普路由协议的最高境界

大家好&#xff0c;我是许公子。 路由协议&#xff0c;经常看我文章的小友都知道&#xff0c;给你们说过很多期了。 这是网络世界里&#xff0c;很重要的一个概念&#xff0c;总得来说&#xff0c;它负责将数据包从源节点传递到目的节点。 最近又有很多萌新关注过来&#xff…

C语言:计算n的阶乘(不考虑溢出)

题目&#xff1a; 从键盘输入一个值n&#xff0c;计算n的阶乘&#xff0c; 如&#xff1a;输入5&#xff0c;计算5的阶乘 --> 5! 1 * 2 * 3 * 4 * 5 思路&#xff1a; 第一步&#xff1a; 创建一个变量 ret &#xff0c;用来存放每次相乘后的值&#xff0c; 因为 0 乘 任何…

uipath 实现连接pg数据库

1、下载ODBC 如需要使用UiPath连接数据库进行操作&#xff0c;需要先准备必需条件先安装ODBC。 postgresql ODBC下载链接&#xff1a;https://www.postgresql.org/ftp/odbc/versions/msi/ 下载最新的安装包即可。 2、配置ODBC 下载完pgsql ODBC的安装包直接打开压缩包进行…