スクエニさんが高解像度版のNieR Automata Upgraded、みたいな、アニメ版の後を受けてNieR Automata 2.0とかでも良いんだけど、まあそういうのを出してくれないので、Stable Diffusionで描けないかなぁ、と試行錯誤したので、オレの屍を乗り越えていけ、ということで。なお、Stable Diffusionを1週間弱イジっただけなんで、全然間違ってる可能性があるのは承知の上で。
前提条件
フォロワーはご存じの通り、当方のメインマシンはMac Studio 64GBメモリなので、これでやる方法を。MacでStable Diffusion出来るの?と思われるかも知れないが、OSS化された後にMac対応が追加されたので、フル機能では無いけど使える。
あと、版権周りが何だか不明瞭。どうもモデルの製作者の判断に委ねられるみたいで、生成された画像の商用利用は一切禁止とか、クレジット入れてくれればOKとか、まだまだ未整備な感じなのでちょっと注意が必要そう。個人的に楽しむ範囲にとどめておくのが安全そう。知的財産権法が想定してない著作権・肖像権に踏み込んでるので、今後、法整備・運用(判例)がなされていくのを待とう。
冒頭の画像の通り、そこそこの結果は得られるけれど、
- 実写寄りにすると、オリジナルの2Bの衣装デザインにはどうやっても近付かない。推測した理由は後述。
- イラスト寄りにすると、オリジナルの2Bの衣装デザインになる。
といった、帯に短したすきに長し、な感じ。今回は実写寄りとし衣装デザインは諦めて、超絶美人さんを眺めて「はー、ふつくしい…」と感想を述べるのを目標に。
環境整備
お手軽なDiffusionBee等も試したけれど、結局AUTOMATIC1111を使った方が、豊富なモデルやらLoRAやら(後述)を簡単に突っ込めるので、執筆時点ではこれ一択。
公式にInstallation on Apple Siliconというドキュメントがあるので、これを正とする。要は
- Homebrew入れろ
- cmake, protobuf等々、brewでインストールしろ(当方の環境では既に入ってるのばかりだったけれど)
だけ。それが終わったら、レポをcloneすればOK。簡単。
% git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
ここでコマンドの使い方とか、gitってなんじゃ、とかそういうのは全部置いてきぼりにしていくスタイルで。2B見たいなら、自分で調べろ!という。そうして人はオトナになるんです。
で、おもむろに起動。
% cd stable-diffusion-webui
% ./webui.sh
初回はvenvに色々ダウンロードしてくるので、起動まで時間かかるが、そのうち上がってくる。上がってきたら、ブラウザで”http://127.0.0.1:7860″を開く。
これで、もう優勝です。ウソです。美しい2Bの画像への長い道程に足を踏み出してしまいましたね…。
モデルとかLoRAとか
2Bの衣装デザインをプロンプトだけで再現するのは、端的に言って無理。あと、2Bの顔は日本人ではないので、日本人を含む東洋系の美人さんで学習したモデルも向いてない。いや、そういう顔で2Bの美しいコスプレイヤーさんもいるので、それを目指すならそれもアリなんだけども。色々試した結果、
- モデル: RealDosMix
- LoRA: 2B (NieR:Automata) LoRA / YorHA edition
という組み合わせが、「NieR Automataの2Bっぽい超絶美人さん」の「個人的に好きな画像」が得られる組み合わせだった。モデルとLoRAの作者さんに感謝。後者はコーヒーウェアなので、作者さんにコーヒーを奢ってあげるのがよろしいかと。
ここで何しているかというと
- RealDosMixの学習モデルを使うけど
- モデルをベースに修正したLoRA(Low-rank Adaptation)で2Bに寄せる
です。
RealDosMixをダウンロードすると”realdosmix_.safetensors”というファイルなので、これを先にcloneした./stable-diffusion-webui/models/Stable-diffusion/
に入れる。
同様に、2B (NieR:Automata) LoRA / YorHA editionをダウンロードして、”2bNierAutomataLora_v2b.safetensors”を./stable-diffusion-webui/models/Lora/
に入れる。モデルとLoRAは入れるフォルダが違うので注意。
ここまで終わったらターミナルに戻って[ctrl]+[c]してAUTOMATIC1111を再起動。
WebUIをリロードすると、左上のプルダウンメニューに”realdosmix_.safetensors”が追加されているはずなので、これを選択する、と。
これで君の、君だけの2Bに会える!
と思うじゃん?
やってみよう。
プロンプトは以下。ダウンロード先のサンプルのプロンプトに書かれているLoRA名は現在は無効で、”2bNierAutomataLora_v2b”にしないとターミナルに「そんなモデルは無ぇ」って怒られが表示される。あと、ウェイトは0.5ぐらいがオススメって作者さんが書いてるので、そのように。で、プロンプトに”yorha no. 2 type b”を入力する。
yorha no. 2 type b
<lora:2bNierAutomataLora_v2b:0.5>
スクショがあると分かりやすいか。他のパラメーターはデフォルトのまま[Generate]ボタンをクリック。
Seedが-1だと使われるシード値がランダムに選ばれるので、Generateのたびに違った2Bが出てくる。デフォルトのパラメーターとこのプロンプトだと、Mac Studioで1枚生成するのに12秒ぐらい。
では、皆さん、ステキな2Bちゃんに会えるまで頑張ってね!
…
…
色々おかしくね???
デフォルトの問題点
このブログエントリーの先頭にある画像と比較して、なんかえらい違いがあるような…。
そう、先頭のはかなり色々試行錯誤した結果で、以下で「超絶美人の2Bちゃんに会いたい皆さんの時間が無限に溶ける」のを出来るだけ減らすためのポイントを解説していくよ。ここ、テストに出ますからね。
彩度が低い
これはRealDosMixに起因する問題で、レンダリングしてる最中は彩度が高いプレビューなのに、最終出力は彩度が低い。この解決法のヒントはRealDosMixのダウンロードページに書いてある通り、VAE(Variational Auto Encoder)を有効にすること。方法は後述。
画像が小さい
512 x 512がデフォルトなのは、Stable Diffusionがデフォで扱う画像サイズだからなんだけど、ここが実は悩みどころ。というのも、大きな画像を生成するには大量のメモリが必要。Apple SiliconではGPUは統合されている(IntelやAMDのグラボ要らないCPUと同じ)ので、メインメモリをVRAMとして利用するため、一般的なグラボよりも大容量のメモリが使える。一方で、NVIDIAグラボを利用するStable DiffusionではGPUメモリが節約されるようになっていて、そこそこなピクセル数の画像が出力出来る(らしい)。
64GBメモリのMac Studioでは、ここまで説明したモデル・LoRA、後述するVAEやプロンプトといった組み合わせの場合、1024 x 1024、あるいは768 x 1056(ポートレート)が安定して出力できるピクセル数の限界っぽい。バックグラウンドプロセスを減らすとか、もっと色々やればもう少し大きな画像が出力できる可能性アリ。
ただし。解像度(ピクセル数)の変更は出力される構図やポーズを大きく変えてしまうことと、Hires. fixによるスケーリングは画質がどうしても甘くなるので、出来るだけ一発で出力できる最大の画像を目指したい、という制約があるので注意。
思ったような画像が出ない
この「思ったような」をStable Diffusionにいかに正確に理解してもらうかがいわゆる「呪文」というやつで、プロンプトを過不足なく作り上げるのが非常に難しい。「プロンプトエンジニアリング」と言っても良い。
で、超絶美人の2Bちゃんに会うためにプロンプトのサンプルを大量に見た結果、いくつかのポイントがあることが分かった。
- かなり無駄が多い: これは推測なのだけど、他人が作ったプロンプトをコピペしているだけで、実は意味や効果を理解しないまま入力されているワードが思いのほか乱用されている。
意味が重複していて一方のワードだけで十分だったり、実はStable Diffusionが認識しないワードが入っていたりする。そもそもスペルを間違ってる例も多い。モデルやLoRAの公式サンプルですらこの状況で、上述した「エンジニアリング」、つまり仮説を立て、実行し、計測・評価する、というフィードバックループを回してない。
結果、プロンプトの75ワードという「鉄の掟」が破られているために、同じシード値・プロンプトを入力しても同じ画像が再現されない。
なおAUTOMATIC1111では、入力されたプロンプトが75ワードを超えても「畳み込み」みたいな処理によって、Stable Diffusionに引き渡すワードを75文字に収まるように頑張ってくれる。が。過度に期待しない方がよい。シンプルなプロンプトを目指そう。 - 再現性を検証していない:上と似ているのだけれど、「たまたま」Stable Diffusionがうまく動いているけれど、バッチで100件出力させてみるとプロンプトが間違っていることが分かる。
例えば”yorha no. 2 type b, 1girl”で、「2Bみたいな女の子1人の画像」のつもりなのだけど、Stable Diffusionは、”yorha no. 2 type b”と”1girl”、つまり2人の画像、と認識する。結果、キメラが出てくるw
テストしてみた範囲では、”yorha no. 2 type b, solo”とするのが正しい。”1girl looks like yorha no. 2 type b”も概ねイケるけれど、ワードが無駄に増えるので”solo”でOK。
- 欲張るのはよくない:例えば、構図としてupper body(上半身)を指定しているのに、stiletto(ピンヒールは和製英語)も入ってるとStable Diffusionは頑張ってピンヒールまで入った構図・ポーズを組み立てようとする。その画角に入り得ない要素は混ぜるなキケン!
VAEを追加する
Hugging Faceから”Anything-V3.0.vae.safetensors”をダウンロードして、./stable-diffusion-webui/models/VAE/
に入れる。
WebUIの[Settings] → [User Interface]とポイントして、[Quicksettings list]に、”sd_vae”をカンマの後に追加し、”Apply settings”をクリックする。
ターミナルからWebUIを再起動して、ブラウザでWebUIを再読込する。
画面左上にプルダウンが追加されるので、”Anything-V3.0.vae.safetensors”を選択する。
サンプリングメソッド
デフォルトは”Euler a”になっているけれど、RealDosMixの推奨は”DPM++ SDE Karras”なので、以降は全てこれで。
プロンプトの検討
WebUIの[PNG Info]を使うと、その画像に使われたプロンプトが分かる。
KtEXtparametersとしてPNGに埋め込まれているのを読み出してるだけなんだけども、これをそのまま[Send to txt2img]すれば、プロンプトも全部再現される。
画質
プロンプトのサンプルを見ると、たいがい最初に画質に関するワードが並んでいて、”4k, 8k”など「両方書く意味ある?」みたいなのが多い。ネガティブプロンプトを設定せず、画質以外のプロンプトを以下にして、サンプリングステップを35、他はデフォルトで描いたのが以下。
yorha no. 2 type b, solo, face
<lora:2bNierAutomataLora_v2b:0.5>
あちこち見ている時に見つけた、”absurdres”、Absurd Resolution「馬鹿げた解像度」がどうやら一番効く様子。
絵作り
ネガティブプロンプトに、”illustration”だとか”painting”とか色々入っている事が多いのだけど、”photorealistic”を指定するだけでこうなる。これは元々リアル系モデルであるRealDosMix固有の「効き方」かもしれないけれど。
absurdres, photorealistic
yorha no. 2 type b, solo, face
<lora:2bNierAutomataLora_v2b:0.5>
ウェイトを1.4ぐらいにすると、一気に写真感が増す。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
<lora:2bNierAutomataLora_v2b:0.5>
ウェイト1.8ぐらいにすると、今度は汚くなってくる。現実は汚い…。
absurdres, (photorealistic:1.8)
yorha no. 2 type b, solo, face
<lora:2bNierAutomataLora_v2b:0.5>
肌
やはり肌はキレイなのが良いですね。ということで”beautiful skin”を追加。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
beautiful skin
<lora:2bNierAutomataLora_v2b:0.5>
“beautiful”だけだとあまり効かない。2Bはメイクしてないと思うけれど、きっと化粧ノリで悩むことはあまりないだろうから、ファンデーションで「輝くような肌」で”shiny”を追加してみる。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
beautiful shiny skin
<lora:2bNierAutomataLora_v2b:0.5>
…。あまり変わらん…。「美しい」という雑な評価を強化してみる。たぶん、「ハリがあってツヤがある若々しい肌」は「美しい肌」だろw
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(beautiful skin:1.2)
<lora:2bNierAutomataLora_v2b:0.5>
ん?キレイになったけど、シミが出たんですけど…。砂漠の巨大な団地の廃墟で紫外線を浴びたからですかね…。プロンプトはそのままで、ネガティブプロンプトに”age spots”を入れる。シミ対策はこれでバッチリで楽だねぇ、2B。”stains”も可。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(beautiful skin:1.2)
<lora:2bNierAutomataLora_v2b:0.5>
age spots
肌の質感は”detailed”を追加すると変わるけれど、ここは好みが分かれるところ。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2)
<lora:2bNierAutomataLora_v2b:0.5>
顔
最も直球な表現は”beautiful face”。なんか出力結果がNieRというよりFFみたいになった気がするが…。同じスクエニさんだから、いっか。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2)
(beautiful face:1.4)
<lora:2bNierAutomataLora_v2b:0.5>
「息を吞むような美人」”breaktaking beauty”はどうやら認識しない様子。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2)
(breathtaking beauty:1.4)
<lora:2bNierAutomataLora_v2b:0.5>
「神がかった美人」”god’s beauty”もシードによって揺れが大きいので、おそらく認識していない。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2)
(god's beauty:1.4)
<lora:2bNierAutomataLora_v2b:0.5>
髪
2Bは短く白い髪ですね。A2は長いですが。”short white hair”を追加。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2), (beautiful face:1.4)
short white hair
<lora:2bNierAutomataLora_v2b:0.5>
う、うーん、短いけどそうじゃない感。ショートボブ?
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2), (beautiful face:1.4)
white short bob
<lora:2bNierAutomataLora_v2b:0.5>
目と目の間に毛束がかかってるんだよなぁ。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2), (beautiful face:1.4)
white short bob, hair between eyes
<lora:2bNierAutomataLora_v2b:0.5>
あまり代わり映えしないですね。ヘアバンドを着けた方が変わるかな?
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, face
(detailed beautiful skin:1.2), (beautiful face:1.4)
white short bob, hairband
<lora:2bNierAutomataLora_v2b:0.5>
服
これが一番やっかい。NieR Automataだよー、って教えちゃうのが一番早いw
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo, upper body
(detailed beautiful skin:1.2), (beautiful face:1.4)
white short bob, hairband
nier automata
<lora:2bNierAutomataLora_v2b:0.5>
あとは細かく、袖などを指定していく。ここから被写体に含める範囲を”face”から”upper body”にしているのは服を確認するため。さらに、”cowboy shot”や”full body”なども可能。
胸のサイズ
RealDosMixは学習データがおそらくそうなんだろうけど、お胸が大きめ。でも、2Bはバランスが良いサイズなので、オリジナルに寄せるならサイズを調整する必要アリ。大きい方から
[gigantic | huge | big | large | medium | tiny | small] breasts, flat chest
なのだけど、mediumがデザインを崩さない感じ。極端なサイズだと服のデザインに影響しちゃう…。
EasyNegative
ここまでで出来たプロンプトで生成すると以下みたいなのが出力されてくる。
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo
(detailed beautiful white shiny skin:1.2)
(detailed blueish grey eyes:1.2), (beautiful face:1.4)
short white hair, hair between eyes
nier automata, cleavage cutout, black dress, opera gloves, hairband, juliet sleeves, long puffy sleeves
god rays, ruins, upper body
<lora:2bNierAutomataLora_v2b:0.5>
ありゃ、だいぶあかん。低画質やトーンジャンプ、顔が崩れる等々、色々出ている。これを簡単に改善するには、EasyNegativeを使うのが手っ取り早い。
(”god rays”は上方からの神々しい光、”ruins”は廃墟)
これもHugging Faceにあるので、EasyNegative.safetensorsをダウンロードして、./stable-diffusion-webui/embeddings/
に入れる。WebUIを再起動してブラウザをリロード後、ネガティブプロンプトに”EasyNegative”を追加する。
EasyNegative
ネガティブプロンプト
画質関連
“EasyNegative”だけでは色々足らないのは、バッチカウントを設定して回してみると分かる。まず画質。
EasyNegative, (worst quality:2), (low quality:2), (normal quality:2), lowres
低画質を絶対に許さないという強い信念を、ウェイトを2にしてStable Diffusionに伝える。これだけでも、かなり良い感じにはなる。
えっちなのはいけないと思います
RealDosMixの学習データにアダルト系の画像が多いと想像されるので、やはりえっちな画像が出力されがち。”NSFW”、Not Safe For Workをネガティブプロンプトに指定すれば、大体防げる。防げてない…。
EasyNegative, (worst quality:2), (low quality:2), (normal quality:2), lowres, NSFW
RealDosMixでのNSFWの判定は微妙なところなので、”nipples”とか具体的に入れておいた方が安全。油断するとすぐにまろび出てきます。せっかく良い表情や構図、ポーズなのにそれらが出ちゃった時は、後述するInpaintで部分的に修正するのが良い。上の画像も耳にピアスがあるので、そこだけ修正することが可能。ほくろや目の色なども修正出来る。ただし、構図やポーズを大きく変えようとすると、たいがいうまくいかないので、あくまで部分的な修正だと考えた方が良い。
キメラ
キメラになったり、指の本数などは結構おかしくなりがち。モデルによって出現頻度は様々だけれども、Stable Diffusionは「構造を理解して」描いているわけではないので、仕方が無い部分はある。
これはネガティブプロンプトで防げるものと、プロンプトを改善しないとならないものがある。ネガティブプロンプトに追加すると効果があるワードは以下のようなもの。
bad anatomy, blurry, deformed, disfigured, disgusting, kitsch, long body, long neck, malformed hands, mangled, mutated, mutilated, oversaturated, poorly drawn, surreal, ugly
プロンプトは原則として順番に適用されていくので、最初に重要な要素を持ってくること、で意図に寄せられる可能性が高い。
Inpaint
先にInpaintを使って部分修正が出来ると書いた。例えば以下の画像、リップがナチュラル過ぎるかなぁ、とかなるわけです。このぐらいならPhotoshopで修正した方が速いかもしれないが、Stable Diffusionでたくさん出力すると修正したいことがかなりあるのでInpaintのやり方を知っておいて損はない。もう一つInpaintを使う理由があって「たかがリップの色のためにプロンプトの貴重な75ワードを消費したくない」というのがね。
Inpaintは[img2img]タブにあるが、[txt2img]から[Send to inpaint]ボタンを使うとプロンプトや設定がコピーされるので楽。
- [img2img]タブに移動
- プロンプトに”red lips”を追加
- [Inpaint]タブに移動
- [Resize mode]で[Resize and fill]を選択
- [Mask mode]で[Inpaint masked]を選択
- [Masked content]で[fill]を選択
- [Inpaint area]で[Whole picture]を選択
して[Generate]です。
はい、だいぶ赤みが増しました。
似ない
で、前提条件で書いた通り、実写に寄せると2Bに似ない。イラストだとそっくりになる。
これは生成された画像を見ると分かる通り、実写の方には相当数の「2Bのコスプレ」の写真が含まれていると推測され、これが「ノイズ」になっている可能性が大きい。そうだよねぇ、市販の2Bのコス衣装を着てる人ばかりじゃないもんね…。
改善する方法は、「NieR AutomataのゲームのスクショをベースにLoRAを自分で作成する」じゃないかなぁ…。(深みにハマる音)
結論
こんな感じのプロンプトでたくさん回せ!
absurdres, (photorealistic:1.4)
yorha no. 2 type b, solo
(detailed beautiful white shiny skin:1.2)
(detailed bluish gray eyes:1.2), (beautiful face:1.4)
short white hair, hair between eyes
nier automata, cleavage cutout, black dress, gloves, hairband, juliet sleeves, long puffy sleeves
god rays, ruins
<lora:2bNierAutomataLora_v2b:0.5>
EasyNegative, (worst quality:2), (low quality:2), (normal quality:2), lowres, NSFW, bad anatomy, blurry, deformed, disfigured, disgusting, kitsch, long body, long neck, malformed hands, mangled, mutated, mutilated, oversaturated, poorly drawn, surreal, ugly
いや、2Bの魅力を75ワードで説明するの無理ですw
結局、ある程度確度の高いプロンプト・設定でたくさん生成して、外れを除外する方が早いです、今のところw
追記
Loraを使うと、衣装の再現度が上がる。