まごんの駄文

ぽんこつSEが勉強したことをアウトプットするためだけのブログです。

Stable Diffusionで絵を描いてみた

!注意! ここの情報はあいまいです。間違った知識かもしれません。 2週間くらいStable Diffusionに触れてなんとなくわかったことを1つの記事で書いてます。

環境

この貧弱な環境ではまともな絵が生成できないのだ。

Stable Diffusionとは

よくわかってない。学習データを使って絵を生成してくれるPythonで書かれたエンジン的なもの?

Stability AIというところが作ってるらしい。

stability.ai

「画像生成AIだよ」と言ってもSDが具体的に何を指してるのかいまいちわからない。

フロントエンド

Stability AIが提供してくれてるブラウザで動作するDream Studioがある。

お試ししたい人はそちらで。

ちゃんと作りたい人はPCに環境を構築しよう。

基本的にWebUIというものを使って生成する。これ作った人すごい。ありがとう。

github.com

SDよりもっといいSDXL版もすでにあるらしいが、AUTOMATIC1111もいずれSDXLに対応してくれるかも。

導入方法

先述のWebUIを入れたらもう生成できるけど、いろいろ追加したい。

とりあえず日本語化はしてるので、以下の話は全部日本語になってるけど、ボタンとか項目の名前とか適宜読み替えで。

起動方法

webui-user.batをたたくとコマンドプロンプトで動いてくれる。

環境が貧弱な人は、このbatの中の「COMMANDLINE_ARGS」にいくつかオプションを書いてあげると改善したりする。

俺はグラボのメモリが4GBしかないのでCPU側のメモリも使うように指定している。

モデルデータ

描く絵のもととなるデータ。自分の好みのものを追加したい。

ざっくり「checkpoint」と「lora」がある。

まずは「checkpoint」をダウンロードする。数GBある。

「lora」は追加学習データらしい。

「checkpoint」に味付けするように追加する。数十~数百MB程度。

配布サイトは以下のどっちか。

civitai.com

huggingface.co

huggingfaceは文字だらけでわかりづらいけど、データ量はcivitaiよりも多い感じ。

でも文字ばっかでわからないからcivitaiのほうが好み。

利用者が生成した絵がプロンプトとセットで公開されてるので参考になる。

拡張機能

WebUIに機能を追加できる。データ管理や生成した絵を補正するものなどなど。

絶対あったほうがいいよねってものもいくつかあるので探して入れよう。

お絵描き

プロンプト

お絵描きは「プロンプト」「呪文」と呼ばれるテキストを使う。描きたい絵の構成要素を現した単語の羅列だ。

どういう言葉が有効なのかは「プロンプト 一覧」とかで検索したら出てくると思う。

以下のような感じで「,」で区切って英語で羅列する。

めっちゃきれい, 高品質, 絵, 前からのアングル, 女性が一人,

前に置くほど影響の強い単語になるらしいが、それぞれの重みを増すこともできる。

めっちゃきれい, 高品質, 絵, (前からのアングル:1.5), 女性が一人,

こんな感じだ。「:1.5」のところ数字を調整する。

この単語はある程度の数の制限があるとか?それをうまくやりくりするための手法としてAND構文やBREAK構文というものもあるらしい。

loraを使う場合もプロンプトに記述する。以下はunkoというlora(そんなものは無いが)を使う例。「,」はいらないっぽい。

めっちゃきれい, 高品質, 絵, (前からのアングル:1.5), 女性が一人 <lora:unko:1>
パラメータ

生成するためにいろんな物を選ぶが、これが正解というのが無いので試行錯誤しよう。

サンプリングメソッド:これで絵の感じが変わる。試してみてお気に入りのメソッドを探そう。

サンプリングステップ:多いほど絵が精彩になる。30~40くらいにしたらいいのではないか。

バッチ回数:何枚描くか。

バッチサイズ:1回で何枚描くか。よくわからない。1にしてバッチ回数を増やせばいいと俺は思い込んでる。

幅、高さ:デフォルト512x512だと小さいからか、例えば「2人」とプロンプトに入れても1人しか書かれない。小さいと自分の意図したものが絵の中に入ってくれない。でも俺のGTX970だと、たとえば1024x1024にするとメモリ不足になる。あと絵があんまりきれいじゃない。

CFGスケール:数字が高いほどプロンプトに忠実らしいが、だからと言って思った絵ができるわけではない。

ノイズ強度:この値が低いと同じような絵ばかり生成される。高いほど色んなパターンの絵ができる。ノイズと言ってもザラザラしたものではなくて、生成結果に対するノイズという意味なんだろう。

実際にお絵描き

生成ボタンを押すと絵が描かれる。

俺の環境だと512x512の絵を一枚描くのに1~2分くらいかかる。

拡張機能でControlNet入れてるとさらに遅くなる。

ControlNetはいい感じの絵が生成されたときにそれを流用して新たな絵を作るためには必要な拡張機能だと思う。

しばらく待つとPNGファイルができる。

画像の下に「保存」というボタンがあるが、別にこれを押さなくても勝手に保存されている。

勝手に保存される場所と、「保存」を押した場合の保存場所は異なる。

PNGの中身

絵だけじゃない。プロンプト等の生成時の情報が全部PNGの中に含まれている。

なので、どういう設定でやったか覚えてなくても、画像から情報を引っ張ってこれる。

画像内の情報をそのまま次の生成に利用できるようにしてくれる機能がWebUIにはある。

なので生成時にseedの値とか諸々メモとかしておかなくてもいい。

拡大する機能

最初から大きい絵を描くのは負荷が高いので、小さく絵を描いて拡大するという手もある。

標準の拡大機能は結果がいまいちなので、MultiDiffusionなどの拡張機能を使おう。

おわり

まるで日本語が通じない相手に日本語でなんとか自分の思った作業をさせるかのような難しさがある。

思ったような絵が描けなくても何度も生成しなおしたり、拡張機能で補正したりなどして頑張って好みの絵を作ろう。

でもその前にちゃんとPCのスペックを良くしよう。

グラボごとの生成速度のベンチマークサイトもあるので参考にしよう。