ControlNet原理解析

news2024/12/23 8:14:29

前排提示照片已经获得小姐姐许可。

image.png

光知道ControlNet好用,不想知道它背后的原理么?今天就看一看这篇论文,带大家了解一下ControlNet是如何炼成的。

image.png


ControlNet是干嘛的

我们知道现在文本到图像生成很火爆,你只需要输入文字就可以获得对应的输出,这个任务的发展多亏了扩散模型的发展。

而我们今天要说的ControlNet的作用就是能够控制扩散模型,生成更接近用户需求的图。

我们用几个图示范一下:

假如我们只用文字去生成图像,我们给模型输入文本prompt:

a girl, long hair, blond hair, black eyes, black coat, winter, snow

那模型会出来这些图:

image.png

我们可以看到,我们输入的要素都符合了。但是差别又很大,大在哪里?每个妹子动作差异都好大。

那现在我们就可以掏出ControlNet了,用ControlNet来控制你生成的人物的动作。

比如下图这样,可以看到即使我换了画风(换了模型的checkpoint)生成的人物动作也是一样的, 并且满足我前边输入的条件。

image.png

那我做了什么才让模型能稳定输出相同的人物动作呢?下面请出我们的仙女姐姐尚尚:

为我们生成的妹子提供动作的是我们的尚影嫣小姐姐,我把她的照片放到ControlNet中作为控制条件,这里使用的是ControlNet的Depth功能,ControlNet会根据小姐姐提取一个深度图,然后按照人物深度图轮廓去生成我们的人物。

下图你看到的就是文本prompt控制ControlNet图像条件控制相互作用的结果。

既符合文本prompt:a girl, long hair, blond hair, black eyes, black coat, winter, snow,又保持了小姐姐的大致动作形态。

image.png

当然,如果我们把文字控制删除一点,只留下a girl, long hair, black eyes,我们可以得到更接近小姐姐原图的结果。

image.png

好了,美女看完了,那我们就介绍一下这个论文吧。

ControlNet 网络设计

在一个扩散模型中,如果不加ControlNet的扩散模型,其中原始的神经网络F\mathcal FF输入xxx获得yyy,参数用Θ\ThetaΘ表示。

y=F(x;Θ)y = \mathcal F(x;\Theta)y=F(x;Θ)

也就是下图这个样子。

image.png

ControlNet中,就是将模型原始的神经网络锁定,设为locked copy

然后将原始网络的模型复制一份,称之为trainable copy,在其上进行操作施加控制条件。然后将施加控制条件之后的结果和原来模型的结果相加获得最终的输出。

经过这么一顿操作之后,施加控制条件之后,最后将原始网络的输出修改为:

yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)\boldsymbol{y}_{\mathrm{c}}=\mathcal{F}(\boldsymbol{x} ; \Theta)+\mathcal{Z}\left(\mathcal{F}\left(\boldsymbol{x}+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z2}}\right)yc​=F(x;Θ)+Z(F(x+Z(c;Θz1​);Θc​);Θz2​)

其中zero convolution,也就是零卷积层Z\mathcal ZZ是初始化weight和bias为0,两层零卷积的参数为{Θz1,Θz2}\{ \Theta_{z1},\Theta_{z2} \}{Θz1​,Θz2​}。

image.png

将控制条件通过零卷积之后,与原始输入相加,相加之后进入ControlNet的复制神经网络块中,将网络输出再做一次零卷积之后与原始网络的输出相加。

初始化之后未经训练的ControlNet参数应该是这样的:

{Z(c;Θz1)=0F(x+Z(c;Θz1);Θc)=F(x;Θc)=F(x;Θ)Z(F(x+Z(c;Θz1);Θc);Θz2)=Z(F(x;Θc);Θz2)=0\left\{\begin{array}{l}\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right)=0 \\ \mathcal{F}\left(x+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right)=\mathcal{F}\left(x ; \Theta_{\mathrm{c}}\right)=\mathcal{F}(x ; \Theta) \\ \mathcal{Z}\left(\mathcal{F}\left(x+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z} 2}\right)=\mathcal{Z}\left(\mathcal{F}\left(x ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z} 2}\right)=\mathbf{0}\end{array}\right.⎩⎨⎧​Z(c;Θz1​)=0F(x+Z(c;Θz1​);Θc​)=F(x;Θc​)=F(x;Θ)Z(F(x+Z(c;Θz1​);Θc​);Θz2​)=Z(F(x;Θc​);Θz2​)=0​

也就是说ControlNet未经训练的时候,输出为0,那加到原始网络上的数字也是0。这样对原始网络是没有任何影响的,就能确保原网络的性能得以完整保存。之后ControlNet训练也只是在原始网络上进行优化,这样可以认为和微调网络是一样的。

ControlNet in Stable Diffusion

上一部分描述了ControlNet如何控制单个神经网络块,论文中作者是以Stable Diffusion为例子,讲了如何使用ControlNet对大型网络进行控制。下图可以看到控制Stable Diffusion的过程就是将Encoder复制训练,decoder部分进行skip connection。

image.png

在这之前需要注意:

Stable Diffusion有一个预处理步骤,将512×512的图片转化为64×64的图之后再进行训练,因此为了保证将控制条件也转化到64×64的条件空间上,训练过程中添加了一个小网络E\EpsilonE将图像空间条件转化为特征图条件。

cf=E(ci)c_f = \Epsilon (c_i)cf​=E(ci​)

这个网络E\EpsilonE是四层卷积神经网络,卷积核为4×4,步长为2,通道16,32,64,128,初始化为高斯权重。这个网络训练过程是和整个ControlNet进行联合训练。

或者我们可以把他的图改吧改吧,画成这样:

image.png

训练过程

训练的目标函数为:

L=Ez0,t,ct,cr,ϵ∼N(0,1)[∥ϵ−ϵθ(zt,t,ct,cf))∥22]\left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{r}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_\theta\left(z_t, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_2^2\right]L=Ez0​,t,ct​,cr​,ϵ∼N(0,1)​[∥ϵ−ϵθ​(zt​,t,ct​,cf​))∥22​]

使用的就是人家Stable Diffusion原始的目标函数改了改。

先看一下原始的Stable Diffusion的目标函数:

LLDM:=EE(x),ϵ∼N(0,1),t[∥ϵ−ϵθ(zt,t)∥22]L_{L D M}:=\mathbb{E}_{\mathcal{E}(x), \epsilon \sim \mathcal{N}(0,1), t}\left[\left\|\epsilon-\epsilon_\theta\left(z_t, t\right)\right\|_2^2\right]LLDM​:=EE(x),ϵ∼N(0,1),t​[∥ϵ−ϵθ​(zt​,t)∥22​]

将采样ztz_tzt​使用网络ϵθ\epsilon_\thetaϵθ​去噪之后和原图经过网络ϵ\epsilonϵ获得的潜变量计算L2L_2L2​loss,看其重建的效果。

那再回到

L=Ez0,t,ct,cr,ϵ∼N(0,1)[∥ϵ−ϵθ(zt,t,ct,cf))∥22]\left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{r}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_\theta\left(z_t, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_2^2\right]L=Ez0​,t,ct​,cr​,ϵ∼N(0,1)​[∥ϵ−ϵθ​(zt​,t,ct​,cf​))∥22​]

将原始图像经过ϵ\epsilonϵ之后获得潜变量,和经过网络ϵθ\epsilon_\thetaϵθ​重建之后的图算L2L_2L2​loss。原来Stable Diffusion中解码器要处理的是采样ztz_tzt​和时间步长ttt,在这里加了两个控制条件:

  • 文字prompt ctc_tct​
  • 任务相关的prompt cfc_fcf​

训练过程中将50 %的文本提示ctc_tct​随机替换为空字符串。这样有利于ControlNet网络从控制条件中识别语义内容。这样做的目的是,当Stable Diffusion没有prompt的时候,编码器能从输入的控制条件中获得更多的语义来代替prompt。(这也就是classifier-free guidance。)

效果!

这一部分作者主要是讲了如何训练不同控制条件的ControlNet的,训练方法感兴趣的自己看,这里简单展示一下作者提供好的训练出来的模型。用《青蛇劫起》里边小青做一下示范:

Canny Edge

使用Canny边缘检测生成边缘线稿,再将作为扩散模型输入。

image.png

HED

使用hed边界检测。

image.png

Depth

使用深度图生成。

image.png

Normal Maps

使用法线图生成图像。提供了Midas计算深度图并转换为法线图的扩展版本的模型。

image.png

Human Pose

使用姿势检测,获得人体骨骼的可视化姿势图像。

image.png

User Sketching

使用人类涂鸦进行生成。

image.png

image.png

Semantic Segmentation

使用语义分割。

image.png

image.png

Hough Line

使用m-lsd直线检测算法。(论文中还提到了使用传统的霍夫变换直线检测)

image.png

其他

论文中还提到了其他的,比如动漫线稿之类的,但是没有提供对应的模型,所以这里无法展示,感兴趣的可以自己去看一下论文。


写在最后

感兴趣的小伙伴,赠送全套AIGC学习资料,包含AI绘画、AI人工智能等前沿科技教程和软件工具,具体看这里。

AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能技术紧密结合,在更多的领域得到广泛应用,对程序员来说影响至关重要。未来,AIGC技术将继续得到提高,同时也将与人工智能技术紧密结合,在更多的领域得到广泛应用。

在这里插入图片描述

一、AIGC所有方向的学习路线

AIGC所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

在这里插入图片描述

二、AIGC必备工具

工具都帮大家整理好了,安装就可直接上手!
在这里插入图片描述

三、最新AIGC学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述
在这里插入图片描述

四、AIGC视频教程合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

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

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

相关文章

framework ‘CoreAudioTypes‘ not found

几天前我升级Xcode15之后遇到了这个问题。关于“CoreAudioTypes”的信息完全是误导。在我的例子中,原因是在删除一些旧代码时,我不小心删除了仍然需要的类。然而,在构建时弹出的唯一消息是关于“CoreAudioTypes”——当我恢复丢失的类时&…

使用python给图片加上文字水印

使用python给图片加上文字水印 作用效果代码 作用 给图片加上文字水印文字水印的字体,颜色,位置可自定义 效果 原图: 加水印后的图: 代码 from PIL import Image, ImageDraw, ImageFontdef add_text_watermark(input_image…

BERT for Joint Intent Classification and Slot Filling 论文阅读

BERT for Joint Intent Classification and Slot Filling 论文阅读 Abstract1 Introduction2 Related work3 Proposed Approach3.1 BERT3.2 Joint Intent Classification and Slot Filling3.3 Conditional Random Field 4 Experiments and Analysis4.1 Data4.2 Training Detail…

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

微软宣布GPT-4o模型,可在 Azure OpenAI上使用

5月14日,微软在官网宣布,OpenAI最新发布的多模态模型GPT-4o,可以在 Azure OpenAI 云服务中使用。 据悉,GPT-4o支持跨文本、视频、音频多模态推理,例如,通过GPT-4o打造一个AI助手,用于辅导孩子解…

AIGC时代已至,你准备好抓住机遇了吗?

一、行业前景 AIGC,即人工智能生成内容,是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步,AIGC已经取得了显著的成果,并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…

界面组件DevExpress WPF v23.2 - 全新升级的数据编辑器、流程图组件

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

Ubuntu16 扩展磁盘空间

一、扩展容量 关闭虚拟机->硬盘->扩展->输入要扩展的空间大小 二、重新磁盘分区 打开虚拟机,在终端安装gparted: sudo apt-get install gparted 打开gparted: sudo gparted 磁盘分区如下图所示 选择/dev/sda5分区,选择…

平均工资数据分析之回归

链接: R语言实战——中国职工平均工资的变化分析——相关与回归分析 1、模型诊断和评估的方法 1. 残差分析 1、残差图 (Residual Plot):用于检查残差是否存在非随机模式。理想情况下,残差应随机分布在零附近。 2、Q-Q 图 (Quantile-Quantile Plot)&am…

MATLAB基础—变量及其操作

众所周知,计算机所处理的数据都是存放在内存单元中的,而每个内存单元都有一个唯一的地址,程序就是通过这个内存单元的地址来访问内存单元的。 在高级语言中,只需要给每个内存单元取一个名字,然后通过这个名字就能够访问…

大模型学习笔记九:模型微调

文章目录 一、什么时候需要Fine-Tuning二、用Hugging Face根据电影评论输出来对电影进行情感分类1)安装依赖2)操作流程3)名字解释4)代码导入库和加载模型、加载数据库、加载tokenlizer5)其他相关公共变量赋值(随机种子、标签集评价、标签转token_Id)6)处理数据集:转成…

数据挖掘与机器学习——概念篇

目录 一、数据增长情况与计量单位 二、数据挖掘的概念 三、数据挖掘的应用案例 1. 互联网行业 2. 医学方面 3. 网络安全方面 4. 交通方面 5. 通信方面 6. 个人生活 四、数据挖掘的方法 1.对比分析 2. 同比分析 3. 环比分析 4. 80/20分析 5. 回归分析 6. 聚…

PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来

日前,第十二期 CCF 秀湖会议在苏州 CCF 业务总部 & 学术交流中心成功举办。本次会议以“开源教育:使命、挑战与发展”为主题,汇聚了来自学术界、工业界的二十余位专家,共同探讨开源教育的现状与未来。 PingCAP 联合创始人兼 C…

C++ | Leetcode C++题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDecodings(string s) {int n s.size();// a f[i-2], b f[i-1], c f[i]int a 0, b 1, c;for (int i 1; i < n; i) {c 0;if (s[i - 1] ! 0) {c b;}if (i > 1 && s[i - 2] ! 0 &&a…

风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码) 完整代码 clc; clear close allX = xlsread(风电场预测.xlsx)

启明云端ESP32-S3模组WT32-S3选型,Flash最大可选16MB,PSRAM最大可选8MB

使用ESP32-S3单芯片&#xff0c;可以完成语音连接屏控三合一功能。接下来给大家推荐一款ESP32-S3模组WT32-S3&#xff0c;Flash 最大可选 16MB,PSRAM 最大可选 8MB。核心芯片是ESP32-S3。 2.4GHz Wi-Fi(802.11b/g/n)Bluetooth 5(LE)模组&#xff0c;内置ESP32-S3系列芯片&#…

如何在Sui智能合约中验证是否为多签地址

通过多签合约实现多个用户可访问的安全账户。多签&#xff08;multi-sig&#xff09;钱包和账户通过允许多个用户在预定义条件下访问共享资产&#xff0c;或让单个用户实施额外的安全措施&#xff0c;从而增强密钥管理。例如&#xff0c;多签钱包可以用于管理去中心化自治组织&…

Leetcode---1.两数之和 (详解加哈希表解释和使用)

文章目录 题目 [两数之和](https://leetcode.cn/problems/two-sum/)方法一&#xff1a;暴力枚举代码方法二&#xff1a;哈希表代码 哈希表哈希表的基本概念哈希函数&#xff08;Hash Function&#xff09;&#xff1a;冲突&#xff08;Collision&#xff09;&#xff1a;链地址…

mysql 查询---多表设计

部分数据 1distinct去重 select distinct job from tb_emp;select * from tb_emp where id in (1,2,3); select * from tb_emp where id between 1 and 5; select * from tb_emp where name like __; #下划线匹配单个字符, %匹配任意多个字符select min(entrydate) from tb_e…

JUnit5参数化用例(三)

JUnit5枚举参数的参数化&#xff1a; 使用枚举类作为测试数据枚举参数参数化注解EnumSource必须与ParameterizedTest结合使用 枚举参数化注解 -简单使用&#xff1a; 需要添加EnumSource注解测试方法传入枚举类作为参数 在执行前&#xff0c;我们需了解enum枚举的使用方式&…