今回のブログでは、シンプルなワークフローを組みつつその手順を書き残しておきます。
1つだけ事前準備
ComfyUIの言語を “English” にする。変更手順は下図。

日本語でも機能的な問題はないが、Github や reddit といったコミュニティー上だと主に英語でやりとりがされていて、それらを参考した際、特にノード名の読み替えが非常に面倒だったりする(地味にノード検索も面倒)。ComfyUIの言語を英語にする理由はそのため。
新しいワークフロー
メニューの “Workflow” から “New” を選択すると空のワークフローが作られる。(下記の画像では左下にメニューがあるが、デフォは左上)

各種ノードの準備
続いては、イラスト生成に必要なノードをワークフロー上に追加する。追加方法は主に下記の二通りとなるが、ここでは後者のやり方で進める。
コンテキストメニュー(右クリックで表示されるメニュー)からノード追加

ノード検索(ワークフローの何も無い部分をダブルクリックで表示される)からノード追加

チェックポイント(Checkpoint)を読み込むノード
” Load Check~~” で検索すると “Load Checkpoint” がフィルタされるので選択する。

するとワークフローに小さなウィンドウが配置される。これがノード。
このノードは チェックポイント(Checkpoint) と呼ばれるモデルを読み込むためのノードなので、前回の記事でダウンロードした “sdXL_v10VAEFix.safetensors” を選択しておく。
また、ノードには左、右、あるいは両方に接点(下図でいうMODELSとかCLIPとか)が付いていて、これを他のノード接続させることでデータのやり取りが行える。入出力については基本的に左が入力用、右が出力用。

VAEを読み込むノード
“Load VAE” で検索すると目的のノードがフィルタされるので選択。

VAE を読み込むためのノードが追加されるが、今回はチェックポイントに VAE が含まれているので利用はしない。

プロンプトを記述するノード
“Clip Text~~” で検索すると “Clip Text Encode (Prompt)” がフィルタされるので選択。

プロンプトを記述するためのノードが追加される。
ここで言うプロンプトとは生成するイメージの特徴を文章で表現したもので、基本英語で記述する。また、プロンプトはポジティブ(イメージに含めたい要素)とネガティブ(イメージに含めてほしくない要素)の2種類が指定可能なので、それぞれ用のノードを用意する。

そうしたら、先程追加したノード Load Checkpoint ノード と、今追加した Clip Text Encode (Prompt) ノード をラインで結ぶ。結び方は Load Checkpoint ノード の CLIP から CLIP Text Encode (Prompt) ノード の CLIP までドラッグ&ドロップすればラインで結べる。
これを結ぶことで、チェックポイントの CLIP モデルを読み込める。

正しく接続できると下図のようになる。

空の潜在イメージを生成するノード
“Empty Latent~~” で検索すると “Empty Latent Image” がフィルタされるので選択。

空の潜在イメージ(Empty Latent Image)を生成するノードが追加される。
空の潜在イメージは例えると何も書かれていないキャンバスに相当し、そのキャンバスのサイズや枚数をノード上で指定することができる。
ここでは width と height にそれぞれ 1024 と入力し、最終的に生成されるイメージのサイズが 1024 x 1024 になるよう指定する。

イメージを生成するノード(サンプラー)
“Ksample” で検索すると “KSampler” がフィルタされるので選択。

イメージを生成してくれる サンプラー が追加される。
サンプラーの設定項目はそれぞれ説明がややこしいので今回は初期値のまま進める。

これまでに追加した Load Checkpoint ノード 、 Clip Text Encode (Prompt) ノード 、 Empty Latent Image ノード といった3種類のノードと KSampler ノード をラインで結ぶ。これで、サンプラーがイメージ生成に必要な入力データ(プロンプト、モデル、空の潜在イメージ)が揃い、それに基づいたイメージデータが生成・出力される。

イメージをデコードするノード
“VAE~~” で検索すると “VAE Decode” がフィルタされるので選択。

処理用のイメージを見る用のイメージに変換してくれる VAEデコーダー が追加される。

これまでに追加した Load Checkpoint ノード 、 KSampler ノード の2ノードと VAE Decode ノード をラインで結ぶ。これでサンプラーが出力したイメージを、モデル付属のVAEを使ってデコードしたイメージデータが出力される。

イメージを表示するノード
“Preview~~” で検索すると “Preview Image” がフィルタされるので選択。

イメージを表示するノードが追加される。

先程追加した VAE Decode ノード と、Preview Image ノード をラインで結ぶ。これでデコードされたイメージデータを受け取りプレビューすることができる。

ワークフローの実行
ワークフローは準備出来たので、適当なプロンプトを入力して実行してみます。
テスト用のプロンプトはこちら。
ポジティブプロンプト
masterpiece, best quality, ultra detailed, high resolution, 4k, 8k, extremely detailed CG, super fine illustration, anime, official, 1girl, small breasts, blonde hair, long wavy hair, voluminous hair, black witch hat, big white ribbon on hat, maid uniform, white apron, golden eyes, slanted eyes, smile, closed mouth, dynamic pose, cherry blossoms in full bloom, shrine background, natural lighting, soft shadows, characteristic star hair ornament,
ネガティブプロンプト
(low quality, bad quality:1.4), (worst quality, bad quality, deformed, distorted, disfigured:1.3), blurry, wrong fingers, mutated hands, bad anatomy, bad proportions, extra limb, missing limb, floating limbs, (fused fingers, too many fingers:1.2), long neck, cross-eyed, ugly, asymmetrical eyes, mismatched eyes, semi-realistic, cgi, 3d, render, sketch, cartoon, manga, text, signature, watermark,
プロンプトを入力。

画面の何処かにある Queue を押せばワークフローが実行される。(Ctrl+Shift+Enter
でも実行できる)

エラーを吐かずイメージが生成されればOK。
よく実況とかで見かけるような娘が生成されました。それと、手だの服だのに破綻がありますがモデル的にもプロンプトの調整だけだと限界でした・・・。


今回作ったワークフロー。(コピー後Comfy上でペーストすれば読み込めます)
{
"last_node_id": 17,
"last_link_id": 10,
"nodes": [
{
"id": 3,
"type": "VAELoader",
"pos": [
15590.3076171875,
4290.068359375
],
"size": [
315,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": null
}
],
"properties": {
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"FLUX1D\\ae.safetensors"
]
},
{
"id": 13,
"type": "EmptyLatentImage",
"pos": [
16064.21875,
4702.33056640625
],
"size": [
315,
106
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
7
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "EmptyLatentImage"
},
"widgets_values": [
1024,
1024,
1
]
},
{
"id": 12,
"type": "KSampler",
"pos": [
16536.466796875,
4138.75244140625
],
"size": [
315,
262
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 6
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 4
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 5
},
{
"name": "latent_image",
"type": "LATENT",
"link": 7
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
8
]
}
],
"properties": {
"Node name for S&R": "KSampler"
},
"widgets_values": [
690699234001186,
"randomize",
20,
8,
"euler",
"normal",
1
]
},
{
"id": 15,
"type": "VAEDecode",
"pos": [
16909.19921875,
4137.712890625
],
"size": [
210,
46
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 8
},
{
"name": "vae",
"type": "VAE",
"link": 9
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
10
]
}
],
"properties": {
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 17,
"type": "PreviewImage",
"pos": [
17180.802734375,
4138.47412109375
],
"size": [
210,
246
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 10
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 2,
"type": "CheckpointLoaderSimple",
"pos": [
15589.9638671875,
4139.5166015625
],
"size": [
315,
98
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
6
],
"slot_index": 0
},
{
"name": "CLIP",
"type": "CLIP",
"links": [
1,
2
],
"slot_index": 1
},
{
"name": "VAE",
"type": "VAE",
"links": [
9
]
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"SDXL\\sd_xl_base_1.0_0.9vae.safetensors"
]
},
{
"id": 4,
"type": "CLIPTextEncode",
"pos": [
15982.3740234375,
4211.38330078125
],
"size": [
400,
200
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 1
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
4
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"masterpiece, best quality, ultra detailed, high resolution, 4k, 8k, extremely detailed CG, super fine illustration, anime, official, 1girl, small breasts, blonde hair, long wavy hair, voluminous hair, black witch hat, big white ribbon on hat, maid uniform, white apron, golden eyes, slanted eyes, smile, closed mouth, dynamic pose, cherry blossoms in full bloom, shrine background, natural lighting, soft shadows, characteristic star hair ornament, broom in hand,"
]
},
{
"id": 5,
"type": "CLIPTextEncode",
"pos": [
15980.95703125,
4456.7412109375
],
"size": [
400,
200
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 2
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
5
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"(low quality, bad quality:1.4), (worst quality, bad quality, deformed, distorted, disfigured:1.3), blurry, wrong fingers, mutated hands, bad anatomy, bad proportions, extra limb, missing limb, floating limbs, (fused fingers, too many fingers:1.2), long neck, cross-eyed, ugly, asymmetrical eyes, mismatched eyes, semi-realistic, cgi, 3d, render, sketch, cartoon, manga, text, signature, watermark,"
]
}
],
"links": [
[
1,
2,
1,
4,
0,
"CLIP"
],
[
2,
2,
1,
5,
0,
"CLIP"
],
[
4,
4,
0,
12,
1,
"CONDITIONING"
],
[
5,
5,
0,
12,
2,
"CONDITIONING"
],
[
6,
2,
0,
12,
0,
"MODEL"
],
[
7,
13,
0,
12,
3,
"LATENT"
],
[
8,
12,
0,
15,
0,
"LATENT"
],
[
9,
2,
2,
15,
1,
"VAE"
],
[
10,
15,
0,
17,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.9229599817706552,
"offset": [
-15035.991427045718,
-3553.2395148360515
]
},
"node_versions": {
"comfy-core": "0.3.18"
},
"ue_links": []
},
"version": 0.4
}
先程生成したイメージの破綻具合が酷かったので別のモデルで生成したもの。


さいごに
ごくごくシンプルなワークフローの作り方でした。
結局、イラストの出来はモデル次第な結論となりましたが、酷すぎなければある程度手直ししてくれるカスタムノードなんてのもあるので時間があればそれらも書こうと思います。
用語
用語の説明を書き残しますが、私の認識なので的を射ているかは怪しい…
- Qノード(Node)とは?
- A
何かしらの機能を持ったユニット。例えば、画像の読み込み・保存、各種モデルの読み込み、プロンプトの受付、画像生成、等々。
- QVAE(Variational Auto-Encoder:変分オートエンコーダー)とは?
- A
画像を処理用や見る用に変換してくれるモデル。難しいので正しくに知りたければ Wiki を見よう。
- QCLIP(Contrastive Language-Image Pre-training:対照言語画像事前学習)とは?
- A
プロンプトを理解してそれに合ったイメージを判断するモデル。これも難しいので正しく知りたければ Wiki 見てね。
コメント