皆さま、こんばんは。
このような辺境まで、お越し頂き、ありがとうございます。

Twitterやネットでの情報を追っている皆様は、既にご存じかと思いますが、先日とある画像生成AIが公開されました。
それが、表題にもあります「Stable Diffusion」です。

そんな今話題のStable Diffusionについて、相変わらずのポンコツな私が使用できるようになるまで苦労したことや、その手触り感について書き残しておきたいと思います。

【注意】

この記事は主に、プログラム関係に馴染みのない方に向けて作成しております。

私はあまり知識が深くないので、今回も凄ーくどうでもいい事で苦労していますので、既にその手の方面に知識のある方には理解できない部分で躓いているためイラっと来る人もいらっしゃると思います。

知識の深い方には、素人が右往左往する姿を楽しむ位しかできない記事かと思いますので、そのつもりでお進みください。

Stable Diffusionって何?

 2022y08m28d_015322694
ここ数日話題のお絵描きAIであるStable Diffusionちゃんですが、簡単に言うと与えたキーワードを基に絵を描いてくれるというものです。

私は絵心がまるでないおっさんなので絵を描くことは早々に諦めて、この様に文章を書くことを趣味としているのですが、やはり絵を描きたいという憧れはあります。

自分の脳内にあるこの絵を表に出せたら楽しいだろうなぁと言う漠然とした想いはあるのです。
ですが、流石にその為に絵を描く事を目指すのは、特に今の私には厳しいです。
しかし、そこで青天の霹靂の如く、Stable Diffusionが登場しました。

凄い世の中になったものです。
そして興味をもって調べてみたのですが、調べれば調べるほど凄い子でした。

ここ最近、トレンドとして挙がっているお絵描きAIなのですが、この記事にありますとおり先輩に「MidJourney」がいます。

ですが、このMidJourneyさんは、残念ながらお金がかかるので無節操に楽しむことはできませんでした。

あとDiscordを使うという事で、私はちょっと良く分からなくて敬遠していたのもあります(超個人的な理由)

しかし、今回、発表された「Stable Diffusion」は、ななな、なんと無料!
オープンソースなので自分でカスタマイズもできそうですし、これは私にも手が出るのでは!?

そう思った時期が私にもありました(遠い目)

まぁ、そんな訳で文字をつなげて絵を描く為、私のポンコツな頭でStable Diffusionを使えるようになるまでのお話が、今回の記事の趣旨です。

もし私と同じように、ちょっと遊んでみたいなぁ、けど難しそうだなぁというプログラム初心者の皆さんに向けて、何かの参考になれば幸いです。

Stable Diffusionを使ってみよう!

と、書きましたが、私が調べて色々試した結果、何通りか方法があることが分かりました。
その前に、私のPC環境をある程度こちらに記載しておきたいと思います。

・CPU
Core i7-12700

・グラボ
GeForce® GTX 1660 SUPER GP OC

・OS
Windows 10

・私の知識レベル
Java ScriptやGASなら書けるくらい
Python?最近流行ってるよねーくらい
開発環境? 何それ美味しいの?(テキストベタ打ち)

上記のような状況で、いざスタートです。
勿論、今回も苦労したよ!

いきなり結論 初心者&マシンスペック低ならGoogle一択

どうでもいい話ですが、私は割とGoogle信者なので、「ははぁ!ぐーぐるさまぁ!!」ってなってます。
そんな私の様にならないまでも、別にGoogle嫌いじゃないよ、という方で、

プログラム?わからん!な人
グラボがNVIDIAじゃない人
PCが私のPC以下のスペックの人

こういう方は、選択肢は一つだけです。
迷わずGoogle様のお世話になりましょう(言い方

信仰的に問題のない方は、まずはGoogleアカウントを作っておきましょう。

もし仮に作成が不安な方は、以下のサイトを参考にして作ってください。

作成にはスマホなどでメールを受け取る必要があります。
Google信者の皆様ご用達なPixcelでは、通知等でより簡単な環境で接続できます。

もしGmaliを持っていて、Googleアカウントのある方は先に進みます。
具体的なやり方は、以下のサイトに詳しくあります。

このサイトとGoogleに感謝しつつ、一つ一つその通りにやっていけば問題ありません。
後は、ゆっくりと楽しんで下さいね!(終了

私はローカル環境で楽しみたい!な人【まずは結論】

さて、私は最初、ローカル環境での構築を選びました。
Pythonの勉強がてらやるべーと、甘い気持ちで始めたのですが……いやぁ、まぁ、何も知らん状況で始めたので、そりゃ色々なところで突っかかりました。

で、現状、最終的にどうなったかと言うと、以下のサイトのお世話になりその通りに構築して、何とか動いてます。

サイトの主様と、情報提供して下さった多くの皆様に感謝!!

ちなみに、上のサイトの通りに環境構築をしても、実は私の環境では以下のような真っ黒・もしくは真緑の画像になってしまい、上手くいきませんでした。
2022y08m28d_015305571
で、ここにたどり着いたのが、最終段階だったので、何でそうなっているかは既に分かっていました。
結論から言いますと、グラボがうまく対応できてないという事らしいです。

このサイトにある通りGeForce1660Superは、乗ってないんですよ。
つまり完全には対応できてない可能性が高いという事です。

で、さらに調べると、どうやら解決策があるとのこと!
これも結論から言うと、

--precision full

これをオプションに加えることです。
こうして動かすと、ついにちゃんとした画像が!!
2022y08m28d_015316545
長かった、長かったよ。ここに至るまでは、本当に長い道のりでありました。
いや、そりゃなんも知らんところからのスタートなので、2日くらいぶっ通しで調べたよね。

という訳で、上の環境で使う場合は、こんな感じで動かしました。

python optimizedSD\optimized_txt2img.py --prompt "ここに呪文を書く" --W 256 --H 256 --ddim_steps 50 --n_samples 5 --n_iter 1 --precision full
何も分からんという初心者な方は、参考までに。

まぁ、という訳で結論としてはそれで、チャンチャンという話なのですが、実は今の状態でもいまいち何をどうやっているのかわかってなかったりします(恐ろしい)

う、動けばいいのよ、動けば!!
という訳で、ここからは、現状にたどり着くまでのお話を時系列で残しておきたいと思います。

またも始まる右往左往の時間

毎度ながら、全く知識がない状態から始めるものですから、本当に???という時間が続きました。
最初に参考にさせて頂いたのは、以下のサイトです。

このサイトを通して、かなり知識が深まりました!(多分)
ありがとうございました。

結論から申し上げますと、こちらのサイトの通りに構築して、動くところまでは行きました。
途中、CUDAのバージョンがあってなかったのでうんぬんかんぬんとか、PATH繋げられなくて、コマンド通らないとか、そもそもコマンドの打ち方がわかんねー!?とか色々ありましたが、それはさておき。

で、最終的に四苦八苦しつつも、出力は出来ました。
上の黒や緑の画像だらけになり、調べた結果、先に述べた通り「--precision full」をオプションに設定すればいいという事までは突き止めたんです。
突き止めたんですが……非常に初心者的かつ根本的な問題にぶち当たりました。

オプションの設定の仕方が意味わからん

とりあえず上記サイトや、公式の通りpipe()の中にカンマで区切って記述してみたのですが……エラーの嵐で???となりまして。

公式サイトの記述なども参考にしつつ、
import torch

generator = torch.Generator("cuda").manual_seed(1024)
image = pipe(prompt, guidance_scale=7.5, num_inference_steps=15, generator=generator)["sample"][0]

# you can save the image with
# image.save(f"astronaut_rides_horse.png")

なるほどー、pipe(a,b,c)みたいな感じねーと思っていたので、
image = pipe(prompt,precision=full )["sample"][0]
とか書いてみたら、めっちゃエラー。fullなんて引数ねぇよ!って怒られました。
え?だってfullってかいてあるじゃーん。

※以下公式からの引用です
usage: txt2img.py [-h] [--prompt [PROMPT]] [--outdir [OUTDIR]] [--skip_grid] [--skip_save] [--ddim_steps DDIM_STEPS] [--plms] [--laion400m] [--fixed_code] [--ddim_eta DDIM_ETA]
                  [--n_iter N_ITER] [--H H] [--W W] [--C C] [--f F] [--n_samples N_SAMPLES] [--n_rows N_ROWS] [--scale SCALE] [--from-file FROM_FILE] [--config CONFIG] [--ckpt CKPT]
                  [--seed SEED] [--precision {full,autocast}]

optional arguments:
  -h, --help            show this help message and exit
  --prompt [PROMPT]     the prompt to render
  --outdir [OUTDIR]     dir to write results to
  --skip_grid           do not save a grid, only individual samples. Helpful when evaluating lots of samples
  --skip_save           do not save individual samples. For speed measurements.
  --ddim_steps DDIM_STEPS
                        number of ddim sampling steps
  --plms                use plms sampling
  --laion400m           uses the LAION400M model
  --fixed_code          if enabled, uses the same starting code across samples
  --ddim_eta DDIM_ETA   ddim eta (eta=0.0 corresponds to deterministic sampling
  --n_iter N_ITER       sample this often
  --H H                 image height, in pixel space
  --W W                 image width, in pixel space
  --C C                 latent channels
  --f F                 downsampling factor
  --n_samples N_SAMPLES
                        how many samples to produce for each given prompt. A.k.a. batch size
  --n_rows N_ROWS       rows in the grid (default: n_samples)
  --scale SCALE         unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty))
  --from-file FROM_FILE
                        if specified, load prompts from this file
  --config CONFIG       path to config which constructs model
  --ckpt CKPT           path to checkpoint of model
  --seed SEED           the seed (for reproducible sampling)
  --precision {full,autocast}
                        evaluate at this precision
これを見る感じだと、他のオプションは変数に=で代入するだけだから、いけそうなものですが、ダメでした。
で、数字はが何故か入ったので、最終的に100億位入れてみましたが通るものの反応せず。
image = pipe(prompt,precision=max )["sample"][0]
そして何故かこれだと通る。なんで? けど反応は無し。

うーむ、もしかして……と嫌な予感がしたのでオプションの他の項目をいじった結果。

全く息をしていないことが判明しました。

わ、わからねぇ。なんでそんな意味不明な挙動をしているんだ!?
とまぁ、そういう訳で、じゃあ、公式の通り--が付くような入れ方が出来れば解決するんじゃないかなー?と思ったのですが、ここでまた初心者的な問題が。

え、どうやったらその入れ方ができるようになるの?

勿論、この疑問が出る通り、コマンドプロンプトでもpythonでもコマンドは弾かれてます。

因みにこの時点での私の作業はこんな感じ。

① コマンドプロンプトを管理者権限で立ち上げる
② cd でファイルの保存場所に移動
③ pythonコマンドで、python起動
④ お世話になったサイトを参考に以下のようなコマンドを張り付け
import torch
from diffusers import StableDiffusionPipeline
from torch import autocast
 
MODEL_ID = "CompVis/stable-diffusion-v1-4"
DEVICE = "cuda"
YOUR_TOKEN = "コピーしたアクセストークン"
 
pipe = StableDiffusionPipeline.from_pretrained(MODEL_ID, revision="fp16", torch_dtype=torch.float16, use_auth_token=YOUR_TOKEN)
pipe.to(DEVICE)
 
prompt = "a dog painted by Katsuhika Hokusai"
 
with autocast(DEVICE):
  image = pipe(prompt)["sample"][0]
  image.save("test.png")
多分、何か通してる環境が違うからコマンドも違うんだろうけど……そもそもpython --的な書き方をする場合は何を使ってるんだろうか?

結局実は今もって、何がどうして動いているのかいまいちわかってません。
ふわっとですがマニュアルを読み進めてきた感じだと「txt2img.py」に定義されているローカルルールっぽいので、つまるところ「txt2img.py」を起動できればいいんですけど……よーわからん。

そのままコマンド叩いても勿論、パスが無いので繋がらんけどその辺りの仕組みを理解しようとしたらあと数日かかりそうだったので、最終的に脳死で環境構築が出来たやり方に落ち着きました。

とりあえずそんな訳で、一応のゴールに到達したわけですが、忘備録ついでにPython初心者の私が凄く困った事を残しておきます。

【python初心者が超困った事】

Q: pip? git? conda?どこで入れるの?
Ans コマンドプロンプトから直接GO(phytonに入ったら>>>になったらダメ)

Q: pythonからコマンドプロンプトに戻れない!?
Ans いいか、落ち着いて「exit()」と入力するのじゃ

Q: そもそもgitコマンドって何よ
Ans 何か色々ダウンロードできるらしいけどよくわからんので使ってない

その後調べたらこんな感じっぽかった。

単純にCloneコマンドを使う場合はこういう事らしい。


Q: そもそもAnacondaって何よ
Ans 開発環境を構築して管理しやすくするものっぽい?

ldmなどのコマンドはこれに関するものっぽい

以上、右も左もわからない初心者の感覚だとこうなりますので、もし初心者向けに記事を書く方は何かの参考にして下さい。

いでよ美少女! 呪文生成の儀式

という訳で、現状、色んな表現を試して遊んでいるわけですが、結論から申し上げますとアニメ系はきつい。以上。
2022y08m28d_015327162
遠めに見ると割と行けてそうな感じじゃないですか。
近くで見ると凄いんですよ、これ。
あれ、手が無い、指が無い、頬どこいった?みたいな軽くホラーになってます。

何かこの作業していると、鋼の錬金術師思い出すんですよね……(遠い目

で、一応、参考としてこんなサイトもありますのでご紹介しておきます。

ですが、私は一つだけ注意しなければならないと思っていることがありまして。

それは、現在ご存命のアーティストさんをキーワードに選ぶ場合は少し慎重になった方が良いかもという事です。

まぁ、個人で楽しんで「わーいたのしー!」するくらいなら良いと思うのですが、外に出す場合(SNSに乗せるとか)は、ちょっと一旦待った方が良いかもです。

この辺りは今後の世の中の動きでどうなるか分かりませんので。
この技術自体が世に出たばかりの生まれたての赤ん坊のような存在なので、場合によってはこれからドンドンと大変な事になっていくことは想像に難くありません。

今回私がいち早く手を出したのは、もちろん、興味が9割くらいあるのですが、こうした楽しみ方が早いうちから出来なくなるかもしれないと思ったからです。

世の中の情勢に詳しい方ならご存じかと思いますが、難癖をつけて新しいものを抑えようとする動きはどこにでも起こるものですので。
なのでとりあえず、変に巻き込まれない程度に、外に出す絵に関してはキーワードについては、気を付けておいた方が良いと個人的に愚考した次第です。

勿論、単なるおっさんの一個人の意見に過ぎませんので、判断は皆様にお任せします。

そんな感じで最後は少し暗い話となりましたが、まだまだ可能性に満ちたStable Diffusionについて、興味のある方の参考になれば幸いです。

※2022年10月15日追記
この続きの記事ができましたのでリンクを張っておきます。

今回の記事は以上になります。
お読みいただき、ありがとうございました。