Files
CavinHuang-comfyui-nodes-docs/docs/SAMLoader.md
2024-05-26 20:35:16 +08:00

75 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Documentation
- Class name: SAMLoader
- Category: ImpactPack
- Output node: False
- Repo Ref: https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
SAMLoader节点旨在高效管理和加载SAM(Segment Anything Model)家族中的各种模型,包括ESAM。它提供了一个高级接口,用于根据用户定义的标准(如模型名称和设备模式)选择和使用模型,确保最佳性能和资源利用率。
# Input types
## Required
- model_name
- model_name参数对于确定要加载的SAM模型至关重要。它通过指导节点指向正确的模型文件来影响节点的执行,这对于后续的处理和预测任务至关重要。
- Comfy dtype: str
- Python dtype: str
## Optional
- device_mode
- device_mode参数允许用户指定模型执行的计算设备。它通过根据所选模式优化GPU或CPU资源的使用,在节点性能中扮演重要角色。
- Comfy dtype: str
- Python dtype: str
# Output types
- SAM_MODEL
- SAM_MODEL输出代表已加载的SAM模型,准备用于推理或进一步处理。它封装了模型的架构和学习到的参数,标志着节点主要功能的完成。
- Comfy dtype: torch.nn.Module
- Python dtype: torch.nn.Module
# Usage tips
- Infra type: GPU
# Source code
```
class SAMLoader:
@classmethod
def INPUT_TYPES(cls):
models = [x for x in folder_paths.get_filename_list('sams') if 'hq' not in x]
return {'required': {'model_name': (models + ['ESAM'],), 'device_mode': (['AUTO', 'Prefer GPU', 'CPU'],)}}
RETURN_TYPES = ('SAM_MODEL',)
FUNCTION = 'load_model'
CATEGORY = 'ImpactPack'
def load_model(self, model_name, device_mode='auto'):
if model_name == 'ESAM':
if 'ESAM_ModelLoader_Zho' not in nodes.NODE_CLASS_MAPPINGS:
try_install_custom_node('https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM', "To use 'ESAM' model, 'ComfyUI-YoloWorld-EfficientSAM' extension is required.")
raise Exception("'ComfyUI-YoloWorld-EfficientSAM' node isn't installed.")
esam_loader = nodes.NODE_CLASS_MAPPINGS['ESAM_ModelLoader_Zho']()
if device_mode == 'CPU':
esam = esam_loader.load_esam_model('CPU')[0]
else:
device_mode = 'CUDA'
esam = esam_loader.load_esam_model('CUDA')[0]
sam_obj = core.ESAMWrapper(esam, device_mode)
esam.sam_wrapper = sam_obj
print(f'Loads EfficientSAM model: (device:{device_mode})')
return (esam,)
modelname = folder_paths.get_full_path('sams', model_name)
if 'vit_h' in model_name:
model_kind = 'vit_h'
elif 'vit_l' in model_name:
model_kind = 'vit_l'
else:
model_kind = 'vit_b'
sam = sam_model_registry[model_kind](checkpoint=modelname)
size = os.path.getsize(modelname)
safe_to = core.SafeToGPU(size)
device = comfy.model_management.get_torch_device() if device_mode == 'Prefer GPU' else 'CPU'
if device_mode == 'Prefer GPU':
safe_to.to_device(sam, device)
is_auto_mode = device_mode == 'AUTO'
sam_obj = core.SAMWrapper(sam, is_auto_mode=is_auto_mode, safe_to_gpu=safe_to)
sam.sam_wrapper = sam_obj
print(f'Loads SAM model: {modelname} (device:{device_mode})')
return (sam,)
```