【ComfyUI插件】 ComfyUI-Advanced-ControlNet核心节点(一)
前言:
ComfyUI-Advanced-ControlNet库包含大量时间插值控制方法,及从时间维度和latent层的维度对图像的生成过程进行控制,主要概念就是__时间步长关键帧__和__潜在关键帧__两个概念。当您学会使用该库,你可以在图片或视频生成过程中加入自己的控制方法,比如在扩散的前50使用权重0.1,在扩散的后50使用0.9的权重,也可以在latent维度,对单个潜空间进行时间步长设置,本文将对节点进行逐个讲解,并且会以尽量详细的过程和配图,尽量通俗易懂的语言进行书写。
__Comfy-Advanced-ControlNet(二): __https://articles.zsxq.com/controlNet/2.html
目录:
先行:安装方法
一、Apply Advanced ControlNet节点
二、Timestep Keyframe节点
三、Latent Keyframe节点
四、Latent Keyframe Group节点
五、Latent Keyframe Interpolation节点
六、ControlNet Custom Weights/ControlNet Soft Weights节点
七、T2IAdapter Soft Weights/T2IAdapter Custom Weights 节点
"转绘"示例工作流:
安装方法:
在ComfyUI主目录里面输入CMD回车。
在弹出的CMD命令行输入git clone xxx,即可开始下载。
github项目地址:https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet.git
*****特别重要*****
时间步长关键帧:将时间进行分割,设置为你满意的时间尺度,比如0-1s,分割成0-0.1,0.1-0.5,0.5-1。
潜在关键帧: 假如我们Latent的batch设置为10,则每一个latent称为一个关键帧。
模型权重:指模型中的参数,用于调整模型的行为和输出。在控制网络中,权重通常用于调整模型对不同输入特征的关注程度。
控制强度:指定某种影响或调整的程度或强度。在控制网络中,“strength” 可能用于调整某些参数或控制某些操作的强度或影响程度。
注意:在计算机领域,索引或者编号,默认为从0开始。
一、Apply Advanced ControlNet节点
节点功能:该结点应用ControlNet,并且接收蒙版信息,以及时间分布信息,并且设置有相应的覆盖策略。
输入:
positive -> 正向提示词的条件信息
negative -> 反向提示词的条件信息
control_net -> 传入ControlNet模型,适配的模型自动转为Advanced版 **大部分都适配**
image -> 出入预处理图片,比如深度图,线稿等
mask_optional -> 传入蒙版信息
timestep_kf -> 传入时间步长关键帧信息
latent_kf_override -> 传入潜在关键帧信息
weights_override -> 权重覆盖,如果这里有参数传入,则会覆盖传入的强度信息
model_optional -> 传入大模型
注意:如下图所示虽然在时间步长关键帧(红色节点)中我们设置了,控制权重一直为1,即代表严格按照深度图进行扩散,但是因为weights_override我们设置为0.1,所以对传入的权重进行覆盖,最终生成的图像并不符合深度图信息。
注意:如下图所示在下方紫色方框中设置潜空间图像的控制强度为1,则应该产生与深度图接近的图像,但是在latent_kf_override参数出,我们传入图像的控制强度为0.1,所以进行了权重覆盖,最终出图与深度图信息没有关系。
参数:
strength -> 设置模型的控制强度 **未有参数传入时,起作用**
start_percent -> 设置控制信息开始百分比 **未有参数传入时,起作用**
end_percent -> 设置控制信息结束百分比 **未有参数传入时,起作用**
输出:
positive -> 混合控制信息后输出的条件信息
negative -> 混合控制信息后输出的条件信息
model_opt -> 混合控制信息后输出的模型信息
二、Timestep Keyframe节点
节点功能:该结点用来汇总时间表,以及提供潜在关键帧设置策略的输入点,将这些信息汇聚为时间步长信息。
输入:
prev_timestep_kf -> 时间步长信息,通过start_percent控制 **多个该节点可以串联**
cn_weights -> 权重时间表,代表ControlNet的作用权重 **如果有传入有效值,会覆盖stength的值**
latent_keyframe -> 代表潜空间的某一个或某一组 **可传入单个控制信息,或整组控制信息**
mask_optional -> 代表蒙版信息
注意:如下图所示通过串联两个(或者多个)该节点,即完成时间表的创建,通过strat_percent参数用来控制作用域(即起作用的时间范围)。
参数:
start_percent -> 设置该时间步长关键帧起作用的开始时间。
strength -> 设置在该时间步长关键帧起作用时的控制强度 **先前有传入,此值会一起计算强度**
null_latent_kf_strength -> 未提供索引的潜在关键帧的控制强度
inherit_missing -> 如果某时间段未设置强度,可选择是否继承该时间段的控制强度
guarantee_usage -> 确保无分配时间步长就近选取控制强度
注意:如下图所示,左边时间步长关键帧设置start_percent=0,strength=0.5,右边时间步长关键帧设置start_percent=0.5,strength=1,即表示在0到0.5的时间内,我们使用0.5的控制权重,在0.5到1的时间内,我们使用1的控制权重
输出:
TIMESTEP_KF -> 输出已经设置的时间步长信息
注意:start_percent的取值范围为0-1,strength的取值范围0-10,但是strength设置值过大会导致生成的图像毁坏,如下图所示:
注意:当strngth我们设置为1的时候,控制强度就基本等于100%了,所以不需要过大的值(大家自行选择),下面两幅图分别代表在时间0-0.8设置strngth=0.1 0.8-1设置strngth=1.0和在时间0-0.8设置strngth=1 0.8-0.1设置strngth=1.0,可以看出时间域长的占据主导图片生成的过程。
三、Latent Keyframe节点
节点功能:该节点用来指定对应的潜空间图像去使用指定的控制强度。
输入:
prev_latent_kf -> 潜在关键帧信息,通过batch_index指定 **多个该节点可以串联**
参数:
batch_index -> 表示潜空间帧索引 **计算机领域,索引从0开始**
strength -> 作用与该帧的控制强度 **如果设置索引冲突,后会和前共同计算**
如图:第0个潜空间图像,设置强度为1,在0-0.8的时间步长我们设置强度为0.1,设置null_latent_kf_strength(未指定索引的潜空间图像)为10,所以在第一个时间步长关键帧中,第0个图像的控制强度为(1与0.1共同计算结果),而第1个图像的控制强度为(10与0.1共同计算结果),所以第0个图像稍微不受深度图约束,而第二张则与深度图更加符合。
__
如图:在0-0.8的时间步长我们设置强度为0.1,设置null_latent_kf_strength(未指定索引的潜空间图像)为10,最终生成的两张图像与深度图均不符合,所以只有当latent_keyframe有输入的时候,null_latent_kf_strength才会起作用。__
输出:
LATENT_KF -> 输出蕴含设置信息的潜在关键帧信息
注意:如下图所示,我们初始生成了两个Latent图像,在Latent Keyframe节点,我们分别对不同的步长进行不同的索引设置,索引0的潜空间图像,在0-0.8使用strength=1的控制强度,而索引1的潜空间图像,在0-0.8使用strength=0.1的控制强度,所以最终生成的两张图像,第一张符合深度图信息,但是第二张并不符合。
四、Latent Keyframe Group节点
节点功能:这个节点可以批量给潜在关键帧赋予权重,以编程语言的书写习惯给出。
输入:
prev_latent_kf -> 潜在关键帧信息 **多个该节点可以串联**
latent_optional -> 此参数可以不传入 **此参数我在代码没找到应用,所以忽略**
参数:
文本框 -> 输入格式按照 索引=权重,索引=权重来写 **注意逗号应使用英文**
print_keyframes -> 是否打印输出的信息 **在命令行会打印相关信息**
输出:
LATENT_KF -> 输出潜在关键帧信息
注意:如下图所示,我们在Latent Keyframe Group节点中,我们设置第0个潜空间图像权重为0.1在一开始就参与控制扩散,在第1个潜空间图像权重设置为1.0同样在一开始就参与扩散,最终我们生成两张图像,其中第一张图像与深度图几乎无关,第二张按照深度图进行扩散生成。
注意:如下图所示,当我们把print_keyframes设置为true的时候,我们可以在命令行看到输出的潜在关键帧信息和其对应的强度信息。
五、Latent Keyframe Interpolation节点
节点功能:该节点用来选择潜在关键帧的顺序索引,并且赋予可选的渐变效果。
输入:
prev_latent_kf -> 潜在关键帧信息 **多个该节点可以串联**
参数:
batch index from -> 索引的开始值 **包含在内**
batch index to excl -> 索引的结束值 **不包含在内**
strength from -> 控制强度的起始值
strength to -> 控制强度的最终值
interpolation -> 渐变效果 **提供了4中渐变效果**
print_keyframes -> 是否打印输出的信息 **在命令行会打印相关信息**
注意:如下图所示,给出四种渐变效果linear、ease-in、ease-out、ease-in-out,他们分别代表匀速变化,渐进,减速,渐进-减速四种状态。
输出:
LATENT_KF -> 输出潜在关键帧信息
注意:如下图所示,我们设置索引为[0,1),那么我们就等于只选择第0个潜在关键帧,渐变方式为匀速渐变,控制强度从1降低到0,最终可以看到第一张图像按照深度图信息进行扩散,但是第二张图像并没有按照深度图进行扩散。
六、ControlNet Custom Weights/ControlNet Soft Weights节点
节点功能:这两个节点用来批量设置强度信息。
注意:这两个节点的区别就是Custom需要自行设置参数,Soft是默认给出了一个参数列表
输入:
weight_xx -> 设置强度信息
flip_weights -> 表示是否对权重进行翻转
输出:
CN_WEIGHTS -> 输出设置的强度信息
TK_SHORTCUT -> 输出时间步数关键帧
注意:这个权重真的是很玄学的东西,这13个权重的值以我的理解来看是去代替掉网络中的部分参数,但是具体的替代方式我并没有找到,其次就是这些权重不针对专门的Latent帧去做控制,我做了很多对比实验,但是得不出合理的结果,实验我放在下面了,大家可以自行推测:
1):参数全为0
2):参数全为1
3):参数前面1,后面为0
4):参数前面0,后面为1
七、T2IAdapter Soft Weights/T2IAdapter Custom Weights 节点
节点功能:该节点用来设置控制强度。
输入:
weight_xx -> 代表权重信息
参数:
flip_weights -> 是否要将强度进行反转
输出:
CN_WEIGHTS -> 输出设置的强度信息
TK_SHORTCUT -> 输出时间步数关键帧
注意:当我们使用T2IAdapter节点的时候,必须使用对应的ControlNet模型,个人感觉T2I-Adapter模型的效果要比传统的ControlNet好一点,下图所示结果为赋予不同强度变化的情况下得到的图像。
模型下载链接:https://huggingface.co/TencentARC/T2I-Adapter/tree/main/models
"转绘"示例工作流:
学习完以上节点,您就可以搭建"转绘"示例工作流了
这里使用SD1.5的大模型,使用ControlNet Soft Weights节点去分散赋予不同时间步长不同的控制强度,在保证大体深度信息不变的情况下,又给与模型一定的自我创造能力,最终完成对图像的转绘工作:
孜孜不倦,方能登峰造极。坚持不懈,乃是成功关键。
__Comfy-Advanced-ControlNet(二): __https://articles.zsxq.com/controlNet/2.html