Stable Diffusionを使ったイラスト作成の記録(6) ~ 下絵のブレンド方法の詳細分析 その2 ~
前回の記事
シリーズ一覧
Layered Diffusion Pipelineを使うためのリンク集
ライブラリの入手先と使用法(英語) : Githubリポジトリ
日本語での使用方法の解説 : Noteの記事
今回の分析の方針
今回は、前回行った下絵のブレンドのパラメータ分析をさらに深めるのが主眼になります。前回よりもさらにたくさんの画像を生成して、比較検討していきます。
前回の分析から、Strengthのレベルを画像生成ステップの途中で変更することはあまり効果的ではない可能性があるということで、今回は下絵のブレンド中はレベルを一定にしています。レベルを途中で変更する効果のさらに詳細な分析は、今後の課題としておきます。
レベルが途中で変更されないので、今回チューニング対象となるパラメータは2つです。1つ目はレベル。2つ目は下絵のブレンドを継続する期間です。2つ目のパラメータは1.0に近いほど期間が短く、0.0に近いほど期間が長くなります。
スクリプト
スクリプトは次のようになります。levelがレベル、untilが継続期間です。
# スクリプト(6-1)
level, until = 0.9, 0.8
images = pipe(
initialize=ByImage(
image="schoolgirl.png",
strength=strg(until, level=level),
),
iterate=[
Layer(
prompt=("high school, school ground, school building, cherry tree, "
"blue sky"),
negative_prompt="1girl",
),
Layer(
prompt="1girl, solo, high school, school uniform",
negative_prompt="",
mask_by="schoolgirl_mask.png",
),
],
num_steps=30,
size=(512, 512),
)
levelは0.9から0.1まで0.1刻み、untilは0.8, 0.75, 0.7の範囲で変化させています。生成画像の表では、横の行がlevelに、縦の列がuntilに対応しています。また、中央のlevel=0.5, until=0.75には赤枠で印をつけてあります。
下絵
下絵は前回と同様、次のものになります。
Generalized Strengthの概念図
Generalized Strengthの考え方を概念的なグラフとして表すと次のように表すことができます。
従来のstrengthは、画像生成プロセスのうちでどれだけの割合を実行するかを示すパラメータでした。Generalized Strengthでは、ランダム初期化から始めた生成画像に対する下絵のブレンド割合を「レベル」として表しますが、これに合わせると、strength=0.9は画像生成プロセスが残り0.9になるまで、レベル1.0でブレンド(つまり、下絵で完全に上書き)を行い、残りはブレンドを行わない、という意味になります。
これに対し、strg(0.75, level=0.5)で指定されるstrengthの場合は、画像生成プロセスが残り0.75になるまで、レベル0.5、つまりランダム初期化から始めた生成画像に対して半分の強度で下絵をブレンドする、という意味になります。
今回のスクリプトは、strg(until, level=level)と設定しているので、画像生成プロセスが残り「until」になるまで、レベル「level」で下絵をブレンドする、という意味になっています。
生成画像
seed=1334630829
赤枠の右斜め上、level=0.6, until=0.7の画像が、下絵の意図を反映しつつ、画像としての破綻が少ないものではないかと思います。
また、level=0.75, until=0.75の付近でも上記と類似の画像が生成されている可能性が高いように思われます。
seed=620416796
赤枠の右斜め下、level=0.4, until=0.7の画像が、この中では最も下絵の意図を反映しつつ、画像としての破綻が少ないものではないかと思います。
背景画像に運動場と解釈できるものが現れるパラメータの組み合わせが少ないものの、赤枠(level=0.5, until=0.75)の画像にはたまたまそれらしいものが描かれていました。が、画像の乱れが強く、levelの調整では乱れを抑えることが難しそうに見えます。
seed=1124067389
左列の最上行、level=0.9, until=0.8が最もよいのではないかと思います。ただし、運動場や灰色の校舎が描かれた画像は生成されませんでした。
赤枠の画像(level=0.5, until=0.75)とよく似ていますが、細部に違いを見て取ることができます。特に髪型やスカートの形状、右手の背景、全体の色合いに違いを見ることができます。
類似画像間における左列(until=0.8)と中央列(until=0.75)の違いとして、右に行くほど形状や色の解像度が下がる(左に行くほど上がる)傾向にあるように思われます。
seed=4114275975
右列の最上行、level=0.7, until=0.7が最もよいのではないかと思います。校庭のようなものが描かれたのはこの画像のみでした。
右列はlevel=0.7までしか画像を生成していませんが、さらにレベルを上げてlevel=0.8, 0.9, 1.0を試してみてもよいように思われます。
あるいは右列のuntil=0.65を試すことも考えられますが、その場合には表情などの画像の細かい部分は潰れてしまう可能性が高いと考えられます。
seed=1719334863
赤枠の左上、level=0.6, until=0.8が最もよいのではないかと思います。左列の画像はどれもそれなりに見えますが、地面や手の描かれ方から選びました。
このseedの場合、赤枠の画像で塗りが厚く細部が潰れ気味だったので、左側(untilが大きい=下絵のブレンド期間が短い)の方がよい画像が生成されやすい傾向にあると考えられます。場合によっては、さらに左側のuntil=0.85も試してもよいかもしれません。
seed=129970857
赤枠から右2マス下、level=0.3, until=0.7が最もよいのではないかと思います。これ以外は、足の位置がおかしいか、運動場が描かれていません。
赤枠から始めて、レベルを下げる(level=0.4)にすることで足が落ち着くので、そこを起点に斜め右下へと探索を広げると、上記の画像にたどり着くことができるのではないかと思います。
まとめ
パラメータ探索の起点
今回のスクリプトでのlevel=0.5, until=0.75の組み合わせが、最適なパラメータの分布の中央付近にあり、探索の起点としては適当なのではないかと考えられます。
ただし、探索起点において、すでに細部が潰れているというような場合には、level=1.0, until=0.8を起点とする方がよいかもしれません。あるいは、最初に両方で生成し、ベターな方を起点とすることも考えられます。
パラメータ探索の手順
パラメータ探索の手順の基本方針としては、untilを固定し、levelを変化させるのがよいと思われます。下絵のブレンド期間(until)の変更は、画像に大きな変更を与えるため、調整に使うには難しいと考えられるためです。
levelの調整で適当な画像が見つかったら、そこから、右下方向(levelから1.0を減算、untilに0.5を加算)に探索し、生成画像の粒度(解像度)を比較するとよいと思います。