ControlNet让SD变得可控

    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

猜你喜欢

转载自blog.csdn.net/wutao22/article/details/130695812
sd