見出し画像

サンプラー改造して 顔部分だけステップ数を増やしてみる

まず結果から

  • 自分が使う分には結構良さそう

  • i2i専用になった

    • t2i -> i2i でワークフロー組めば使える

  • Detailerほど劇的に良くはならない

  • 素直にi2iのステップ数増やせば良くね?

もうちょっと有用性出てくるとか、ワークフロー簡略化できたら公開するかもしれません

Detailer

Detailer、便利ですよね。 Lora適用だとか全身を描かせるとかすると、どうしても顔の描画が崩れやすくなってしまうので、 駄目そうならDetailerで修正する。とかでちょくちょく使ってます

Detailerって何種類かあるので違うものもあるかもしれませんが、基本的には

  • (通常の手法で画像全体を生成する)

  • 画像認識で顔などの領域を検出

  • 検出した領域を切り出して i2i

    • 拡大してi2iし、縮小かけるとかやってる?

  • i2i結果を書き戻す

    • 境界をぼかしたりいい具合になじませるようにしてる?

という処理を行っているかと思います

個人的にイマイチかなぁと感じているのは

  • Detailer領域外とのタッチが変わってしまうことがある

    • オーバーサンプリングみたいな処理になっているので、微細になりすぎてる

  • 色味が変化することがあるので、肌の色がズレることがある

    • 色調を戻す処理かけることもあるみたいですね

  • 境界部がぼやけることがある

とかですね

ところで GradualLatentSampler というカスタムノードなんですが

高解像度での構図が変わってしまう問題をなんとかするために GradualLatentSampler というサンプラーが 実装されたわけなんですが、 サンプラーのステップ間に処理(拡大など)を差し込むという改造を行っているようです。

このソースを参考にすれば、既存のサンプラーをお手軽に改造できるわけですね。

これはありがたいです。

サンプラーを改造してみる

というわけで、 (i2i 専用になってしまうのですが) ステップの処理を

  • (顔などの領域を認識しておく)

  • 画像全体のノイズ除去

  • 認識された領域のみ 追加でノイズ除去

という感じで改造してみたいと思います

ベースとなるサンプラー

GradualLatentSampler ではベースとなるサンプラーは

  • euler_ancestral

  • dpmpp_2s_ancestral

  • dpmpp_2m_sde

  • lcm

となっていて、いずれも多めにノイズ除去してからノイズを加えるというタイプのサンプラーのようです (このタイプのサンプラーの場合、ステップ間に処理を加えても そのあとでノイズが加えられるために いい具合に馴染ませてくれるという感じなんだと思います)

単純に追加でノイズ除去するだけだと領域内と領域外でのノイズ強度が違ってしまうために問題が出そうですが、 毎ステップノイズを加えるタイプなら、ノイズ強度の問題はなんとかなりそうですね

dpm++は前ステップの情報を使うので、サイズの違うノイズ除去ステップを差し込むのは改造が難しそうかなぁと思い euler_ancestral lcm の サンプラーを改造対象にしてみます

とりあえず改造してみる

サンプラーメソッドはConfyUIメインが利用しているメソッドをコピー。 カスタムノードはGradualLatentSamplerから拝借して、使わないパラメータを削除。

ノイズ計算とかちゃんと調べるの面倒だったので simgaは線形補間、 各ステップ前にsegsに対して半ステップ進めるという感じで改造してみました

あ、動きました

案外簡単にサンプラー改造できました。 (ノイズ除去するあたりの数式そのままですし)

ただ、アレですね。追加ステップは範囲が狭いので早いのですが、 yoloとかで画像認識するため、i2i専用になってしまっています。 (t2iに使う場合は t2i -> i2i とサンプラー分割が必要ですね)

また、画像認識のぶんワークフローが複雑化してしまうのも問題ですね……

これはこれで使えるのですが、もうちょっと別のアプローチも考えてみたいですね

Cross-attention の 類似度を参考にする

WebUIだと DAAM とかがやってますが、 クロスアテンションがどの部分に強く作用していたかを計測するというヤツですね。

プロンプトに 顔部分に関係するトークンを入れる必要ありますが、たとえば face とかに反応した箇所を クロップして追加ステップをまわすとかそういう感じでしょうか?

アテンション計算の中間データを引っ張り出す必要ありそうなので、簡単ではなさそうです。

そのうち実験してみたいですね。

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