文章目录
安装教程 1.环境安装 2. 下载预训练的模型文件 3.运行(生成可视化界面) 1、ControlNet:AI绘画 1.1、ControlNet的本质是文生图(txt2img) 2.2、预处理器 & 模型选择 1.3、参数配置 2、ControlNet 模型分类 2.1、草图类(6个) 2.2、高级特征类(3个) 3.3、高级类(5个) 3、配置参数 4、基本原理:可控的SD模型 5.可视化效果 总结安装教程
下载安装:建议下载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