今話題の画像生成AIの「Stable Diffusion」。ワシも自給自足やアイディア出しに使えるのでは、と踏んで環境構築まで行って使用中。ブームに乗っかかるワシは激レアなので心残りなく味わっておくこと。
当記事で扱っているモノは、テキストから画像を生成するtxt2imgのみです。新たな気づきがあれば随時追記します。
環境
GALLERIA GCR1660TGF-QC
- CPU: Core-i7 9750H
- GPU: GTX 1660 Ti
- VRAM: 6GB
- RAM: DDR4 16GB
…という環境だとVRAMが心もとないようなので、コレよりもずっとずっとハイスペックなGPUが使えるGoogle Colaboratoryで環境を構築した。
十分なスペックのGPUが搭載されていて、消費電力だとかその辺を許容できるならローカルの方がいいかも。ただノートパソコンはこの使い方に向いてなさそうなのでデスクトップの方が拡張性含めて有利そう。
Google Colabに関して、2022/08/31時点では無料プランを使用。無料プランでもVRAMが10GBを超えるGPUを使える。
- GPUの使用量上限があり、使い過ぎると接続が切れる
- 日本時間における昼だと空いていることが多く、夜だと混みあうことが多い
- 最大90分間操作しないと接続が切れる
- 連続で12時間使うと接続が切れる
- 接続が切れるとライブラリのインストールなどもやり直しとなり、生成されたデータなどもGoogle Driveに保存しないと消える
- (比較的)性能の低いGPUを引きやすい
- 無料版なのに何故かワシはT4(VRAM 15GB)ばかり引く
未検証だが、有料版(Pro, Pro+)はGPUの使用量上限が大きく上がり、高性能なGPUを引くことが多くなり、連続で使える時間も24時間になるなど、沢山動かすユーザーにとっては有難いプランのようだ。でもみんなが欲しがってそうなバックグラウンド処理は最高額(約5000円/月)のPro+だけで、Pro(約1000円/月)は純粋にスペックと使用量が上がるだけっぽい。
導入方法に関しては先駆者様の記事を参考にしてね。Hugging Faceのアカウントも必要になるよ。

基本知識
Stable Diffusionは、テキスト及び画像を入力とし、学習済みモデルから画像を生成する拡散モデルである。説明が難しいが、「テキストを入れるだけで画像を出力してくれるAI」といえばわかりやすいだろうか。テキストから画像を生成する拡散がtxt2imgで、画像+テキストから画像を生成する拡散がimg2img、だったはず。この記事では、txt2imgのみを扱っている。
任意のテキスト(呪文ともいう。ここではプロンプトとする)を入力すると、それに沿った内容の画像を出力するが、同じ内容のプロンプトでも大きく結果が変わることが多い。
ガチャ
同じプロンプトで複数枚の画像を生成し、目当ての画像が出るまで待つ行為。人によって大きく解釈が変わるテーマ(ロボットとかロボットとかロボットとか)だと内容の振れ幅がかなり大きいため、多くの枚数の画像を生成しないと目当ての画像が生成できない事もある。
以下は、プロンプトを”an illustration of pop mecha robot, glossy, kirby, cyber”として生成した画像だ。全く同じな上にある程度傾向を絞っているにも関わらず、デザイン、体格、絵柄、配色、書込みの細かさなどにここまで大きな振れ幅が生じるのだ。
プロンプトの意味としては、「ツヤツヤで、カービィっぽくて、サイバーな感じの、ポップなメカロボットのイラスト」(意訳)。
勿論、時間に余裕がある、高スぺPC故に短時間で処理できるなら問題はないが、Google Colabの場合はガチャを回し続けているうちにGPUの使用量上限に到達して中断されることも多いだろう(無料版で顕著、有料版は未検証)。アタリを引ける見込みのないプロンプトの場合は早めに撤収する、プロンプトを少しずつ細かくして理想に近づけるなど、ユーザー側で工夫を凝らした方が早く目当ての画像にたどり着けることが多い。プロンプトの重みを弄って不要な成分を含ませないという手段に出た方もいる模様(未検証)
※512*512以下のPNG画像のサイズは然程大きくないのであまり問題にはならない。大きくても500kB。

seed値を保存する
上記のように、同じプロンプトを入力しても全く異なる結果が出ることが多いが、全く同じ結果を出す方法が一つ存在する。生成された画像のseed値を記録し、生成時に指定することだ。
Stable Diffusionのseed値はワシが確認した限りでは、0~2,147,483,647までの約21億通り存在する。コレは、31bitで表現できる数値の数と等しい。
不勉強でseed値を指定しない場合に使われたseed値を取り出す方法を知らないので、プログラム側でseed値を生成し、保存ファイル名もseed値とする方法をとった。ファイル名の重複で上書きされる危険性も無くなるし、万が一上書きされても同じ内容なので大丈夫。
print(prompt) sentence = f"{prompt.replace(' ','_')}_{width}*{height}" dir_prom = drive_stdf_dir + sentence mkdire(dir_prom) for i in range(quantity): seed = random.randrange(0, 2147483647, 1) print(f"{i+1}/{quantity}\nseed = {seed}") with autocast("cuda"): generator = torch.Generator("cuda").manual_seed(seed) image = pipe(prompt=prompt, width=width, height=height, generator=generator)["sample"][0] out_path = f"{dir_prom}/{seed}.png" image.save(out_path) if(disp): display(Image(out_path))
同じseed値で画像を生成する場合、画像のファイル名が{seed値}.pngとなっているので、ソレを参照するとイイ。
ただし、同じseed値でも解像度が異なる場合は全く違う結果となる。低解像度で素早く生成し、気にいった画像だけ高解像度で生成してもらう方法は使えない。ただし、influence stepsは変更しても全く違う結果にはならないので、品質を上げる場合はそちらを使う。
Google Colabにて、生成した画像をGoogle Driveに保存する
Stable Diffusion生成した画像は、保存するなり表示するなり好きに扱うことが出来る。Colab上のディスクにも保存することが出来るが、接続が解除されるまでに保存しないと消去されてしまうし、そもそも右クリック保存も面倒。そのため、Google Driveをマウントし、そこに画像を保存するようにすると便利。保存のためのプロセスは自動化されるし、保存漏れも発生しない。
マウントの度にアクセス許可を行う必要がある。また、必要なライブラリもインポートする。
from google.colab import drive drive.mount('./gdrive')
保存する際にはディレクトリの指定を行うことになるが、コレは変数として宣言しておくと非常に取り回しが良くなる。オススメ。
drive_root_dir="./gdrive/MyDrive/" drive_stdf_dir="./gdrive/MyDrive/Stable_Diffusion/"
例えば、マイドライブ直下のStable_Diffusionというディレクトリに保存したい場合は上記のように代入すると良い。
その他、気付いたコトとか
- Pythonの経験が役に立つ。いくらでも自動化できる。
- 1024*1024の画像はかなりのスペックのGPUが必要
- Google Colab(無料版)だとVRAM不足で処理が中断されることが多かった
- 低解像度だとNSFWフィルターに引っかかることが多い?
- プロンプトのこと
- Cartoon of…だと粗い手書き風の絵柄になりやすい
- Robotはイイ感じにバラけてくる。
- ミリタリー系のメカ、八頭身の巨大ロボは意外にも全然出てこない
- kirbyと入れると、カービィ的なエッセンスを取り入れてくれるコトが多い
- Robot wearing clothes、Robot holding a shirtなどと入れても服を着たロボットが全くと言っていいほど出力されない
ギャラリー
生成した画像の内、気にいったモノの一部を公開。
- 闘うメカだがかわいい
- 野暮ったさもかわいい
- 光沢感のある絵柄が素敵!
- 浮遊感のあるデザイン
気付いたコトとかあれば随時追記します(2回目)
ちなみにこのAIを使いこなせるようになっても創作活動はやめないと思うし、むしろAIじゃ表現できない領域を目指すようになると思う。
コメント