見出し画像

Gemini 1.5 Proで「ComfyUI Custom Node リファレンスドキュメント」作ってみた🤣🤣🤣(サブ記事)

割引あり

この記事は下の記事のサブ記事です😉内容は正しくない可能性があります😉



ComfyUI Custom Node リファレンスドキュメント

ComfyUIは、ノードベースのワークフローシステムで、Stable Diffusionなどの深層学習モデルを使った画像生成を簡単に行えるツールです。Custom Nodeを作成することで、ComfyUIの機能を拡張し、独自の処理やワークフローを実現できます。

本ドキュメントは、Custom Nodeを作成するためのガイドラインと、各機能の詳細を解説するリファレンスです。

Custom Nodeの基本構造

ComfyUIのCustom Nodeは、Pythonクラスとして定義します。基本的な構造は以下の通りです。

import torch
import comfy.utils

class MyCustomNode:
    @classmethod
    def INPUT_TYPES(s):
        # ノードの入力タイプを定義
        return {"required": {"input_image": ("IMAGE",),
                              "text": ("STRING", {"default": "a cat"}),
                              "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
                              }}

    RETURN_TYPES = ("IMAGE",) # ノードの出力タイプを定義
    FUNCTION = "my_function" # ノードの処理を行う関数の名前

    CATEGORY = "image" # ノードのカテゴリを定義

    def my_function(self, input_image, text, strength):
        # ノードの処理を実装
        # 例: 入力画像にテキストを埋め込む処理
        
        # 出力データを返す
        return (output_image,)
        
NODE_CLASS_MAPPINGS = {
    "MyCustomNode": MyCustomNode # ノードクラスを登録
}
    

content_copyUse code with caution.Python

詳細解説

1. クラス定義

  • MyCustomNode: Custom Nodeの名前です。任意の名前に変更できます。

2. INPUT_TYPESメソッド

  • このメソッドは、ノードの入力タイプを定義します。

  • required キーには必須の入力、optional キーには任意の入力を指定します。

  • 各入力は、(type, options) のタプルで定義します。

    • type: 入力のデータタイプです。IMAGE, STRING, FLOAT, INT, MODEL, CLIP, VAE, LATENT, MASK, CONDITIONING, CONTROL_NET, UPSCALE_MODEL など、ComfyUIで定義されているデータタイプを指定します。

    • options: 入力に関する追加情報を指定します。

      • default: デフォルト値

      • min, max, step: 数値入力の場合の最小値、最大値、ステップ

      • multiline: 文字列入力の場合に複数行入力を許可するかどうか

      • dynamicPrompts: 文字列入力の場合に動的プロンプトを許可するかどうか

      • image_upload: 画像アップロードを許可するかどうか

      • audio_upload: 音声アップロードを許可するかどうか

例:

@classmethod
    def INPUT_TYPES(s):
        return {"required": {"input_image": ("IMAGE",),
                              "text": ("STRING", {"default": "a cat", "multiline": True}),
                              "strength": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}),
                              },
                "optional": {"mask": ("MASK", )},
                }
    

content_copyUse code with caution.Python

3. RETURN_TYPES属性

  • この属性は、ノードの出力タイプを定義します。

  • 出力タイプは INPUT_TYPES と同様に、ComfyUIで定義されているデータタイプを指定します。

  • 複数の出力がある場合は、タプルのリストで定義します。

例:

RETURN_TYPES = ("IMAGE", "MASK") # 2つの出力を定義
    

content_copyUse code with caution.Python

4. FUNCTION属性

  • この属性は、ノードの処理を行う関数の名前を指定します。

5. CATEGORY属性

  • この属性は、ノードのカテゴリを指定します。

  • カテゴリは、ComfyUIのノードメニューに表示されます。

例:

CATEGORY = "image/custom" # カスタムカテゴリを作成
    

content_copyUse code with caution.Python

6. 処理関数

  • my_function: FUNCTION 属性で指定した名前の関数です。

  • ノードの処理を実装します。

  • 引数は INPUT_TYPES メソッドで定義した入力を受け取ります。

  • 戻り値は RETURN_TYPES 属性で定義した出力データのタプルです。

例:

def my_function(self, input_image, text, strength):
        # 入力画像にテキストを埋め込む処理
        
        # 出力データを返す
        return (output_image,)
    

content_copyUse code with caution.Python

7. NODE_CLASS_MAPPINGS辞書

  • この辞書は、ノードクラスをComfyUIに登録するために使用します。

  • キーにはノードクラスの名前、値にはノードクラス自体を指定します。

実装例

画像の特定色をマスクに変換するノード

import torch
import comfy.utils

class ImageToMaskByColor:
    @classmethod
    def INPUT_TYPES(s):
        return {"required": { "image": ("IMAGE",),
                              "color": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFF, "step": 1, "display": "color"}),
                              }}
    RETURN_TYPES = ("MASK",)
    FUNCTION = "image_to_mask"

    CATEGORY = "image/mask"

    def image_to_mask(self, image, color):
        temp = (torch.clamp(image, 0, 1.0) * 255.0).round().to(torch.int)
        temp = torch.bitwise_left_shift(temp[:,:,:,0], 16) + torch.bitwise_left_shift(temp[:,:,:,1], 8) + temp[:,:,:,2]
        mask = torch.where(temp == color, 255, 0).float()
        return (mask,)

NODE_CLASS_MAPPINGS = {
    "ImageToMaskByColor": ImageToMaskByColor
}
    

content_copyUse code with caution.Python

モデルにLoraを適用するノード

import comfy.utils
import folder_paths

class ApplyLora:
    @classmethod
    def INPUT_TYPES(s):
        return {"required": { "model": ("MODEL",),
                              "lora_path": ("STRING", {"default": "loras/example.safetensors", "multiline": False}),
                              "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
                              }}
    RETURN_TYPES = ("MODEL",)
    FUNCTION = "apply_lora"

    CATEGORY = "model"

    def apply_lora(self, model, lora_path, strength):
        lora_path = folder_paths.get_annotated_filepath(lora_path)
        lora = comfy.utils.load_torch_file(lora_path)
        model_lora = model.clone()
        model_lora.load_lora(lora, strength)
        return (model_lora,)

NODE_CLASS_MAPPINGS = {
    "ApplyLora": ApplyLora
}
    

content_copyUse code with caution.Python

まとめ

ComfyUIのCustom Node作成は、Pythonの基本的な知識があれば比較的容易です。ぜひ本ドキュメントを参考に、ComfyUIの機能を拡張するCustom Nodeを作成してみてください。

ここから先は

0字

この記事が気に入ったらチップで応援してみませんか?