【ComfyUI插件】ComfyUI Easy Use插件(二)——重绘
前言:
本节主要是将comfyui的原生重绘工作流与EasyUse重绘工作流进行对比讲解,帮助大家更好的理解不同重绘方式之间的差别(主要描述了各种不同的重绘方式)。
__ComfyUI Easy Use插件(一): __https://articles.zsxq.com/easyuse/1.html
__ComfyUI Easy Use插件(三): __https://articles.zsxq.com/easyuse/3.html
__ComfyUI Easy Use插件(四): __https://articles.zsxq.com/easyuse/4.html
__ComfyUI Easy Use插件(五): __https://articles.zsxq.com/easyuse/5.html
__ComfyUI Easy Use插件(六): __https://articles.zsxq.com/easyuse/6.html
__ComfyUI Easy Use插件(七): __https://articles.zsxq.com/easyuse/7.html
__ComfyUI Easy Use插件(八): __https://articles.zsxq.com/easyuse/8.html
本期使用的示例工作流在网盘:小黄瓜知识星球资料分享/插件节点讲解视频/ComfyUI_EasyUse/第二期文件夹中
一、ComfyUI重绘 (一)----VAE Encode (for Inpainting)节点
二、ComfyUI重绘 (二)----Set Latent Noise Mask节点
三、ComfyUI重绘 (三)----InpaintModelConditioning节点
四、ComfyUI重绘 (四)----ControlNet(inpainting模型)
五、ComfyUI重绘 (五)----Differential Diffusion节点
六、ImageCompositedMasked节点
七、Easy Use小技巧---EasyUse的管理组/XYplot Advanced节点/EasyUse的同类型节点替换
一、ComfyUI重绘 (一)-----VAE Encode (for Inpainting)节点
节点功能:节点用于将输入图像编码为潜在空间表示,以便在图像修复(Inpainting)任务中处理损坏或缺失的区域。
输入:
pixels: 输入的图像
vae: 加载的 VAE 模型
mask: 修复区域的掩码图像
参数:
grow_mask_by: 扩展掩码区域的像素数量。扩大掩码区域,以确保边缘区域平滑过渡,避免修复区域和原图部分的割裂感。
首先,先加载默认的comfyui的图生图工作流,然后将图生图的__denoise__参数调为1,点击运行,得到结果如下图
然后我们将复制一个图生图工作流,并将其改成重绘工作流,因为这里我们主要讲解重绘节点的使用,所以这里我们只采用最简单的手绘选择蒙版的方式
首先在load image节点上,鼠标右键,选择__Open In SAM Detector__节点,并打开具体操作如下图所示:
在上图中,鼠标左键标记的蓝色点是选择图片中需要的部分,鼠标右键标记的红色点选择图片中不要的部分,Confidence是检测阈值,Detect是开始检测,Clear是清除标记点,当标记完成后点击detect即可完成检测,效果如下图所示,检测效果不是特别好, 但是没关系,这里我们点击右下角的Save to node即可。
此时可以看到检测的蒙版部分已经传入到前图中,此时我们再鼠标右键选择Open In Editer,具体如下图所示
接下来,我们可以通过调节Thickness调节笔刷大小,Opacity调节不透明度进行手动涂抹,具体操作如下图所示
涂抹完成后,点击右下角的Save to Node即可完成手动蒙版绘制,如下图所示
最终效果如下图所示
然后我们对接__VAE Encode (for inpainting)节点__,点击运行,效果如下图
从图生图和局部重绘的对比中可以看出,重绘的本质就是从原本图生图工作流的重绘整个图片变为只重绘图片中蒙版区域的部分。
但是此时我们会注意到上图的一个问题,那就是重绘部分与非重绘部分的相关性很差,也就是没有很好的与原图融合,那么对于这个情况是因为什么产生的呢?
这是因为我们选择的模型__不是重绘模型__,而是普通的sd15模型,普通的sd15往往只作用于单一区域部分的补足而不会参考整体图片,也就是非重绘部分,但重绘模型也就是inpainting的模型会参考整体图片部分,所以对于这种情况的重绘效果更好
此时我们选择加载一个inpainting的模型,如下图
然后运行下这个工作流如下图,可以看出此时重绘参考了整体图片的效果所以重绘效果很好。
同时在__EasyUse__中我们可以使用更为简单的方式完成这个操作,我们加载EasyUse的重绘工作流如下图,点击运行,可以看出生成图片是完全一样的,且EasyUse的使用方式更加便捷。
那么这个时候我们可能会有另外一个问题,那就是如果我们想要使用的模型不是inpaint模型而且作者也没有提供inpaint模型的版本,这个时候我们应该怎么去做呢?
我们可以自己去__制作重绘模型__,这里以SD1.5的模型为例,让我们加载制作重绘模型工作流,如下图所示
通过上图可以看出这个工作流先是用SD1.5的标准的inpaint模型-普通模型,然后将获得的重绘部分与我们想要使用的非重绘模型混合,最后保存为新的模型,这样我们就可以得到我们想要用的模型的inpaint版本,模型默认保存的路径如下图所示
使用新的inpaint模型的重绘效果如下图所示,可以看出还是不错的
但是要注意的是这种模型虽然重绘效果比原模型好很多,但是对比作者专门提供的训练版本的inpaint的模型效果还是要差一些的,所有如果有选择的话最好还是使用作者提供的inpaint模型
小总结:使用VAE Encode (for inpainting)节点注意两点:
1、使用模型需要是inpainting模型;
2、denoise权重通常设置为1
二、ComfyUI重绘 (二)-----Set Latent Noise Mask节点
节点功能:该节点用于在潜在空间中对特定区域添加噪声掩码。该节点的主要作用是在生成或修复过程中,通过掩码区域引入随机噪声,从而影响图像生成或修复效果,常用于图像修复(Inpainting)或局部生成任务。
输入:
samples: 潜在表示数据,通常是通过 VAE 编码得到的潜在空间样本
mask: 二值掩码图像,表示在哪些区域引入噪声
经过上一个的重绘后此时我们会想,如果我们想要更接近原图人物的重绘此时怎么做呢?
下面让我们去加载__Set Latent Noise Mask节点__的重绘工作流,我们想要的是蒙版中的人从男人变成女人,这里我们使用了inpainting模型,如下图所示,效果不是很好,角色变动不大。
此时我们需要将inpainting模型换成正常sd15模型且denoise调节为0.65,再运行下效果,此时效果比之前好上很多,且得到的效果的人物姿态等也更接近原图。
但是此时我们可以会考虑为什么前一种重绘方式使用inpainting模型效果更好,而后一种重绘方式使用普通的模型效果更好?
下面让我们将两者重绘方式的denoise的强度调整成0.1,然后运行,将会看出背后的区别,如下图
通过上图,我们可以看出__这是因为它们的蒙版区域部分的初始噪声不一样。__
但是此时我们可以会考虑为什么前一种重绘方式使用inpainting模型效果更好,而后一种重绘方式使用普通的模型效果更好?
重绘方式一(使用VAE Encode (for Inpainting)节点)是以空的蒙版区域作为初始噪声加入,所以在原模型没有束缚的情况下效果不好,而使用inpainting的模型效果更好。
重绘方式二(使用传统VAE Encode节点+Set Latent Noise Mask节点)使用原先蒙版区域的男人站立图作为初始噪声加入,由于在初始噪声部分已经参考了原先蒙版区域的图片,而使用inpainting会造成强度过大导致难以进行蒙版区域重绘大幅度改变的情况,所以使用原始模型会更好。
然后我们在EasyUse中实现这个重绘工作流,点击运行,如下图可以看出生成图片是完全一样的,且EasyUse的使用方式更加便捷。
小总结:使用Set Latent Noise Mask节点注意两点:
1、使用模型需要是普通模型而不是inpainting模型;
2、denoise权重通常设置为较低值,比如0.6或者以下
三、ComfyUI重绘 (三)----InpaintModelConditioning节点
节点功能:该节点用于在图像修复(Inpainting)任务中,将潜在表示(latent space)与文本提示(text prompts)和掩码相结合,为扩散模型提供条件输入。
输入:
positive: 正向文本提示,用于引导模型生成目标区域期望的内容。
negative: 负向文本提示,指定模型在生成过程中要避免的特征或内容。
vae: VAE 编码器生成的潜在表示。
pixels: 原始图像像素数据。
mask: 修复掩码图像,标记需要修复或重绘的区域。
然后加载一个使用这个节点的工作流点击运行,对比于重绘方式三(使用传统VAE Encode节点+Set Latent Noise Mask节点)的工作流,可以看到两者生成的图片完全一致。
但是这是否意味这两种方法也完全一致呢?
实际上并不是,此时如果我们将使用__InpaintModelConditioning节点__的工作流的模型换成inpainting模型将很清晰的看出它们直接的差别,如下图
可以看出换成inpainting模型后,使用InpaintModelConditioning的重绘方式并不会像Set Noise重绘方式一样进行极强的控制导致几乎无法重绘,而是产生了一种介于使用set Noise的非重绘模型方式和Set Noise使用重绘模型方式之间的一种控制,且这种控制更加集中于人物面部。
然后我们在EasyUse实现InpaintModelConditioning的重绘,如下图,这里仅仅是将__additional__的参数调整为__InpaintModelCond__即可实现,这极大的提升了工作效率。
小总结:使用InpaintModelConditioning节点注意两点:
1、当使用普通模型时候,其效果和要点与使用Set Latent Noise Mask是一样的;
2、当使用inpainting模型时,重绘强度介于Set Noise(inpainting模型)与Set Noise(普通模型)之前,且更关注于人物面部
四、ComfyUI重绘(四)—ControlNet(inpainting模型)
关于controlnet的重绘模型,相信经常使用webUI的使用者一定不会陌生,这里我们直接就在EasyUse里面使用controlnet的inpainting模型进行讲解
让我们加载EasyUse的controlnet的重绘工作流,并点击运行如下图,可以看出EasyUse的controlnet的重绘效果对比上面三种方式是最不好的一种,所以在实际使用时候就排除这种方式了。
五、ComfyUI的重绘(五)----Differential Diffusion节点
关于differential diffusion也就是差分扩散框架可能有很多人并不了解,它是一个可以集成到我们现在所有扩散模型(也就是我们常说的绘图大模型)的框架,可以帮助我们在重绘时,可以更加精细的控制图像内像素的变化,同时使变化部分与原图其余部分确保更加无缝合成。
下面让我们在comfyui中加载__differenital diffusion节点__,如下图,该节点就是调用differential diffusion框架的节点,用法很简单只需要把该节点插入绘图模型和采样器的中间即可
下面让我们加载一个使用差分扩散和不使用差分扩散的对比工作流,来更清晰的认识这个框架起到的作用,点击运行,如下图所示
这里,我们选择让马的图片蒙版部分变成羽毛,让我们放大结果图片进行细致分析
通过上图的图片可以看出我们常用的三种方式中,__加了differential diffusion__后,其效果明显更好,比如在马的腹部羽毛的细致度增加了不少,同时蒙版部分与原图的接缝处也进行了更好的融合。
但是我们可能会注意到在__使用Vae Inpainting的重绘模型方式的条件下这种方式并不起到作用__,如下图所示,这是什么原因造成的呢?
通过我们对Vae Inpainting前面的分析可以知道,__Vae Inpainting与其它重绘方式最大区别__在于其重绘部分的初始噪声是空的蒙版区域产生,而其它的则是蒙版区域原有图片产生的,这导致了差分扩散效果无效的原因
下面我们用EasyUse来实现上面的差分扩散效果,让我们加载EasyUse的差分扩散工作流,可以看到在EasyUse中实现InpaintModelCond的差分十分简单,仅仅需要在EasyKsampler(inpainting)节点选择differential diffusion即可。
六、ImageCompositedMasked节点
节点功能:该节点设计用于组合图像,允许将源图像覆盖在目标图像上,在指定坐标处进行叠加,可选择调整大小和使用遮罩。
输入:
destination: 目标图像,源图像将组合在此图像上。它作为组合操作的背景。
source: 要组合到目标图像上的源图像。此图像可以选择性地调整大小以适应目标图像的尺寸。
mask: 一个可选的遮罩,指定应将源图像的哪些部分组合到目标图像上。这允许进行更复杂的组合操作,如混合或部分叠加。
x: 在目标图像中,源图像左上角放置的x坐标。
y: 在目标图像中,源图像左上角放置的y坐标。
resize_source: 一个布尔标志,指示是否应调整源图像的尺寸以匹配目标图像的尺寸。
虽然经过上述重绘方式我们已经可以实现一个还不错的效果,但我们应该会注意到一个问题,那就是即使我们选择只重绘蒙版区域但是实际上的出图结果也带来了其它区域的变化,这个是因为什么产生的呢?
是因为图片经过VAE 编码再解码产生的像素损失,差异效果如下图,红框部分就是两图的区别
那个对于这个问题我们有没有什么好的解决方案呢?
答案是有的,我们可以使用ImageCompositedMasked节点,如下图
这个节点的作用是将两张图片根据蒙版进行重叠,其中destination是底层图片,source是顶层图片,mask是作用于顶层图片的蒙版,这样我们就可以将原图放在底层,重绘后的图片放在顶层,再通过蒙版叠加即可保证重绘外的区域与原图保持一致
下面我们可以根据这个节点,加载如下工作流,如下图所示
从上图中可以看到经过这个处理后,图片重绘外的区域不会再出现改变了
七、Easy Use小技巧---EasyUse的管理组/XYplot Advanced节点/EasyUse的同类型节点替换
接下来,让我们进行今天最后的部分EasyUse的Tips讲解
1、 EasyUse的管理组
在空白部分鼠标右键进行选择EasyUse的管理组即可
但需要注意的是EasyUse的管理组,需要你在工作流里建立组(Group)才能起作用,主要功能就是,我们可以通过管理组去禁用我们当前不需要运行的组或者直接跳转到对应的组的位置。
2. XYplot Advanced节点
节点功能:是一个用于在图像生成过程中执行批量参数对比和可视化的节点。通过该节点,用户可以快速生成一组图像,对不同参数的影响进行直观的对比和分析。例如,可以调整参数(如种子、提示词、CFG 比例、采样步骤等),并在同一个网格中呈现这些调整对生成结果的影响。
参数:
Grid_spacing:设置Xyplot中每张图片的间隔
Output_individuals:是否分别输出每张图片,这个主要是在保存图片中使用,如果选择false就会只保存一张总体XYPlot图,如果选择true则会将其中每张图片以及总体XYPlot都分别进行保存
Flip_xy: 是否反转X、Y的坐标轴
然后我们这里以不同的步数为X轴,不同CFG为Y轴,如下图所示,XYPlot帮我们以参数的不同匹配去生成所有的图片,然后我们根据结果去选择最符合我们要求的图片
3、 EasyUse的同类型节点替换
首先加载一个简单的EasyUse文生图工作流,然后在PreSampling节点上右键选择Swap EasyPreSampling即可选择替换的同类型节点,具体操作如下图所示
这里我们选择第一个,最终效果如下图所示
可以看出这很方便我们随时切换节点,节省了多余的操作时间
__ComfyUI Easy Use插件(一): __https://articles.zsxq.com/easyuse/1.html
__ComfyUI Easy Use插件(三): __https://articles.zsxq.com/easyuse/3.html
__ComfyUI Easy Use插件(四): __https://articles.zsxq.com/easyuse/4.html
__ComfyUI Easy Use插件(五): __https://articles.zsxq.com/easyuse/5.html
__ComfyUI Easy Use插件(六): __https://articles.zsxq.com/easyuse/6.html
__ComfyUI Easy Use插件(七): __https://articles.zsxq.com/easyuse/7.html
__ComfyUI Easy Use插件(八): __https://articles.zsxq.com/easyuse/8.html