ControlNet是一个用于深度神经网络的控制技术,它可以通过操作神经网络块的输入条件来控制神经网络的行为。在这里,“网络块”是指常用的神经层集合,例如“resnet”块、“conv-bn-relu”块、多头注意力块等。通过克隆神经网络块的参数并应用零卷积连接层来实现ControlNet的目标。
ControlNet的副本与神经网络块的输入和输出是一致的,这使得在训练初始阶段,ControlNet不会对神经网络产生影响。零卷积的权重和偏置值都被初始化为零,这使得ControlNet在优化过程中不会影响权重和偏置值的梯度。神经网络块的能力和质量得到了保留,同时还能有效地进行优化和定制。
ControlNet的原理是通过控制神经网络块的输入条件来调整神经网络的行为,并适应不同的任务和数据。每个神经网络块由一组参数来定义,这些参数可以在训练过程中进行优化。ControlNet使用特殊的卷积层来连接神经网络块,以达到快速优化的效果。
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。
上图的“Zero Convolution”是带有零初始化权重和偏差的1×1卷积。在进行自己的模型训练开始之前,所有零卷积输出都是零,此时模型仍然是原始的Stable Diffusion Model。而在加入自己的训练数据之后,则会对最终数据产生影响,这里的影响,更多是对最终结果的微调,因此不会导致模型出现重大偏离的情况。
我们从整体的模型结构上可以看出,作者在Stable Diffusion 模型的decode层加入了上述“0卷积层”,以实现对最终模型与训练数据的一致性。
没错你没有看错,网络结构就是这么简单暴力,但有效。
现在放出来的controlnet模型大致有以下几个
1、通过Canny检测边缘,然后和SD1.5进行融合
2、通过HED轮廓,搭配SD1.5
3、灵魂画师搭配SD1.5
4、HED边缘检测搭配SD1.5
5、姿态检测搭配SD1.5
6、图像分割搭配SD1.5
7、Midas Depth搭配SD1.5
下面我们将通过SD-WEBUI来进行简单演示:
首先根据我前面的图文这是你幻想中的女友吗 (qq.com)中安装插件的方式安装ControlNet插件
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插件用来生成姿态图
然后将将图片发送到文生图,剩下的就是之前的SD操作,我们选择的模型是NED,可以通过 这是你幻想中的女友吗 (qq.com)中的介绍在civit下载模型。
然后将生成的图片拖入ControlNet,然后预处理选择canny,模型也选择canny
生成图片如下所示,风格有略微改变
然后我们试用下depth
HED
mlsd
scribble
SEG
总的来说,各类控制方法还算稳定,但是分割模型似乎容易出错,不太容易分割出主体,相对简单的背景问题不大。文章来源:https://www.toymoban.com/news/detail-486203.html
上述就是ControlNet的基本原理以及使用,欢迎关注公众号IoT Inn文章来源地址https://www.toymoban.com/news/detail-486203.html
到了这里,关于ControlNet让SD变得可控的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!