ControlNet让SD变得可控

news2024/10/5 16:25:47

    ControlNet是一个用于深度神经网络的控制技术,它可以通过操作神经网络块的输入条件来控制神经网络的行为。在这里,“网络块”是指常用的神经层集合,例如“resnet”块、“conv-bn-relu”块、多头注意力块等。通过克隆神经网络块的参数并应用零卷积连接层来实现ControlNet的目标。

    ControlNet的副本与神经网络块的输入和输出是一致的,这使得在训练初始阶段,ControlNet不会对神经网络产生影响。零卷积的权重和偏置值都被初始化为零,这使得ControlNet在优化过程中不会影响权重和偏置值的梯度。神经网络块的能力和质量得到了保留,同时还能有效地进行优化和定制。

    ControlNet的原理是通过控制神经网络块的输入条件来调整神经网络的行为,并适应不同的任务和数据。每个神经网络块由一组参数来定义,这些参数可以在训练过程中进行优化。ControlNet使用特殊的卷积层来连接神经网络块,以达到快速优化的效果。

8656179125ecb9dac23582ce637e730a.png

ControlNet 应用于任意神经网络块。x; y 是神经网络中的深度特征。"+" 表示特征加法。"c" 是我们要添加到神经网络中的额外条件。"zero convolution" 是一个 1 × 1 卷积层,其权重和偏置都初始化为零

ControlNet结构可以表示为:

yc = F(x; α) + Z(F(x + Z(c;β_z1); β_c); β_z2)

其中yc是该神经网络块的输出结果。它等于F(x, α)的输出结果加上使用β_z2对F(x + Z(c, β_z1), β_c)应用Z的结果。这意味着,在第一次训练步骤中,神经网络块的可训练副本和锁定副本的所有输入和输出都与ControlNet不存在时一致。任何神经网络块的能力、功能和结果质量都得到完美保留,并且任何进一步的优化将变得像微调一样快(与从头开始训练这些层相比)。

在第一次训练步骤中,由于零卷积层的权重和偏置值都初始化为零,我们有:

Z(c; β_z1) = 0
F(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不存在时一致。换句话说,当应用ControlNet到一些神经网络块时,在任何优化之前,它都不会对深度神经特征产生影响。任何神经网络块的能力、功能和结果质量都得到完美保留,并且任何进一步的优化将变得像微调一样快(与从头开始训练这些层相比)。

    ControlNet就像一个迭代的过程,通过重复应用ControlNet操作来优化神经网络块。这样,在每一步中,我们可以保持所有其他神经网络块不变,仅对某些神经网络块进行修改和调整。

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

61b9b7755aeb72b430323289deb5abf8.png

上图的“Zero Convolution”是带有零初始化权重和偏差的1×1卷积。在进行自己的模型训练开始之前,所有零卷积输出都是零,此时模型仍然是原始的Stable Diffusion Model。而在加入自己的训练数据之后,则会对最终数据产生影响,这里的影响,更多是对最终结果的微调,因此不会导致模型出现重大偏离的情况。

我们从整体的模型结构上可以看出,作者在Stable Diffusion 模型的decode层加入了上述“0卷积层”,以实现对最终模型与训练数据的一致性。

没错你没有看错,网络结构就是这么简单暴力,但有效。

现在放出来的controlnet模型大致有以下几个

1、通过Canny检测边缘,然后和SD1.5进行融合

818a869ded5918d2dcde2bb0c1c0c60b.png

2、通过HED轮廓,搭配SD1.5

ade8048eefae00670c1e2e7ce6db1a7a.png

3、灵魂画师搭配SD1.5

86cf638170854951c8a9e7f4e02a537b.png

4、HED边缘检测搭配SD1.5

541d92115a88727ce92df23abd2a522c.png

5、姿态检测搭配SD1.5

ddf76ca1650b4d042b621c1f42239e6c.png

6、图像分割搭配SD1.5

d49ca2ac0f6d33115f912ba95a22d87f.png

7、Midas Depth搭配SD1.5

4757823d8f457dc25ca2b26ec6e62720.png

下面我们将通过SD-WEBUI来进行简单演示:

首先根据我前面的图文这是你幻想中的女友吗 (qq.com)中安装插件的方式安装ControlNet插件

9db76623b0a23bfdd799dcb0d9054546.png

1. 启用(Enable)

勾选此选项后,点击 “生成” 按钮时,ControlNet 才会生效。

2. 反色模式(Invert Input Color)

将图像颜色进行反转后应用。

3. RGB 转 BGR(RGB to BGR)

把颜色通道进行反转,在 NormalMap 模式可能会用到。

4. 低显存优化(Low VRAM)

低显存模式,如果你的显卡内存小于等于4GB,建议勾选此选项。

5. 无提示词的猜测模式(Guess Mode)

也就是盲盒模式,不需要任何正面与负面提示词,出图效果随机,很有可能产生意想不到的惊喜效果!

6. 预处理器(Preprocessor)

在此列表我们可选择需要的预处理器,每个 ControlNet 的预处理器都有不同的功能,后续将会详细介绍。

7. 模型(Model)

配套各预处理器需要的专属模型。该列表内的模型必须与预处理选项框内的名称选择一致,才能保证正确生成预期结果。如果预处理与模型不一致其实也可以出图,但效果无法预料,且一般效果并不理想。

8. 权重(Weight)

权重,代表使用 ControlNet 生成图片时被应用的权重占比。

9. 引导介入时机(Guidance Start(T))

在理解此功能之前,我们应该先知道生成图片的 Sampling steps 采样步数功能,步数代表生成一张图片要刷新计算多少次,Guidance Start(T) 设置为 0 即代表开始时就介入,默认为 0,设置为 0.5 时即代表 ControlNet 从 50% 步数时开始介入计算。

10. 引导退出时机(Guidance End(T))

和引导介入时机相对应,如设置为1,则表示在100%计算完时才会退出介入也就是不退出,默认为 1,可调节范围 0-1,如设置为 0.8 时即代表从80% 步数时退出介入。

11. 缩放模式(Resize Mode)

用于选择调整图像大小的模式:默认使用(Scale to Fit (Inner Fit))缩放至合适即可,将会自动适配图片。
一共三个选项:Just Resize,Scale to Fit (Inner Fit),Envelope (Outer Fit)

12. 画布宽度和高度(Canvas Width 和 Canvas Height)

画布宽高设置,请注意这里的宽高,并不是指 SD 生成图片的图像宽高比。该宽高代表 ControlNet 引导时所使用的控制图像的分辨率,假如你用 SD 生成的图片是 1000x2000 分辨率,那么使用 ControlNet 引导图像时,对显存的消耗将是非常大的;我们可以将引导控制图像的分辨率设置为 500x1000 ,也就是缩放为原本图像一半的分辨率尺寸去进行引导,这有利于节省显存消耗。

13. 创建空白画布(Create Blank Canvas)

如果之前使用过 ControlNet 功能,那么将会在 ControlNet 的图像区域留有历史图片,点击该按钮可以清空之前的历史,也就是创建一张空白的画布。

14. 预览预处理结果(Preview Annotator Result)

点击该按钮可以预览生成的引导图。例如:如果使用 Canny 作为预处理器,那么点击该按钮之后,可以看到一张通过 Canny 模型提取的边缘线图片。

15. 隐藏预处理结果(Hide Annotator Result)

点击该按钮可以隐藏通过 Preview 按钮生成的预览图像窗口(不建议隐藏)

我们从openpose姿态开始,首先我们还是参照前面插件安装的方式安装openpose插件用来生成姿态图

090031971602c9f1a8502d0db513bd94.png

然后将将图片发送到文生图,剩下的就是之前的SD操作,我们选择的模型是NED,可以通过 这是你幻想中的女友吗 (qq.com)中的介绍在civit下载模型。

                bb2e5964289d65af288e1b6deda8527c.png8857e4254f1f0beb35a6c5a6ba41bded.png

然后将生成的图片拖入ControlNet,然后预处理选择canny,模型也选择canny

c87f1c42cd4a200445001850d3146adf.png

生成图片如下所示,风格有略微改变

becb3fc71aaa91ef88911748ded8acea.pnge04a070d1873fd48d2cfe49761504b2a.png

然后我们试用下depth

7811bbf30de2d1bbef668c0f62f62e6c.png4e7acf00e5cc571415cf904d5bff38c5.png

HED

8e93e6e9133f8697d85465c8a86ffff1.png9965d2c6ac5f8ea0934294ac1f3a13b1.png

mlsd

841c1c007e0e20616415da1f5fe55317.png16aaaec8ffce0d8deb778153a5b16d3d.png

scribble

4e54b21c9e0dc2e97a281c685da986e6.png9dacc4ab5da44af6655e964e007a3e06.png

SEG

a650742a3dc97b3e28b66057ed93f909.png135778bb1ccad2d577461c1a49f90dcd.png

总的来说,各类控制方法还算稳定,但是分割模型似乎容易出错,不太容易分割出主体,相对简单的背景问题不大。

上述就是ControlNet的基本原理以及使用,欢迎关注公众号IoT Inn

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

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

相关文章

软考A计划-真题-分类精讲汇总-第十七章(数据结构与算法)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

智慧档案馆建设之八防十防常用的设备

档案八防十防常用的十款设备 序号 名称 1 温湿度传感器 2 空气质量云测仪 3 恒湿净化一体机 4 健康防护一体机 5 综合智能触摸一体化区域控制器 6 空调红外学习控制模块 7 漏水检测控制器及感应线 8 数字烟雾传感器 9 红外防盗传感器 10 系统软件平台 附…

redis高级篇(1)

分布式缓存 单节点redis的问题: 1)数据丢失的问题,redis是基于内存来进行存储的,当服务器重启的时候可能会丢失数据 2)无法满足高并发场景 3)如果redis宕机,那么这个服务不可用,所以就需要有一种自动的故障恢复手段,必…

从裸机启动开始运行一个C++程序(一)

前言 对于一个C程序员来说,可能更多是是每天都在跟各种上层语义、设计模式、软件方法等等在打交道。但对于「一个C程序是如何运行在机器上的」这件事可能会比较陌生。有时,遇到一些问题,在宏观角度看起来可能比较难以解释,但其实…

activiti6是使用,或签,会签

会签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,需全部同意之后,审批才可到下一审批节点; 或签:也有叫“竞签”、“串签”:指同一个审批节点设置多个人,…

电脑上删除掉的文件怎么恢复?一文告诉你详细恢复方法!

对于不太会整理电脑的用户来讲,电脑上的文件一旦保存多了,不但会使得电脑看上去很杂乱,还会在我们需要寻找某一个文件的时候,半天都找不到。 所以,对于一些可能不会再需要的文件,我们会选择直接删除&#x…

Dart 3.0 语法新特性 | 类型修饰符 Class modifiers

theme: cyanosis 在 dart 3.0.0 之后,对类型的修饰符进行了拓展,现在类型的修饰符有: | 名称 | 作用 | | --- | --- | | mixin | 混入类修饰符 | | sealed | 密封可枚举的子类型 | | abstract | 抽象类修饰符 | | final | 一定程度上关闭派生…

《测试开发》测试启蒙

文章目录 测试是什么调试和测试的区别 什么是需求需求的定义需求的特征测试人员眼里的需求是什么如何深入了解需求 测试用例什么是测试用例为什么有测试用例 bug如何描述一个bug如何定义bug的级别bug的生命周期 软件测试的生命周期 👑作者主页:Java冰激凌…

理解神经网络的注意力机制(Attention)及PyTorch 实现

刚刚结束的 2022 年对于人工智能的许多进步来说是不可思议的一年。最近 AI 中的大多数著名地标都是由称为变形金刚的特定类别模型驱动的,无论是 chatGPT 的令人难以置信的进步,它席卷了世界,还是稳定的扩散,它为您的智能手机带来了类似科幻小说的功能。即使是 Tesla 的自动…

100种思维模型之联脑破界思维模型-64

前面我们分享过破界思维模型,即要不断打破固有认知边界,用变化的眼光看待一切事物的思维模型。 今天我们介绍一个破界方法的思维模型,一个告诉我们可通过联脑学习,打破独立大脑带来边界的思维模型。 01、何谓联脑破界思维模型 一…

crow-han(基于go-micro框架的微服务脚手架)-01-快速启动(简介、快速启动、接口测试)

文章目录 1. 简介1.1 包含内容1.2 swagger展示 2. 快速启动2.1 下载2.2 环境变量配置2.3 goland配置2.5 启动2.6 查看结果 3. swagger 接口测试3.1 url3.2 认证3.2.1 获取token3.2.2 Bearer 认证 3.3 测试接口(已创建用户为例) 1. 简介 一个基于go-micr…

测试4年,跳槽一次涨8k,我跳了3次···

最近有人说,现在测试岗位初始工资太低了,有些刚刚入行的程序员朋友说自己工资连5位数都没有.....干了好几年也没怎么涨。看看别人动辄月薪2-3万,其实我想说也没那么难。说下如何高效地拿到3w。 1.暂且把刚入行的条件设低些吧,大专…

大模型综述来了!一文带你理清全球AI巨头的大模型进化史

夕小瑶科技说 原创 作者 | 小戏,Python 如果自己是一个大模型的小白,第一眼看到 GPT、PaLm、LLaMA 这些单词的怪异组合会作何感想?假如再往深里入门,又看到 BERT、BART、RoBERTa、ELMo 这些奇奇怪怪的词一个接一个蹦出来&#xf…

python list 逆序的方法

在 Python中,使用 list作为基本的数据类型是非常方便的,也是 Python中最常见的数据结构之一。那么对于 list进行逆序操作时,我们应该怎么做呢?下面就一起来看看吧。 首先要注意,在使用 list逆序时,它会自动…

【Java】EasyExecl数据导入

【Java】EasyExecl数据导入 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助…

视频格式、视频方式区别、一个视频播放的全过程

一:直播和点播的区别及有的格式 1:视频直播的播放内容是媒体直播流的形式,不存在物理文件,视频画面和声音信息都是实时采集、传输和播放的。如果没有录制模块,视频画面和声音播放完毕就消失了,不能提供二次…

并行分布式计算 并行计算性能评测

文章目录 并行分布式计算 并行计算性能评测基本性能指标参数CPU 基本性能指标存储器性能并行与存储开销 加速比性能定律Amdahl 定律Gustafson 定律Sun 和 Ni 定律加速比讨论 可括放性评测标准等效率度量标准等速度度量标准平均延迟度量标准 基准评测程序(Benchmark&…

甘特图控件DHTMLX Gantt入门使用教程【引入】:用Node.js实现Gantt(下)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…

Linux多路转接之select

文章目录 一、IO的理解二、五种IO模型1.阻塞式IO2.非阻塞式IO3.信号驱动式IO4.IO多路转接5.异步IO6.五种IO模型的总结 三、非阻塞式IO1.fcntl函数 四、IO多路转接之select的介绍五、编写select服务器1.将获取连接时设置为select多路转接2.获取连接成功后的读取数据 六、select多…