ComfyUI基础教程——应用Controlnet精准控制图像生成
ComfyUI基础教程——应用Controlnet精准控制图像生成
ControlNet是AI绘画领域中一个重要的控制神经网络,它允许用户通过输入各种调节图像(如涂鸦、边缘图、姿势关键点等)来控制图像生成过程。本文将详细介绍ControlNet的基本概念、使用场景以及在ComfyUI中的具体应用方法,并通过多个实例展示其强大功能。
一、前言
你是否有见过下面类似这样的图片:
看起来平平无奇,当你站远点看,或者把眼睛眯成一条缝了看,你会发现,这个图中藏有一些特别的元素。这就是利用了AI绘画中的ControlNet,实现对图片的相对更精准控制。
上一篇文章讲述了文生图的基本工作流和最基础的核心插件用法。通过提示器可以描述我们想要生成的图片。但是通过文字是无法精准描述描述图片的。就好你说“一个女孩,穿着粉色的裙子”,一百个人听到这句话,脑海中产生的信息有一百种,每个人想到的都不一样,无论你再怎么加场景、细节、修饰符,都不可能统一所有人的理解。那今天要将的ControlNet却能在一定程度上指导Stable Diffusion图片的生成过程,实现一些特殊的效果。
二、ControlNet的相关概念
2.1 什么是ControlNet
ControlNet是一个控制预训练图像扩散模型(例如Stable Diffusion)的神经网络。它允许输入调节图像,然后使用调节图像来控制图像生成。这里的调节图像类型有很多,比如涂鸦、边缘图、姿势关键点、深度图、法线图、分割图等。这些输入条件都可以作为条件输入来指导生成图像的内容。
这里需要明确一点,ControlNet是一种算法,用来控制预训练图像扩散模型生成图像的,可以搭配Stable Diffusion模型进行使用,但不是只能使用在Stable Diffusion中。
2.2 ControlNet的使用场景
ControlNet的使用场景非常之多。比如想要控制生成图像人物的姿势,可以给定一张参考图,使用姿势控制模型,提取出人物的姿势,进行控制;比如生成室内装修设计图,可以根据给定定一个法线图,进行控制;比如可以简单画个涂鸦草图,让AI根据这个草图进行绘制等等。由于AI绘图试一项创造性工作,所以无法列举完所有的场景,这里大家有个初步印象,然后可以尝试不同的ControlNet模型,发挥想象,用到合适的需求场景。
2.3 ControlNet官方地址
ControlNet的官方地址:GitHub - lllyasviel/ControlNet: Let us control diffusion models!
关于ControlNet的原理,官网上有一些讲解。本人水平有限,这里就班门弄斧,以免误导大家。感兴趣的朋友可以查看官网文档,或者搜索其它资料文献。
三、如何使用ControlNet
对于使用AI绘画的人来说,应用才是最重要的。接下来通过一个示例讲解如何使用ControlNet。
3.1 安装ControlNet插件
ComfyUI-Advanced-ControlNet
首先是ControlNet节点安装,如果你使用的秋葉整合包ComfyUI,是自带了ControlNet节点的。如果没有,可在自行安装插件
ComfyUI-Advanced-ControlNet
。相信能看到这里的朋友都掌握了插件安装的方法,如果有不会的朋友,可以回头去看我前面的文章,安装插件的方法前面的文章有讲。
3.2 模型下载
强调:ContrlNet模型是分版本的,与基础大模型要对应。 比如你基础大模型使用的SD1.5,那么你的ControlNet模型也要选择SD1.5版本,模型不匹配运行会报错。
官方提供了Stable Diffusion 1.5版本的ControlNet模型下载地址:
https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main
这里面的模型非常之多,通过模型的名字基本能知道模型的作用。
下载模型,放到如下路径:
ComfyUI\models\controlnet
如果需要下载SDXL或者其它版本的ControlNet模型,可自行在模型下载网站搜索下载。
多合一模型
controlnet-union-sdxl-1.0
这个模型只适用于SDXL版本,优势是该模型集成了ControlNet的12中类型的模型,不用挨个下载,并且能更节约内存。
官方地址:https://huggingface.co/xinsir/controlnet-union-sdxl-1.0
3.3 ControlNet使用
接下来通过一个实际的例子,展示ControlNet如何使用。
3.3.1 应用ControlNet节点
首先,我们不必要完全从零开始搭建工作流,直接加载默认的文生图工作流,在它的基础上进行修改。
然后我们添加一个应用ControlNet节点。
新建 -> 条件 -> ControlNet
这里面可能有好几个相关的节点。
这里说说最常用的
ControlNet应用高级
这个节点。掌握这个节点,其它节点使用方式大同小异,大家可以自行尝试。
ControlNet应用高级
和
ControlNet应用
相比,多了负面条件控制,以及开始时间和结束时间。我们可以把两者都添加进来更直观的看到。
这里输入和输出中的正面条件和负面条件都很好理解,说一下开始时间和结束时间,它们指的是,在整个采样器去除噪波,生成图片过程中,ControlNet介入控制的时机,最小是0,最大是1。如果开始时间设置为0,结束时间设置为1,则表示生成图片过程中,ControlNet从头到尾都介入控制。
再看剩余的参数和输入条件:
- 强度:是ControlNet的作用强度。值越大,生成的图片ControlNet参考强度越大,也越贴近参考效果,但是实际使用中,往往也不是参考效果越明显越好。比如前言中看到的光影文字效果,我们以文字的深度图作为ControlNet参考图,生成风景照,当ControlNet强度太大了,生成的图像中,文字非常明显,反而风景照发挥的空间太小了,往往效果不近人如意。实际使用过程中,还需要根据实际生成图片不断调整。
- ControlNet:该输入项需要连接到ControlNet加载器。前面我们下载的模型,需要根据需要选择一个使用。
- 图像:这里需要一个输入一个经过ControlNet预处理器处理过的图像。
3.3.2 ControlNet模型加载器
ControlNet模型加载器同样有很多种,这里挑一个最常用的。
只有一个参数,选择我们需要的模型。前面强调过,这里的模型版本,要和你选择的基础大模型匹配。
3.3.3 ControlNet预处理器
ControlNet的预处理器种类非常多,选择哪个需要和加载的ControlNet模型对应上。 比如前面选择了模型加载了
openpose
类型,这里就要选择
面部与姿态
下面的预处理器。
这里我们选择DW姿态预处理器来说明。
这里面的参数,检测项需要就启用,不需要就禁用。分辨率可以根据基础大模型设置。一般SD1.5设置512,SDXL设置1024。BBox检测和姿态预估是用来检测身体各个部位的,在其他场景中也会用到,不同模型之间的区别,大家可以自行了解。
首次使用某个ControlNet预处理器时间会长一点,会自动从网络下载所需要的模型,请保持网络通畅,并且可以在ComfyUI启动器的控制台看到下载任务和进度。后续如果本地有了该模型,很快就可以加载进来。
输入图像,需要出入一张参考图像。
Aux集成预处理器
下面再介绍一个多合一的ControlNet预处理器 —— Aux集成预处理器。
它只有两个参数,预处理器,需要自己选择,比如选择DW姿态预处理,就和上面的效果基本一致了。同样需要输入一张参考图。
图像加载节点
输入的参考图,就是从本地或者网络加载一张图片,然后输出到ControlNet预处理器。
加载本地图像
加载图像使用
LoadImage
节点就可以。
新建->图像->加载图像
点击
choose file to upload
, 选择一张本地图片,或者直接拖动图片到上面就可以,实际使用中,拖拽一张网络图片也是可以的。
加载网络图像
有时候我们知道网络图片的地址,那就可以使用专门加载网络图片的节点。我们可以搜索一下本地节点,没有的话,就需要自己安装。我这里有很多插件提供了加载网络图片的节点。
以上就是所有ControlNet需要的节点,都添加进来然后正确连接起来就可以了。
3.4 实例展示
3.4.1 人物姿态控制
这里本地有一张图片
下面生成一张女孩的图片,姿态和这张图片保持一致。工作流如下:
和上面讲解的节点一样,这里,注意就是Clip文本编码器输出的正面条件和负面条件连接到ControlNet应用节点的输入,ControlNet应用节点的输出再分别连接到K采样器的输入。
另外这里将ControlNet的预处理器输出到一个预览图像节点,方便我们查看与预处理处理后的结果。
大模型选择的
xxmix9Realistic
写实风格,正向提示词就简单填写的
1 girl
, 最终的结果生成了一个女孩,姿势与我们的参考图是一致的。当然这个图并不完美,放大看比较模糊,细节也很欠缺。如果要生成一张质量较高的图片,需要非常好的提示词,好需要一些其他的节点。如增加Lora模型(后面文章讲解如何使用),放大处理节点,对局部进细节进行处理(比如手部修复,面部修复)等等。
3.4.2 局部重绘
局部重绘的方法有很多,本示例将通过ControlNet完成一个局部重绘的简单工作流。
想要实现的效果是对下面这张图片进行局部重绘,比如给这个女孩换上不同的裤子。
先说一下基本的思路,就是加载上面的图像,然后创建需要重绘部位的遮罩(在PS里面也称为蒙版),然后对遮罩区域进行重新绘制,这里就要创建图中女孩裤子部分的遮罩。此时,使用ControlNet的模型是
inpaint
类型。针对这个示例,接下来使用SDXL版本的模型进行,一步一步实现效果。
先上图:
和前面使用openpose的工作流基本类似。这里SDXL的模型,我选择的是union版本,这里在加载ControlNet模型的时候,ControlNet加载器不能直接连接到应用ControlNet节点上,因为我们使用union版本的模型,它集成了12种类型的模型功能,使用时就需要选择具体使用哪种类型,这应该很好理解。
所以这里连接到
设置UnionControlNet类型
这个节点,然后再将输出端连接到应用ControlNet节点。
在设置UnionControlNet类型中,基于重绘,我们选择repaint类型。同时,与之对应的预处理器节点应该选择
Inpaint内部预处理器
。该预处理需要输入图像和遮罩。刚刚也说过了,我们需要创建遮罩区域,对遮罩区域进行重绘。
如何创建图像遮罩呢?
在图片上鼠标右键,点击"在遮罩编辑器中打开",
然后会自动打开遮罩编辑器,操作非常简单,左下角工具条依次是清除遮罩、设置画笔宽度、设置遮罩透明度、设置遮罩颜色。如果涂错了,点击清除,或按住右键涂抹即可。最后记得点击右下角保存。
另外记得大模型也要选择对应的SDXL版本,对于SDXL分辨率可以设置为1024左右。正向提示词写上“1 girl,short red_dress, ”。最后运行看看:
不出意外的话,意外出现了。。。生成的图像一片漆黑,预览预处理器处理过后的图像倒是能看清楚图像和遮罩。
不要慌,这里,有个小细节,就是inpaint内部预处理处理过后的图像不能直接输入到ControlNet应用节点,需要先转换为RGB。
再次运行,可以看到,图片中的人物已经换上了红色的裙子。
Ok,这次没问题了。
注意这个图像转RGB节点,是WAS插件下的图像到RGB。 不要添加为其他自定义插件中的
Convert Image To RBG
了,亲测过,不生效。
我们还可以再进一步补充完善完善一下这个工作流。上述这个工作流,K采样器的Latent我们传入的试一个空Latent,图像的宽高是我们自己设置的,这样有两个特点:
- 有可能我们设置的值与原图宽高不一致
- 空的Latent意味着对整个图完全进行了重绘。关于这一点,后面在专门写一篇文章,讲述各种重绘方式的区别。
由于是图片局部重绘,我们实际上可以将原图使用VAE编码器进行编码转换成Latent输出到采样器中。这里使用VAE内补编码器。输入端,需要传入图像,VAE模型,遮罩,输出Latent连接到采样器。VAE内补编码器还有一个参数,“遮罩延展”,这个类似与PS中的羽化,可以让重绘部分和原图融合得更好。这个值可以在使用过程中不断修改尝试,达到自己满意的效果就可以了。
最后完整的工作流如下:
3.5 ControlNet堆的使用
有时候我们想用多张图片的不同ControlNet类型进行控制,最原始的做法就是依次添加不同的ControlNet相关的节点,把它们依次串联起来。这样做节点数看起来会很多,不是很直观。ComfyUI中可以使用ControlNet堆进行统一处理。使用也非常简单:
如果你没有这个自定义插件,就需要额外下载,看这个节点样式,使用起来非常简单。它支持最多三个ControlNet一起控制,整合了ControlNet模型加载器,并且分别提供了开关、强度、介入时间等参数。如果3个不够用,还可以继续串联ControlNet堆节点。一般来说。
四、结束语
ControlNet在AI绘画中非常重要,大多数生产环境中,都不是天马行空,完全随机生成图片的,有了ControlNet,能够更精准地控制生图,才能不断修改完善,符合实际使用需求。本文只是讲解了ControlNet的入门使用方法,更多的知识需要在大量的练习和探索中掌握。
回到开头图片,文字融入图片的效果又该如何应用ControlNet来生成呢?
留给大家自己去学习探索。最后中秋节快到了,提前祝大家中秋节快乐!