基本ノードの作成
前提条件
環境構築
ノードの定義
以下のコードをsrc/nodes.py の末尾に追加してください:
src/nodes.py
カスタムノードの基本構造については、こちら で詳しく説明されています。
CATEGORY(カスタムノードが新規追加ノードメニューのどこに配置されるかを指定)、INPUT_TYPES(ノードが受け取る入力を定義するクラスメソッド。返される辞書の詳細は 後述 を参照)、RETURN_TYPES(ノードが生成する出力を定義)、および FUNCTION(ノード実行時に呼び出される関数名)。
メイン関数
メイン関数choose_image は、INPUT_TYPES で定義された名前付き引数を受け取り、RETURN_TYPES で定義された tuple を返します。画像は内部的には torch.Tensor として保存されているため、
[B,H,W,C] の torch.Tensor です。ここで B はバッチサイズ、C はチャンネル数(RGB の場合は 3)です。このようなテンソルを反復処理すると、形状 [H,W,C] の B 個のテンソルシリーズが得られます。.flatten() メソッドはこれを長さ H*W*C の 1 次元テンソルに変換し、torch.mean() は平均を計算し、.item() は単一値のテンソルを Python の浮動小数点数に変換します。
images[brightest]は形状[H,W,C]のテンソルを返します。unsqueezeは、この場合次元 0 に(長さ 1 の)次元を挿入するために使用され、B=1の[B,H,W,C]、つまり単一の画像を得ます。return (result,)では、タプルを返すことを保証するために末尾のコンマが不可欠です。
ノードの登録
Comfy に新しいノードを認識させるには、パッケージレベルで利用可能である必要があります。src/nodes.py の末尾にある NODE_CLASS_MAPPINGS 変数を変更してください。変更を確認するには ComfyUI を再起動する必要があります。
src/nodes.py
ComfyUI がカスタムノードをどのように発見しロードするかについての詳しい説明は、ノードライフサイクルドキュメント を参照してください。
オプションの追加
そのノードは少し退屈かもしれないので、オプションを追加してみましょう。最も明るい画像、または最も赤い、青い、緑の画像を選択できるウィジェットです。INPUT_TYPES を以下のように編集してください:
R 値を 3 色すべての平均で割ったものです。したがって:
UI の調整
視覚的なフィードバックがあると良いかもしれないので、表示されるテキストメッセージを送信してみましょう。サーバーからメッセージを送信
これには、Python コードに 2 行追加する必要があります:choose_image メソッドの末尾に、フロントエンドへメッセージを送信する行を追加します(send_sync は一意であるべきメッセージタイプと辞書を取ります):
クライアント拡張の作成
クライアントに Javascript を追加するには、カスタムノードディレクトリにweb/js サブディレクトリを作成し、__init__.py の末尾を修正して WEB_DIRECTORY をエクスポートすることで Comfy に伝えます:
web/js サブディレクトリ内の .js ファイルとして保存されるため、以下のコードで image_selector/web/js/imageSelector.js を作成してください。(詳細は クライアントサイドコーディング を参照)
setup() メソッド内で送信するメッセージタイプのリスナーを追加することだけです。これは、送信した辞書(event.detail に保存されています)を読み取ります。
Comfy サーバーを停止し、再度起動して、ウェブページをリロードし、ワークフローを実行してください。
完全な例
完全な例は こちら で入手できます。示例ワークフローの JSON ファイル をダウンロードするか、以下で閲覧できます: