1327522.jpg

Ridley

GF  2024-04-26 00:12
(空的)

[comfyui] 一键AI去衣工作流教程(三)—— 肤色与修复(完结篇)


本教程系列最终为了在comfyui里实现“一键AI去衣”工作流,参考https://south-plus.net/read.php?tid-2157478.html

在阅读本帖前请务必先阅读基础篇教程:https://south-plus.net/read.php?tid-2160293.html

第二篇——自动识别:https://south-plus.net/read.php?tid-2164519.html

本篇教程为第三篇——肤色与修复,主要介绍如何在comfyui中实现蒙版肤色自动提取,以及修复局部重绘后的图像细节。

正式版工作流:https://south-plus.net/read.php?tid-2180363.html

同时,根据之前评论反馈的问题,我在新的工作流中进行了一些修正,主要修改如下:

1. 更换了DensePose预处理器节点,不再需要翻墙才能正常运行
2. 修复了{加载图像}默认生成错误遮罩,不再需要手动清除
3. 根据导入图像的尺寸自动进行缩放(小图像则不缩放),不再需要手动设置缩放系数


肤色提取

在之前的工作流中,皮肤蒙版的颜色需要我们手动输入,那么如何实现肤色自动提取?

通常情况下我们手动提取肤色需要借助额外的软件,对人像中皮肤裸露部位进行颜色吸取,因此我首先想到的是靠算法对图像中的皮肤像素取一个平均或者中位数。但如何让模型识别出皮肤像素呢?

记得在之前的工作流中,我们得到了人物的面部遮罩,虽然不能保证万无一失,但我们导入的图片中人物面部大概率是裸露的(不会有人上传一个假面骑士然后去衣吧)。如此一来我们可以对面部遮罩内的像素进行进一步筛选,我的方法是调用WAS节点的{选择颜色},先筛选出大致肤色颜色范围,然后对这些像素的颜色取均值,如图



这里我对节点进行了一些修改,让节点能够直接输出RGB颜色数值,同时我又对像素添加了可调节选项,使得最终输出的颜色只取red值最高的n%(节点修改文件我会在后面分享),最终的筛选结果参考如下



除此以外如果你还有其他更可靠的自动提取肤色的方法,欢迎分享。

修复

即便你的设置再合理,在局部重绘之后图像仍旧大概率会出现颜色与纹理与遮罩外原图不匹配,甚至有残留色块,因此一个全局重绘以修复图像是不可或缺的,一个最简单的方法就是将图像以低重绘幅度再采样一遍(不要直接传递latent,之前的噪波遮罩还在)



如此一来虽然会细微改变原图,但可以有效修复重绘细节。

高清修复

如果你原先导入的图像分辨率很高,但经过缩放后丢失了大量细节,你或许想将重绘后的图像再放大回原来的分辨率而不是简单的修复。

你可能会想到使用各种图像高清放大插件,但是直接对重绘后图像进行高清放大只会增加不合理的细节,最终结果跟原图想去甚远。

因此,你可以将局部重绘区域经过简单缩放后再与原图合并,再对合并后图像进行全局重绘,这样有效避免了图像放大给非重绘区域带来不必要细节。如图,我用{SD放大(不放大)}节点对合并后图像进行了分块重绘,以避免显存爆炸,同时还串联了新的controlnet节点保证一致性(不要用controlnet tile,tile可能会将要修复的错误色块保留下来)。



当然,如果你的原图实在太高清(>4K),可能不太适合直接放大回原分辨率,除了过于耗时之外,分块放大时每个小分块里可能没有有半点图像细节,模型压根不知道要采样什么东西。


伏笔回收

值得注意的是我在全局修复重绘这一块也使用了controlnet inpaint,它的作用是尽量保证遮罩外区域不变,如此一来即便是全局重绘,也不会过多改变包括人物面部在内的区域。

首先,inpainting大模型与controlnet inpaint功能兼容性很糟糕,两者一起使用可能导致图像崩坏。

在前面的局部重绘部分,你可以不依靠controlnet inpaint而是利用inpainting大模型达到近似效果,但是在全局重绘这里只能通过controlnet inpaint来控制不同区域的重绘幅度,这也是为什么我在基础篇教程里提到不建议使用inpainting后缀的大模型来进行局部重绘。


如此,我们终于实现了完整版的“一键AI去衣”工作流




工作流分享

此帖售价 3 SP币,已有 144 人购买
若发现会员采用欺骗的方法获取财富,请立刻举报,我们会对会员处以2-N倍的罚金,严重者封掉ID!

(默认忽略高清修复,右键节点组启用)

再提一嘴,我用的大模型是fantasticmix_k1,VAE是 vae-ft-mse-840000-ema-pruned。如果你想重绘二次元图像,注意使用跟原图效果相近的大模型。

除了正确安装基础篇里提到的节点外, 为了实现肤色自动提取,你还需要将以下代码覆盖到\custom_nodes\was-node-suite-comfyui\WAS_Node_Suite.py的"class WAS_Image_Select_Color:"类里(注意如果你更新了该节点,需要重新覆盖)

此帖售价 0 SP币,已有 144 人购买
若发现会员采用欺骗的方法获取财富,请立刻举报,我们会对会员处以2-N倍的罚金,严重者封掉ID!


如果你不会或者懒得覆盖,就直接用无肤色提取版的工作流吧。


这次让我看看评论区还有什么bug

none.gif

391f0ba0

B1F  2024-04-27 07:29
大佬这个女的模型叫什么 真好看

none.gif

391f0ba0

B2F  2024-04-28 01:59
大佬 用的无肤色版 点加入队列报错
Error occurred when executing SAMModelLoader (segment anything):



File "G:\ComfyUI-aki-v1.3\execution.py", line 151, in recursive_execute
output_data, output_ui = get_output_data(obj, input_data_all)
File "G:\ComfyUI-aki-v1.3\execution.py", line 81, in get_output_data
return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True)
File "G:\ComfyUI-aki-v1.3\execution.py", line 74, in map_node_over_list
results.append(getattr(obj, func)(**slice_dict(input_data_all, i)))
File "G:\ComfyUI-aki-v1.3\custom_nodes\comfyui_segment_anything\node.py", line 269, in main
sam_model = load_sam_model(model_name)
File "G:\ComfyUI-aki-v1.3\custom_nodes\comfyui_segment_anything\node.py", line 80, in load_sam_model
sam_checkpoint_path = get_local_filepath(
File "G:\ComfyUI-aki-v1.3\custom_nodes\comfyui_segment_anything\node.py", line 111, in get_local_filepath
download_url_to_file(url, destination)
File "", line 28, in download_url_to_file_wrapper_inner
File "G:\ComfyUI-aki-v1.3\python\lib\site-packages\torch\hub.py", line 620, in download_url_to_file
u = urlopen(req)
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 519, in open
response = self._open(req, data)
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 536, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 496, in _call_chain
result = func(*args)
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 1391, in https_open
return self.do_open(http.client.HTTPSConnection, req,
File "G:\ComfyUI-aki-v1.3\python\lib\urllib\request.py", line 1351, in do_open
raise URLError(err)