前言
AIGC蔚然成风一段时间了,利用闲散时间整理了如下知识点和实践经验,以供查阅。
一句话定义
ControlNet是一种神经网络模型,它工作在稳定扩散模型上,通过在特定阶段给予生成网络额外的训练条件以影响和修正扩散效果。
简单工作原理
ControlNet 的工作原理是将可训练的神经网络模块(trainable network modules)附加到稳定扩散模型的各个噪声预测器(U-Net)上,直接影响稳定扩散模型的各个解码阶段输出,如下图所示。由于 Stable Diffusion 模型的权重是锁定的,因此它们在训练过程中是不变的,会改变的仅是附加的ControlNet模块的权重(下图右侧)。在带有ControlNet的图像训练过程中,一共有2种条件会作用到生成图像上,其一是提示词(prompt),另一个就是由ControlNet引入的各种自定义条件(Condition)。
ControlNet1.1及以后对附属模型的命名规则:
注意版本号后面的质量标识符是否为p,以及对应的控制方法是什么即可
ControlNet总览
主要模型(预处理模型/模型)详解
Invert
Invert 用于检测用户上传的图像。预处理器和模型通常需要在黑色图像上使用白线来检测(也就是灰度图)。但如果你的图是白色图像上的黑线,就必须使用这个工具来切换颜色了,不然controlNet模型会无法正确识别输入图中的信息。注意这种情况在涂鸦模式和线稿填色场景中非常常见。
对应模型:无 -> Invert是预处理器,没有对应的ControlNet模型
Canny
Canny 通过使用边缘检测器提取图像中的所有重要轮廓线。通过调节阈值,可以使线条捕捉到非常详细的信息,但也会因此让图像背景中固有的干扰信息影响你的目标物体,所以在必要时可通过设置边缘检测阈值达到过滤出特定边缘信息的目的。注意,对于一些细节丰富的训练图可能并不适合使用Canny提取边缘。
对应模型:control_v11p_sd15_canny
Lineart_XXX
Lineart_XXX: 是Canny的替代者,但是能够比canny更加精准的提取二次元(使用anime后缀),或真实照片(使用realistic后缀)图片的线稿。具体效果参考下方图示。
说明: 如果使用自己的线稿,想进行填色也可以单独应用 lineart 模型,具体方法是:
在ControlNet中输入原始线稿,一般是白底黑线 -> 先使用Invert预处理器将线稿反色以便能够让lineart模型识别出线稿中的白色线条 -> 将从提词器中获取到的线稿Prompt发送至文生图,同时也补全反向提示词 -> 按需求增加有关颜色的正向提示词 -> 开始输出迭代。
注意,按照上述方法生成时有概率输出黑白或彩色的填色图(参考下面图示)
备注:如果要提高出彩色填色的概率,除了在正向提示词里添加颜色关键词外,还可以在反向提示词栏中填写诸如【greyscale】这样的黑白色关键词 🙂
对应模型:control_v11p_sd15_lineart
Softedge_XXX
Softedge_XXX:对应了以前的HED(Holistically-nested Edge Detection),既软边缘检测,它可以在物体周围创建清晰和精细的边界,输出类似于Canny,但减少了噪声和更柔软的边缘。它的有效性在于能够从复杂的细节中捕捉(过滤出)需要的轮廓信息,同时也保留了一定量的细节特征(面部表情、头发、手指等)。同Canny,我们一般用此预处理器保留原图线条轮廓,修改风格和颜色。
对应模型:control_v11p_sd15_softedge
Openpose_XXX
Openpose_XXX: 这个预处理器的基础款用于生成了一个基于节点和连线的骨骼火柴人的形象。相较于其他固定角色姿势的controlnet方案来说,这种技术的优势是支持多个 OpenPose 骨架组合成一个图像,达到精确控制多角色同屏的效果。此外由于还支持通过插件手动调节骨骼节点,也就便利了喜欢自已定义动作的同学。所有这些辅助骨骼信息会形成ControlNet的输入条件(condition)从而影响和引导稳定扩散模型的生成过程,获得符合预设姿势的生成图。
新版增加了对手部和脸部的支持,现在使用“openpose_full”可以得到姿势+手部+脸部的全貌信息,具体参考如下图示。
备注:当选择openpose_full时需注意,此模型在运行时会需求大量显存,注意控制分辨率
对应模型:control_v11p_sd15_openpose
Depth_XXX
Depth_XXX: 这个预处理器有助于生成输入图像的深度估计。深度通常用于控制图像内物体的空间定位。depth模型在固定角色姿势轮廓的同时还能起到固定场景透视效果的作用。浅色区域意味着它离用户更近,而深色区域则离用户更远。注意在处理角色图像时它可能会丢失部分内部细节(面部表情等)。
Depth Leres(++) 倾向于图片中捕获更多信息,参考下图,对背景和人物体表的起伏比较敏感
Depth Zoe 则相反,倾向保留物体的轮廓,并尽可能忽略极远处的景深信息,适合引导出更加随机的风格
对应模型:control_v11f1p_sd15_depth
MLSD
MLSD: 最适合生成各种朝向的直线条,经MLSD输出的线条能较好的贴合物体上的各种直线轮廓,尤其适合勾勒建筑物和其他规则的几何造型物品。但是另一方面,MLSD不适用于提取图像中的各种弯曲线条。基于上述特性,该模型常用于生成室内外渲染图,或者具有简约直线条风格的艺术/工艺作品。通过简单横竖线条固定下场景的基调,由稳定扩散模型填充/创作具体细节,以达到同设计替换风格的效果。
对应模型:control_v11f1p_sd15_mlsd
Normal
Normal: 法线图使用三种颜色通道来表示一个垂直于像素点表面的朝向(法向)信息。法线图能很好的还原大块物体面的朝向,这有利于光照,形状和体积(透视/景深)的还原。同时得益于细节的保留,使用法线图也可以间接反应物体表面的粗糙度和光滑程度。
对应模型:control_v11f1p_sd15_normalbae
Scribble
Scribble: 涂鸦的目的是从简单的黑白线条画和草图中生成图像,一般可作为通过草图快速迭代寻找灵感的工具。用户使用“Open new Canvas”选项创建特定大小的空白画布,可以直接动手绘制(当然也可以直接上传图像)。注意如果草图或上传的绘图是由白色背景上的黑线组成,则需要选中开头提到的“Invert”预处理器。
对应模型:control_v11f1p_sd15_scribble
Seg_xxx
Seg_xxx: 分割预处理器通过检测和识别图像不同区块的属性,并依据属性将图像分割归纳到不同的区段。下图展示了将具有包豪斯建筑风格的照片经过 seg_ofade20k 预处理器处理前后的状态。
注意上图右侧内各种输出区段的颜色不是胡乱标记的,它们符合ADE20K分类定义,参考下侧表格截图,如需全表从备注链接中下载获取。
备注: [ADE20K颜色表]
如果想直接看到分割后不同区块代表的语义可以使用如下网站:OneFormer 提供的Segmenation(分割)服务,操作时请在Task Token处选择“the task is semantic” 这代表我们需要输出色块内含的语意;Model(模型)则选择ADE220K。最终输出参考如下包豪斯建筑截图。
使用Seg预处理器 + 模型主要用于输出布局相同,但是风格不同的各类场景设计图。可以说同MLSD模型的作用类似,但是相比使用线条约束,Seg通过色块能更好的控制出图布局。
当然我们还可以直接动手在分割图上绘制(粘贴)任何我们想要的事物剪影(比如一个人物角色的剪影),利用控制色块属性和形状进行深度定制化!参考下方图示,背景为照片提取的室内场景图,左侧暗红色人物是通过截取相片中人物剪影,重新填上ADE20K中人物对应颜色(96053D)获得的,人物在原始背景上并不存在。同时为了便于控制人物姿势(单纯色块无法给出姿势的约束),一般还可以开启第二套ControlNet,选择Openpose定位角色姿势。最后输出成品参考下面第二张图示,可见出图结合了场景的布局和人物以及对应姿势,而风格则是依靠底模或lora提供。
对应模型:control_v11f1p_sd15_seg
Ip2p
[仅模型] Ip2p : 全称 Instruct Pixel to Piexl(像素对像素指令),该模型会自动识别像素对应提示词与新输入提示词的关系,并选择性的向新提示词迁移。从宏观角度来看,就是可以帮助我们固定大部分图像属性,只修改少量属性,这些修改的属性可以是全局属性(如光照明暗之类),也可以是局部属性(如物体状态,颜色,姿势等)。具体实现方式参考如下:
首先开启ControlNet并导入原图,不使用任何预处理器,点选完美像素模式,模型选择control_v11e_sd15_ip2p(如果后续该模型有升级,则选择最新的即可)。控制权重保持为1,引导介入为0,终止为1,控制模式注意只能选择“均衡”(我试过其他模式,出图会变得极为不稳),缩放模式一般“直接调整大小”即可。
然后是文生图的提示词,注意只需要输入你想要的特性,比如我想把图片的光照调暗,让白天变为夜晚,那么我会在正向提示词中加入:(make it night:1.3), (night:1.3),这2个即可;为了加强影响还可以在反向提示词里填写提示词:day。
接下来调整图像长宽比以适应原图长宽,否则点对点处理放大会出问题。
而最后需要调整的是提示词引导系数(CFG Scale),经过测试,这个值不易过小(2以下)否则会导致输入的提示词效果不明显,也不可过大(5以上),否则此模型会变得极不稳定,出完全随机的图。
全部调整完毕后所出的图参考图示如下,分别是左侧的原图和经过调暗处理后的右图。
如果需要配合其他controlnet模型使用,建议搭配lineart_anime提取轮廓,但是修改后的图像变换也更加随机了(参考下方图示)
对应模型:control_v11f1p_sd15_ip2p
Tile
Tile_resample: tile模型原本是为了放大图片而设计的,具体来讲需要先将原图分割为一块一块的小区域(叫做Tile或瓦块),然后分别对每个瓦块进行图生图放大,最后集合所有放大后的瓦块,拼成完整的大图。之所以采用局部放大后拼接的模式是为了减少显存占用。但是这样放大图片也有弊端,那就是必须要求每个小图在图生图时重绘幅度不能太大,因为本质上每个小图使用的也是全图提示词,当重回幅度过高时,老版本tile模型很可能会在每个小图里生成全图提示词所描绘的全部内容。
ControlNet1.1版本后的Tile模型更加强大,它具有2点特性:
- 能识别并忽略图像中的细节,同时生成新的细节
- 如果当前瓦块中识别到的语义或提示词与全局不符,那么模型将忽略全局提示词,同时依据当前局部环境构造新的监督扩散(既创建新的局部提示词并以此引导扩散模型)
Tile的放大流程:
- 原图由打标器(WD1.4)打标并发送到图生图
- 开启ControlNet,选择tile_resample预处理器(可不选任何预处理器),选择tile模型,其他保持默认即可
- 向下找到脚本框,点选Ultimate SD upscale,目标尺寸类型一般可选从图像尺寸缩放,而后在右侧填选放大倍数,放大算法我一般使用R-ESRGAN 4X+,但是差别不大
- 调节重绘幅度,一般而言放大倍数越大,重绘幅度越小才好,对于二次元风格化差异较大的图片来说,如果基模风格与目标图片不同,那么建议调小重绘幅度到0.5以内
- 启动重绘!
Tile用于增强(取代)传统图生图:
利用Tile自身的理解能力,在保持原始构图的前提下去风格化或者替换局部特征。
- 使用生成原图的基模 -> 将原图由打标器(WD1.4)打标并发送到文生图 -> 添加合适的负面提示词 -> 开启ControlNet并选择tile模型,选择“更倾向于让ControlNet自由发挥”-> 调低CFG值到3左右 -> 这样做获取到的就是保持构图,保持画风,同时增加额外细节的新图
- 切换其他基模 -> ControlNet中选择“提示词更重要” -> 调整CFG值到7左右 -> 其他同上 -> 这样出来的图能保持构图,去画风化,且细节有大量迭代
[说明1] “更倾向于让ControlNet自由发挥”就是原来的无提示词模式,ControlNet-Tile模型会基于自己的强大理解,尽力保持原图的语义构成,同时忽略用户自定义的“额外”提示词。因此当使用此模式时,务必调低CFG值(既降低提示词相关性) ,不然可能引发Tile模型与提示词之间的冲突,导致画面边形,或者线条过粗,颜色过饱和等问题。
[说明2] 基模(或画风Lora)对Tile的影响非常大,很大程度上决定了画风。参考右侧风格迁移图示,左侧为原图,右侧为去除人物面貌特征提示词,并替换角色风格Lora后的出图效果,可以看到,人物头像完全替换成了其他角色,但是整体构图和色调保持不变(如果使用原图的基模的话)
[说明3] 关于如何从完全服从原图到完全创新的过渡,除了上述提到的几点外,还可以通过调节ControlNet自带参数“控制权重”,“介入/终止步数”,以及“降采样比例(Down Sampling Rate)”来控制。基本上控制权重越高,介入步数越低,终止步数越高 -> 会导致Tile模型的权重越高,而降采样率越高,会导致Tile模型效果越低,既创造性越高。
对应模型:control_v11f1p_sd15_tile
Shuffle
Shuffle:洗牌,重新组织图像。具体来说shuffle通过使用随机流的方式来洗牌原图像,在控制稳定扩散的前提下重构出新图。
经过洗牌的生成图与原图风格统一,色调统一,也就是说洗牌模型能够在固定图片风格的前提下,较大幅度的重构原图。一般可以配合动态提示词等插件快速获取具有输入原图风格的多张不同设计稿,以便寻找灵感。
典型洗牌流程:
- 原图由打标器(WD1.4)打标并发送到图生图
- 图生图加载原图
- 开启ControlNet,加载原图,模型和预处理器都选择shuffle,控制模式选择提示词更重要
- 启用动态提示词(Dynamic Prompts)
- 开启Magic prompt,选择合适的Magic prompt model
- 连续出图效果
出图效果参考下方图示:第一幅是输入图为艺术风格鲜明的半身像雕塑作品,后面则是对应的9张输出图,可见图像保留了原图的色调和基本风格,同时借由动态提示词追加的内容进行了作品设计上的变换。
作为对比,下面图示是在不开启dynamic prompts前提下仅通过shuffle模型获得到的,可见风格和色调同样得到了保留,同时用户输入的提示词也得到了很好的遵守,变化和创新大多在各种细节上,相比之下不会产生角色形象上的较大迁移。
参考提示词:shoes, gloves, sneakers, simple background, solo, white gloves, split, 1robot, disconnected arm, no legs, crown, blue eyes, portrait, profile, black background, border
[tips]使用秋葉大佬的sd整合包安装dynamic_prompts可能会在启动时,控制台面板遇到“ModuleNotFoundError: No module named 'dynamicprompts'”的报错,从而导致进入SD无法访问dynamicprompts,此时关闭SD,用管理员模式开启powershell,并使用如下命令:
你的路径\sd-webui-aki-v4\py310> .\python.exe -m pip install 'dynamicprompts[attentiongrabber, magicprompt]==0.25.2'
手动安装目标依赖,完成后重启秋葉大佬的启动器即可(参考资料)
对应模型:control_v11e_sd15_shuffle
inpaint
inpaint_global_harmonious:主要用于局部(遮罩部分)重绘,在原生基于图生图的重绘模式上加入了ControlNet的控制,从而让inpaint能够更加准确的预测重绘细节。但是注意,和普通局部重绘不同,ControlNet的inpaint模型除了重绘遮罩部分外,遮罩以外的地方也会发生微小变化(重绘),这样做带来的好处是它能够更好地将重绘区域与整体画面融合,让整体出图更加和谐统一。当然你也能将ControlNet引导权重调节到最大(2),此时ControlNet-inpaint模型将尽可能得保持遮罩区域以外的画面不发生变化。
比较传统图生图的局部重绘:如下方图示,原图蒙版重绘部分往往会出现与周围环境不相容的独立景物,无法统一整体布局。
典型inpaint构图流程:
- 提取原图提示词,注意去除蒙版部分原有内容,替换为你期望的内容(可选)
- 将提示词导入文生图
- 开启ControlNet,预处理器和模型都选择inpaint,适当调整控制权重(一般1.2 ~ 1.7之间效果都不错),控制模式选择提示词更重要
- 调整出图比例和尺寸,直接出图
效果参考下方图示,可以看到对比传统图生图的局部重绘,inpaint模型能在统一整体效果的前提下,补全蒙版部分的内容,同时遮罩外部分的轮廓和细节也得到了较好的保留。
参考提示词:scenery, outdoors, sky, day, petals, cloud, cherry blossoms, architecture, east asian architecture, blurry, blue sky, stairs,cherry blossoms
对应模型:control_v11p_sd15_inpaint
TODO
有新的模型会在此追加...
对Control Mode效果理解
借用网上大佬的图示:
提示词更重要 -> 增大提示词控制权重,出图倾向于提示词内容,(就是Stable Diffusion加载的主模型对提示词的理解),这会削弱ControlNet的控制力
ControlNet更重要 -> 倾向于ControlNet模型的介入,更多利用非提示词约束条件(深度,轮廓,姿势等你选择的ControlNet模型),当约束条件与全局提示词冲突时倾向于约束条件(或者直接出错XD)
均衡 -> 字面意思,但是实际应用中发现有的ControlNet模型只有在此档能稳定工作。