Stable Diffusion — ControlNet 超详细讲解

news2024/9/25 15:23:56

Stable Diffusion — ControlNet 超详细讲解

ControlNet 最近非常火🔥!ControlNet 和 Stable Diffusion 的结合使 Stable Diffusion 能够接受指导图像生成过程的条件输入,从而增强了 Stable Diffusion 的性能。今天为大家深入剖析 ControlNet 的工作原理。

img

文章目录

    • 什么是 ControlNet
    • 内部架构
      • 前馈
      • 反向传播
    • 与 Stable Diffusion 相结合
      • 编码器
      • 整体架构
    • 训练
    • 输入条件
    • 总结

什么是 ControlNet

ControlNet 是一个控制预训练图像扩散模型(例如 Stable Diffusion)的神经网络。它允许输入调节图像,然后使用该调节图像来操控图像生成。

这里的调节图像类型众多,例如涂鸦、边缘图、姿势关键点、深度图、分割图、法线图等,这些输入都可以作为条件输入来指导生成图像的内容。 下面是一些例子:

在这里插入图片描述

图片来源:https://github.com/lllyasviel/ControlNet

内部架构

在这里插入图片描述

图1. ControlNet 内部架构

Stable Diffusion (UNet) 中的所有参数都被锁定并克隆到 ControlNet 端的可训练副本中。然后使用外部条件向量训练该副本。

创建原始权重的副本而不是直接训练原始权重是为了防止数据集较小时出现过拟合,并保持已经训练好的大模型的高质量,这些大模型在数十亿图像上训练得到,并可以直接部署到生产环境使用。

前馈

在这里插入图片描述

图2. ControlNet 前馈部分

解释一下上图公式和符号:

  • x , y x, y x,y:神经网络中的深层特征
  • c c c:额外条件
  • + + + : 特征相加
  • Z ( ⋅    ;    ⋅ ) \mathcal{Z}(\cdot\;;\;\cdot) Z(;):零卷积运算(权重和偏差都用零初始化的 1 x 1 卷积层)
  • F ( ⋅    ;    ⋅ ) \mathcal{F}(\cdot\;;\;\cdot) F(;):神经网络块操作(例如 “resnet” 块、“conv-bn-relu” 块等)
  • Θ z 1 \Theta_{z1} Θz1:第一个零卷积层的参数
  • Θ z 2 \Theta_{z2} Θz2:第二个零卷积层的参数
  • Θ c \Theta_c Θc:可训练副本的参数

第一步训练

在这里插入图片描述

图3. ControlNet 的第一步训练

在第一步训练中,由于零卷积层的权重和偏差被初始化为零,因此前馈过程与没有 ControlNet 的过程相同。

经过反向传播后,ControlNet 中的零卷积层变为非零并影响输出。

换句话说,当 ControlNet 应用于某些神经网络块时,在进行任何优化之前,不会对深度神经特征造成任何影响。

反向传播

在这里插入图片描述

图4. ControlNet 反向传播部分

反向传播更新 ControlNet 中的可训练副本和零卷积层,使零卷积权重通过学习过程逐渐过渡到优化值。

为什么梯度不会为零?

我们可以假设如果卷积层的权重为零,则梯度为零。 然而,事实并非如此。

假设 y = w x + b y = wx + b y=wx+b 是零卷积层,其中 w w w b b b 分别是权重和偏差, x x x 是输入特征图。以下是每一项的梯度。
y = w x + b ∂ y ∂ w = x ∂ y ∂ x = w ∂ y ∂ b = 1 y = wx+b\\ \frac{\partial y}{\partial w} = x \qquad \frac{\partial y}{\partial x} = w \qquad \frac{\partial y}{\partial b} = 1 y=wx+bwy=xxy=wby=1
如果 w = 0 w=0 w=0 x ≠ 0 x \ne 0 x=0,则
∂ y ∂ w = x ≠ 0 ∂ y ∂ x = w = 0 ∂ y ∂ b = 1 ≠ 0 \frac{\partial y}{\partial w} = x \ne 0 \qquad \frac{\partial y}{\partial x} = w = 0 \qquad \frac{\partial y}{\partial b} = 1 \ne 0 wy=x=0xy=w=0by=1=0
回想一下梯度下降和链式法则:
w ← w − α ∂ L ∂ w w ← w − α ∂ L ∂ ⋅ … ∂ L ∂ w ⏟ ≠ 0 w \larr w-\alpha\frac{\partial \mathcal{L}}{\partial w}\\ w \larr w-\alpha\frac{\partial \mathcal{L}}{\partial \cdot}\dots\frac{\partial \mathcal{L}}{\underbrace{\partial w}_{\ne 0}} wwαwLwwαL=0 wL
一步训练之后, ∂ y ∂ x ≠ 0 \frac{\partial y}{\partial x} \ne 0 xy=0

一开始,当权重值 w = 0 w = 0 w=0 时,输入特征 x x x 通常不为0。结果,虽然 x x x 上的梯度由于零卷积而变为0,但权重和偏置的梯度不受影响。尽管如此,在一个梯度下降步骤之后,权重值 w w w 将更新为非零值(因为 y y y w w w 的偏导数非零)。

与 Stable Diffusion 相结合

编码器

由于 Stable Diffusion 的 UNet 接受潜在特征 ( 64 × 64 64 \times 64 64×64) 而不是原始图像,因此我们还必须将基于图像的条件转换为 64 × 64 64 \times 64 64×64 的特征空间以匹配卷积大小。
c f = ε ( c i ) c_f = \varepsilon(c_i) cf=ε(ci)
我们可以使用网络 ε \varepsilon ε 将输入条件 c i c_i ci 编码为特征图 c f c_f cf

在这里插入图片描述

图5. ControlNet 编码器

上图中,我们使用 z t z_t zt z t − 1 z_{t-1} zt1 作为锁定网络块的输入和输出,以匹配 Stable Diffusion 上下文中的符号。

整体架构

下图展示了 Stable Diffusion 中 ControlNet 和 UNet 在一个去噪步骤中的输入和输出。

在这里插入图片描述

图6. 一步去噪流程

此外,下图从整体上说明了 ControlNet 和 Stable Diffusion 如何在反向扩散过程(采样)中协同工作。

在这里插入图片描述

图7. 整体反向扩散的流程

上图是根据我之前关于 Stable Diffusion 的文章修改的。如果您还没有阅读过,建议您阅读 《Stable Diffusion 超详细讲解》 和 《Diffusion Model 深入剖析》。

训练

ControlNet 损失函数与 Stable Diffusion 的损失函数类似,但包含文本条件 c t c_t ct 和潜在条件 c f c_f cf,以提高输出与指定条件的一致性。

Stable Diffusion 损失函数:
L = E z 0 , t , ϵ [ ∥ ϵ − ϵ θ ( z t , t ) ∥ 2 ] \mathcal{L} = \mathbb{E}_{z_0,t,\epsilon}\big[\Vert \epsilon - \epsilon_\theta(z_t,t)\Vert^2\big] L=Ez0,t,ϵ[ϵϵθ(zt,t)2]
Stable Diffusion + ControlNet 损失函数:
L = E z 0 , t , ϵ , c t , c f [ ∥ ϵ − ϵ θ ( z t , t , c t , c f ) ∥ 2 ] \mathcal{L} = \mathbb{E}_{z_0,t,\epsilon,\boxed{c_t,c_f}}\big[\Vert \epsilon - \epsilon_\theta(z_t,t,\boxed{c_t,c_f})\Vert^2\big] L=Ez0,t,ϵ,ct,cf[ϵϵθ(zt,t,ct,cf)2]
作为训练过程的一部分,我们随机用空字符串替换 50% 的文本提示 c t c_t ct。这有助于 ControlNet 更好地理解输入条件图的含义,例如 Canny 边缘图或人类涂鸦。

在这里插入图片描述

图8. 训练 ControlNet

通过删除提示,编码器被迫更多地依赖控制图中的信息,这提高了其理解其语义内容的能力。

输入条件

ControlNet 是一种灵活的工具,允许您使用不同类型的条件输入来加强 Stable Diffusion。以下是可在 ControlNet 中使用的输入类型。

Canny 边缘图

img

线条图

img

涂鸦

img

霍夫线

img

语义分割

img

深度图

img

法线图

img

姿势

img

总结

ControlNet 是一种神经网络,可以与预训练的扩散模型结合使用,特别是 Stable Diffusion 模型。

ControlNet 允许将条件输入(例如边缘图、分割图和关键点)包含到 Stable Diffusion 等大型扩散模型中。

结合 ControlNet 可以更好地控制图像生成过程,从而能够生成更具体、更符合要求的图像。

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

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

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:321-340)

第321题 BGP的Open报文是用于建立对等体连接的,以下哪一项不属于Open报文中携带的参数信息? A、发送者的Router ID B、AS号 C、BGP版本号 D、TCP端口号 答案:D 解析:以下是BGP的Open报文: 第322题 在建立BGP对等体的过程中,OpenSent状态表明BGP等待的Open报文 并对收…

合宙Air724UG LuatOS-Air LVGL API控件-微调框 (Spinbox)

微调框 (Spinbox) 微调框用于数值调整,有时候我们希望获取一个用户输入的数值,但是又不希望弹出键盘,可以使用微调框。 示例代码 -- 回调函数 function spinbox_increment_event_cb(obj, event)if event lvgl.EVENT_SHORT_CLICKED thenlvg…

RetroArch 接入两个同款手柄只能识别到一个导致无法双打的问题

测试平台 设备:StationPC M3 RetroArch: 1.1.5(当前官方最新) 手柄:北通蝙蝠BD2F(XBOX360键位) 问题说明 RetroArch插入两个同款手柄/摇杆时只能识别到一个,此时两个手柄都是可以控制模拟器,但是进入游戏也都是p1,无法实现双打 解决办法 …

【Redis】Bitmap 使用及应用场景

前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值,可以设为 1 或 0 例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为…

数据结构——二叉树线索化遍历(前中后序遍历)

二叉树线索化 线索化概念: 为什么要转换为线索化 二叉树线索化是一种将普通二叉树转换为具有特殊线索(指向前驱和后继节点)的二叉树的过程。这种线索化的目的是为了提高对二叉树的遍历效率,特别是在不使用递归或栈的情况下进行遍历…

io和进程day03(文件IO、文件属性函数、目录相关函数)

今日任务 代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <dirent.h> #in…

【管理运筹学】第 7 章 | 图与网络分析(3,最短路问题)

文章目录 引言三、最短路问题3.1 最短路问题定义3.2 Dijkstra 算法3.2.1 算法基本依据3.2.2 算法基本思想与步骤 3.3 逐次逼近算法&#xff08;Bellman-Ford 算法&#xff09;3.4 Floyd 算法 写在最后 引言 承接前文&#xff0c;我们来学习图论中另一个经典问题 —— 最短路问…

解决:使用MySQL Command Line Client时光标不显示的问题

项目场景&#xff1a; 在使用MySQL Command Line Client时&#xff0c;有时候光标会不显示出来&#xff0c;就像下面的图片显示一样。 问题描述&#xff1a; 光标会不显示出来。 解决方案&#xff1a;​​​​​​​ 1.首先将输入法切换到中文输入法&#xff0c;然后随便打出一…

(2023,Diffusion 稳健性 攻击)稳定扩散模型是不稳定的

Stable Diffusion is Unstable 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 进交流群获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 2.1 扩散模型 2.2 文本到图像模型的缺陷 3. 基础 4. 稳定扩散模型的缺陷 4.1 生成速度的变化 4.…

介绍PHP

PHP是一种流行的服务器端编程语言&#xff0c;用于开发Web应用程序。它是一种开源的编程语言&#xff0c;具有易学易用的语法和强大的功能。PHP支持在服务器上运行的动态网页和Web应用程序的快速开发。 PHP可以与HTML标记语言结合使用&#xff0c;从而能够生成动态的Web页面&a…

Java实践-物联网loT入门-MQTT传输协议

前言 MQTT是一个极其轻量级的发布/订阅消息传输协议,适用于网络带宽较低的场合. 它通过一个代理服务器&#xff08;broker&#xff09;&#xff0c;任何一个客户端&#xff08;client&#xff09;都可以订阅或者发布某个主题的消息&#xff0c;然后订阅了该主题的客户端则会收…

红米note5 拆金属外壳

红米note5 拆金属外壳 卡扣式 外壳 屏幕 先拿下来&#xff0c;sim卡的那个卡座。 贴边&#xff0c;到这个卡扣的地方&#xff0c;用工具翘一下&#xff0c;然后下一个卡扣的地方翘一下&#xff0c;然后慢慢的整个的拿下来。 别硬翘&#xff0c;小刀的刀尖&#xff0c;容易给…

jeesite自定义数据字典,自定义字典表,自带树选择数据源(保姆级图文教程)

文章目录 前言一、框架自带树字典表如何使用二、自定义表作为字典表1. 下拉选项使用自建表作为字典表。实际效果框架示例实际开发代码总结前言 项目开发中字典表如果不满足实际需求,比如使用自己的表作为字典,系统自带字典表树如何使用等问题进行总结记录。 一、框架自带树字…

端口扫描-安全体系-网络安全技术和协议

端口扫描-安全体系-网络安全技术和协议 端口扫描信息安全的保证体系和评估方法网络安全技术网络攻击和威胁(重要)网络安全协议 端口扫描 全TCP连接:三次握手 半打开式扫描:前两次握手 FIN扫描:不用建立TCP连接 第三方扫描: 拒绝服务攻击有: 同步包风暴ICMP攻击SNMP攻击 都是修改…

卡牌类游戏推荐,卡牌类三国手游排行榜

以下是小编要推荐给大家的关于卡牌类三国手游排行榜的内容。这里有来自各个历史阶段的名将和美女&#xff0c;让你体验最真实的三国战役。你可以将各种战略思维运用到其中&#xff0c;感受步步为营的喜悦&#xff0c;最终赢得战火纷飞的三国&#xff0c;如果想了解每个游戏的具…

c高级day2 linux指令的补充和shell脚本

思维导图 写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把di…

维维数码:网络电视机顶盒怎么样?口碑电视机顶盒排行榜

欢迎各位来到维维数码频道&#xff0c;最近后台收到很多私信咨询我网络电视机顶盒怎么样&#xff0c;值不值得买&#xff1f;当家里是老电视想升级智能电视&#xff0c;或者智能电视使用几年后出现卡顿、资源少、无法下载软件等&#xff0c;只需要买一台网络电视机顶盒就可以解…

Tomcat环境变量配置教程

1、在官网下载并解压Tomcat&#xff0c;记住解压好的目录&#xff0c;后面配置环境需要用到。 官网地址&#xff1a;Apache Tomcat - Welcome! --- 阿帕奇雄猫 - 欢迎&#xff01; 2、右键此电脑&#xff08;我的电脑&#xff09;->属性->高级系统设置->环境变量 3、…

NoSQL之redis持久化(RDB、AOF)

目录 一、Redis高可用 二、Redis持久化 1、持久化的功能 2、Redis的两种持久化 三、RDB 持久化 1、触发条件 1.1 手动触发 1.2 自动触发 1.3 其它自动触发机制 2、执行流程 3、启动时加载RED文件(恢复) 四、Redis的AOF持久化 1、开启AOF 2、执行流程 2.1 命令追加…

SSD202D-boot-IO复用功能

SSD202D-logo分区添加dtb_旋风旋风的博客-CSDN博客 可以参考该博客,当然我为了兼容以前的固件又优化了该思路: 直接把对应的包添加在logo_202d的尾部,这样就不会影响原来的包 这两张就是修改之后的结构,只在尾部追加DTB 其中ABC结构体 //A结构体- (12 size) typedef struc…