commit SegformerUltraV2, SegformerClothesPipeline and SegformerFashionPipeline nodes
This commit is contained in:
@@ -98,7 +98,8 @@ When this error has occurred, please check the network environment.
|
|||||||
## Update
|
## Update
|
||||||
<font size="4">**If the dependency package error after updating, please reinstall the relevant dependency packages. </font><br />
|
<font size="4">**If the dependency package error after updating, please reinstall the relevant dependency packages. </font><br />
|
||||||
|
|
||||||
* Commit install_requirements.bat and install_requirements_aki.bat, One click solution to install dependency packages.
|
* Commit [SegformerUltraV2](#SegformerUltraV2), [SegfromerFashionPipeline](#SegfromerFashionPipeline) and [SegformerClothesPipeline](#SegformerClothesPipeline) nodes, used for segmentation of clothing. please download the model file according to the instructions.
|
||||||
|
* Commit ```install_requirements.bat``` and ```install_requirements_aki.bat```, One click solution to install dependency packages.
|
||||||
* Commit [TransparentBackgroundUltra](#TransparentBackgroundUltra) node, it remove background based on transparent-background model.
|
* Commit [TransparentBackgroundUltra](#TransparentBackgroundUltra) node, it remove background based on transparent-background model.
|
||||||
* Change the VitMatte model of the [Ultra](#Ultra) node to a local call. Please download [all files of vitmatte model](https://huggingface.co/hustvl/vitmatte-small-composition-1k/tree/main) to the ```ComfyUI/models/vitmatte``` folder.
|
* Change the VitMatte model of the [Ultra](#Ultra) node to a local call. Please download [all files of vitmatte model](https://huggingface.co/hustvl/vitmatte-small-composition-1k/tree/main) to the ```ComfyUI/models/vitmatte``` folder.
|
||||||
* [GetColorToneV2](#GetColorToneV2) node add the ```mask``` method to the color selection option, which can accurately obtain the main color and average color within the mask.
|
* [GetColorToneV2](#GetColorToneV2) node add the ```mask``` method to the color selection option, which can accurately obtain the main color and average color within the mask.
|
||||||
@@ -1561,7 +1562,7 @@ Generate masks for characters' faces, hair, arms, legs, and clothing, mainly use
|
|||||||
The model segmentation code is from[StartHua](https://github.com/StartHua/Comfyui_segformer_b2_clothes),thanks to the original author.
|
The model segmentation code is from[StartHua](https://github.com/StartHua/Comfyui_segformer_b2_clothes),thanks to the original author.
|
||||||
Compared to the comfyui_segformer_b2_clothes, this node has ultra-high edge details. (Note: Generating images with edges exceeding 2K in size using the VITMatte method will consume a lot of memory)
|
Compared to the comfyui_segformer_b2_clothes, this node has ultra-high edge details. (Note: Generating images with edges exceeding 2K in size using the VITMatte method will consume a lot of memory)
|
||||||
|
|
||||||
*Download all model files from [https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes) to ```ComfyUI/models/segformer_b2_clothes``` folder.
|
*Download all model files from [here](https://huggingface.co/mattmdjaga/segformer_b2_clothes/tree/main) to ```ComfyUI/models/segformer_b2_clothes``` folder.
|
||||||
|
|
||||||
Node Options:
|
Node Options:
|
||||||

|

|
||||||
@@ -1589,6 +1590,103 @@ Node Options:
|
|||||||
* device: Set whether the VitMatte to use cuda.
|
* device: Set whether the VitMatte to use cuda.
|
||||||
* max_megapixels: Set the maximum size for VitMate operations.
|
* max_megapixels: Set the maximum size for VitMate operations.
|
||||||
|
|
||||||
|
### <a id="table1">SegformerUltraV2</a>
|
||||||
|

|
||||||
|

|
||||||
|
Using the segformer model to segment clothing with ultra-high edge details. Currently supports segformer b2 clothes, segformer b3 clothes and segformer b3 fashion。
|
||||||
|
|
||||||
|
*from [here](https://huggingface.co/mattmdjaga/segformer_b2_clothes/tree/main) download all files to ```ComfyUI/models/segformer_b2_clothes``` folder.
|
||||||
|
*from [here](https://huggingface.co/sayeed99/segformer_b3_clothes/tree/main) download all files to ```ComfyUI/models/segformer_b3_clothes``` folder.
|
||||||
|
*from [here](https://huggingface.co/sayeed99/segformer-b3-fashion/tree/main) download all files to ```ComfyUI/models/segformer_b3_fashion``` folder.
|
||||||
|
|
||||||
|
Node Options:
|
||||||
|

|
||||||
|
* image: The input image.
|
||||||
|
* segformer_pipeline: Segformer pipeline input. The pipeline is output by SegformerClottesPipeline and SegformerFashionPipeline node.
|
||||||
|
* detail_method: Edge processing methods. provides VITMatte, VITMatte(local), PyMatting, GuidedFilter. If the model has been downloaded after the first use of VITMatte, you can use VITMatte (local) afterwards.
|
||||||
|
* detail_erode: Mask the erosion range inward from the edge. the larger the value, the larger the range of inward repair.
|
||||||
|
* detail_dilate: The edge of the mask expands outward. the larger the value, the wider the range of outward repair.
|
||||||
|
* black_point: Edge black sampling threshold.
|
||||||
|
* white_point: Edge white sampling threshold.
|
||||||
|
* process_detail: Set to false here will skip edge processing to save runtime.
|
||||||
|
* device: Set whether the VitMatte to use cuda.
|
||||||
|
* max_megapixels: Set the maximum size for VitMate operations.
|
||||||
|
|
||||||
|
### <a id="table1">SegformerClothesPipiline</a>
|
||||||
|
Select the segformer clothes model and choose the segmentation content.
|
||||||
|
|
||||||
|
Node Options:
|
||||||
|

|
||||||
|
* model: Model selection. There are currently two models available to choose from for segformer b2 clothes and segformer b3 clothes.
|
||||||
|
* face: Facial recognition switch.
|
||||||
|
* hair: Hair recognition switch.
|
||||||
|
* hat: Hat recognition switch.
|
||||||
|
* sunglass: Sunglass recognition switch.
|
||||||
|
* left_arm: Left arm recognition switch.
|
||||||
|
* right_arm: Right arm recognition switch.
|
||||||
|
* left_leg: Left leg recognition switch.
|
||||||
|
* right_leg: Right leg recognition switch.
|
||||||
|
* left_shoe: Left shoe recognition switch.
|
||||||
|
* right_shoe: Right shoe recognition switch.
|
||||||
|
* skirt: Skirt recognition switch.
|
||||||
|
* pants: Pants recognition switch.
|
||||||
|
* dress: Dress recognition switch.
|
||||||
|
* belt: Belt recognition switch.
|
||||||
|
* bag: Bag recognition switch.
|
||||||
|
* scarf: Scarf recognition switch.
|
||||||
|
|
||||||
|
### <a id="table1">SegformerFashionPipiline</a>
|
||||||
|
Select the segformer fashion model and choose the segmentation content.
|
||||||
|
|
||||||
|
Node Options:
|
||||||
|

|
||||||
|
* model: Model selection. Currently, there is only one model available for selection: segformer b3 fashion。
|
||||||
|
* shirt: shirt and blouse switch.
|
||||||
|
* top: top, t-shirt, sweatshirt switch.
|
||||||
|
* sweater: sweater switch.
|
||||||
|
* cardigan: cardigan switch.
|
||||||
|
* jacket: jacket switch.
|
||||||
|
* vest: vest switch.
|
||||||
|
* pants: pants switch.
|
||||||
|
* shorts: shorts switch.
|
||||||
|
* skirt: skirt switch.
|
||||||
|
* coat: coat switch.
|
||||||
|
* dress: dress switch.
|
||||||
|
* jumpsuit: jumpsuit switch.
|
||||||
|
* cape: cape switch.
|
||||||
|
* glasses: glasses switch.
|
||||||
|
* hat: hat switch.
|
||||||
|
* hairaccessory: headband, head covering, hair accessory switch.
|
||||||
|
* tie: tie switch.
|
||||||
|
* glove: glove switch.
|
||||||
|
* watch: watch switch.
|
||||||
|
* belt: belt switch.
|
||||||
|
* legwarmer: leg warmer switch.
|
||||||
|
* tights: tights and stockings switch.
|
||||||
|
* sock: sock switch.
|
||||||
|
* shoe: shoes switch.
|
||||||
|
* bagwallet: bag and wallet switch.
|
||||||
|
* scarf: scarf switch.
|
||||||
|
* umbrella: umbrella switch.
|
||||||
|
* hood: hood switch.
|
||||||
|
* collar: collar switch.
|
||||||
|
* lapel: lapel switch.
|
||||||
|
* epaulette: epaulette switch.
|
||||||
|
* sleeve: sleeve switch.
|
||||||
|
* pocket: pocket switch.
|
||||||
|
* neckline: neckline switch.
|
||||||
|
* buckle: buckle switch.
|
||||||
|
* zipper: zipper switch.
|
||||||
|
* applique: applique switch.
|
||||||
|
* bead: bead switch.
|
||||||
|
* bow: bow switch.
|
||||||
|
* flower: flower switch.
|
||||||
|
* fringe: fringe switch.
|
||||||
|
* ribbon: ribbon switch.
|
||||||
|
* rivet: rivet switch.
|
||||||
|
* ruffle: ruffle switch.
|
||||||
|
* sequin: sequin switch.
|
||||||
|
* tassel: tassel switch.
|
||||||
|
|
||||||
### <a id="table1">MaskEdgeUltraDetail</a>
|
### <a id="table1">MaskEdgeUltraDetail</a>
|
||||||
Process rough masks to ultra fine edges.
|
Process rough masks to ultra fine edges.
|
||||||
|
|||||||
+102
-2
@@ -99,7 +99,8 @@ git clone https://github.com/chflame163/ComfyUI_LayerStyle.git
|
|||||||
## 更新说明
|
## 更新说明
|
||||||
<font size="4">**如果本插件更新后出现依赖包错误,请重新安装相关依赖包。
|
<font size="4">**如果本插件更新后出现依赖包错误,请重新安装相关依赖包。
|
||||||
|
|
||||||
* 添加 install_requirements.bat 和 install_requirements_aki.bat 文件, 一键解决安装依赖包问题。
|
* 添加 [SegformerUltraV2](#SegformerUltraV2), [SegfromerFashionPipeline](#SegfromerFashionPipeline) 和 [SegformerClothesPipeline](#SegformerClothesPipeline) 节点, 用于分割服饰。请按说明下载模型文件。
|
||||||
|
* 添加 ```install_requirements.bat``` 和 ```install_requirements_aki.bat``` 文件, 一键解决安装依赖包问题。
|
||||||
* 添加[TransparentBackgroundUltra](#TransparentBackgroundUltra) 节点,基于transparent-background模型,用于去除背景。
|
* 添加[TransparentBackgroundUltra](#TransparentBackgroundUltra) 节点,基于transparent-background模型,用于去除背景。
|
||||||
* [Ultra](#Ultra) 节点的VitMatte模型改为本地调用,请下载[所有的vitmatte模型文件](https://huggingface.co/hustvl/vitmatte-small-composition-1k/tree/main)到```ComfyUI/models/vitmatte```文件夹。
|
* [Ultra](#Ultra) 节点的VitMatte模型改为本地调用,请下载[所有的vitmatte模型文件](https://huggingface.co/hustvl/vitmatte-small-composition-1k/tree/main)到```ComfyUI/models/vitmatte```文件夹。
|
||||||
* [GetColorToneV2](#GetColorToneV2) 节点的取色选项增加```mask```方法,可精确获取遮罩内的主色和平均色。
|
* [GetColorToneV2](#GetColorToneV2) 节点的取色选项增加```mask```方法,可精确获取遮罩内的主色和平均色。
|
||||||
@@ -1542,7 +1543,7 @@ PersonMaskUltra的V2升级版,增加了VITMatte边缘处理方法。
|
|||||||
为人物生成脸、头发、手臂、腿以及服饰的遮罩,主要用于分割服装。模型分割代码来自[StartHua](https://github.com/StartHua/Comfyui_segformer_b2_clothes),感谢原作者。
|
为人物生成脸、头发、手臂、腿以及服饰的遮罩,主要用于分割服装。模型分割代码来自[StartHua](https://github.com/StartHua/Comfyui_segformer_b2_clothes),感谢原作者。
|
||||||
与comfyui_segformer_b2_clothes节点相比,这个节点具有超高的边缘细节。
|
与comfyui_segformer_b2_clothes节点相比,这个节点具有超高的边缘细节。
|
||||||
|
|
||||||
*从[https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)下载全部文件至```ComfyUI/models/segformer_b2_clothes```文件夹。
|
*从[这里](https://huggingface.co/mattmdjaga/segformer_b2_clothes/tree/main)下载全部文件至```ComfyUI/models/segformer_b2_clothes```文件夹。
|
||||||
|
|
||||||
节点选项说明:
|
节点选项说明:
|
||||||

|

|
||||||
@@ -1570,6 +1571,105 @@ PersonMaskUltra的V2升级版,增加了VITMatte边缘处理方法。
|
|||||||
* device: 设置是否使用cuda。
|
* device: 设置是否使用cuda。
|
||||||
* max_megapixels: 设置vitmatte运算的最大尺寸。
|
* max_megapixels: 设置vitmatte运算的最大尺寸。
|
||||||
|
|
||||||
|
|
||||||
|
### <a id="table1">SegformerUltraV2</a>
|
||||||
|

|
||||||
|

|
||||||
|
使用segformer模型分割服饰,具有超高的边缘细节。目前支持segformer b2 clothes, segformer b3 clothes, segformer b3 fashion。
|
||||||
|
|
||||||
|
*从[这里](https://huggingface.co/mattmdjaga/segformer_b2_clothes/tree/main)下载全部文件至```ComfyUI/models/segformer_b2_clothes```文件夹。
|
||||||
|
*从[这里](https://huggingface.co/sayeed99/segformer_b3_clothes/tree/main)下载全部文件至```ComfyUI/models/segformer_b3_clothes```文件夹。
|
||||||
|
*从[这里](https://huggingface.co/sayeed99/segformer-b3-fashion/tree/main)下载全部文件至```ComfyUI/models/segformer_b3_fashion```文件夹。
|
||||||
|
|
||||||
|
节点选项说明:
|
||||||
|

|
||||||
|
* image: 图像输入。
|
||||||
|
* segformer_pipeline: segformer管线输入。管线由SegformerClothesPipeline和SegformerFashionPipeline节点输出。
|
||||||
|
* detail_method: 边缘处理方法。提供了VITMatte, VITMatte(local), PyMatting, GuidedFilter。如果首次使用VITMatte后模型已经下载,之后可以使用VITMatte(local)。
|
||||||
|
* detail_erode: 遮罩边缘向内侵蚀范围。数值越大,向内修复的范围越大。
|
||||||
|
* detail_dilate: 遮罩边缘向外扩张范围。数值越大,向外修复的范围越大。
|
||||||
|
* black_point: 边缘黑色采样阈值。
|
||||||
|
* white_point: 边缘黑色采样阈值。
|
||||||
|
* process_detail: 此处设为False将跳过边缘处理以节省运行时间。
|
||||||
|
* device: 设置是否使用cuda。
|
||||||
|
* max_megapixels: 设置vitmatte运算的最大尺寸。
|
||||||
|
|
||||||
|
### <a id="table1">SegformerClothesPipiline</a>
|
||||||
|
选择segformer clothes模型,并选择分割内容。
|
||||||
|
|
||||||
|
节点选项说明:
|
||||||
|

|
||||||
|
* model: 模型选择。目前有两种模型可供选择segformer b2 clothes, segformer b3 clothes。
|
||||||
|
* face: 脸部识别。
|
||||||
|
* hair: 头发识别。
|
||||||
|
* hat: 帽子识别。
|
||||||
|
* sunglass: 墨镜识别。
|
||||||
|
* left_arm:左手臂识别。
|
||||||
|
* right_arm:右手臂识别。
|
||||||
|
* left_leg:左腿识别。
|
||||||
|
* right_leg:右腿识别。
|
||||||
|
* left_shoe: 左鞋子识别。
|
||||||
|
* right_shoe: 右鞋子识别。
|
||||||
|
* skirt:短裙识别。
|
||||||
|
* pants:裤子识别。
|
||||||
|
* dress:连衣裙识别。
|
||||||
|
* belt:腰带识别。
|
||||||
|
* bag:背包识别。
|
||||||
|
* scarf:围巾识别。
|
||||||
|
|
||||||
|
### <a id="table1">SegformerFashionPipiline</a>
|
||||||
|
选择segformer fashion模型,并选择分割内容。
|
||||||
|
|
||||||
|
节点选项说明:
|
||||||
|

|
||||||
|
* model: 模型选择。目前只有一种模型可供选择segformer b3 fashion。
|
||||||
|
* shirt: 衬衫、罩衫识别。
|
||||||
|
* top: 上衣、t恤、运动衫识别。
|
||||||
|
* sweater: 毛衣识别。
|
||||||
|
* cardigan: 开襟毛衫识别。
|
||||||
|
* jacket: 夹克识别。
|
||||||
|
* vest: 背心识别。
|
||||||
|
* pants: 裤子识别。
|
||||||
|
* shorts: 短裤识别。
|
||||||
|
* skirt: 短裙识别。
|
||||||
|
* coat: 外套识别。
|
||||||
|
* dress: 连衣裙识别。
|
||||||
|
* jumpsuit: 连身裤识别。
|
||||||
|
* cape: 斗篷识别。
|
||||||
|
* glasses: 眼镜识别。
|
||||||
|
* hat: 帽子识别。
|
||||||
|
* hairaccessory: 头带、头巾、发饰识别。
|
||||||
|
* tie: 领带识别。
|
||||||
|
* glove: 手套识别。
|
||||||
|
* watch: 手表识别。
|
||||||
|
* belt: 皮带识别。
|
||||||
|
* legwarmer: 腿套识别。
|
||||||
|
* tights: 紧身裤和长筒袜识别。
|
||||||
|
* sock: 袜子识别。
|
||||||
|
* shoe: 鞋子识别。
|
||||||
|
* bagwallet: 背包、钱包识别。
|
||||||
|
* scarf: 围巾识别。
|
||||||
|
* umbrella: 雨伞识别。
|
||||||
|
* hood: 兜帽识别。
|
||||||
|
* collar: 衣领识别。
|
||||||
|
* lapel: 翻领识别。
|
||||||
|
* epaulette: 肩章识别。
|
||||||
|
* sleeve: 袖子识别。
|
||||||
|
* pocket: 口袋识别。
|
||||||
|
* neckline: 领口识别。
|
||||||
|
* buckle: 带扣识别。
|
||||||
|
* zipper: 拉链识别。
|
||||||
|
* applique: 贴花识别。
|
||||||
|
* bead: 珠子识别。
|
||||||
|
* bow: 蝴蝶结识别。
|
||||||
|
* flower: 花识别。
|
||||||
|
* fringe: 刘海识别。
|
||||||
|
* ribbon: 丝带识别。
|
||||||
|
* rivet: 铆钉识别。
|
||||||
|
* ruffle: 褶饰识别。
|
||||||
|
* sequin: 亮片识别。
|
||||||
|
* tassel: 流苏识别。
|
||||||
|
|
||||||
### <a id="table1">MaskEdgeUltraDetail</a>
|
### <a id="table1">MaskEdgeUltraDetail</a>
|
||||||
处理较粗糙的遮罩使其获得超精细边缘。
|
处理较粗糙的遮罩使其获得超精细边缘。
|
||||||

|

|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 184 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 178 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
@@ -1470,6 +1470,8 @@ class VITMatteModel:
|
|||||||
self.processor = processor
|
self.processor = processor
|
||||||
|
|
||||||
def load_VITMatte_model(model_name:str, local_files_only:bool=False) -> object:
|
def load_VITMatte_model(model_name:str, local_files_only:bool=False) -> object:
|
||||||
|
# if local_files_only:
|
||||||
|
# model_name = Path(os.path.join(folder_paths.models_dir, "vitmatte"))
|
||||||
model_name = Path(os.path.join(folder_paths.models_dir, "vitmatte"))
|
model_name = Path(os.path.join(folder_paths.models_dir, "vitmatte"))
|
||||||
from transformers import VitMatteImageProcessor, VitMatteForImageMatting
|
from transformers import VitMatteImageProcessor, VitMatteForImageMatting
|
||||||
model = VitMatteForImageMatting.from_pretrained(model_name, local_files_only=local_files_only)
|
model = VitMatteForImageMatting.from_pretrained(model_name, local_files_only=local_files_only)
|
||||||
|
|||||||
+375
-18
@@ -6,14 +6,20 @@ from transformers import SegformerImageProcessor, AutoModelForSemanticSegmentati
|
|||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
from .imagefunc import *
|
from .imagefunc import *
|
||||||
|
|
||||||
NODE_NAME = 'SegformerB2ClothesUltra'
|
|
||||||
|
class SegformerPipeline:
|
||||||
|
def __init__(self):
|
||||||
|
self.model_name = ''
|
||||||
|
self.segment_label = []
|
||||||
|
|
||||||
|
SegPipeline = SegformerPipeline()
|
||||||
|
|
||||||
# 切割服装
|
# 切割服装
|
||||||
def get_segmentation(tensor_image):
|
def get_segmentation(tensor_image, model_name='segformer_b2_clothes'):
|
||||||
cloth = tensor2pil(tensor_image)
|
cloth = tensor2pil(tensor_image)
|
||||||
model_folder_path = os.path.join(folder_paths.models_dir, "segformer_b2_clothes")
|
model_folder_path = os.path.join(folder_paths.models_dir, model_name)
|
||||||
try:
|
try:
|
||||||
model_folder_path = os.path.normpath(folder_paths.folder_names_and_paths['segformer_b2_clothes'][0][0])
|
model_folder_path = os.path.normpath(folder_paths.folder_names_and_paths[model_name][0][0])
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -31,19 +37,20 @@ def get_segmentation(tensor_image):
|
|||||||
class Segformer_B2_Clothes:
|
class Segformer_B2_Clothes:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.NODE_NAME = 'SegformerB2ClothesUltra'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Labels: 0: "Background", 1: "Hat", 2: "Hair", 3: "Sunglasses", 4: "Upper-clothes", 5: "Skirt",
|
# Labels: 0: "Background", 1: "Hat", 2: "Hair", 3: "Sunglasses", 4: "Upper-clothes", 5: "Skirt",
|
||||||
# 6: "Pants", 7: "Dress", 8: "Belt", 9: "Left-shoe", 10: "Right-shoe", 11: "Face",
|
# 6: "Pants", 7: "Dress", 8: "Belt", 9: "Left-shoe", 10: "Right-shoe", 11: "Face",
|
||||||
# 12: "Left-leg", 13: "Right-leg", 14: "Left-arm", 15: "Right-arm", 16: "Bag", 17: "Scarf"
|
# 12: "Left-leg", 13: "Right-leg", 14: "Left-arm", 15: "Right-arm", 16: "Bag", 17: "Scarf"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(cls):
|
def INPUT_TYPES(cls):
|
||||||
method_list = ['VITMatte', 'VITMatte(local)', 'PyMatting', 'GuidedFilter', ]
|
method_list = ['VITMatte', 'VITMatte(local)', 'PyMatting', 'GuidedFilter', ]
|
||||||
device_list = ['cuda','cpu']
|
device_list = ['cuda', 'cpu']
|
||||||
return {"required":
|
return {"required":
|
||||||
{
|
{
|
||||||
"image":("IMAGE",),
|
"image": ("IMAGE",),
|
||||||
"face": ("BOOLEAN", {"default": False}),
|
"face": ("BOOLEAN", {"default": False}),
|
||||||
"hair": ("BOOLEAN", {"default": False}),
|
"hair": ("BOOLEAN", {"default": False}),
|
||||||
"hat": ("BOOLEAN", {"default": False}),
|
"hat": ("BOOLEAN", {"default": False}),
|
||||||
@@ -63,16 +70,18 @@ class Segformer_B2_Clothes:
|
|||||||
"detail_method": (method_list,),
|
"detail_method": (method_list,),
|
||||||
"detail_erode": ("INT", {"default": 12, "min": 1, "max": 255, "step": 1}),
|
"detail_erode": ("INT", {"default": 12, "min": 1, "max": 255, "step": 1}),
|
||||||
"detail_dilate": ("INT", {"default": 6, "min": 1, "max": 255, "step": 1}),
|
"detail_dilate": ("INT", {"default": 6, "min": 1, "max": 255, "step": 1}),
|
||||||
"black_point": ("FLOAT", {"default": 0.15, "min": 0.01, "max": 0.98, "step": 0.01, "display": "slider"}),
|
"black_point": (
|
||||||
"white_point": ("FLOAT", {"default": 0.99, "min": 0.02, "max": 0.99, "step": 0.01, "display": "slider"}),
|
"FLOAT", {"default": 0.15, "min": 0.01, "max": 0.98, "step": 0.01, "display": "slider"}),
|
||||||
|
"white_point": (
|
||||||
|
"FLOAT", {"default": 0.99, "min": 0.02, "max": 0.99, "step": 0.01, "display": "slider"}),
|
||||||
"process_detail": ("BOOLEAN", {"default": True}),
|
"process_detail": ("BOOLEAN", {"default": True}),
|
||||||
"device": (device_list,),
|
"device": (device_list,),
|
||||||
"max_megapixels": ("FLOAT", {"default": 2.0, "min": 1, "max": 999, "step": 0.1}),
|
"max_megapixels": ("FLOAT", {"default": 2.0, "min": 1, "max": 999, "step": 0.1}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN_TYPES = ("IMAGE", "MASK", )
|
RETURN_TYPES = ("IMAGE", "MASK",)
|
||||||
RETURN_NAMES = ("image", "mask", )
|
RETURN_NAMES = ("image", "mask",)
|
||||||
FUNCTION = "segformer_ultra"
|
FUNCTION = "segformer_ultra"
|
||||||
CATEGORY = '😺dzNodes/LayerMask'
|
CATEGORY = '😺dzNodes/LayerMask'
|
||||||
|
|
||||||
@@ -147,7 +156,8 @@ class Segformer_B2_Clothes:
|
|||||||
_mask = tensor2pil(mask_edge_detail(i, _mask, detail_range // 8 + 1, black_point, white_point))
|
_mask = tensor2pil(mask_edge_detail(i, _mask, detail_range // 8 + 1, black_point, white_point))
|
||||||
else:
|
else:
|
||||||
_trimap = generate_VITMatte_trimap(_mask, detail_erode, detail_dilate)
|
_trimap = generate_VITMatte_trimap(_mask, detail_erode, detail_dilate)
|
||||||
_mask = generate_VITMatte(orig_image, _trimap, local_files_only=local_files_only, device=device, max_megapixels=max_megapixels)
|
_mask = generate_VITMatte(orig_image, _trimap, local_files_only=local_files_only, device=device,
|
||||||
|
max_megapixels=max_megapixels)
|
||||||
_mask = tensor2pil(histogram_remap(pil2tensor(_mask), black_point, white_point))
|
_mask = tensor2pil(histogram_remap(pil2tensor(_mask), black_point, white_point))
|
||||||
else:
|
else:
|
||||||
_mask = mask2image(_mask)
|
_mask = mask2image(_mask)
|
||||||
@@ -156,13 +166,360 @@ class Segformer_B2_Clothes:
|
|||||||
ret_images.append(pil2tensor(ret_image))
|
ret_images.append(pil2tensor(ret_image))
|
||||||
ret_masks.append(image2mask(_mask))
|
ret_masks.append(image2mask(_mask))
|
||||||
|
|
||||||
log(f"{NODE_NAME} Processed {len(ret_images)} image(s).", message_type='finish')
|
log(f"{self.NODE_NAME} Processed {len(ret_images)} image(s).", message_type='finish')
|
||||||
|
return (torch.cat(ret_images, dim=0), torch.cat(ret_masks, dim=0),)
|
||||||
|
|
||||||
|
class SegformerClothesPipelineLoader:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.NODE_NAME = 'SegformerClothesPipelineLoader'
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Labels: 0: "Background", 1: "Hat", 2: "Hair", 3: "Sunglasses", 4: "Upper-clothes",
|
||||||
|
# 5: "Skirt", 6: "Pants", 7: "Dress", 8: "Belt", 9: "Left-shoe", 10: "Right-shoe",
|
||||||
|
# 11: "Face", 12: "Left-leg", 13: "Right-leg", 14: "Left-arm", 15: "Right-arm",
|
||||||
|
# 17: "Scarf"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(cls):
|
||||||
|
model_list = ['segformer_b3_clothes', 'segformer_b2_clothes']
|
||||||
|
return {"required":
|
||||||
|
{ "model": (model_list,),
|
||||||
|
"face": ("BOOLEAN", {"default": False, "label_on": "enabled(脸)", "label_off": "disabled(脸)"}),
|
||||||
|
"hair": ("BOOLEAN", {"default": False, "label_on": "enabled(头发)", "label_off": "disabled(头发)"}),
|
||||||
|
"hat": ("BOOLEAN", {"default": False, "label_on": "enabled(帽子)", "label_off": "disabled(帽子)"}),
|
||||||
|
"sunglass": ("BOOLEAN", {"default": False, "label_on": "enabled(墨镜)", "label_off": "disabled(墨镜)"}),
|
||||||
|
"left_arm": ("BOOLEAN", {"default": False, "label_on": "enabled(左臂)", "label_off": "disabled(左臂)"}),
|
||||||
|
"right_arm": ("BOOLEAN", {"default": False, "label_on": "enabled(右臂)", "label_off": "disabled(右臂)"}),
|
||||||
|
"left_leg": ("BOOLEAN", {"default": False, "label_on": "enabled(左腿)", "label_off": "disabled(左腿)"}),
|
||||||
|
"right_leg": ("BOOLEAN", {"default": False, "label_on": "enabled(右腿)", "label_off": "disabled(右腿)"}),
|
||||||
|
"left_shoe": ("BOOLEAN", {"default": False, "label_on": "enabled(左鞋)", "label_off": "disabled(左鞋)"}),
|
||||||
|
"right_shoe": ("BOOLEAN", {"default": False, "label_on": "enabled(右鞋)", "label_off": "disabled(右鞋)"}),
|
||||||
|
"upper_clothes": ("BOOLEAN", {"default": False, "label_on": "enabled(上衣)", "label_off": "disabled(上衣)"}),
|
||||||
|
"skirt": ("BOOLEAN", {"default": False, "label_on": "enabled(短裙)", "label_off": "disabled(短裙)"}),
|
||||||
|
"pants": ("BOOLEAN", {"default": False, "label_on": "enabled(裤子)", "label_off": "disabled(裤子)"}),
|
||||||
|
"dress": ("BOOLEAN", {"default": False, "label_on": "enabled(连衣裙)", "label_off": "disabled(连衣裙)"}),
|
||||||
|
"belt": ("BOOLEAN", {"default": False, "label_on": "enabled(腰带)", "label_off": "disabled(腰带)"}),
|
||||||
|
"bag": ("BOOLEAN", {"default": False, "label_on": "enabled(背包)", "label_off": "disabled(背包)"}),
|
||||||
|
"scarf": ("BOOLEAN", {"default": False, "label_on": "enabled(围巾)", "label_off": "disabled(围巾)"}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("SegPipeline",)
|
||||||
|
RETURN_NAMES = ("segformer_pipeline",)
|
||||||
|
FUNCTION = "segformer_clothes_pipeline_loader"
|
||||||
|
CATEGORY = '😺dzNodes/LayerMask'
|
||||||
|
|
||||||
|
def segformer_clothes_pipeline_loader(self, model,
|
||||||
|
face, hat, hair, sunglass,
|
||||||
|
left_leg, right_leg, left_arm, right_arm, left_shoe, right_shoe,
|
||||||
|
upper_clothes, skirt, pants, dress, belt, bag, scarf,
|
||||||
|
):
|
||||||
|
|
||||||
|
pipeline = SegformerPipeline()
|
||||||
|
labels_to_keep = [0]
|
||||||
|
if not hat:
|
||||||
|
labels_to_keep.append(1)
|
||||||
|
if not hair:
|
||||||
|
labels_to_keep.append(2)
|
||||||
|
if not sunglass:
|
||||||
|
labels_to_keep.append(3)
|
||||||
|
if not upper_clothes:
|
||||||
|
labels_to_keep.append(4)
|
||||||
|
if not skirt:
|
||||||
|
labels_to_keep.append(5)
|
||||||
|
if not pants:
|
||||||
|
labels_to_keep.append(6)
|
||||||
|
if not dress:
|
||||||
|
labels_to_keep.append(7)
|
||||||
|
if not belt:
|
||||||
|
labels_to_keep.append(8)
|
||||||
|
if not left_shoe:
|
||||||
|
labels_to_keep.append(9)
|
||||||
|
if not right_shoe:
|
||||||
|
labels_to_keep.append(10)
|
||||||
|
if not face:
|
||||||
|
labels_to_keep.append(11)
|
||||||
|
if not left_leg:
|
||||||
|
labels_to_keep.append(12)
|
||||||
|
if not right_leg:
|
||||||
|
labels_to_keep.append(13)
|
||||||
|
if not left_arm:
|
||||||
|
labels_to_keep.append(14)
|
||||||
|
if not right_arm:
|
||||||
|
labels_to_keep.append(15)
|
||||||
|
if not bag:
|
||||||
|
labels_to_keep.append(16)
|
||||||
|
if not scarf:
|
||||||
|
labels_to_keep.append(17)
|
||||||
|
pipeline.segment_label = labels_to_keep
|
||||||
|
pipeline.model_name = model
|
||||||
|
return (pipeline,)
|
||||||
|
|
||||||
|
class SegformerFashionPipelineLoader:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.NODE_NAME = 'SegformerFashionPipelineLoader'
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(cls):
|
||||||
|
model_list = ['segformer_b3_fashion']
|
||||||
|
return {"required":
|
||||||
|
{ "model": (model_list,),
|
||||||
|
"shirt": ("BOOLEAN", {"default": False, "label_on": "enabled(衬衫、罩衫)", "label_off": "disabled(衬衫、罩衫)"}),
|
||||||
|
"top": ("BOOLEAN", {"default": False, "label_on": "enabled(上衣、t恤)", "label_off": "disabled(上衣、t恤)"}),
|
||||||
|
"sweater": ("BOOLEAN", {"default": False, "label_on": "enabled(毛衣)", "label_off": "disabled(毛衣)"}),
|
||||||
|
"cardigan": ("BOOLEAN", {"default": False, "label_on": "enabled(开襟毛衫)", "label_off": "disabled(开襟毛衫)"}),
|
||||||
|
"jacket": ("BOOLEAN", {"default": False, "label_on": "enabled(夹克)", "label_off": "disabled(夹克)"}),
|
||||||
|
"vest": ("BOOLEAN", {"default": False, "label_on": "enabled(背心)", "label_off": "disabled(背心)"}),
|
||||||
|
"pants": ("BOOLEAN", {"default": False, "label_on": "enabled(裤子)", "label_off": "disabled(裤子)"}),
|
||||||
|
"shorts": ("BOOLEAN", {"default": False, "label_on": "enabled(短裤)", "label_off": "disabled(短裤)"}),
|
||||||
|
"skirt": ("BOOLEAN", {"default": False, "label_on": "enabled(裙子)", "label_off": "disabled(裙子)"}),
|
||||||
|
"coat": ("BOOLEAN", {"default": False, "label_on": "enabled(外套)", "label_off": "disabled(外套)"}),
|
||||||
|
"dress": ("BOOLEAN", {"default": False, "label_on": "enabled(连衣裙)", "label_off": "disabled(连衣裙)"}),
|
||||||
|
"jumpsuit": ("BOOLEAN", {"default": False, "label_on": "enabled(连身裤)", "label_off": "disabled(连身裤)"}),
|
||||||
|
"cape": ("BOOLEAN", {"default": False, "label_on": "enabled(斗篷)", "label_off": "disabled(斗篷)"}),
|
||||||
|
"glasses": ("BOOLEAN", {"default": False, "label_on": "enabled(眼镜)", "label_off": "disabled(眼镜)"}),
|
||||||
|
"hat": ("BOOLEAN", {"default": False, "label_on": "enabled(帽子)", "label_off": "disabled(帽子)"}),
|
||||||
|
"hairaccessory": ("BOOLEAN", {"default": False, "label_on": "enabled(头带)", "label_off": "disabled(头带)"}),
|
||||||
|
"tie": ("BOOLEAN", {"default": False, "label_on": "enabled(领带)", "label_off": "disabled(领带)"}),
|
||||||
|
"glove": ("BOOLEAN", {"default": False, "label_on": "enabled(手套)", "label_off": "disabled(手套)"}),
|
||||||
|
"watch": ("BOOLEAN", {"default": False, "label_on": "enabled(手表)", "label_off": "disabled(手表)"}),
|
||||||
|
"belt": ("BOOLEAN", {"default": False, "label_on": "enabled(皮带)", "label_off": "disabled(皮带)"}),
|
||||||
|
"legwarmer": ("BOOLEAN", {"default": False, "label_on": "enabled(腿套)", "label_off": "disabled(腿套)"}),
|
||||||
|
"tights": ("BOOLEAN", {"default": False, "label_on": "enabled(裤袜)","label_off": "disabled(裤袜)"}),
|
||||||
|
"sock": ("BOOLEAN", {"default": False, "label_on": "enabled(袜子)", "label_off": "disabled(袜子)"}),
|
||||||
|
"shoe": ("BOOLEAN", {"default": False, "label_on": "enabled(鞋子)", "label_off": "disabled(鞋子)"}),
|
||||||
|
"bagwallet": ("BOOLEAN", {"default": False, "label_on": "enabled(手包)", "label_off": "disabled(手包)"}),
|
||||||
|
"scarf": ("BOOLEAN", {"default": False, "label_on": "enabled(围巾)", "label_off": "disabled(围巾)"}),
|
||||||
|
"umbrella": ("BOOLEAN", {"default": False, "label_on": "enabled(雨伞)", "label_off": "disabled(雨伞)"}),
|
||||||
|
"hood": ("BOOLEAN", {"default": False, "label_on": "enabled(兜帽)", "label_off": "disabled(兜帽)"}),
|
||||||
|
"collar": ("BOOLEAN", {"default": False, "label_on": "enabled(衣领)", "label_off": "disabled(衣领)"}),
|
||||||
|
"lapel": ("BOOLEAN", {"default": False, "label_on": "enabled(翻领)", "label_off": "disabled(翻领)"}),
|
||||||
|
"epaulette": ("BOOLEAN", {"default": False, "label_on": "enabled(肩章)", "label_off": "disabled(肩章)"}),
|
||||||
|
"sleeve": ("BOOLEAN", {"default": False, "label_on": "enabled(袖子)", "label_off": "disabled(袖子)"}),
|
||||||
|
"pocket": ("BOOLEAN", {"default": False, "label_on": "enabled(口袋)", "label_off": "disabled(口袋)"}),
|
||||||
|
"neckline": ("BOOLEAN", {"default": False, "label_on": "enabled(领口)", "label_off": "disabled(领口)"}),
|
||||||
|
"buckle": ("BOOLEAN", {"default": False, "label_on": "enabled(带扣)", "label_off": "disabled(带扣)"}),
|
||||||
|
"zipper": ("BOOLEAN", {"default": False, "label_on": "enabled(拉链)", "label_off": "disabled(拉链)"}),
|
||||||
|
"applique": ("BOOLEAN", {"default": False, "label_on": "enabled(贴花)", "label_off": "disabled(贴花)"}),
|
||||||
|
"bead": ("BOOLEAN", {"default": False, "label_on": "enabled(珠子)", "label_off": "disabled(珠子)"}),
|
||||||
|
"bow": ("BOOLEAN", {"default": False, "label_on": "enabled(蝴蝶结)", "label_off": "disabled(蝴蝶结)"}),
|
||||||
|
"flower": ("BOOLEAN", {"default": False, "label_on": "enabled(花)", "label_off": "disabled(花)"}),
|
||||||
|
"fringe": ("BOOLEAN", {"default": False, "label_on": "enabled(刘海)", "label_off": "disabled(刘海)"}),
|
||||||
|
"ribbon": ("BOOLEAN", {"default": False, "label_on": "enabled(丝带)", "label_off": "disabled(丝带)"}),
|
||||||
|
"rivet": ("BOOLEAN", {"default": False, "label_on": "enabled(铆钉)", "label_off": "disabled(铆钉)"}),
|
||||||
|
"ruffle": ("BOOLEAN", {"default": False, "label_on": "enabled(褶饰)", "label_off": "disabled(褶饰)"}),
|
||||||
|
"sequin": ("BOOLEAN", {"default": False, "label_on": "enabled(亮片)", "label_off": "disabled(亮片)"}),
|
||||||
|
"tassel": ("BOOLEAN", {"default": False, "label_on": "enabled(流苏)", "label_off": "disabled(流苏)"}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("SegPipeline",)
|
||||||
|
RETURN_NAMES = ("segformer_pipeline",)
|
||||||
|
FUNCTION = "segformer_fashion_pipeline_loader"
|
||||||
|
CATEGORY = '😺dzNodes/LayerMask'
|
||||||
|
|
||||||
|
def segformer_fashion_pipeline_loader(self, model,
|
||||||
|
shirt, top, sweater, cardigan, jacket, vest, pants,
|
||||||
|
shorts, skirt, coat, dress, jumpsuit, cape, glasses,
|
||||||
|
hat, hairaccessory, tie, glove, watch, belt, legwarmer,
|
||||||
|
tights, sock, shoe, bagwallet, scarf, umbrella, hood,
|
||||||
|
collar, lapel, epaulette, sleeve, pocket, neckline,
|
||||||
|
buckle, zipper, applique, bead, bow, flower, fringe,
|
||||||
|
ribbon, rivet, ruffle, sequin, tassel
|
||||||
|
):
|
||||||
|
|
||||||
|
pipeline = SegformerPipeline()
|
||||||
|
labels_to_keep = [0]
|
||||||
|
if not shirt:
|
||||||
|
labels_to_keep.append(1)
|
||||||
|
if not top:
|
||||||
|
labels_to_keep.append(2)
|
||||||
|
if not sweater:
|
||||||
|
labels_to_keep.append(3)
|
||||||
|
if not cardigan:
|
||||||
|
labels_to_keep.append(4)
|
||||||
|
if not jacket:
|
||||||
|
labels_to_keep.append(5)
|
||||||
|
if not vest:
|
||||||
|
labels_to_keep.append(6)
|
||||||
|
if not pants:
|
||||||
|
labels_to_keep.append(7)
|
||||||
|
if not shorts:
|
||||||
|
labels_to_keep.append(8)
|
||||||
|
if not skirt:
|
||||||
|
labels_to_keep.append(9)
|
||||||
|
if not coat:
|
||||||
|
labels_to_keep.append(10)
|
||||||
|
if not dress:
|
||||||
|
labels_to_keep.append(11)
|
||||||
|
if not jumpsuit:
|
||||||
|
labels_to_keep.append(12)
|
||||||
|
if not cape:
|
||||||
|
labels_to_keep.append(13)
|
||||||
|
if not glasses:
|
||||||
|
labels_to_keep.append(14)
|
||||||
|
if not hat:
|
||||||
|
labels_to_keep.append(15)
|
||||||
|
if not hairaccessory:
|
||||||
|
labels_to_keep.append(16)
|
||||||
|
if not tie:
|
||||||
|
labels_to_keep.append(17)
|
||||||
|
if not glove:
|
||||||
|
labels_to_keep.append(18)
|
||||||
|
if not watch:
|
||||||
|
labels_to_keep.append(19)
|
||||||
|
if not belt:
|
||||||
|
labels_to_keep.append(20)
|
||||||
|
if not legwarmer:
|
||||||
|
labels_to_keep.append(21)
|
||||||
|
if not tights:
|
||||||
|
labels_to_keep.append(22)
|
||||||
|
if not sock:
|
||||||
|
labels_to_keep.append(23)
|
||||||
|
if not shoe:
|
||||||
|
labels_to_keep.append(24)
|
||||||
|
if not bagwallet:
|
||||||
|
labels_to_keep.append(25)
|
||||||
|
if not scarf:
|
||||||
|
labels_to_keep.append(26)
|
||||||
|
if not umbrella:
|
||||||
|
labels_to_keep.append(27)
|
||||||
|
if not hood:
|
||||||
|
labels_to_keep.append(28)
|
||||||
|
if not collar:
|
||||||
|
labels_to_keep.append(29)
|
||||||
|
if not lapel:
|
||||||
|
labels_to_keep.append(30)
|
||||||
|
if not epaulette:
|
||||||
|
labels_to_keep.append(31)
|
||||||
|
if not sleeve:
|
||||||
|
labels_to_keep.append(32)
|
||||||
|
if not pocket:
|
||||||
|
labels_to_keep.append(33)
|
||||||
|
if not neckline:
|
||||||
|
labels_to_keep.append(34)
|
||||||
|
if not buckle:
|
||||||
|
labels_to_keep.append(35)
|
||||||
|
if not zipper:
|
||||||
|
labels_to_keep.append(36)
|
||||||
|
if not applique:
|
||||||
|
labels_to_keep.append(37)
|
||||||
|
if not bead:
|
||||||
|
labels_to_keep.append(38)
|
||||||
|
if not bow:
|
||||||
|
labels_to_keep.append(39)
|
||||||
|
if not flower:
|
||||||
|
labels_to_keep.append(40)
|
||||||
|
if not fringe:
|
||||||
|
labels_to_keep.append(41)
|
||||||
|
if not ribbon:
|
||||||
|
labels_to_keep.append(42)
|
||||||
|
if not rivet:
|
||||||
|
labels_to_keep.append(43)
|
||||||
|
if not ruffle:
|
||||||
|
labels_to_keep.append(44)
|
||||||
|
if not sequin:
|
||||||
|
labels_to_keep.append(45)
|
||||||
|
if not tassel:
|
||||||
|
labels_to_keep.append(46)
|
||||||
|
|
||||||
|
pipeline.segment_label = labels_to_keep
|
||||||
|
pipeline.model_name = model
|
||||||
|
return (pipeline,)
|
||||||
|
|
||||||
|
class SegformerUltraV2:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.NODE_NAME = 'SegformerUltraV2'
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(cls):
|
||||||
|
method_list = ['VITMatte', 'VITMatte(local)', 'PyMatting', 'GuidedFilter', ]
|
||||||
|
device_list = ['cuda', 'cpu']
|
||||||
|
return {"required":
|
||||||
|
{
|
||||||
|
"image": ("IMAGE",),
|
||||||
|
"segformer_pipeline": ("SegPipeline",),
|
||||||
|
"detail_method": (method_list,),
|
||||||
|
"detail_erode": ("INT", {"default": 8, "min": 1, "max": 255, "step": 1}),
|
||||||
|
"detail_dilate": ("INT", {"default": 6, "min": 1, "max": 255, "step": 1}),
|
||||||
|
"black_point": ("FLOAT", {"default": 0.01, "min": 0.01, "max": 0.98, "step": 0.01, "display": "slider"}),
|
||||||
|
"white_point": ("FLOAT", {"default": 0.99, "min": 0.02, "max": 0.99, "step": 0.01, "display": "slider"}),
|
||||||
|
"process_detail": ("BOOLEAN", {"default": True}),
|
||||||
|
"device": (device_list,),
|
||||||
|
"max_megapixels": ("FLOAT", {"default": 2.0, "min": 1, "max": 999, "step": 0.1}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("IMAGE", "MASK",)
|
||||||
|
RETURN_NAMES = ("image", "mask",)
|
||||||
|
FUNCTION = "segformer_ultra_v2"
|
||||||
|
CATEGORY = '😺dzNodes/LayerMask'
|
||||||
|
|
||||||
|
def segformer_ultra_v2(self, image, segformer_pipeline,
|
||||||
|
detail_method, detail_erode, detail_dilate, black_point, white_point,
|
||||||
|
process_detail, device, max_megapixels,
|
||||||
|
):
|
||||||
|
model = segformer_pipeline.model_name
|
||||||
|
labels_to_keep = segformer_pipeline.segment_label
|
||||||
|
ret_images = []
|
||||||
|
ret_masks = []
|
||||||
|
|
||||||
|
if detail_method == 'VITMatte(local)':
|
||||||
|
local_files_only = True
|
||||||
|
else:
|
||||||
|
local_files_only = False
|
||||||
|
|
||||||
|
for i in image:
|
||||||
|
pred_seg, cloth = get_segmentation(i, model_name=model)
|
||||||
|
i = torch.unsqueeze(i, 0)
|
||||||
|
i = pil2tensor(tensor2pil(i).convert('RGB'))
|
||||||
|
orig_image = tensor2pil(i).convert('RGB')
|
||||||
|
|
||||||
|
mask = np.isin(pred_seg, labels_to_keep).astype(np.uint8)
|
||||||
|
|
||||||
|
# 创建agnostic-mask图像
|
||||||
|
mask_image = Image.fromarray((1 - mask) * 255)
|
||||||
|
mask_image = mask_image.convert("L")
|
||||||
|
_mask = pil2tensor(mask_image)
|
||||||
|
|
||||||
|
detail_range = detail_erode + detail_dilate
|
||||||
|
if process_detail:
|
||||||
|
if detail_method == 'GuidedFilter':
|
||||||
|
_mask = guided_filter_alpha(i, _mask, detail_range // 6 + 1)
|
||||||
|
_mask = tensor2pil(histogram_remap(_mask, black_point, white_point))
|
||||||
|
elif detail_method == 'PyMatting':
|
||||||
|
_mask = tensor2pil(mask_edge_detail(i, _mask, detail_range // 8 + 1, black_point, white_point))
|
||||||
|
else:
|
||||||
|
_trimap = generate_VITMatte_trimap(_mask, detail_erode, detail_dilate)
|
||||||
|
_mask = generate_VITMatte(orig_image, _trimap, local_files_only=local_files_only, device=device,
|
||||||
|
max_megapixels=max_megapixels)
|
||||||
|
_mask = tensor2pil(histogram_remap(pil2tensor(_mask), black_point, white_point))
|
||||||
|
else:
|
||||||
|
_mask = mask2image(_mask)
|
||||||
|
|
||||||
|
ret_image = RGB2RGBA(orig_image, _mask.convert('L'))
|
||||||
|
ret_images.append(pil2tensor(ret_image))
|
||||||
|
ret_masks.append(image2mask(_mask))
|
||||||
|
|
||||||
|
log(f"{self.NODE_NAME} Processed {len(ret_images)} image(s).", message_type='finish')
|
||||||
return (torch.cat(ret_images, dim=0), torch.cat(ret_masks, dim=0),)
|
return (torch.cat(ret_images, dim=0), torch.cat(ret_masks, dim=0),)
|
||||||
|
|
||||||
NODE_CLASS_MAPPINGS = {
|
NODE_CLASS_MAPPINGS = {
|
||||||
"LayerMask: SegformerB2ClothesUltra": Segformer_B2_Clothes
|
"LayerMask: SegformerB2ClothesUltra": Segformer_B2_Clothes,
|
||||||
|
"LayerMask: SegformerUltraV2": SegformerUltraV2,
|
||||||
|
"LayerMask: SegformerClothesPipelineLoader": SegformerClothesPipelineLoader,
|
||||||
|
"LayerMask: SegformerFashionPipelineLoader": SegformerFashionPipelineLoader,
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
"LayerMask: SegformerB2ClothesUltra": "LayerMask: Segformer B2 Clothes Ultra"
|
"LayerMask: SegformerB2ClothesUltra": "LayerMask: Segformer B2 Clothes Ultra",
|
||||||
|
"LayerMask: SegformerUltraV2": "LayerMask: Segformer Ultra V2",
|
||||||
|
"LayerMask: SegformerClothesPipelineLoader": "LayerMask: Segformer Clothes Pipeline",
|
||||||
|
"LayerMask: SegformerFashionPipelineLoader": "LayerMask: Segformer Fashion Pipeline"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui_layerstyle"
|
name = "comfyui_layerstyle"
|
||||||
description = "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
|
description = "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
|
||||||
version = "1.0.17"
|
version = "1.0.18"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
dependencies = ["numpy", "pillow", "torch", "matplotlib", "Scipy", "scikit_image", "opencv-contrib-python", "pymatting", "segment_anything", "timm", "addict", "yapf", "colour-science", "wget", "mediapipe", "loguru", "typer_config", "fastapi", "rich", "google-generativeai", "diffusers", "omegaconf", "tqdm", "transformers", "kornia", "image-reward", "ultralytics", "blend_modes", "blind-watermark", "qrcode", "pyzbar", "psd-tools"]
|
dependencies = ["numpy", "pillow", "torch", "matplotlib", "Scipy", "scikit_image", "opencv-contrib-python", "pymatting", "segment_anything", "timm", "addict", "yapf", "colour-science", "wget", "mediapipe", "loguru", "typer_config", "fastapi", "rich", "google-generativeai", "diffusers", "omegaconf", "tqdm", "transformers", "kornia", "image-reward", "ultralytics", "blend_modes", "blind-watermark", "qrcode", "pyzbar", "psd-tools"]
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,251 @@
|
|||||||
|
{
|
||||||
|
"last_node_id": 13,
|
||||||
|
"last_link_id": 21,
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"type": "LayerMask: SegformerClothesPipelineLoader",
|
||||||
|
"pos": [
|
||||||
|
-1510,
|
||||||
|
-370
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 315,
|
||||||
|
"1": 466
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 0,
|
||||||
|
"mode": 0,
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "segformer_pipeline",
|
||||||
|
"type": "SegPipeline",
|
||||||
|
"links": [
|
||||||
|
16
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "LayerMask: Segformer Clothes Pipeline",
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: SegformerClothesPipelineLoader"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"segformer_b3_clothes",
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"type": "LayerMask: SegformerUltraV2",
|
||||||
|
"pos": [
|
||||||
|
-1160,
|
||||||
|
-240
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 315,
|
||||||
|
"1": 246
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 2,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "image",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"link": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "segformer_pipeline",
|
||||||
|
"type": "SegPipeline",
|
||||||
|
"link": 16
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "image",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"links": [
|
||||||
|
14
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mask",
|
||||||
|
"type": "MASK",
|
||||||
|
"links": [
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: SegformerUltraV2"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"VITMatte",
|
||||||
|
44,
|
||||||
|
6,
|
||||||
|
0.01,
|
||||||
|
0.99,
|
||||||
|
true,
|
||||||
|
"cuda",
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"type": "PreviewImage",
|
||||||
|
"pos": [
|
||||||
|
-798,
|
||||||
|
-614
|
||||||
|
],
|
||||||
|
"size": [
|
||||||
|
230.18093750785056,
|
||||||
|
422.02388956433197
|
||||||
|
],
|
||||||
|
"flags": {},
|
||||||
|
"order": 3,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "images",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"link": 14
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "PreviewImage"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"type": "LayerMask: MaskPreview",
|
||||||
|
"pos": [
|
||||||
|
-800,
|
||||||
|
-140
|
||||||
|
],
|
||||||
|
"size": [
|
||||||
|
236.40463640741564,
|
||||||
|
438.79732236746304
|
||||||
|
],
|
||||||
|
"flags": {},
|
||||||
|
"order": 4,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "mask",
|
||||||
|
"type": "MASK",
|
||||||
|
"link": 15
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: MaskPreview"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"type": "LoadImage",
|
||||||
|
"pos": [
|
||||||
|
-1919,
|
||||||
|
-513
|
||||||
|
],
|
||||||
|
"size": [
|
||||||
|
330.2955113657599,
|
||||||
|
658.6634932172642
|
||||||
|
],
|
||||||
|
"flags": {},
|
||||||
|
"order": 1,
|
||||||
|
"mode": 0,
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "IMAGE",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"links": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MASK",
|
||||||
|
"type": "MASK",
|
||||||
|
"links": null,
|
||||||
|
"shape": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LoadImage"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"768x1344_dress.png",
|
||||||
|
"image"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
[
|
||||||
|
13,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
9,
|
||||||
|
0,
|
||||||
|
"IMAGE"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
14,
|
||||||
|
9,
|
||||||
|
0,
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
"IMAGE"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
15,
|
||||||
|
9,
|
||||||
|
1,
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
"MASK"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
16,
|
||||||
|
11,
|
||||||
|
0,
|
||||||
|
9,
|
||||||
|
1,
|
||||||
|
"SegPipeline"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"groups": [],
|
||||||
|
"config": {},
|
||||||
|
"extra": {
|
||||||
|
"ds": {
|
||||||
|
"scale": 0.5445000000000026,
|
||||||
|
"offset": [
|
||||||
|
3409.5755571201344,
|
||||||
|
1368.2914043226942
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": 0.4
|
||||||
|
}
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
{
|
||||||
|
"last_node_id": 13,
|
||||||
|
"last_link_id": 21,
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"type": "PreviewImage",
|
||||||
|
"pos": [
|
||||||
|
-770,
|
||||||
|
-460
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 337.95587158203125,
|
||||||
|
"1": 447.5793151855469
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 3,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "images",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"link": 18
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "PreviewImage"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"type": "LayerMask: MaskPreview",
|
||||||
|
"pos": [
|
||||||
|
-770,
|
||||||
|
40
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 333.88427734375,
|
||||||
|
"1": 474.7603759765625
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 4,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "mask",
|
||||||
|
"type": "MASK",
|
||||||
|
"link": 19
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: MaskPreview"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"type": "LayerMask: SegformerUltraV2",
|
||||||
|
"pos": [
|
||||||
|
-1160,
|
||||||
|
-90
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 315,
|
||||||
|
"1": 246
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 2,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "image",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"link": 21
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "segformer_pipeline",
|
||||||
|
"type": "SegPipeline",
|
||||||
|
"link": 20
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "image",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"links": [
|
||||||
|
18
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mask",
|
||||||
|
"type": "MASK",
|
||||||
|
"links": [
|
||||||
|
19
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: SegformerUltraV2"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"VITMatte",
|
||||||
|
8,
|
||||||
|
6,
|
||||||
|
0.01,
|
||||||
|
0.99,
|
||||||
|
true,
|
||||||
|
"cuda",
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"type": "LayerMask: SegformerFashionPipelineLoader",
|
||||||
|
"pos": [
|
||||||
|
-1580,
|
||||||
|
-540
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 315,
|
||||||
|
"1": 1162
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 0,
|
||||||
|
"mode": 0,
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "segformer_pipeline",
|
||||||
|
"type": "SegPipeline",
|
||||||
|
"links": [
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "LayerMask: Segformer Fashion Pipeline",
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LayerMask: SegformerFashionPipelineLoader"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"segformer_b3_fashion",
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"type": "LoadImage",
|
||||||
|
"pos": [
|
||||||
|
-1990,
|
||||||
|
-200
|
||||||
|
],
|
||||||
|
"size": {
|
||||||
|
"0": 311.8735656738281,
|
||||||
|
"1": 470.3501892089844
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"order": 1,
|
||||||
|
"mode": 0,
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "IMAGE",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"links": [
|
||||||
|
21
|
||||||
|
],
|
||||||
|
"shape": 3,
|
||||||
|
"slot_index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MASK",
|
||||||
|
"type": "MASK",
|
||||||
|
"links": null,
|
||||||
|
"shape": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"Node name for S&R": "LoadImage"
|
||||||
|
},
|
||||||
|
"widgets_values": [
|
||||||
|
"768x1344_dress.png",
|
||||||
|
"image"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
[
|
||||||
|
18,
|
||||||
|
12,
|
||||||
|
0,
|
||||||
|
5,
|
||||||
|
0,
|
||||||
|
"IMAGE"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
19,
|
||||||
|
12,
|
||||||
|
1,
|
||||||
|
7,
|
||||||
|
0,
|
||||||
|
"MASK"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
20,
|
||||||
|
10,
|
||||||
|
0,
|
||||||
|
12,
|
||||||
|
1,
|
||||||
|
"SegPipeline"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
21,
|
||||||
|
13,
|
||||||
|
0,
|
||||||
|
12,
|
||||||
|
0,
|
||||||
|
"IMAGE"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"groups": [],
|
||||||
|
"config": {},
|
||||||
|
"extra": {
|
||||||
|
"ds": {
|
||||||
|
"scale": 0.7972024500000043,
|
||||||
|
"offset": [
|
||||||
|
2634.915464714221,
|
||||||
|
818.4797865982553
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": 0.4
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user