【AIGC】【AI绘画】controlNet介绍(原理+使用)

在这里插入图片描述



安装教程

下载安装:建议下载V1.1版本
论文:https://arxiv.org/pdf/2302.05543.pdf

1.环境安装

下载ControlNet仓库

git clone https://github.com/lllyasviel/ControlNet

切换到ControlNet主目录

cd ControlNet

创建名为control的conda虚拟环境并安装依赖

conda env create -f environment.yaml

激活名为control的虚拟环境

conda activate control

2. 下载预训练的模型文件

所有模型和检测器都可以从 Hugging Face页面下载。确保
SD 模型放在“ControlNet/models”中
检测器放在“ControlNet/annotator/ckpts”中

确保从 Hugging Face 页面下载所有必要的预训练权重和检测器模型,包括 HED 边缘检测模型、Midas 深度估计模型、Openpose 等。

几种预训练模型解释见下表,可以根据功能下载:

在这里插入图片描述

3.运行(生成可视化界面)

通过执行上表中,不同的“脚本”列来执行不同的条件控制任务。

注意:原始的执行脚本默认不能在公网访问,若要在公网访问请在脚本的最后一行作如下修改:

原始代码:
block.launch(server_name=‘0.0.0.0’)

修改为:
block.launch(server_name=‘0.0.0.0’, share=True)

下面以segmentation map 这个条件控制方式进行AI图像的生成。

执行代码:

python gradio_seg2image.py

在终端中生成的链接进行公网访问:
在这里插入图片描述
在本地浏览器访问,示例界面如下:
在这里插入图片描述

1、ControlNet:AI绘画

如果要画一幅画,一方面是构图,一方面是风格。现在的AI绘画,就是炼丹。需要通过各种 prompt 来控制画面的构图和风格。

鉴于prompt 的专业性与复杂性,产生了两个模型: ControlNet就是用来控制构图的,LoRA就是用来控制风格。还有一个风格迁移的模型shuffle,此外,SD1.5也能生成好的图像。

那ControlNet是 如何构图呢?有以下两种方法:
1、已经手绘了草图,后续的完善和美化由 AI 去做;
2、利用现成的图,生成不同风格的新图。
那么这就是ControlNet做的事情:通过你手上已有的图而不是咒语,实现对AI绘图的控制。

这里只介绍 ControlNet,LoRA作为锦上添花的 work 后续介绍。

1.1、ControlNet的本质是文生图(txt2img)

ControlNet的原始论文:《Adding Conditional Control toText-to-Image Diffusion Models》 及代码,最原始是一个 txt2img 的工作。此外还有 inpaint 的附加功能,也就是替换、消除等。
所以在WEB UI中,不管是txt2img还是img2img,都有ControlNet。

2.2、预处理器 & 模型选择

要保证预处理器(preprocessor)跟模型(model)是同类的

预处理器preprocessor:对参考图预处理,作为控制图,给到后续的对应模型进行控制出图。比如:如果选择了scribble类的预处理器,那么模型就最好选择scribble模型:
在这里插入图片描述
上图中,第一行分别是原图和scribble预处理后的图,想画一只类似猫头鹰。第二行是不同配置条件下的AI出图结果。只有预处理跟模型是一致的情况下,才能得到比较好的结果图,如果预处理器或者模型有一者为空,基本就等同于ControlNet未生效,就是一般的SD出图,如第二行的中间两幅图。 WEB UI开发者也注意到了预处理器vs模型之间对应关系的问题,所以在1.1.2XXX版本中限定了预处理和模型之间的对应关系,如下图所示。

在这里插入图片描述

1.3、参数配置

由于可调参数多,第一次使用默认参数,如果效果不好,再做参数细调。

2、ControlNet 模型分类

ControlNet1.1版本发布了14个模型,主要可以分成三类:

2.1、草图类(6个)

主要是用预处理器,将图像处理成草图,或者直接输入手稿也行。

预处理器有以下几种:
1)Canny:边缘提取器,最常用
2)MLSD:特殊的线条检测(比如直线),适合建筑设计、室内设计
3)lineart :线条提取(早期版本叫fake_scribble )
4)lineart_anime:需要配合anything_v3-v5的大模型(需要复杂提示词)使用
5)SoftEdge:区分几种预处理器,综合效果选择SoftEdge_PIDI
6)Scribble:涂鸦,类似于简笔画

以下是不同预处理器的效果和差异

在这里插入图片描述

以下是Scribble的效果

在这里插入图片描述
简单的prompt就能生成非常好的效果图

2.2、高级特征类(3个)

1)depth:深度图
2)seg:语义分割图。譬如粉色是建筑物、绿色是植物等
3)normalbae:法线贴图(法线就是像素的梯度,反映了纹理)

以下是效果图,后面两列是模型生成的新图

在这里插入图片描述

对应的预处理器如下(可随机选,效果类似):

1.depth:支持depth_Midas, depth_Leres, depth_Zoe等等,以及别其他软件生成的depth map
2.seg:支持Seg_OFADE20K、Seg_OFCOCO、Seg_UFADE20K,以及人工手绘的蒙版。
3.normalbae:支持normal_bae, normal_midas

3.3、高级类(5个)

1)OpenPose:骨骼捕捉,很热门
2)inpaint:局部修图,可以很自然删除一些目标
3)shuffle:风格混合,转换不同风格
4)ip2p:指令式修图,可以识别有限的指令
5)tile:图像超分:会增加原图没有的细节。

以下是ip2p的效果

在这里插入图片描述

以下是shuffle 的效果

在这里插入图片描述


3、配置参数

大多数参数选择默认就可以了,在高阶应用时需要调参。除了对预处理器与模型的选择,下面介绍别的参数

在这里插入图片描述

黄色框:跟所选的 预处理器和模型相关的。主要是线条粗细、细节丰富程度等参数

红色框

第一组:基础控制,比较简单
1)enable:是否启用ControlNet
2)lowVRAM:低精度,可以减少显存消耗
3)Pixel Perfect:是新版本新增功能,对应黄框中的第一项preprocessor resolution,算法自己去计算最合适的resolution。如果不是512*512这种的方形出图,建议勾上这个选项。
4)allow preview:提前预览 预处理器的效果

第二组:权重控制(可以直接用默认)
1)control weight:控制网络的控制权重
2)starting control step:什么时候介入控制(百分比)
3)ending control step:什么时候退出控制(百分比)
如果不想用controlNet控制太多,则可以晚点介入

第三组:控制模式(可以直接用默认)
1)balanced
2)my prompt is important
3)ControlNet is important
用于分配 prompt 和 参考图的权重比例

第四组:裁剪方式
当控制图(参考图)的尺寸跟目标图(txt2img里面要生成的图)的尺寸不一致时,需要配置这组参数:
1)just resize:变更控制图的长宽比以适应目标图的尺寸比例(可能导致形变)。
2)crop and resize:对控制图进行裁剪以适应目标图的尺寸比例 。
3)resize and fill:对控制图进行缩放,保证整个控制图能塞到目标图中去,然后对多余部分进行空白填充。

4、基本原理:可控的SD模型

ControlNet:将stable diffusion模型,克隆出一个副本

ControlNet是一个用于 深度神经网络 的控制技术,它可以通过操作神经网络的输入条件来控制神经网络的行为。网络主要包含 “resnet”块、“conv-bn-relu”块、多头注意力块等。通过克隆神经网络块的参数, 并应用零卷积连接层来实现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是该神经网络块的输出结果。在第一次训练步骤中,神经网络块的可训练副本锁定副本的所有输入和输出不受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到一些神经网络块时,在任何优化之前,它都不会对深度神经特征产生影响。任何神经网络块(比如预训练的SD)的能力、功能和结果质量都得到完美保留,并且任何进一步的优化将变得像微调一样快。通过迭代的过程,重复应用ControlNet操作来优化神经网络块。这样,在每一步中,我们可以保持所有其他神经网络块不变,仅对某些神经网络块进行修改和调整

原文以 Stable Diffusion为基础,使用ControlNet对大型网络进行控制:将Encoder复制训练,decoder部分进行skip connection。

在这里插入图片描述

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

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

5.可视化效果

图像分割搭配SD1.5
在这里插入图片描述

姿态检测搭配SD1.5:
在这里插入图片描述

通过HED轮廓,搭配SD1.5
在这里插入图片描述

灵魂画师搭配SD1.5
在这里插入图片描述


总结

部分图片转载自知乎用户@BitByBit

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ControlNet API是一种用于控制网络设备的应用程序接口。它提供了一组编程接口和协议,使开发人员可以与网络设备进行通信和交互。通过ControlNet API,开发人员可以实现对网络设备的远程监控、状态查询、配置管理和故障诊断等功能。 ControlNet API具有以下特点: 1. 灵活性:ControlNet API可以与各种类型的网络设备进行通信,包括交换机、路由器、防火墙等。无论设备是采用何种操作系统或硬件平台,都可以通过ControlNet API进行控制和管理。 2. 安全性:ControlNet API提供了严格的安全机制,确保通信过程中的数据传输和交换是安全的。它支持各种加密算法和身份验证机制,可以防止未经授权的访问和信息泄露。 3. 易用性:ControlNet API具有友好的开发接口和文档,开发人员可以快速上手并实现所需的功能。它还提供了丰富的示例代码和调试工具,方便开发人员进行调试和测试。 4. 扩展性:ControlNet API提供了可扩展的架构和接口,可以根据实际需求进行定制和扩展。开发人员可以根据自己的需求添加新的功能和模块,以满足不同场景和需求的要求。 总之,ControlNet API是一种强大而灵活的控制网络设备的工具,它可以帮助开发人员实现对网络设备的管理和控制,提高网络的可靠性和安全性。在现代网络环境中,ControlNet API具有重要的意义和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值