Frqux’s AI laboratory

AIの技術が進化する今日

Stable Diffusionモデルを利用して画像生成する方法を圧倒的に詳しく徹底解説!!(AUTOMATIC1111)

 こんにちは。ふらうです。

 今回はAUTOMATIC1111上で、Stable Diffusionモデルを利用して画像生成を行うまでを解説します。
 「Hugging Faceからどのモデルをダウンロードすればいいか分からない...」
 「どこに保存すればいいかわからない...」
など、疑問を抱えていれば参考になる内容になると思いますので、ぜひ見ていってください。

 また、AUTOMATIC1111をインストールする方法は以下の記事で解説してますので、こちらもよろしくお願いします。

frqux.hatenablog.com

各拡張子のファイルの役割について

 各プラットフォームで配布されているファイルには、主に以下の拡張子のものです。

  • .ckpt
  • .safetensors
  • .yaml
  • .vae.pt

 まずは、これらのファイルの役割を解説します。

.ckpt

 この拡張子のファイルは、モデルのチェックポイントファイルです。チェックポイント(check point)の各単語の頭文字と終わりの文字をくっつけて「ckpt」です。
 ckptファイルは、学習されたモデルデータを「pickle」というライブラリを用いて保存しています。これをまたpickleなどで復元して元のモデルの形に戻し、使用することができます。

 ckptファイルは性質上、割と危険であったりもします。悪意のあるckptファイルだった場合、復元したと同時に最悪、不正なコードが実行されてPCが汚染されたりします。

 

.safetensors

 この拡張子のファイルも、モデルのチェックポイントファイルです。
 先ほどのckptの違いとしては、安全が保障されているか、されていないかの違いです。
 safetensorsファイルは、不正なコードが実行されないという認識で間違ってないと思います。なので、ckptファイルとsafetensorsの2種類が配布されていた場合、safetensorsを選んだほうが安心ということです。


.yaml

 この拡張子のファイルには、モデルの構成データが記されています。
 モデルの構成データは、ほかにも「.json」や「.py」で記されることがありますが、「.yaml」で記したほうが単純で分かりやすいのだそうです。

 こちらは、もし配布サイトにモデルファイルと一緒においてあれば一緒にダウンロードして、モデルファイルと同じフォルダに入れたほうがいいです。
 でも、正直理由はよくわかりませんでした。申し訳ございません。だいたいのモデルは、yamlファイルがなくても使用できましたので謎です。詳しい方、コメントなどで教えてくださると幸いです。


.vae.pt

 この拡張子のファイルは、vaeデータです。
 vaeとは変分オートエンコーダーのことで、画像生成に使われる用途としては、画質向上です。
 画像生成モデルで画像が生成された後、vaeを用いてもう一度作り直すことでクオリティが向上します。
 vaeはモデルごとに作られていることが多いです。
 vaeの性質上、モデルの学習データと同じデータセットを使って学習したほうが性能が上がるからです。
 しかし、どのモデルにも使えるような汎用的なvaeもありますので、vaeが一緒に配布されていないモデルがあっても心配ご無用です。

 基本的にこれもモデルファイルと同時にダウンロードされることが多いです。
 保存する場合は、

  • ある特定のモデルに特化したvaeは以下のstable diffusionのモデルファイルに入れる。

\\wsl.localhost\Ubuntu-20.04\home\[UNIX user name]\stable-diffusion-webui\models\Stable-diffusion

  • 様々なモデルに使うことを想定したvaeは以下のVAE専用のフォルダに入れる。

\\wsl.localhost\Ubuntu-20.04\home\[UNIX user name]\stable-diffusion-webui\models\VAE

という風に保存しましょう。


prunedとfp16・fp32の違い

 モデルファイルには、ファイル名の中に「pruned」という名前が入っているものがあります。
 これは、簡単に言うとモデルから不要な部分を取り除いたものになります。なので、通常のモデルと比べるとかなり小さいファイルサイズになっていることが多く、性能も大差ない結果になります。

 しかし、「不要な部分ってどんな部分?」、「性能は本当にあまり変わらないの?」って思いますよね。そういったところまで書いているサイトが見る限りなかったので調べてみました。
 以下に解説を載せますが、専門的な内容なので、わからない方はスキップしてください。

 tensorflowの公式リファレンスで調べてみると、以下のような記事が見つかりました。

www.tensorflow.org

 簡単に言うと重要度に基づいて重みを変えていき、不要なものを取っ払う方法らしいです。

 詳しく説明します。
 ニューラルネットワークの中の重みを学習していく段階で、複数の重みを徐々にゼロに近づけていきます。すると、ほかのゼロに近づいていない部分の重みで出力を正そうとします。この流れで、最終時に複数の重みをゼロに限りなく近くしてから、その部分を削除することで重みデータの削減につながります。
 公式リファレンスでは、性能の低下はほぼないまま、普通にファイルサイズを小さくした(モデルを小さくした)場合と比較して6倍の改善があったらしいです。

 わかりやすく具体例を挙げて説明します。まず、バナナが何か分類するために以下の三択を与えます。

  • 果物
  • 野菜

 もちろん正解は「果物」なので、「野菜」と「肉」の重要度は下がります。その後さらに選択肢を与えます。

  • 木の上にできるもの
  • 木の下にできるもの
  • 土の中にできるもの

 これは「木の上にできるもの」が正解なので、それ以外の重要度は下がります。こういった学習の過程でランダムに各選択肢の重要度をゼロに近づけていって、最終的に指標を下回った重要度の選択肢は削除される形になります。

 機械学習では、重み(例の中での重要度)一つ一つがファイルサイズを大きくする要因なので、それが削減されることでファイルサイズが小さくなります。さらに、重要度が指標を下回ったものを消すので、性能も高めたままにすることができるのです。

 実際はランダムにゼロに近づけるらしいので正解の選択肢も、もしかしたらゼロに近くなってしまうかもしれません。でも学習は基本的に何千回・何万回とループさせるのが基本なので、最終的に重要であれば指標を下回る事はないといえます。多分。

 なので、結果から言うと性能はprunedのほうが若干下がります。

 さらにその中でもfp16とfp32の2種類がありますが、fp16が基本的に選択されています。
 なぜなら、AUTOMATIC1111は基本的にfp16で計算が行われるからです。

 fp32は、単精度浮動小数点と呼ばれているものです。これは、10^38桁の数値を有効桁数7〜9桁で表せます。精度をあまり重視しない場合に使われるみたいです。

 また、fp16は半精度浮動小数点と呼ばれているもので、これは、〜10^-8から〜65504の間で、有効桁数4桁の範囲で表現可能なものです。fp32と比べて半分ほどのメモリ量で使用されるため、更にファイルサイズが小さくなります。fp32よりも精度を重視しない深層学習などで使われるみたいです。

 ちなみに、Dreamboothなどで追加学習したい方はfp16はお勧めできません。prunedモデルか、素のモデルを利用するようにしましょう。

 なので最終的な結論としては、「容量を食いたくないし、少しの性能差ならどうでもいい!」という方は"prunedのfp16モデル"を、「容量は気にしてないから性能が一番いいものを使いたい!」という方は通常のprunedと書かれていない素のモデルをダウンロードしましょう。


emaとnon emaの違い

 これもモデルファイルの違いです。
 emaは”exponential moving average”の略で加重移動平均のことです。
 加重移動平均とは、直近のデータを重要視した平均です。
 例えば、中学生の頃は偏差値が30くらいだったとして、高校生で一気に偏差値が70近くになった場合、加重移動平均は70に近い値をとることになります。

 なので、emaモデルは直近の性能の重みを採用しているものであると言えます。
 non emaについては特に書かれていなかったのですが、逆に考えるとnon emaは過去のデータすべてを平均して近似値をとっているものだと考えられます。

 正直、初心者目線だと違いがいまいちわからないし、ファイルサイズも一切変わらないのでどっちでもいいと思います。ただ、基本的に推論モデルにはemaを使うことになっているらしい(reddit情報)なので、emaモデルを使うのが無難といえます。


実際にモデルとvaeを選んで画像生成する

 ここまでの説明を見ればだいたい、どのファイルがどんな役割を果たすのか分かったと思います。
 早速ですが画像生成に移っていきましょう。


AUTOMATIC1111の起動

 まずAUTOMATIC1111を起動させましょう。

 ubuntuを起動して、stable-diffusion-webuiフォルダの中に入って以下のコマンドで起動できます。

./webui.sh

 すると以下の画像のような画面がブラウザを介して開かれると思います。

メイン画面

これで起動は完了です。


モデルファイルとvaeファイルのセット

 左上の「Stable Diffusion checkpoint」にモデルファイル
 右上の「SD VAE」にVAEを設定しましょう。
 VAEに関しては設定しないことも可能ですのでダウンロードが面倒な方や、別に多少のクオリティ向上はいらないという方は「None」を選びましょう。

 設定するとファイル名が表示されるようになり、セット完了になります。
 もし、errorと表示されて、左上に"connection error"などが出れば、AUTOMATIC1111が落ちていますので、もう一度起動して設定しなおしましょう。
 おそらくですが、PCの性能に見合わない大きいモデルを読み込もうとしたり、複数のモデルを入れ替え入れ替え使用したりするとErrorが出て落ちます。


プロンプト(呪文)の設定

 次にプロンプトを入力します。

 "prompt(press Ctrl+Enter or Alt+Enter to generate)"と書かれている欄に生成したい画像の特徴を入力していきます。
 文章でもいいのですが、単語ごとにカンマ(,)で区切って入力することが、基本のやり方でおすすめです。例えば以下のように"1girl"(一人の女の子)と"smile"(笑顔)と入力します。

 次にネガティブプロンプトを入力します。
 簡単に言うと、「こうなってほしくない!」というような特徴を入力します。

 ここでネット上からかき集めてきたネガティブプロンプトを以下に記しますので、以下の内容をコピペして貼り付けましょう。

lowres, ((bad anatomy)), ((bad hands)), text, missing finger, extra digits, fewer digits, blurry, ((mutated hands and fingers)), (poorly drawn face), ((mutation)), ((deformed face)), (ugly), ((bad proportions)), ((extra limbs)), extra face, (double head), (extra head), ((extra feet)), monster, logo, cropped, worst quality, jpeg, humpbacked, long body, long neck, ((jpeg artifacts)), deleted, old, oldest, ((censored)), ((bad aesthetic)), (mosaic censoring, bar censor, blur censor), multiple angle, blurry, longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair,extra digit, fewer digits, cropped, worst quality, low quality, text, error, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, missing fingers, bad hands, missing arms, large breasts, head_out_of_frame, 2koma, panel layout,

 中身は、monster(化け物)やworst quality(最低品質)などが入ってます。

 もっといい方法で、Embeddingファイルを利用する方法があるのですが、以下の記事で紹介してますので参考にしてください。

frqux.hatenablog.com

 ここまで行うと以下のようになります。

 必要最低限の設定をしたので、右の「Generate」ボタンを押してください。すると、画面右側に画像が生成されます。

 この状態では以下のような画像が生成されました。

モデル:Anything v4.5

 これで画像生成ができました。
 あとはおまけ程度に画面下部のオプションの解説をします。

  • Sampling method ... サンプラーの設定。サンプラーによって、生成される速さや品質を変えることができる。処理速度なら「Euler a」、クオリティなら「DPM++」から始まるサンプラーを選ぶとよい。
  • Sampling steps ... サンプリングするステップ数。数が多ければ多いほど多くのステップを踏んで画像が生成されていくのでクオリティが高くなりやすい。だがもちろんステップ数が多いほど時間がかかる。おすすめはデフォルトの「20」。
  • Width・Height ... 出力される画像を縦横のサイズ。少し変えるだけで生成時間が大きく変わるほか、縦横のサイズを大きくしすぎるとVRAM不足になって、CUDA out of memoryのエラーが出て生成できない場合がある。おすすめは、縦横合わせて1000近くなるよう数値を調整するといいでしょう。
  • Batch count ... 画像が生成される回数。
  • Batch size ... 一度に生成される画像の数。
  • CFG Scale ... 生成画像の内容をAIの感覚に任せるか、プロンプトを重視するかの割合。数値を小さくすればするほどプロンプトとは違った絵になりやすいが、自然な仕上がりになる。逆に数値を大きくすればするほど、プロンプトの内容に近い内容の絵になるが、無理やり近づけていくため絵が崩れてしまいやすい。おすすめは4~8の間。また、LoRAやLyCORISを使っている場合、おすすめのCFG Scaleがダウンロード元のページに記載されている場合があるのでそれを参考にするといいです。
  • Seed ... 初期値(シード値)。これを指定すると、同じシーンを生成できるようになる。例えば、シード値を「1000」に設定して画像生成したときに自分好みの絵が生成されたとします。そして、また別の機会に同じ絵を生成したい場合、また同じプロンプトを入力して、シード値に「1000」と入れて画像生成するとまったく同じ画像が生成されるようになる。初期値は「-1」となってますが、これはシード値を完全ランダムにするという意味です。特別なことがない限り「-1」のままのほうがいいです。


 以上を細かく設定して、自分好みの絵を生成しましょう。


終わりに

 今回は、AUTOMATIC1111での画像生成を行う方法を解説しました。

 また、このプロンプトから新しい絵を生成することをtxt2img(text to image : テキストから画像に)というものになります。

 これのほかにも、img2img(image to image : 画像から画像に)というものもあります。
 これは、既存の画像をもとに新たな画像を生成するものです。例えば、既存の画像のポージングを真似た画像を作りたい場合や、既存の画像を微調整(画質向上やサイズ変更など)したいときに使います。

 また、AUTOMATIC1111には、txt2imgで生成した画像をimg2imgにそのまま直接送ることができる("Send to img2img"を押す)ので、使用用途は結構あります。

 また時間があれば解説したいと思っています。

 それでは、最後まで閲覧いただきありがとうございました!
 今後もよろしくお願いいたします。