Compare commits
14
Commits
ipa_faceid
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43ec2701a1 | ||
|
|
4653a739ae | ||
|
|
2ab1c04c83 | ||
|
|
ad5de83098 | ||
|
|
f2ec7263ea | ||
|
|
e02e185329 | ||
|
|
b680b86f97 | ||
|
|
86880547f3 | ||
|
|
535c9879b8 | ||
|
|
b5081b503f | ||
|
|
5965646127 | ||
|
|
94aa709b22 | ||
|
|
7484d8e6cf | ||
|
|
0634908ffc |
@@ -8,17 +8,19 @@ on:
|
||||
paths:
|
||||
- "pyproject.toml"
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
publish-node:
|
||||
name: Publish Custom Node to registry
|
||||
runs-on: ubuntu-latest
|
||||
# if this is a forked repository. Skipping the workflow.
|
||||
if: github.event.repository.fork == false
|
||||
if: ${{ github.repository_owner == 'MinusZoneAI' }}
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
- name: Publish Custom Node
|
||||
uses: Comfy-Org/publish-node-action@main
|
||||
uses: Comfy-Org/publish-node-action@v1
|
||||
with:
|
||||
## Add your own personal access token to your Github Repository secrets and reference it here.
|
||||
personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||

|
||||
|
||||
## Recent changes
|
||||
* [2024-07-27] 支持faceid,新增一些相关节点,工作流见examples/workflow_ipa_faceid.png
|
||||
* [2024-08-02] 支持faceid,新增一些相关节点,工作流见examples/workflow_ipa_faceid.png
|
||||
* [2024-07-27] 新增MZ_KolorsControlNetLoader节点,用于加载可图ControlNet官方模型
|
||||
* [2024-07-26] 新增MZ_ApplySDXLSamplingSettings节点,用于V2版本重新回到SDXL的scheduler配置.
|
||||

|
||||
@@ -21,7 +21,6 @@
|
||||
使用ComfyUI原生采样
|
||||
|
||||
工作流在examples/workflow.png中获取
|
||||
|
||||
|
||||
### UNET模型下载
|
||||
unet模型放置在 models/unet/ 文件夹下
|
||||
@@ -39,6 +38,15 @@ chatglm3放置在 models/LLM/ 文件夹下
|
||||
下载地址: https://huggingface.co/Kijai/ChatGLM3-safetensors/resolve/main/chatglm3-fp16.safetensors
|
||||
|
||||
|
||||
## IPAdapter实现推荐使用 [cubiq/ComfyUI_IPAdapter_plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus)
|
||||
faceid相关节点已经在其中支持,IPAdapter实现需要更新ComfyUI_IPAdapter_plus到最新版本
|
||||
### IPAdapter工作流
|
||||
https://github.com/cubiq/ComfyUI_IPAdapter_plus/blob/main/examples/ipadapter_kolors.json
|
||||
|
||||
### IPAdapter_FaceIDv2工作流
|
||||
https://github.com/cubiq/ComfyUI_IPAdapter_plus/blob/main/examples/IPAdapter_FaceIDv2_Kolors.json
|
||||
|
||||
|
||||
### 官方IP-Adapter-Plus模型下载地址
|
||||
模型主页: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus
|
||||
|
||||
@@ -46,16 +54,6 @@ https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/ip_adapte
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/image_encoder/pytorch_model.bin 下载至 models/clip_vision/
|
||||
|
||||
### 官方ControlNet模型下载地址
|
||||
模型主页(Depth): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Depth
|
||||
|
||||
模型主页(Canny): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Canny
|
||||
|
||||
### Kolors-Inpainting模型下载地址
|
||||
模型主页: https://huggingface.co/Kwai-Kolors/Kolors-Inpainting
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-Inpainting/resolve/main/unet/diffusion_pytorch_model.safetensors 下载至 models/unet/
|
||||
|
||||
### 官方Kolors-IP-Adapter-FaceID-Plus模型下载地址
|
||||
模型主页: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus
|
||||
|
||||
@@ -65,6 +63,17 @@ https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus/resolve/main/cl
|
||||
|
||||
https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip 下载并解压至 models/insightface/models/antelopev2/*.onnx
|
||||
|
||||
### 官方ControlNet模型下载地址
|
||||
模型主页(Depth): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Depth
|
||||
|
||||
模型主页(Canny): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Canny
|
||||
|
||||
模型主页(Pose): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Pose
|
||||
|
||||
### Kolors-Inpainting模型下载地址
|
||||
模型主页: https://huggingface.co/Kwai-Kolors/Kolors-Inpainting
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-Inpainting/resolve/main/unet/diffusion_pytorch_model.safetensors 下载至 models/unet/
|
||||
|
||||
|
||||
|
||||
@@ -95,6 +104,15 @@ Download link:
|
||||
https://huggingface.co/Kijai/ChatGLM3-safetensors/resolve/main/chatglm3-fp16.safetensors
|
||||
|
||||
|
||||
## IPAdapter implementation is recommended to use [cubiq/ComfyUI_IPAdapter_plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus)
|
||||
The faceid related nodes have been supported in it, and the IPAdapter implementation needs to update ComfyUI_IPAdapter_plus to the latest version
|
||||
### IPAdapter workflow
|
||||
https://github.com/cubiq/ComfyUI_IPAdapter_plus/blob/main/examples/ipadapter_kolors.json
|
||||
|
||||
### IPAdapter_FaceIDv2 workflow
|
||||
https://github.com/cubiq/ComfyUI_IPAdapter_plus/blob/main/examples/IPAdapter_FaceIDv2_Kolors.json
|
||||
|
||||
|
||||
### Official IP-Adapter-Plus model download link
|
||||
|
||||
Model homepage: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus
|
||||
@@ -103,15 +121,6 @@ https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/ip_adapte
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/image_encoder/pytorch_model.bin Download to models/clip_vision/
|
||||
|
||||
### Official ControlNet model download link
|
||||
Model homepage(Depth): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Depth
|
||||
|
||||
Model homepage(Canny): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Canny
|
||||
|
||||
### Kolors-Inpainting model download link
|
||||
Model homepage: https://huggingface.co/Kwai-Kolors/Kolors-Inpainting
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-Inpainting/resolve/main/unet/diffusion_pytorch_model.safetensors Download to models/unet/
|
||||
|
||||
### Official Kolors-IP-Adapter-FaceID-Plus model download link
|
||||
Model homepage: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus
|
||||
@@ -122,6 +131,19 @@ https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus/resolve/main/cl
|
||||
|
||||
https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip Download and unzip to models/insightface/models/antelopev2/*.onnx
|
||||
|
||||
### Official ControlNet model download link
|
||||
Model homepage(Depth): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Depth
|
||||
|
||||
Model homepage(Canny): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Canny
|
||||
|
||||
Model homepage(Pose): https://huggingface.co/Kwai-Kolors/Kolors-ControlNet-Pose
|
||||
|
||||
### Kolors-Inpainting model download link
|
||||
Model homepage: https://huggingface.co/Kwai-Kolors/Kolors-Inpainting
|
||||
|
||||
https://huggingface.co/Kwai-Kolors/Kolors-Inpainting/resolve/main/unet/diffusion_pytorch_model.safetensors Download to models/unet/
|
||||
|
||||
|
||||
## 使用ComfyUI-KwaiKolorsWrapper在相同种子下测试结果 (Testing results with the same seed using ComfyUI-KwaiKolorsWrapper)
|
||||
测试工作流来自examples/workflow_same_seed_test.png
|
||||
|
||||
@@ -178,8 +200,6 @@ Error occurred when executing MZ_ChatGLM3Loader: 'ChatGLMModel' object has no at
|
||||
## Stargazers
|
||||
[](https://github.com/MinusZoneAI/ComfyUI-Kolors-MZ/stargazers)
|
||||
|
||||
|
||||
## Sponsorship
|
||||
<img src="https://github.com/user-attachments/assets/a7ef9684-4911-45b6-8071-a9b433dca6af" width="200"/>
|
||||
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -315,24 +315,24 @@ from .ComfyUI_IPAdapter_plus.IPAdapterPlus import IPAdapterAdvanced, IPAdapterMo
|
||||
IPAdapterModelLoader.CATEGORY = CATEGORY_NAME + "/IPAdapter"
|
||||
NODE_CLASS_MAPPINGS["MZ_IPAdapterModelLoaderKolors"] = IPAdapterModelLoader
|
||||
NODE_DISPLAY_NAME_MAPPINGS[
|
||||
"MZ_IPAdapterModelLoaderKolors"] = f"IPAdapterModelLoader(kolors)"
|
||||
"MZ_IPAdapterModelLoaderKolors"] = f"IPAdapterModelLoader(kolors) - Legacy"
|
||||
|
||||
IPAdapterAdvanced.CATEGORY = CATEGORY_NAME + "/IPAdapter"
|
||||
NODE_CLASS_MAPPINGS["MZ_IPAdapterAdvancedKolors"] = IPAdapterAdvanced
|
||||
NODE_DISPLAY_NAME_MAPPINGS[
|
||||
"MZ_IPAdapterAdvancedKolors"] = f"IPAdapterAdvanced(kolors)"
|
||||
"MZ_IPAdapterAdvancedKolors"] = f"IPAdapterAdvanced(kolors) - Legacy"
|
||||
|
||||
IPAdapterInsightFaceLoader.CATEGORY = CATEGORY_NAME + "/IPAdapter"
|
||||
NODE_CLASS_MAPPINGS["MZ_IPAdapterInsightFaceLoader"] = IPAdapterInsightFaceLoader
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS[
|
||||
"MZ_IPAdapterInsightFaceLoader"] = f"IPAdapterInsightFaceLoader(kolors)"
|
||||
"MZ_IPAdapterInsightFaceLoader"] = f"IPAdapterInsightFaceLoader(kolors) - Legacy"
|
||||
|
||||
IPAdapterFaceID.CATEGORY = CATEGORY_NAME + "/IPAdapter"
|
||||
NODE_CLASS_MAPPINGS["MZ_IPAdapterFaceID"] = IPAdapterFaceID
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS[
|
||||
"MZ_IPAdapterFaceID"] = f"IPAdapterFaceID(kolors)"
|
||||
"MZ_IPAdapterFaceID"] = f"IPAdapterFaceID(kolors) - Legacy"
|
||||
|
||||
from . import mz_kolors_legacy
|
||||
NODE_CLASS_MAPPINGS.update(mz_kolors_legacy.NODE_CLASS_MAPPINGS)
|
||||
|
||||
@@ -21,15 +21,18 @@ class SPTokenizer:
|
||||
self.pad_id: int = self.sp_model.unk_id()
|
||||
assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()
|
||||
|
||||
role_special_tokens = ["<|system|>", "<|user|>", "<|assistant|>", "<|observation|>"]
|
||||
special_tokens = ["[MASK]", "[gMASK]", "[sMASK]", "sop", "eop"] + role_special_tokens
|
||||
role_special_tokens = ["<|system|>", "<|user|>",
|
||||
"<|assistant|>", "<|observation|>"]
|
||||
special_tokens = ["[MASK]", "[gMASK]", "[sMASK]",
|
||||
"sop", "eop"] + role_special_tokens
|
||||
self.special_tokens = {}
|
||||
self.index_special_tokens = {}
|
||||
for token in special_tokens:
|
||||
self.special_tokens[token] = self.n_words
|
||||
self.index_special_tokens[self.n_words] = token
|
||||
self.n_words += 1
|
||||
self.role_special_token_expression = "|".join([re.escape(token) for token in role_special_tokens])
|
||||
self.role_special_token_expression = "|".join(
|
||||
[re.escape(token) for token in role_special_tokens])
|
||||
|
||||
def tokenize(self, s: str, encode_special_tokens=False):
|
||||
if encode_special_tokens:
|
||||
@@ -37,7 +40,8 @@ class SPTokenizer:
|
||||
t = []
|
||||
for match in re.finditer(self.role_special_token_expression, s):
|
||||
if last_index < match.start():
|
||||
t.extend(self.sp_model.EncodeAsPieces(s[last_index:match.start()]))
|
||||
t.extend(self.sp_model.EncodeAsPieces(
|
||||
s[last_index:match.start()]))
|
||||
t.append(s[match.start():match.end()])
|
||||
last_index = match.end()
|
||||
if last_index < len(s):
|
||||
@@ -141,7 +145,8 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
|
||||
def get_vocab(self):
|
||||
""" Returns vocab as a dict """
|
||||
vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
|
||||
vocab = {self._convert_id_to_token(
|
||||
i): i for i in range(self.vocab_size)}
|
||||
vocab.update(self.added_tokens_encoder)
|
||||
return vocab
|
||||
|
||||
@@ -193,7 +198,8 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
|
||||
def build_single_message(self, role, metadata, message):
|
||||
assert role in ["system", "user", "assistant", "observation"], role
|
||||
role_tokens = [self.get_command(f"<|{role}|>")] + self.tokenizer.encode(f"{metadata}\n")
|
||||
role_tokens = [self.get_command(
|
||||
f"<|{role}|>")] + self.tokenizer.encode(f"{metadata}\n")
|
||||
message_tokens = self.tokenizer.encode(message)
|
||||
tokens = role_tokens + message_tokens
|
||||
return tokens
|
||||
@@ -205,8 +211,10 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
for item in history:
|
||||
content = item["content"]
|
||||
if item["role"] == "system" and "tools" in item:
|
||||
content = content + "\n" + json.dumps(item["tools"], indent=4, ensure_ascii=False)
|
||||
input_ids.extend(self.build_single_message(item["role"], item.get("metadata", ""), content))
|
||||
content = content + "\n" + \
|
||||
json.dumps(item["tools"], indent=4, ensure_ascii=False)
|
||||
input_ids.extend(self.build_single_message(
|
||||
item["role"], item.get("metadata", ""), content))
|
||||
input_ids.extend(self.build_single_message(role, "", query))
|
||||
input_ids.extend([self.get_command("<|assistant|>")])
|
||||
return self.batch_encode_plus([input_ids], return_tensors="pt", is_split_into_words=True)
|
||||
@@ -233,7 +241,8 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
prefix_tokens = self.get_prefix_tokens()
|
||||
token_ids_0 = prefix_tokens + token_ids_0
|
||||
if token_ids_1 is not None:
|
||||
token_ids_0 = token_ids_0 + token_ids_1 + [self.get_command("<eos>")]
|
||||
token_ids_0 = token_ids_0 + token_ids_1 + \
|
||||
[self.get_command("<eos>")]
|
||||
return token_ids_0
|
||||
|
||||
def _pad(
|
||||
@@ -243,6 +252,7 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
padding_strategy: PaddingStrategy = PaddingStrategy.DO_NOT_PAD,
|
||||
pad_to_multiple_of: Optional[int] = None,
|
||||
return_attention_mask: Optional[bool] = None,
|
||||
**kwargs,
|
||||
) -> dict:
|
||||
"""
|
||||
Pad encoded inputs (on left/right and up to predefined length or max length in the batch)
|
||||
@@ -277,9 +287,11 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
max_length = len(required_input)
|
||||
|
||||
if max_length is not None and pad_to_multiple_of is not None and (max_length % pad_to_multiple_of != 0):
|
||||
max_length = ((max_length // pad_to_multiple_of) + 1) * pad_to_multiple_of
|
||||
max_length = ((max_length // pad_to_multiple_of) +
|
||||
1) * pad_to_multiple_of
|
||||
|
||||
needs_to_be_padded = padding_strategy != PaddingStrategy.DO_NOT_PAD and len(required_input) != max_length
|
||||
needs_to_be_padded = padding_strategy != PaddingStrategy.DO_NOT_PAD and len(
|
||||
required_input) != max_length
|
||||
|
||||
# Initialize attention mask if not present.
|
||||
if "attention_mask" not in encoded_inputs:
|
||||
@@ -292,9 +304,12 @@ class ChatGLMTokenizer(PreTrainedTokenizer):
|
||||
difference = max_length - len(required_input)
|
||||
|
||||
if "attention_mask" in encoded_inputs:
|
||||
encoded_inputs["attention_mask"] = [0] * difference + encoded_inputs["attention_mask"]
|
||||
encoded_inputs["attention_mask"] = [0] * \
|
||||
difference + encoded_inputs["attention_mask"]
|
||||
if "position_ids" in encoded_inputs:
|
||||
encoded_inputs["position_ids"] = [0] * difference + encoded_inputs["position_ids"]
|
||||
encoded_inputs[self.model_input_names[0]] = [self.pad_token_id] * difference + required_input
|
||||
encoded_inputs["position_ids"] = [0] * \
|
||||
difference + encoded_inputs["position_ids"]
|
||||
encoded_inputs[self.model_input_names[0]] = [
|
||||
self.pad_token_id] * difference + required_input
|
||||
|
||||
return encoded_inputs
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
[project]
|
||||
name = "comfyui-kolors-mz"
|
||||
description = "Implementation of Kolors on ComfyUI\nReference from [a/https://github.com/kijai/ComfyUI-KwaiKolorsWrapper](https://github.com/kijai/ComfyUI-KwaiKolorsWrapper)\nUsing ComfyUI Native Sampling"
|
||||
version = "1.0.0"
|
||||
license = "LICENSE"
|
||||
version = "2.0.0"
|
||||
license = { file = "GPL-3.0 license" }
|
||||
|
||||
[project.urls]
|
||||
Repository = "https://github.com/MinusZoneAI/ComfyUI-Kolors-MZ"
|
||||
|
||||
Reference in New Issue
Block a user