Stable Diffusion メモ:txt2img、promptいじり編
◆text2imgパラメータざっくり説明
Sampling method
モデル側で指定されていることもあるが、そうでなければ完全に好み。どれ選んでも偶然性に変わりはない。ただ、繰り返し使ってるとなんとなくいつも選ぶのはこれ、というお決まりのメソッドが決まってくるようだ。DPM++ SDE Kerrasが使われているのを良くみるが、私はEuler aを良く使う。
Width/Height
画像の大きさだが、大きければ良いというものではない。むしろ大きくしすぎるとデメリットのほうが大きい(遅い、メモリを食う、奇形が生まれたり余計なオブジェクトが出現する、など)
AI画像生成の一般的なベストパフォーマンスはSD1.5で512x512~720x720, XLで720x720~1024x1024程度なので基本的にはここからなるべく動かさない。
promptやseed,stepなどのパラメータを変えながら出力を繰り返す機会が多くなると思うが、画像の大きさだけは最初に決めたらそこから動かさないこと。なぜなら内部で最初に生成するノイズの配置が、サイズを変更することで大きく変わってしまうからだ。シードが同じでも、1pixelでも大きさを変えたら全く違う絵が出力されてしまう。制作中に構図に不満を感じても、出力後に切り抜きやアウトペインティングで多少はなんとかなるのである程度は割り切ろう。
Batch Count
同じプロンプト&設定かつ違うシードで繰り返し出力し続ける。基本的に案出しに使う。プロンプトをいじって方向性が固まってきたら一気に20枚とか100枚とか連続出力させ(そのあいだマシンは放置できる)、あとで確認して良いものがあったらシード値を再利用する、というのが基本スタイル。
これぞというものが出てきて本番出力(hires fixとか)する際にこのBatch countを1に戻し忘れる、という事故が多発。よくチェックしよう。(まあ途中で止めることはできるが)
Batch size
複数の画像を「一枚におさめて」出力したのちに分割して保存する。1枚ずつ4回出力する場合と4枚を一度に出す場合では後者のほうが出力時間を短くできる。ただし大きくすればするほどVRAMを消費するのでメモリ不足に注意。
Sampling Step
どれだけ細かく絵に反映させるか。
少なければかかる時間は短くなるがおおざっぱ、多ければ詳細だが時間がかかる。ただしある程度以上はほとんど変わらなくなる。
SD1.5の場合、案出しは20で数をこなし、方向性が固まれば30以上で本番出力する、というのがセオリー。
SD1.5では個人的な検証の結果、20~30の間で構図が大きく変わる可能性がある。試すなら20と30で比較すると良いかもしれない。
XLではもっと少なくても十分なクオリティが出るので筆者は16で案出しをしている。
50以上にあげてもほとんど変化がない。でも承知の上でMAXまで上げる派がいるとかいないとか。
SampleStepを増やしていく過程で微妙に出力の内容やキャラクターのポーズが移り変わっていく。意図的に絶妙な数値で止めるテクニックもあるにはあるが、値を探る手間がかかるのと偶然性によるところが大きいのでpromptやcontrolnetでなんとかするほうが楽で良い。
なお、少ないステップ数で絵を確定させるLCM(TurboとかLightningとも呼ばれる)という技術がある。これを使うと大体8Stepあたりで絵が確定するため従来よりも出力にかかる時間を短くできる。ただしクオリティは非LCMより劣るケースが多い。LCMはLoraで追加できるほかモデルに内蔵されている場合もある。
CFG scale
プロンプトをどこまで深く解釈するか。
下げると言う事をきかない(通常、1とかだとぐちゃぐちゃでボケボケの絵になる。LCMは別)
上げる(9以上)と、絵が乱れる。MAX30は抽象的な謎の絵になる
6~8あたりが限界か。通常は7を使う。
処理時間は大差なさそう。
個人的な検証の結果、7~8の間にポーズが変化する可能性がある。ためすなら7と8で比較すると良いかもしれない。
Variation Seed
extraをチェックすると使えるようになる。
基本となるシード値に、「微調整」にあたるシードを加える。
Seed固定のまま、Variation Seedを-1(ランダム)にし、Variation strengthを0.1などにして複数枚連続出力してみると「なんとなく似ているが微妙に違う絵」が出力される。この「微妙さ」がVariation strengthにあたる。内部的には2つのノイズ画像を重ね合わせているように思える。
何が変わって何が変わらないかが予測できないことに違いないため、個人的には使う機会があまりなさそうに思える。
Resize seed from ...
StableDiffusionは多くのモデルにおいて正方形を基準に学習されているため、縦長、横長の画像サイズ、あるいは極端に大きいサイズを指定するとキャラクターの胴が伸びたり2人に分裂したりなどがおきる。これを防ぐため、Resize from.. のスライダーに縦横の基本のサイズ(SD1.5なら512~720付近、XLなら720~1024くらいまでの正方形)を入れておいたうえで、出力サイズをもっと大きい縦長横長のサイズを入れて生成してみると、構図がある程度保たれたまま横長/縦長/高解像度の画像を出力できる。SDで壁紙(たとえば1920x1080)を作ろうという場合には必須。
アウトペインティングの方法
img2imgで元の画像を読み込む。
Scriptで「poor man's outpainting」を選択する。
広げる幅(Pixels to expand)と広げる方向(Outpainting direction)を指定する。
祈る。
情報によると、CFGは最大の30、Stepもなるべく上げる(最低でも50以上)と成功しやすいらしい
◆プロンプト調整メモ
まずは少ないプロンプトで案出し
最初から完成形が頭の中にある人は少ない。画面の中に収めたい最低限の要素からはじめること。1girlのみでも良い。あとは乱数シードで繰り返して案出しをさせる(Batch Countを利用しよう)。
偶然出た「良さげな要素」はどんどん追加する
いいねと思った要素はどんどん追加して固定する。そうしないと、次は出ないかもしれないから。
たとえば、偶然出てきた女の子の青い髪が可愛いと思ったらpromptにblue hairを追加する、など。
見落としやすい要素は、カメラアングル、ポーズ、手の位置、背景、光の入り方など。
要素が言葉に言い表しにくいときは出力した画像をimg2imgに持っていきdeepdanbooruなどを活用する。
キーワードの重複をさけて節約
単語を多く入れればいれるほど、ひとつひとつの単語が与える影響度があいまいになっていく。なのでpromptは必要最低限であるべき。
顔を描くのにあえて目、鼻、口、眉毛…などと顔パーツを列挙する必要はない。1girlと書けばだいたい女の子っぽい顔パーツ一式がついてくる(顔を意図的に画面外に出したいときはface out of frameやネガティブにfaceを入れるなどの工夫が必要)。書く必要がないプロンプトは基本的になるべく書かずに節約する。
ただし、あえて重複させたり強調させることでより目立たせたり大きく描かせたりする効果もある。
矛盾を削除
プロンプトの内容は画面内に描こうとする。そこで、例えばblue eyesとeyes closedを同時に指定してしまうと、目を閉じているのに青い瞳が画面内に映っているという矛盾が生じる(片目を閉じたい場合はone eye closedにすべき)。こういう矛盾が残っているとあからさまに「迷った」絵が出力されるので、取り除いたほうが良い。
ただし画風を指定する時などはあえて複数の作家名を上げてブレンドしていく方法が一般的。
複数のキャラクターをコントロールするのは非常に難しい
1girl, 1boyであれば自然にgirlのほうが画面の主役になりがち(男性向けイラストを中心に学習されているモデルなら特にその傾向が強い)。細かく服装を指定すると自然にgirlに適用される。逆にboyのほうの装飾は二の次になってしまうのでいくらキーワードをいれても適用されないケースが多い。
さらに難しいのは2girls以上のときである。どちらのgirlにその服装やポーズが適用されるのか、博打に近いレベルで難しい。
そのために、Controlnetなどをフル活用する必要がある。ポーズに関してはopenpose、服装に関してはcannyやscribbleなど。
また、最近では1体ずつ出力してのちに合成する手段なども考えられている。ただこれもただ並んでいるだけなら問題ないが、2人がくんずほぐれつしている絵を出力したいとなると、違和感なく合成するのはかなり難しい。
プロンプトの重要度指定
基本的には前に並んでいるキーワードのほうが優先度が高い。全体的なテイスト、キャラクターの性別、キャラクターのおおまかなポーズ、カメラアングルなどは前の方に持ってくるといいのかも(なんとなく)
カッコ()でくくると、他のキーワードよりも重要な扱いになる。
無視されてしまうキーワードの重要度をあげてやると、優先的に描くようになる。
小さく描かれているものの重要度をあげてやると、大きめに描くようになる。
いいかげんに描かれているもの(例えばhand)の重要度をあげてやると、少し丁寧に描くようになる。
指がスライムみたいに解けてたり指の本数がおかしいときは(hands)で治ることがある
さらに強調したい場合は(hands:1.1)(hands:1.2)…のように割合を指定してやる。(hands)は(hands:1.0)と同値。MAXの値はよくわからないが、1.5あたりでやり過ぎになることが多い。(hands:1.9)では化け物のように手が肥大化した。
単純に複数回同じキーワードを書く、でも効果はある
指/手/腕/足が多い/少ないなどの修正
○○が多いときはネガティブプロンプトにextra xxx(xxxにはdigits/fingers/limbs/handsなど。同様に少ないときはmissing xxx)を入れることで改善することもあるのでまずは試そう。改善されないこともあるが。
どうにもならんときはエディタで消したり描き足したりしてcontrolnetやimg2imgしてしまうしかない。
◆Controlnetでできること
Controlnetを使うとクオリティが落ちる。Sampling Stepsを増やすと多少マシになるが限界がある。なので基本的にはpromptでできることはpromptでなんとかしたほうがいい。なんとかできない場合にControlnetを使う。
輪郭を真似る系
輪郭真似る系は元画像がなくても自分で輪郭データを作れる。
背景は黒地。その上に乗せる色は明るさも色相も関係ないようだ
canny
輪郭検出系で最も細かい
prepropは一択のみ
lineart
元絵から主線を検出して出力に反映する。
Scribbleよりももっと詳細に反映されるのかも
grobal_harmonius…なんかおかしいことになるので使用しないほうがいい
anime(かなりハショされる)
anime_denoise(線が太くなる。アニメのシンプルな線)
realistic(線画のよう。輪郭検出としては最も自然)
coarse(余計な線が出る。ラフ画のよう)
standard(余計な線が出る。陰影までつく感じ)
lineart_animeにはmodelも専用のものがあるが違いはよくわからない。
Scribble
らくがきから絵を生成する。
自分で「落書きデータ」を作る場合
主線のみではなく塗りつぶしたほうが精度があがる。
棒人間ではなく厚みのある人体を描いたほうが精度があがる。
preprocessorは「None」
既存画像から「落書きデータ」を作る場合
preprocessorは「scribble_xxx」のうちから選ぶ
pidinet→hed→xdogの順で線が細かくなるようだ
softedge
lineartよりももっと幅のある主線認識
mlsd
元絵から直線部分を検出してそれを優先した出力をする。
背景、建物などで活躍するとのことだがキャラにはあまり役に立たない
雰囲気を真似る系
reference only
雰囲気を似せる。ポーズや奥行きなど考慮しない。
preprocessorのみでmodelは存在しない
ちゃんと雰囲気が似せられているかは微妙なところである
shuffle
雰囲気だけ似せるためのもの?
よくわからんがpreprocessorで元絵はとにかくぐにゃぐにゃに破壊される。しかしmodel側でなんとなく空気を読んでちゃんと生成しようとするので結果雰囲気だけ似るのかもしれない
色の要素は保持されるかもしれない
物体の形を推測する系
そもそも2次元画像に奥行きはないので推測でしかないことに注意すること
余計なエフェクト、漫符などは事前に消しておきたい。
Depth
元画像の深度(カメラからの距離)を推測して出力画像に反映する
元画像からの推定の精度はpreprocessorに依存する
depth_leles(おおざっぱ)
depth_leles++(lelesより詳細だが服装など余計な要素を含みがち)
depth_midas(へんな凸凹が出やすい)
depth_zoe(一番自然かもだが無視される要素も多い)
lelesの2種類は、背景、前景の範囲をクリップできる。
normal
物体の表面の傾きを推測する
normal_bae
normal_midasはおかしいことになるので使わないほうが良い
ポーズを真似る系
OpenPose
キャラクターのポーズを指定できる。無理なポーズは再現しづらい
相変わらず足を上げたりするポーズは拒否られがち(たまに従っても足が取れたり手に同化したりとひどいことになる)