类 WAS_CLIPSeg_Model_Loade
# CLIPSeg Model Loader
class WAS_CLIPSeg_Model_Loader:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"model": ("STRING", {"default": "CIDAS/clipseg-rd64-refined", "multiline": False}),
},
}
RETURN_TYPES = ("CLIPSEG_MODEL",)
RETURN_NAMES = ("clipseg_model",)
FUNCTION = "clipseg_model"
CATEGORY = "WAS Suite/Loaders"
def clipseg_model(self, model):
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
cache = os.path.join(MODELS_DIR, 'clipseg')
inputs = CLIPSegProcessor.from_pretrained(model, cache_dir=cache)
model = CLIPSegForImageSegmentation.from_pretrained(model, cache_dir=cache)
return ( (inputs, model), )
# CLIPSeg Node
class WAS_CLIPSeg:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
"text": ("STRING", {"default":"", "multiline": False}),
},
"optional": {
"clipseg_model": ("CLIPSEG_MODEL",),
}
}
RETURN_TYPES = ("MASK", "IMAGE")
RETURN_NAMES = ("MASK", "MASK_IMAGE")
FUNCTION = "CLIPSeg_image"
CATEGORY = "WAS Suite/Image/Masking"
def CLIPSeg_image(self, image, text=None, clipseg_model=None):
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
image = tensor2pil(image)
cache = os.path.join(MODELS_DIR, 'clipseg')
if clipseg_model:
inputs = clipseg_model[0]
model = clipseg_model[1]
else:
inputs = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined", cache_dir=cache)
model = CLIPSegForImageSegmentation.from_pretrained("CIDAS/clipseg-rd64-refined", cache_dir=cache)
with torch.no_grad():
result = model(**inputs(text=text, images=image, padding=True, return_tensors="pt"))
tensor = torch.sigmoid(result[0])
mask = 1. - (tensor - tensor.min()) / tensor.max()
mask = mask.unsqueeze(0)
mask = tensor2pil(mask).convert("L")
mask = mask.resize(image.size)
return (pil2mask(mask), pil2tensor(ImageOps.invert(mask.convert("RGB"))))
# CLIPSeg Node
这段代码定义了一个名为 WAS_CLIPSeg_Model_Loader 的类,用于加载 CLIPSeg 模型并将其作为一个节点在 ComfyUI 中使用。以下是详细解释:
类 WAS_CLIPSeg_Model_Loader
这个类负责加载 CLIPSeg 模型,具体包括模型处理器和模型本身,并将其返回以供后续使用。
构造函数 init
python
复制
def __init__(self):
pass
这个构造函数没有执行任何操作,只是一个占位符。类的实例化时不会进行任何特殊初始化。
类方法 INPUT_TYPES
python
复制
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"model": ("STRING", {"default": "CIDAS/clipseg-rd64-refined", "multiline": False}),
},
}
这是一个类方法,返回一个字典,用于定义节点所需的输入类型。
required 字段定义了模型名称 (model) 是一个字符串类型,默认值为 “CIDAS/clipseg-rd64-refined”,且不支持多行输入。
类属性 RETURN_TYPES 和 RETURN_NAMES
python
复制
RETURN_TYPES = ("CLIPSEG_MODEL",)
RETURN_NAMES = ("clipseg_model",)
RETURN_TYPES 定义了该节点返回的输出类型,输出类型为 CLIPSEG_MODEL。
RETURN_NAMES 定义了该节点返回的输出名称,输出名称为 clipseg_model。
类属性 FUNCTION 和 CATEGORY
python
复制
FUNCTION = “clipseg_model”
CATEGORY = “WAS Suite/Loaders”
FUNCTION 定义了在类中执行的主要函数名称,即 clipseg_model。
CATEGORY 指定了该节点在 ComfyUI 中的分类,便于用户在 UI 中找到该节点。
方法 clipseg_model
python
复制
def clipseg_model(self, model):
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
cache = os.path.join(MODELS_DIR, 'clipseg')
inputs = CLIPSegProcessor.from_pretrained(model, cache_dir=cache)
model = CLIPSegForImageSegmentation.from_pretrained(model, cache_dir=cache)
return ((inputs, model),)
该方法负责加载 CLIPSeg 模型。
具体步骤如下:
导入必要的库:
python
复制
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
定义缓存目录:
python
复制
cache = os.path.join(MODELS_DIR, 'clipseg')
这里将缓存目录定义为 MODELS_DIR 目录下的 clipseg 子目录,用于存放下载的模型文件。
加载处理器和模型:
python
复制
inputs = CLIPSegProcessor.from_pretrained(model, cache_dir=cache)
model = CLIPSegForImageSegmentation.from_pretrained(model, cache_dir=cache)
CLIPSegProcessor.from_pretrained(model, cache_dir=cache):从预训练模型中加载处理器,如果本地缓存目录中存在模型文件,则从本地加载,否则从远程服务器下载并缓存到本地。
CLIPSegForImageSegmentation.from_pretrained(model, cache_dir=cache):从预训练模型中加载图像分割模型,遵循与处理器相同的加载逻辑。
返回结果:
python
复制
return ((inputs, model),)
返回一个包含处理器和模型的元组 ((inputs, model),),其中 inputs 是加载的处理器,model 是加载的图像分割模型。
主要工作流程
模型加载:通过 WAS_CLIPSeg_Model_Loader 类,加载 CLIPSeg 模型处理器和图像分割模型,并将它们作为节点返回。
缓存机制:如果本地缓存目录中存在模型文件,则从本地加载;如果不存在,则从远程服务器下载并缓存到本地,确保下次使用时可以直接从本地加载,减少网络请求和下载时间。
在 ComfyUI 中使用
这个类被定义为一个自定义节点,可以在 ComfyUI 中使用,用于加载 CLIPSeg 模型。
用户可以通过 UI 输入模型名称,然后该节点会自动加载相应的处理器和模型,供后续图像处理任务使用。
总结
WAS_CLIPSeg_Model_Loader 类通过指定模型名称,加载 CLIPSeg 模型处理器和图像分割模型,并将它们返回作为节点输出,便于在 ComfyUI 中进行图像分割任务。
原文地址:https://blog.csdn.net/vv1025/article/details/140586206
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!