【ComfyUI学习笔记04】案例学习:局部重绘 - 上
前言
大多时候,我们会对AI生成的图片感到整体的满意,但觉得其中的一些细节尚需修改,这要怎么做呢?
本节讲述了ComfyUI中实现对图片进行局部重绘的2个工作流及其核心节点 VAE Encode for Inpainting 应用讲解,并涉及对蒙版的基本认识和编辑操作,下一节将额外补充蒙版 Mask 的相关知识和编辑方式。
本系列博客不涉及过多底层原理,若有纰漏,万望海涵
【往期传送门】
ComfyUI学习笔记01:下载安装 | 运行第一个工作流 | 学习思路
ComfyUI学习笔记02:工作区的整理与注释办法 | 2个节点包推荐
ComfyUI学习笔记03:案例学习:图片放大的3个基本工作流
局部重绘的通识介绍
一句话概括,局部重绘 inpainting 是利用蒙版 Mask 来有针对性地修改画面内容做法的统称。根据官方手册对 Image Upscaling1 的介绍:
这就像让一位艺术家(AI模型)绘制一幅画,但我们对具体细节仍不满意。我们需要告诉艺术家需要调整的区域(遮罩),然后让其根据我们的要求重新绘制(填充)。
局部重绘是 图生图Img2Img 的一种重要应用,常用于图片的局部修改,或者固定主体后进行画风调整。
在WebUI中,局部重绘被称译作蒙版模式,对蒙版区域的处理主要有填充、原版,潜空间噪声和空白潜空间4种:
填充 Fill:一般情况下会得到一个“色块”,它的色彩数值来自蒙版区域周围的像素颜色和纹理
原版 Original:保留蒙版区域原始图像的内容,然后将这些内容连同新的提示词一起扔进潜空间进行重绘。注意!它不是从零开始画,而是读取原图的数据作为底图 + 新图的描述进行生成
潜空间噪声 Latent Noise:无视蒙版区域的任何原始信息,直接在潜空间的对应区域填满纯粹的、随机的噪声;
空白潜空间 Empty Latent:用一个中性的、零值的“空”信号来填充潜空间区域,等待下一步的信息输入
上图来自:Beginner’s guide to inpainting (step-by-step examples)2
面向直接应用的需要,ComfyUI中为一般用户提供了“原版”和“空白潜空间”这两种模式,分别对应了两个重绘的关键电池——Set Latent Noise Mask 和 VAE Encode (for inpainting),我们将在后面的案例中上手体会。
在今天的案例中,我们将通过局部重绘功能实现以下的效果:
由于疏忽,准备资料的时候忘了保存原始数据了,接下来的案例出图与上图将有点小差异
蒙版 Mask的基本认识
不妨将我们想象成一位医生,需要对患者的病灶进行精准手术,为了屏蔽非手术区域对我们的干扰,我们会在病灶处搭上一块“布”,即“铺巾”,布面上留出的孔洞就是我们要操作的部位。在上述的情境中,那块“布”其实就是我们图片重绘中的蒙版,不同的是,医生用的是绿色的,我们用的是黑色的
在ComfyUI中,蒙版以黑白表示是否被修改,白色表示待修改,黑色表示不修改,灰色则控制修改的强弱。
对图片添加蒙版的方式主要有两种:
- 手动绘制:在ComfyUI中,右键Load Image的图片,在弹出的菜单下方找到 Open in MaskEditor 进入蒙版编辑页面
- 提前绘制导入:常用,下篇讲。
VAE Encode for Inpainting 工作流
如图展示的是使用“VAE Encode for Inpainting”进行局部重绘的最基础工作流,由3块组成——导入,重绘和生成。
工作流解读
- 导入模型、图片、VAE:这是工作流的准备阶段,导入要修改的图片,自备的蒙版等,模型 CheckPoint 将决定重绘时的画风,Load VAE 是可选项,亦可以通过Load Checkpoint节点中的vae进行后续连线,但由于ComfyUI的vae是默认的SD XL,1等版本使用的vae,可能与当前的checkpoint结合起来并不是最优的,所以:
- 【建议】查看 模型 Checkpoint 的作者手册中对此是否有额外的推荐;,在作者没有特别对Checkpoint搭配的VAE有推荐时,可以加载通用 VAE :vaeFtMse840000EmaPruned_vaeFtMse840k3.
- 图片生成:CLIP Text Encode(Prompt)主要用于添加重绘部分的提示词,Ksampler进行采样,然后经过Vae Decode,Preview Image进行图片查看
- 【建议】正面提示词的建构一般是:“重绘部分”的内容+模型激活词、调用词(有使用Lora时)
- 局部重绘:此处仅为最基础的工作流,因此,直接入了本案例关键的VAE Encode for Inpainting
- 局部重绘部分进阶还会加入对蒙版的处理,主要是导入,扩展/收缩选取,羽化边缘
关键节点
VAE Encode for Inpainting:
- pixels 像素图输入: 用于接入图片信息,并经过vae,与Mask一同被转化成Latent信息
- vae:略
- mask:较常用节点 VAE Encode 多出来的接口,用于专门接收蒙版 Mask信息
- grow_mask_by: 向外扩充蒙版的待修改区域(白区),值越高,向外扩充的像素就越多,被修改区域就越大
KSampler:重绘实际上就是对选定区域重新采样,因此在接口和参数的设置上会有以下一下变动和考量:
- model:即大模型 Checkpoint,此处接入的模型将会直接影响重绘的画风,在对人物的二次元化、三次元化、背景的替换中尤为重要
- 具体可以去C站上进行画风的挑选,【!!留意部分Checkpoint是有指定“唤醒词”的,需要添加进CLIP Text Encode中】
- positive / negative:接入提示词 Prompts,这里的正向 positive 提示词只用写重绘部分即可,不用再将原来的prompt复制过去
- 再次提醒,如果调用的Checkpoint,Lora需要“唤醒词”,请及时加上
- latent_image: 接入VAE Encode for Inpainting即可
- Step:优先根据调用的Checkpoint的推荐值进行设定,但由于是局部重绘,在电脑配置不足的时候,可以稍微调低 5 - 10
- cfg:优先根据调用的Checkpoint的推荐值进行设定
- 采样器:优先根据调用的Checkpoint的推荐值进行设定
- denoise:在使用 VAE Encode for Inpainting 时,值不能太低,0.8调整的基准,可以上下浮动0.2进行调整;
案例演示
- model:即大模型 Checkpoint,此处接入的模型将会直接影响重绘的画风,在对人物的二次元化、三次元化、背景的替换中尤为重要
此处是案例原图,需要请自取案例最终呈现
案例基本参数:(请将以下内容复制到空白ComfyUI中打开)
{
"id": "b8009e0e-6d6c-4708-9148-aa17c260e600",
"revision": 0,
"last_node_id": 19,
"last_link_id": 21,
"nodes": [
{
"id": 18,
"type": "VAEDecode",
"pos": [
1850,
220
],
"size": [
140,
46
],
"flags": {
},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 12
},
{
"name": "vae",
"type": "VAE",
"link": 21
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
13
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.44",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 13,
"type": "VAELoader",
"pos": [
737.1824340820312,
721.64794921875
],
"size": [
270,
58
],
"flags": {
},
"order": 0,
"mode": 0,
"inputs": []