見出し画像

SDXL RefinerをComfyUIで使おう

間違いのお知らせ

申し訳ありません、Ksamplerの設定を間違っていたので記事とワークフローを修正しました

はじめに

SDXLの目玉機能であるRefiner…
正直、あまり使われていない機能ですが、使い方によってはモデルの持つ特性を越えた生成が実現出来たりします

SDXLのRefinerをComfyUIで使う時、Refinerがどのようなタイミングで作用しているのか理解していないと、潜在空間内で収束しきったデータに対してRefinerを使っても効果は薄く、Refinerを適用する意味があまりありません

Refinerがどのようなタイミングで作用するのかを理解し、ワークフローを見ながら正しくRefinerを使ってみましょう

ComfyUIの操作方法に関しては、以前の記事を読んでね

仕組み

基本的なt2iはSampler一つで完結します
次のワークフローを見て見ましょう

必要最低限のBaseのみSDXL t2iワークフローです

基本的なt2iはこれに色んな機能を追加していく事になります。

Refinerの簡単な解説

本来SDXLは二つのモデルから構成されています
それはBaseモデルとRefinerモデルです

潜在空間内でBaseとRefinerを切り替えて生成を行います
Step20で生成して、step10まではBase、step11からはRefinerで仕上げをする…といった事が可能となっています。

仕組みを簡単に言ってしまうとBaseで全体像を生成しRefinerで詳細な生成を行う…仕上げ工程のようなイメージでしょうか

どうやるの?

潜在空間内でBaseとRefinerを切り替えるってKSamplerの動作中に切替なんてできませんよね

そこでKSamler(Advance)ノードを二つ使用しLatentを接続します

こんな感じ

このままだと、Baseで収束したデータを元にRefinerで生成を行うのであまり効果がありません
Base側のKSamplerの処理を途中で中断しRefiner側に受け渡す必要があります

こうしましょう

Ksampler(Advance)ノードのBase側stepsとend_at_step、Refinerはstepsとstart_at_stepを外部入力に切り替えます

ここで、Ksampler(Advance)における各値の役割と値は以下の通りとなります

  • steps

    • 総steps数

    • いつものstepsを指定しているものと同じもの

  • end_at_step

    • Baseのstep数

    • Refinerを利用する場合はstepsの8割くらいの値を推奨(モデルによって違います)

      • ここではsteps25,end_at_step20にしました

  • start_at_step

    • steps - start_at_step = Refinerのstep数

    • end_at_stepから1足した値を指定(end_at_stepと同じ値でも構いません)

  • add_noise

    • 当該ノードでノイズを追加するかどうか

    • Baseではenable

    • Refinerではdisable

  • return_with_leftover_noise: enable

    • 潜在空間内のノイズをそのまま次のKSamplerノードに送るかどうか

    • この値をdisableのまま次のKsamplerに渡すとt2i2iの処理となります

    • Baseではenable

    • Refinerではdisable

肝心のstepsやend_at_stepと繋ぐノードですが、Primitiveノードと接続することになります
Add Node>Utils>Primitiveで追加し接続すると動作に必要な値を入力するためのノードに変化します

こんな感じでprimitiveを接続します
stepsは共通なので注意

同じ要領でend_at_stepとstart_at_stepにも接続しましょう

あとはRefiner側にもmodelとpromptを入力すれば完了です

カスタムノードは使用していないのでそのまま使用できると思います

作例

Positive: sci-fi city street,car,best quality,extreme detailed,cinema lighting,8K,photorealistic,photo,3D
Negative: (worst quality,low quality:1.5),lowres,messy, abstract, ugly, disfigured, bad anatomy, draft, deformed hands, fused fingers, signature, text, multi views,horror,
Base model: sd_xl_base_1.0 / Refiner model: sd_xl_refiner_1.0
steps25/Base end at step20
Base CFG3.0/Refiner CFG4.0

さいごに

Base側のendとRefinerのstartの値をスライドさせながら、モデル同士の相性を見ていくと面白いと思います

ちなみにSDXLモデルであればBaseとRefinerどちらとも好きなモデルを使用できますよ
Baseをリアル系モデル、Refinerをイラスト系モデルなんて事も可能です(プロンプトでどう制御するか悩みどころになるかも?)

ちなみに、身も蓋もない事を言ってしまうと、Ksampler同士をLatentでつなぐ際にノイズを引き渡さずそれぞれのSamplerで収束させるi2i形式の方が結果がいいパターンが多いのは内緒です(return_with_leftover_noise: disableということ)

便利なカスタムノードのご紹介

この記事を書いてる最中にDiscordでやり取りさせて頂いている、だにえる氏がstep、end_at_step、start_at_stepを一元管理できるカスタムノードを公開されました

Refinerを使われる方はは是非使ってみてね

おまけ

現在私が使っているt2iワークフローを載せておきます
カスタムノードマシマシなので、ご注意ください

作例

この記事が気に入ったらサポートをしてみませんか?