見出し画像

【Flux.1】Flux.1時代のローカルAI画像生成④-3【SD1.5】


はじめに

下記事の続きです。

広範囲にテストを行ってみたのですが、Flux.1とSD1.5を交互に生成する手法は、汎用的にかなり良い結果を出すようです。さらに良くなるようにComfyUIのノードを作り直しました。

本記事のComfyUI jsonファイルは過去の下記事の付録欄にてダウンロードできます。

生成例

Flux.1(pro)を利用できるサイトのひとつhttps://fluxai.studio/ja/showcasesで紹介されているプロンプトで試します。

black forest gateau cake spelling out the words "FLUX PRO", tasty, food photography, dynamic shot

fluxai.studio
もちろんプロンプトは"FLUX DEV"に変更しています。
Flux.1(dev)とSD1.5(RealisticVision5.1)を交互に利用したもの

アップスケーラを利用している事もありますが、Pro版を大きく超える品質です。

SD1.5アジア系LoRAを利用
SD1.5用のLoRAを間接的にFlux.1に適用できます。細部に至るまでかなりの高品質です。

ComfyUIワークフロー例の紹介

生成の流れ

  • ① プロンプトを利用したFlux.1の画像を生成

  • ② (1)で生成した画像を元にしてSD1.5モデルでのimg2imgを行う。ただし、プロンプトはLLMで(1)を整形したものを利用

  • ③ (2)で生成した画像を元にして、再度Flux.1モデルでのimg2imgを行う。ただし、プロンプトは(2)をLLM Visionモデルで作ったものを利用

  • ④ (3)で生成した画像を元にして、SD1.5モデルのimg2imgを行う。ただし、プロンプトは(2)と同じ

  • ⑤ オプションとしてUltimate SD Upscalerを利用する ※ 場合によっては劣化させる事もあるのでオプションとします

全体図

rensei-03

① Flux.1一回目

特に工夫のない通常のFlux.1の生成方法です。最後に生成画像をモデルアップスケーラで1.2倍にして、次の工程に渡します。

② SD1.5一回目

まずはSD1.5用のプロンプトを作ります。先のFlux.1で利用したプロンプトを「短い英文に変換して。結果のみ表示して。」の指示でLLMで作ります。※ 長過ぎるプロンプトはSD1.5で悪影響になる場合があるため

初期プロンプトをLLMで整形

Flux.1一回目の画像を受け取り、SD1.5でimg2imgをします。形状を大きく損なわないように、ControlNet(depth)を利用します。

LoRA効果を強く出したい場合は、denoiosing strengthを大きく、Apply ControlnetのStrengthを小さくします。

生成画像をオリジナルサイズの1.5倍にして、次の工程に渡します。

SD1.5でimg2img

③ Flux.1二回目

先の工程の結果をFlux.1でimg2imgします。その前にVisionモデルでプロンプトを作ります。

Flux.1二回目のプロンプト作成

Flux.1でimg2imgします。生成画像をオリジナルサイズの2倍にして、次の工程に渡します。

Flux.1でimg2img

④ SD1.5二回目

最終工程です。SD1.5でimg2imgします。例では768x1024が初期画像サイズですので、1536x2048の画像が完成します。ここまでRTX3060(12G)で7分弱かかりました。

⑤ オプション工程

Ultimate SD Upscalerを利用します。さらに1.5倍にします。プロンプトはSD1.5の品質プロンプトのみを利用します。

使い方と技工的なもの

初期プロンプトとキーワード

一回目のFlux.1のプロンプト入力と、すべてのプロンプトに強制的に挿入するキーワード欄です。LLMの加工で、キーワードが消えてしまう事を防ぎます。

初期画像サイズの指定とSD1.5 LoRA

最初の画像サイズを768x1024に指定しています。工程②と工程④で利用するLoRAの指定もここで設定するようにしています。それぞれ2つずつ指定できるようにしています。

※ ComfUIのショートカット「Ctl+B」で各ノードのON/OFFが切り替えられるので便利です。LoRAを利用しない場合は切り替えてピンク色にするだけです。

Global Seedを利用して、(Ollama以外の)各Seedを一括管理できるようにしています。途中から再開したい場合などに便利です。

入力とLoRA

GPUメモリ管理

LLMの利用で(時々)問題になる事は、GPUメモリを専有してしまい。CPUで計算してしまう事です。そのために3つのギミックを利用しました。

GPUメモリ管理
  • LLM利用直前に、LayerUtilityのPurge VRAMを利用する(ただし必要のないパッケージを大量に入れてしまうので考えものですが…)

  • Impact-PackのSleepを利用する

    • Purge VRAMは非同期処理のようですので、1秒の緩衝時間を作っています

  • LLM(Ollama)を利用した後にも1秒の緩衝時間を作ります

    • ollamaノードの「keep_alive」を0に設定するとLLM処理の終了後に即座にGPUメモリを開放するはずなのですが、タイミングによるようです。

まとめと付録

以前の記事の有料の付録欄に、本記事のComfyUI jsonファイルを追加しました。記事サポートをしていただける場合はよろしくお願いします。

以下、関連する記事の【PR】です。


いいなと思ったら応援しよう!