single.php

ComfyUIでFLUX.1-devを利用してガイダーを使って画像生成するワークフローの作成手順

Pythonと[FLUX.1-dev]でローカル環境に生成AIをインストールした時の手順を備忘録的に投稿しておきます。

ローカル環境に生成AIをインストール

先回インストールしてみた[FLUX.1-dev]でプロンプトに入力したテキストから画像を生成するまでのワークフローを作成してみた。

[FLUX.1-dev]をインストールする手順については別記事をご覧ください。

今回のワークフローのベースになっている、ワークフローの作成手順については別記事をご覧ください。

ガイダーを利用したワークフロー

先回作成したワークフローは[CLIPテキストエンコード(プロンプト)]に入力したでテキストを[カスタムサンプラー]に直接受け渡していました。

今回は[基本ガイダー]を利用しての処理に改良してみます。

ガイダーとは[ComfyUI]のドキュメントによると、こんな説明になっています。

BasicGuiderノードは、サンプリングプロセス用のシンプルなガイダンスメカニズムを作成します。モデルとコンディショニングデータを入力として受け取り、サンプリング中に生成プロセスをガイドするために使用できるガイダーオブジェクトを生成します。このノードは、制御された生成に必要な基本的なガイダンス機能を提供します。

要するに作成されたモデルデータとテキスト(プロンプト)からサンプラーの生成に必要なガイドを作成する役割です。

今回利用した[基本ガイダー]ノードは[モデル]と[条件付け(コンディショニング)]の2つの入力なのでネガティブプロンプトの用意が必要なくなります。

実際に配置するノードは、こんな感じ。(名前を[ノードライブラリ]で検索すると表示されます)

名前数量
デュアルCLIPを読み込む1
CLIPテキストエンコード(プロンプト)1
拡散モデルを読み込む1
整数2
モデルサンプリングフラックス1
空のSD3潜在画像1
基本スケジューラー1
基本ガイダー1
ランダムノイズ1
Kサンプラー選択1
カスタムサンプラー(高度)1
VEAを読み込む1
VEAデコード1
画像を保存1

最初にプロンプトを作成するワークフロー

1.[デュアルCLIPを読み込む]ノードを配置して[clip_name]に[clip_l.safetensors]と[t5xxl_fp8_e4m3fn.safetensors]を設定します。

2.[CLIPテキストエンコード(プロンプト)]ノードを配置して[デュアルCLIPを読み込む]ノードの[CLIP(クリップ)]ピンを接続します。

3. [CLIPテキストエンコード(プロンプト)]ノードのボックスにテキストを入力します。

今回はキーワードとして “Green Apple” を入力しました。

モデルを作成するワークフロー

1.[拡散モデルを読み込む]ノードを配置して[unet_name]プロパティに[flux1-dev.safetensors]を設定します。

2.[モデルサンプリングフラックス]ノードを配置して[拡散モデルを読み込む]の[モデル]ピン同士を接続します。

3.[整数]ノードを2つ配置して、生成する画像のサイズ(幅と高さ)を[値]プロパティに設定します。

4.[モデルサンプリングフラックス]ノード[幅]と[高さ]ピンと[整数]ノードの[整数]ピンを接続します。

5.[空のSD3潜在画像]ノードを配置して[幅]と[高さ]ピンと[整数]ノードの[整数]ピンを接続します。

6.[基本スケジューラー]ノードを配置して[モデルサンプリングフラックス]ノードの[モデル]ピンと接続します。

[整数]ノードの[値]以外のプロパティは、既定値のままでも構いません。

モデルとプロンプトからガイダーを生成するワークフロー

1.[基本ガイダー]ノードを配置します。

2.[CLIPテキストエンコード(プロンプト]ノードの[条件付け]ピンと[基本ガイダー]ノードの[コンディショニング]ピンを接続します。

3.[モデルサンプリングフラックス]ノードの[モデル]ピンと[基本ガイダー]ノードの[モデル]ピンを接続します。

サンプラーから画像を生成するワークフロー

1.[Kサンプラー選択]ノードと[カスタムサンプラー(高度)]ノードを配置して[サンプラー]ピン同士を接続します。

2.[ランダムノイズ]ノードを配置して[カスタムサンプラー(高度)]ノードの[ノイズ]ピン同士を接続します。

3.[基本ガイダー]ノードと[カスタムサンプラー(高度)]ノードの[ガイダー]ピン同士を接続します。

4.[空のSD3潜在画像]ノードの[潜在]ピン、[基本スケジューラー]ノードの[シグマ]ピンを[カスタムサンプラー]ノードのそれぞれのピンに接続します。

5.[VEAを読み込む]ノードを配置して[vea_name]プロパティに[ae.safetensors]を設定します。

6.[VEAデコード]ノードを配置して[VEAを読み込む]ノードの[VEA]ピンを接続します。

7.[カスタムサンプラー]ノードの[出力]ピンと[VEAデコード]ノードの[サンプル]ピンを接続します。

8.[画像を保存]ノードを配置して[VEAデコード]ノードの[画像]ピンと接続します。

実行すると、”緑のりんご” っぽい画像が[output]フォルダーに出力されます。

ワークフローのJSON

最後に作成したワークフローのJSONを貼り付けておきます。

保存したファイルをComfyUIの[メニュー|ファイル|開く]で選択するとワークフローが表示される(はず)です。

{
    "id": "00000000-0000-0000-0000-000000000000",
    "revision": 0,
    "last_node_id": 30,
    "last_link_id": 50,
    "nodes": [
        {
            "id": 7,
            "type": "PrimitiveInt",
            "pos": [
                219.67084380741093,
                562.6876946220195
            ],
            "size": [
                270,
                82
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "値",
                    "name": "value",
                    "type": "INT",
                    "widget": {
                        "name": "value"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "整数",
                    "name": "INT",
                    "type": "INT",
                    "links": [
                        3,
                        5
                    ]
                }
            ],
            "title": "整数(幅)",
            "properties": {
                "Node name for S&R": "PrimitiveInt"
            },
            "widgets_values": [
                512,
                "fixed"
            ]
        },
        {
            "id": 8,
            "type": "PrimitiveInt",
            "pos": [
                225.22632476444218,
                708.0580742606926
            ],
            "size": [
                270,
                82
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "値",
                    "name": "value",
                    "type": "INT",
                    "widget": {
                        "name": "value"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "整数",
                    "name": "INT",
                    "type": "INT",
                    "links": [
                        4,
                        6
                    ]
                }
            ],
            "title": "整数(高さ)",
            "properties": {
                "Node name for S&R": "PrimitiveInt"
            },
            "widgets_values": [
                512,
                "fixed"
            ]
        },
        {
            "id": 10,
            "type": "EmptySD3LatentImage",
            "pos": [
                578.7543563196188,
                606.0304112357899
            ],
            "size": [
                270,
                106
            ],
            "flags": {},
            "order": 7,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "幅",
                    "name": "width",
                    "type": "INT",
                    "widget": {
                        "name": "width"
                    },
                    "link": 5
                },
                {
                    "localized_name": "高さ",
                    "name": "height",
                    "type": "INT",
                    "widget": {
                        "name": "height"
                    },
                    "link": 6
                },
                {
                    "localized_name": "バッチサイズ",
                    "name": "batch_size",
                    "type": "INT",
                    "widget": {
                        "name": "batch_size"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "潜在",
                    "name": "LATENT",
                    "type": "LATENT",
                    "links": [
                        46
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "EmptySD3LatentImage"
            },
            "widgets_values": [
                1024,
                1024,
                1
            ]
        },
        {
            "id": 13,
            "type": "BasicScheduler",
            "pos": [
                582.7111793592795,
                771.5856863450992
            ],
            "size": [
                270,
                106
            ],
            "flags": {},
            "order": 10,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "モデル",
                    "name": "model",
                    "type": "MODEL",
                    "link": 10
                },
                {
                    "localized_name": "スケジューラ",
                    "name": "scheduler",
                    "type": "COMBO",
                    "widget": {
                        "name": "scheduler"
                    },
                    "link": null
                },
                {
                    "localized_name": "ステップ",
                    "name": "steps",
                    "type": "INT",
                    "widget": {
                        "name": "steps"
                    },
                    "link": null
                },
                {
                    "localized_name": "ノイズ除去",
                    "name": "denoise",
                    "type": "FLOAT",
                    "widget": {
                        "name": "denoise"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "シグマ",
                    "name": "SIGMAS",
                    "type": "SIGMAS",
                    "links": [
                        47
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "BasicScheduler"
            },
            "widgets_values": [
                "simple",
                20,
                1
            ]
        },
        {
            "id": 4,
            "type": "UNETLoader",
            "pos": [
                217.62350237674676,
                419.1602127494611
            ],
            "size": [
                270,
                82
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "unet_name",
                    "name": "unet_name",
                    "type": "COMBO",
                    "widget": {
                        "name": "unet_name"
                    },
                    "link": null
                },
                {
                    "localized_name": "重みdtype",
                    "name": "weight_dtype",
                    "type": "COMBO",
                    "widget": {
                        "name": "weight_dtype"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "モデル",
                    "name": "MODEL",
                    "type": "MODEL",
                    "links": [
                        7
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "UNETLoader"
            },
            "widgets_values": [
                "flux1-dev.safetensors",
                "default"
            ]
        },
        {
            "id": 9,
            "type": "ModelSamplingFlux",
            "pos": [
                568.8266892603434,
                411.4655083427228
            ],
            "size": [
                295.9,
                130
            ],
            "flags": {},
            "order": 8,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "モデル",
                    "name": "model",
                    "type": "MODEL",
                    "link": 7
                },
                {
                    "localized_name": "最大シフト",
                    "name": "max_shift",
                    "type": "FLOAT",
                    "widget": {
                        "name": "max_shift"
                    },
                    "link": null
                },
                {
                    "localized_name": "基本シフト",
                    "name": "base_shift",
                    "type": "FLOAT",
                    "widget": {
                        "name": "base_shift"
                    },
                    "link": null
                },
                {
                    "localized_name": "幅",
                    "name": "width",
                    "type": "INT",
                    "widget": {
                        "name": "width"
                    },
                    "link": 3
                },
                {
                    "localized_name": "高さ",
                    "name": "height",
                    "type": "INT",
                    "widget": {
                        "name": "height"
                    },
                    "link": 4
                }
            ],
            "outputs": [
                {
                    "localized_name": "モデル",
                    "name": "MODEL",
                    "type": "MODEL",
                    "links": [
                        10,
                        50
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "ModelSamplingFlux"
            },
            "widgets_values": [
                1.15,
                0.5,
                1024,
                1024
            ]
        },
        {
            "id": 1,
            "type": "DualCLIPLoader",
            "pos": [
                214.74581943607572,
                140.21324089992214
            ],
            "size": [
                270,
                130
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "clip_name1",
                    "name": "clip_name1",
                    "type": "COMBO",
                    "widget": {
                        "name": "clip_name1"
                    },
                    "link": null
                },
                {
                    "localized_name": "clip_name2",
                    "name": "clip_name2",
                    "type": "COMBO",
                    "widget": {
                        "name": "clip_name2"
                    },
                    "link": null
                },
                {
                    "localized_name": "タイプ",
                    "name": "type",
                    "type": "COMBO",
                    "widget": {
                        "name": "type"
                    },
                    "link": null
                },
                {
                    "localized_name": "デバイス",
                    "name": "device",
                    "shape": 7,
                    "type": "COMBO",
                    "widget": {
                        "name": "device"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "CLIP",
                    "name": "CLIP",
                    "type": "CLIP",
                    "links": [
                        1
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "DualCLIPLoader"
            },
            "widgets_values": [
                "t5xxl_fp8_e4m3fn.safetensors",
                "clip_l.safetensors",
                "flux",
                "default"
            ]
        },
        {
            "id": 2,
            "type": "CLIPTextEncode",
            "pos": [
                560.9267361485657,
                137.19382493475624
            ],
            "size": [
                301.82736483487224,
                197.19923161278086
            ],
            "flags": {},
            "order": 9,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "クリップ",
                    "name": "clip",
                    "type": "CLIP",
                    "link": 1
                },
                {
                    "localized_name": "テキスト",
                    "name": "text",
                    "type": "STRING",
                    "widget": {
                        "name": "text"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "条件付け",
                    "name": "CONDITIONING",
                    "type": "CONDITIONING",
                    "links": [
                        48
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "CLIPTextEncode"
            },
            "widgets_values": [
                "Green Apple"
            ]
        },
        {
            "id": 26,
            "type": "BasicGuider",
            "pos": [
                908.601923174549,
                289.2569576552612
            ],
            "size": [
                201,
                46
            ],
            "flags": {},
            "order": 11,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "モデル",
                    "name": "model",
                    "type": "MODEL",
                    "link": 50
                },
                {
                    "localized_name": "コンディショニング",
                    "name": "conditioning",
                    "type": "CONDITIONING",
                    "link": 48
                }
            ],
            "outputs": [
                {
                    "localized_name": "ガイダー",
                    "name": "GUIDER",
                    "type": "GUIDER",
                    "links": [
                        35
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "BasicGuider"
            },
            "widgets_values": []
        },
        {
            "id": 29,
            "type": "RandomNoise",
            "pos": [
                912.3474742160815,
                407.07439374741733
            ],
            "size": [
                270,
                82
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "ノイズシード",
                    "name": "noise_seed",
                    "type": "INT",
                    "widget": {
                        "name": "noise_seed"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "ノイズ",
                    "name": "NOISE",
                    "type": "NOISE",
                    "links": [
                        34
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "RandomNoise"
            },
            "widgets_values": [
                168294946403286,
                "randomize"
            ]
        },
        {
            "id": 14,
            "type": "KSamplerSelect",
            "pos": [
                901.4604531910044,
                818.7077858016182
            ],
            "size": [
                270,
                58
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "サンプラー名",
                    "name": "sampler_name",
                    "type": "COMBO",
                    "widget": {
                        "name": "sampler_name"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "サンプラー",
                    "name": "SAMPLER",
                    "type": "SAMPLER",
                    "links": [
                        45
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "KSamplerSelect"
            },
            "widgets_values": [
                "euler"
            ]
        },
        {
            "id": 25,
            "type": "SamplerCustomAdvanced",
            "pos": [
                1227.7013804660817,
                566.539137621707
            ],
            "size": [
                377.4555419921875,
                302.66668701171875
            ],
            "flags": {},
            "order": 12,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "ノイズ",
                    "name": "noise",
                    "type": "NOISE",
                    "link": 34
                },
                {
                    "localized_name": "ガイダー",
                    "name": "guider",
                    "type": "GUIDER",
                    "link": 35
                },
                {
                    "localized_name": "サンプラー",
                    "name": "sampler",
                    "type": "SAMPLER",
                    "link": 45
                },
                {
                    "localized_name": "シグマ",
                    "name": "sigmas",
                    "type": "SIGMAS",
                    "link": 47
                },
                {
                    "localized_name": "潜在イメージ",
                    "name": "latent_image",
                    "type": "LATENT",
                    "link": 46
                }
            ],
            "outputs": [
                {
                    "localized_name": "出力",
                    "name": "output",
                    "type": "LATENT",
                    "links": [
                        49
                    ]
                },
                {
                    "localized_name": "デノイズ出力",
                    "name": "denoised_output",
                    "type": "LATENT",
                    "links": null
                }
            ],
            "properties": {
                "Node name for S&R": "SamplerCustomAdvanced"
            },
            "widgets_values": []
        },
        {
            "id": 23,
            "type": "VAEDecode",
            "pos": [
                1712.0182934237384,
                577.7002406255546
            ],
            "size": [
                258.10393560302737,
                46
            ],
            "flags": {},
            "order": 13,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "サンプル",
                    "name": "samples",
                    "type": "LATENT",
                    "link": 49
                },
                {
                    "localized_name": "vae",
                    "name": "vae",
                    "type": "VAE",
                    "link": 20
                }
            ],
            "outputs": [
                {
                    "localized_name": "画像",
                    "name": "IMAGE",
                    "type": "IMAGE",
                    "links": [
                        22
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "VAEDecode"
            },
            "widgets_values": []
        },
        {
            "id": 24,
            "type": "VAELoader",
            "pos": [
                1340.8290248690523,
                924.6886247503097
            ],
            "size": [
                270,
                58
            ],
            "flags": {},
            "order": 6,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "vae_name",
                    "name": "vae_name",
                    "type": "COMBO",
                    "widget": {
                        "name": "vae_name"
                    },
                    "link": null
                }
            ],
            "outputs": [
                {
                    "localized_name": "VAE",
                    "name": "VAE",
                    "type": "VAE",
                    "links": [
                        20
                    ]
                }
            ],
            "properties": {
                "Node name for S&R": "VAELoader"
            },
            "widgets_values": [
                "ae.safetensors"
            ]
        },
        {
            "id": 21,
            "type": "SaveImage",
            "pos": [
                1731.8831336336998,
                692.1500901128595
            ],
            "size": [
                314.673828125,
                270
            ],
            "flags": {},
            "order": 14,
            "mode": 0,
            "inputs": [
                {
                    "localized_name": "画像",
                    "name": "images",
                    "type": "IMAGE",
                    "link": 22
                },
                {
                    "localized_name": "ファイル名_プレフィックス",
                    "name": "filename_prefix",
                    "type": "STRING",
                    "widget": {
                        "name": "filename_prefix"
                    },
                    "link": null
                }
            ],
            "outputs": [],
            "properties": {},
            "widgets_values": [
                "ComfyUI"
            ]
        }
    ],
    "links": [
        [
            1,
            1,
            0,
            2,
            0,
            "CLIP"
        ],
        [
            3,
            7,
            0,
            9,
            3,
            "INT"
        ],
        [
            4,
            8,
            0,
            9,
            4,
            "INT"
        ],
        [
            5,
            7,
            0,
            10,
            0,
            "INT"
        ],
        [
            6,
            8,
            0,
            10,
            1,
            "INT"
        ],
        [
            7,
            4,
            0,
            9,
            0,
            "MODEL"
        ],
        [
            10,
            9,
            0,
            13,
            0,
            "MODEL"
        ],
        [
            20,
            24,
            0,
            23,
            1,
            "VAE"
        ],
        [
            22,
            23,
            0,
            21,
            0,
            "IMAGE"
        ],
        [
            34,
            29,
            0,
            25,
            0,
            "NOISE"
        ],
        [
            35,
            26,
            0,
            25,
            1,
            "GUIDER"
        ],
        [
            45,
            14,
            0,
            25,
            2,
            "SAMPLER"
        ],
        [
            46,
            10,
            0,
            25,
            4,
            "LATENT"
        ],
        [
            47,
            13,
            0,
            25,
            3,
            "SIGMAS"
        ],
        [
            48,
            2,
            0,
            26,
            1,
            "CONDITIONING"
        ],
        [
            49,
            25,
            0,
            23,
            0,
            "LATENT"
        ],
        [
            50,
            9,
            0,
            26,
            0,
            "MODEL"
        ]
    ],
    "groups": [],
    "config": {},
    "extra": {
        "ds": {
            "scale": 0.38554328942953175,
            "offset": [
                2312.988583505018,
                -20.874663103992766
            ]
        },
        "workflowRendererVersion": "LG"
    },
    "version": 0.4
}

まとめ

今回は[ComfyUI]と[FLUX.1-dev]でガイダーを使ってプロンプトから画像を生成するためのワークフローを作成する手順について紹介しました。

[ComfyUI]で[FLUX.1-dev]を動作させる必要最低限のノードに[基本ガイダー]ノードを追加して、少し詳細な画像が出力できそうなワークフローを作成してみました。

[ComfyUI]で[FLUX.1-dev]を動作させるワークフローを作りたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です