Stable Diffusion メモ:txt2img、promptいじり編
◆text2imgパラメータざっくり説明
Sampling method
完全に好み。どれ選んでも偶然性に変わりはない。ただ、繰り返し使ってるとなんとなくいつも選ぶのはこれ、というお決まりのメソッドが決まってくるようだ。私はHeunとDDIMをよく使う。
Width/Height
画像の大きさだが、大きければ良いというものではない。むしろ大きくしすぎるとデメリットのほうが大きい(遅い、メモリを食う、余計なオブジェクトが出現する、など)
標準は512x512なので基本的にはここから大きく動かさない。また、画像の学習は基本的に正方形で行われるとされているため、AI画像生成の一般的なベストパフォーマンスは512x512の正方形とされている。
ただし、世界中の女の子のイラストの圧倒的多数は「ちょっと縦長」である。SNS映えや同人誌に収録を見越してなどの理由があってそうなっていることが多い。そのため個人的には女の子のイラストは512x640で出力している。
画像の大きさは、最初に決めたらそこから動かさないこと。なぜなら内部で最初に生成するノイズの配置が、サイズを変更することで大きく変わってしまうからだ。シードが同じでも、1pixelでも大きさを変えたら全く違う絵が出力されてしまう。制作中に構図に不満を感じても、出力後に切り抜きやアウトペインティングで多少はなんとかなるのである程度は割り切ろう。
Batch Count
同じプロンプト&設定かつ違うシードで繰り返し出力し続ける。基本的に案出しに使う。プロンプトをいじって方向性が固まってきたら一気に20枚とか100枚とか連続出力させ(そのあいだマシンは放置できる)、あとで確認して良いものがあったらシード値を再利用する、というのが基本スタイル。
これぞというものが出てきて本番出力(highres fixとか)する際にこのBatch countを1に戻し忘れる、という事故が多発。よくチェックしよう。(まあ途中で止めることはできるが)
Batch size
上記Batch Countのようにシードを変えたイラストを「一枚の画像におさめて」出力する。基本的に使わない。
Sampling Step
どれだけ細かく絵に反映させるか。
少なければおおざっぱだが処理は速くなる。
多ければ詳細だが処理は重くなる。
案出しは20で数をこなし、方向性が固まれば50で本番出力する、というのがセオリー。
50以上にあげてもほとんど変化がない。でも承知の上でMAXまで上げる派がいるとかいないとか。
SampleStepを増やしていく過程で微妙に出力の内容やキャラクターのポーズが移り変わっていく。意図的に絶妙な数値で止めるテクニックもあるにはあるが、値を探る手間がかかるのと偶然性によるところが大きいのでpromptやcontrolnetでなんとかするほうが楽で良い。
個人的な検証の結果、20~30の間で構図が大きく変わる可能性がある。試すなら20と30で比較すると良いかもしれない。
CFG scale
プロンプトをどこまで深く解釈するか。
下げると言う事をきかない(1とかだとぐちゃぐちゃでボケボケの絵になる)
上げる(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 ...
不明。
◆プロンプト調整メモ
まずは少ないプロンプトで案出し
最初から完成形が頭の中にある人は少ない。画面の中に収めたい最低限の要素からはじめること。1girlのみでも良い。あとは乱数シードで繰り返して案出しをさせる(Batch Countを利用しよう)。
偶然出た「良さげな要素」はどんどん追加する
いいねと思った要素はどんどん追加して固定する。そうしないと、次は出ないかもしれないから。
見落としやすい要素は、カメラアングル、ポーズ、手の位置、背景、光の入り方など。
要素が言葉に言い表しにくいときは出力した画像をimg2imgに持っていきdeepdanbooruなどを活用する。
キーワードの重複をさけて節約
顔を描くのにあえて目、鼻、口、眉毛…などと顔パーツを列挙する必要はない。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
キャラクターのポーズを指定できる。無理なポーズは再現しづらい
相変わらず足を上げたりするポーズは拒否られがち(たまに従っても足が取れたり手に同化したりとひどいことになる)