ComfyUI基礎

# Text-to-Image
![スクリーンショット 2024-07-20 15.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/265ef525-a2a1-3ac4-5ef3-c7f0217b5d17.png)


### 技術説明
Stable Diffusionのプロセスは、大きく3つのステップに要約できます。

1) **テキストエンコーディング**：ユーザー入力のプロンプトは、Text Encoderと呼ばれるコンポーネントによって個々の単語の特徴ベクトルにコンパイルされます。このステップでは、テキストをモデルが理解して扱える形式に変換します。

2) **潜在空間変換**：Text Encoderからの特徴ベクトルとランダムノイズ画像が、潜在空間に変換されます。この空間では、ランダム画像が特徴ベクトルに基づいてデノイジングされ、中間生成物となります。このステップでは、モデルがテキストの特徴をビジュアル表現と関連付けることを学習し、魔法が起こります。

3) **画像デコーディング**：最後に、潜在空間からの中間生成物が Image Decoder によってデコードされ、私たちが見て感謝できる実際の画像に変換されます。

### チェックポイントノード（Load Checkpoint）
Load Checkpointノードで、Stable Diffusionのチェックポイントモデルを選択します。モデル名をクリックすると、利用可能なモデルが表示されます。モデル名をクリックしても何も起こらない場合は、カスタムモデルをアップロードする必要あります。

Stable Diffusionモデルは、MODEL、CLIP、VAEの3つの主要コンポーネントで構成されています

1) **MODEL**：MODELコンポーネントは、潜在空間で動作するノイズ予測モデルです。潜在表現から画像を生成するコアプロセスを担当します。ComfyUIでは、Load CheckpointノードのMODEL出力がKSamplerノードに接続されており、ここで逆拡散プロセスが行われます。KSamplerノードはMODELを使用して、潜在表現を反復的にデノイズし、目的のプロンプトに合致するまで徐々に画像を洗練していきます。

2) **CLIP**：CLIP（Contrastive Language-Image Pre-training）は、ユーザーが提供するポジティブプロンプトとネガティブプロンプトを前処理する言語モデルです。テキストプロンプトをMODELが理解して使用できる形式に変換します。ComfyUIでは、Load CheckpointノードのCLIP出力がCLIP Text Encodeノードに接続されます。CLIP Text Encodeノードは、ユーザーが提供したプロンプトを受け取り、CLIP言語モデルに入力し、各単語をエンベディングに変換します。これらのエンベディングは単語の意味を捉え、MODELが与えられたプロンプトに沿った画像を生成できるようにします。

3) **VAE**：VAE（Variational AutoEncoder）は、画像をピクセル空間と潜在空間の間で変換する役割を担います。画像を低次元の潜在表現に圧縮するエンコーダと、潜在表現から画像を再構成するデコーダで構成されています。Text-to-Imageのプロセスでは、VAEは最後のステップでのみ使用され、生成された画像を潜在空間からピクセル空間に変換します。ComfyUIのVAE Decodeノードは、KSamplerノード（潜在空間で動作）の出力を受け取り、VAEのデコーダ部分を使って潜在表現を最終的なピクセル空間の画像に変換します。

## CLIPテキストエンコード（CLIP Text Encode）
CLIP Text Encodeノードは、ユーザーが提供したプロンプトを受け取り、CLIP言語モデルに入力する役割を果たします。CLIPは、単語の意味を理解し、視覚的概念と関連付けることができる強力な言語モデルです。プロンプトがCLIP Text Encodeノードに入力されると、各単語がエンベディングに変換される変換プロセスを経ます。これらのエンベディングは、単語の意味情報を捉える高次元のベクトルです。プロンプトをエンベディングに変換することで、CLIPはMODELが与えられたプロンプトの意味と意図を正確に反映した画像を生成できるようになります。

### 空のLatent画像
Text-to-Imageのプロセスでは、潜在空間のランダムな画像から生成がスタートします。このランダム画像は、MODELが扱う初期状態として機能します。Latent画像のサイズは、ピクセル空間での実際の画像サイズに比例します。ComfyUIでは、Latent画像の高さと幅を調整して、生成される画像のサイズを制御できます。さらに、バッチサイズを設定して、1回の実行で生成する画像の数を決めることができます。

Latent画像の最適なサイズは、使用する特定のStable Diffusionモデルによって異なります。SD v1.5モデルでは、512x512または768x768のサイズが推奨されますが、SDXLモデルでは1024x1024が最適なサイズです。ComfyUIには、1:1（正方形）、3:2（横長）、2:3（縦長）、4:3（横長）、3:4（縦長）、16:9（ワイドスクリーン）、9:16（縦長）など、一般的なアスペクト比が用意されています。モデルのアーキテクチャとの互換性を確保するために、Latent画像の幅と高さは8の倍数である必要があります。

### VAE
VAE（Variational AutoEncoder）は、Stable Diffusionモデルにおいて、ピクセル空間と潜在空間の間で画像の変換を扱う重要なコンポーネントです。**Image Encoder** と **Image Decoder** の2つの主要な部分で構成されています。

**Image Encoder** は、ピクセル空間の画像を受け取り、それを低次元の潜在表現に圧縮します。この圧縮プロセスは、データサイズを大幅に削減し、より効率的な処理と保存を可能にします。例えば、512x512ピクセルの画像を64x64の潜在表現にまで圧縮できます。

一方、**Image Decoder（VAE Decoderとも呼ばれる）** は、潜在表現から画像をピクセル空間に再構成する役割を担います。圧縮された潜在表現を取り込み、最終的な画像を生成するために展開します。

VAEを使用することにはいくつかの利点があります。

- 効率性：画像を低次元の潜在空間に圧縮することで、VAEは高速な生成とより短いトレーニング時間を可能にします。データサイズが縮小されることで、より効率的な処理とメモリ使用が実現します。

- 潜在空間操作：潜在空間は画像のよりコンパクトで意味のある表現を提供します。これにより、画像の詳細やスタイルのより正確な制御と編集が可能になります。潜在表現を操作することで、生成された画像の特定の側面を修正することができます。


しかし、いくつかの欠点も考慮する必要があります。

- データの損失：エンコーディングとデコーディングのプロセス中に、元の画像の一部の詳細が失われる可能性があります。圧縮と再構成の手順により、元の画像と比較して最終的な画像にアーチファクトや若干のバリエーションが生じる可能性があります。
- 元のデータの限定的な捕捉：低次元の潜在空間では、元の画像の複雑な特徴や詳細のすべてを完全に捉えきれない可能性があります。圧縮プロセス中に一部の情報が失われ、元のデータのやや不正確な表現になる可能性があります。


これらの制限にもかかわらず、VAEはStable Diffusionモデルにおいて重要な役割を果たし、ピクセル空間と潜在空間の間の効率的な変換を可能にし、より高速な生成とより正確な生成画像の制御を促進します。

### KSampler
ComfyUIのKSamplerノードは、Stable Diffusionにおける画像生成プロセスの中心です。潜在空間のランダム画像をユーザー提供のプロンプトに一致するようにデノイズする役割を担っています。KSamplerは、逆拡散と呼ばれる手法を採用しており、CLIPエンベディングからのガイダンスに基づいて、ノイズを除去し意味のある詳細を追加することで、潜在表現を反復的に洗練します。

KSamplerノードには、ユーザーが画像生成プロセスを微調整できるいくつかのパラメータがあります。

- **Seed** ：シード値は、最終的な画像の初期ノイズと構成を制御します。特定のシードを設定することで、ユーザーは再現可能な結果を得ることができ、複数の生成にわたって一貫性を維持できます。

- **Control_after_generation** ：このパラメータは、各生成後にシード値がどのように変化するかを決定します。randomize（各実行で新しいランダムシードを生成）、increment（シード値を1ずつ増加）、decrement（シード値を1ずつ減少）、fixed（シード値を一定に保つ）に設定できます。

- **Step** ：サンプリングステップの数は、洗練プロセスの強度を決定します。値が大きいほどアーチファクトが少なくなり、より詳細な画像が生成されますが、生成時間も長くなります。

- **Sampler_name** ：このパラメータでは、KSamplerが使用する特定のサンプリングアルゴリズムを選択できます。異なるサンプリングアルゴリズムは、わずかに異なる結果を生み出し、生成速度も異なる場合があります。

- **Scheduler** ：スケジューラは、デノイジングプロセスの各ステップでノイズレベルがどのように変化するかを制御します。潜在表現からノイズが除去される速度を決定します。

- **Denoise** ：デノイズパラメータは、デノイジングプロセスによって消去されるべき初期ノイズの量を設定します。値が1の場合、すべてのノイズが除去され、クリーンで詳細な画像が生成されます。

これらのパラメータを調整することで、目的の結果を得るために画像生成プロセスを微調整できます。

# Image-to-Image
![スクリーンショット 2024-07-20 16.37.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/6c0f3b4e-16c1-4c1d-b89f-9593d5c6f203.png)

# Inpainting
![スクリーンショット 2024-07-20 17.53.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/dbc8f99d-0975-f0b8-2a0d-7c140ac72e63.png)

インペインティングワークフローを使用するには：

- インペインティングしたい画像をアップロードします。
- 画像を右クリックして「MaskEditorで開く」を選択します。再生成したい領域をマスクし、「Save to node」をクリックします。
- チェックポイントモデルを選択します：
このワークフローは、標準のStable Diffusionモデルでのみ動作し、インペインティングモデルでは動作しません。
- インペインティングモデルを利用したい場合は、"VAE Encode" と "Set Noise Latent Mask" ノードを、インペインティングモデル専用の "VAE Encode (Inpaint)" ノードに切り替えてください。
- インペインティング プロセスをカスタマイズします：
CLIP Text Encode (Prompt) ノードで、インペインティングのガイドとなる追加情報を入力できます。例えば、インペインティング領域に含めたいスタイル、テーマ、要素を指定できます。
- 元のデノイジング強度（デノイズ）を設定します（例：0.6）。
Queue Promptを押してインペインティングを実行します。

# Outpainting
![スクリーンショット 2024-07-20 21.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/54763644-5cc4-7ed3-30d8-c767ff2f7643.png)

ComfyUI Outpaintingワークフローを使用するには：

- 拡張したい画像から始めます。
- Pad Image for Outpaintingノードをワークフローに追加します。
- アウトペインティングの設定を行います：
left、top、right、bottom：各方向に拡張するピクセル数を指定します。
feathering：元の画像とアウトペインティングされた領域の間の移行のスムーズさを調整します。値が高いほどよりグラデーションがかかった境界になりますが、ぼかし効果が生じる可能性があります。
- アウトペインティングプロセスをカスタマイズします：
CLIP Text Encode (Prompt) ノードで、アウトペインティングのガイドとなる追加情報を入力できます。例えば、拡張領域に含めたいスタイル、テーマ、要素を指定できます。
異なるプロンプトを試して、目的の結果を得てください。
- VAE Encode (for Inpainting) ノードを微調整します：
grow_mask_byパラメータを調整して、アウトペインティングマスクのサイズを制御します。最適な結果を得るには、10より大きい値をお勧めします。
- Queue Promptを押してアウトペインティングプロセスを開始します。

# Upscale
アップスケールには2つの主な方法があります：

- **Upscale pixel** ：可視画像を直接アップスケールする。
入力：画像、出力：アップスケールされた画像
- **Upscale latent** ：非可視の潜在空間の画像をアップスケールする。
入力：潜在表現、出力：アップスケールされた潜在表現（可視画像になるにはデコードが必要）

![スクリーンショット 2024-07-21 17.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/e16a8d03-bcdb-4947-fc56-9ecd11109a9a.png)


![スクリーンショット 2024-07-20 22.27.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/fe2c4930-2bea-e7c5-2a42-e802fe7a0c0c.png)

![スクリーンショット 2024-07-21 17.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536217/9dd859ea-0a08-bf61-b60a-9145593e7dfa.png)