Stable Diffusionを使ってみた

画像を自動生成するStableDiffsionを使ったイラストなんかがよくTwitterで流れてくるようになり
ちょっと気になったので使ってみた話。

## そもそもStable Diffsionってなに？
ひとことで書くと入力されたテキストをもとにテキストの内容に沿った画像を自動で生成するAI。
オープンソースで公開されていて商業利用に関しても自由らしい。
最近ではNovelAI,midjourney(こちらも画像生成サービス)なども話題にのぼっていたりして、
色々なイラストが公開されている。

## どうしたら使えるの？
試してみるだけなら割と色々な方法がある
- デモページ
    - [HuggingFace](https://huggingface.co/spaces/stabilityai/stable-diffusion)
    - 英語で文字を投げるとそれをもとに生成された画像4枚ほど出てくるのでとりあえず試したいならここが楽
- お絵描きばりぐっどくん
    - [LINEBot](https://page.line.me/877ieiqs)
        - 日本語対応していて1日あたり2枚が上限らしい？が手軽に試せる
- AIピカソ
    - [Apple Storeのリンク](https://apps.apple.com/jp/app/ai%E3%83%94%E3%82%AB%E3%82%BD-ai%E3%81%8A%E7%B5%B5%E6%8F%8F%E3%81%8D%E3%82%A2%E3%83%97%E3%83%AA/id1642181654)
    - お絵描きばりぐっどくんと同じ開発者が作っていて1日あたりの生成上限も多い！
- Stable Diffsionを実行して画像生成する(今回やるのはこれ)
    - 他の手段と比べると使うのに必要な手順が多いがそれでもそこまで大変というほどでもない
## 実際に使うためにインストール

### 環境
* 実行端末
    * MacBookAir M1(2020)
    * OS
        * Montery 12.5.1

### 事前準備
* Pythonのインストール
    * 今回は `3.10.6`　で進めていきます。
```
$ brew install pyenv
$ pyenv install 3.10.6
$ pyenv global 3.10.6   
// ここで今回利用するバージョンに切り替わっているか確認
$ python -V
```
### インストール
#### Stable DiffusionのRepositoryのクローン
Stable difusionのリポジトリからクローンしてきます。
```
$ git clone -b apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git
$ cd stable-diffusion
$ mkdir -p models/ldm/stable-diffusion-v1/
```

#### Virtualenvのインストール
Virtualenvをインストールして依存関係などをインストールしていきます。
```
$ python3 -m pip install virtualenv
$ python3 -m virtualenv venv
$ pip install -r requirements.txt
```


#### Hugging Faceのトークンを取得
利用にあたってHugging Faceのトークンが必要なので取得します。

[Hugging Faceのリポジトリ](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)にてHuggin Faceのアカウントを作って表示されるライセンスの内容に同意します。
![スクリーンショット 2022-10-21 11.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067453/7b7fcfe5-9031-1927-d4ea-216d11313e86.png)

`sd-v1-4.ckpt`をサイト内からダウンロードして先ほどクローンしてきた際に作ったディレクトリ `models/ldm/stable-diffusion-v1` に ファイル名を`model.ckpt`にして配置します。

### 実行
実行の際は下記コマンドに生成したい画像を英文で入力し、実行することで画像が出力されます。

実行コマンド
```
python scripts/txt2img.py \
  --prompt "ここに生成するのに使う文字列を英語で入力する" \
  --n_samples 1 --n_iter 1 --plms
```

この際に入力するpromptを入力したテキストから生成してくれるサイトもあるみたいです。
https://huggingface.co/spaces/Gustavosta/MagicPrompt-Stable-Diffusion

今回は弊社のマスコットキャラクターであるブルくんっぽい画像になるように出力してみます(リンクの記事参照)
https://news.line.me/detail/oa-sportsbull/102ab78d0b4d

文字で表すと全身赤色の人型の牛って感じだと思うのでそんな感じの内容を上記で紹介したサイトで実行してみます。


## 生成画像

* 生成に使ったテキスト
    * `Clip art of red cow in human shape  by artgerm, Craig Mullins`

赤い牛の顔のような画像が出来上がってhuman shapeの部分があまり感じられない...
![create_image_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067453/c43b6ff6-403f-b608-b151-06de2689b87c.jpeg)

人型の赤い牛のような記載のはずが赤い牛ばかりが出てきてしまうので、
赤い体をしたミノタウロス(体は人で頭が牛の形をしているとされる空想の生物)を生成する感じで試してみます。



* 生成に使ったテキスト
    * `Clip art of minotaur whose whole body is red`
頭が牛で体が人にはなったけどなんか違う...
![minota_image_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067453/14f6f721-60c4-759e-c4ff-2e7799762291.jpeg)![mino_image_2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067453/f223e6ab-eba8-dbc2-83c7-56c471d0a7e4.jpeg)


* 生成に使ったテキスト
    * `Clip art of minotaur whose whole body is red`
デフォルメされたイラストって感じで指定したらどうだと試したらなんか赤いヤギ頭がになった上におぞましい生き物ができてしまった
![defo_mino_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067453/1234cf4b-b1f5-fcc8-2ece-67206f4360d9.jpeg)

## まとめ

何十回か試してみたものの、センスがないのかブルくんのようなものが全く出来上がりませんでしたが
赤くて人型の牛頭の生物が出来上がったのでよしとします！(よくない)