【Stable Diffusion】新学期からはじめる画像生成AI【M1 / M2 Mac】

# はじめに

画像生成AIに関する知識がゼロである筆者が、Stable Diffusionを動かすための環境を構築し、好きなモデルやVAEを導入するところまで成功したため、手順を記載しておきます。ただし、promptの書き方については触れません

# 対象者

- 画像生成AIについて知識がない人(私も無いです)
- M1 / M2 Macを使用している人

# 環境

```
MacBook Air
Apple M2
メモリ 16G
macOS Ventura 13.2.1
```

# 環境構築

## Homebrewのインストール

以下のQiitaの記事を参考に、Homebrewをインストールします

https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

## 必要なパッケージのインストール

Homebrewを使ってパッケージをインストールします

```zsh
brew install git wget
```

:::note warn
公式の[手順](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon)では、`cmake`、`protobuf`、`rust`、`python@3.10`、`git`、および`wget`をインストールするように指示されていますが、筆者の環境では`git`と`wget`だけで十分でした(Pythonはこのあとインストールします)。もし何かしらのエラーが発生した場合は、`cmake`、`protobuf`、および`rust`もインストールしてみてください
:::

## Python環境の構築

### バージョン管理ツールのインストール

Pythonのバージョンによって、動くものと動かないものの差が激しいため、バージョンを自由に切り替えられるように、バージョン管理ツールをインストールします。ここでは、asdfというツールを使用しますが、他のツールでも構いません

#### `asdf`のインストール

```zsh
brew install asdf
```

`.zshrc`に次の一行を加える
```
. /opt/homebrew/opt/asdf/libexec/asdf.sh
```

:::note
`.zshrc`を直接編集せずとも
```
echo -e "n. $(brew --prefix asdf)/libexec/asdf.sh" >> ~/.zshrc
```
と実行することで追加できます
:::

#### Pythonプラグインのインストール

`asdf`でPythonを扱えるようにします

```zsh
asdf plugin-add python
```

この時点でまだPythonはインストールされていません

#### Pythonのインストール

`asdf`を用いてPythonをインストールします。 **ここで重要なのは、インストールするバージョン** です。

```zsh
asdf install python latest
```

と実行することで最新版のPythonがインストールできますが、最新版のPythonではStable Diffusionは動かせないので、 **v3.10** をインストールします。

```zsh
asdf install python 3.10.10
```

:::note warn
これは2023年4月1日時点での情報です。今後Stable Diffusionのアップデートにより要求されるPythonのバージョンが変更されるおそれがあります
:::

#### 使用するPythonのバージョンの設定

```zsh
asdf global python 3.10.10
```

```zsh
python -v # Python 3.10.10と表示されればOK
```

## `stable-diffusion-webui`の環境構築

Stable Diffusionの実行環境を構築する方法には、複数の手段がありますが、今回は最も簡単なstable-diffusion-webuiを使用する方法を紹介します(実は、最初はスクリプトを書いて実行する方法を試みましたが、好きなモデルを指定するところで挫折したため、webuiに切り替えました)

任意のディレクトリに移動したら、以下のコマンドを実行します

```zsh
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
```

次に、モデルを用意します。とりあえず最初はオリジナルのモデルを追加してみます

https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

以上のサイトから`sd-v1-4.ckpt`というファイルをダウンロードしましょう。基本的に、AIのモデルなどを落としてくるのはこのHugging Faceというサイトになります。Hugging Faceはアカウント登録が必要なので事前に登録をしてください

AIのモデルは、`ckpt`や`safetensors`といった拡張子になっています。また、モデルを落とす際に`git lfs`でリポジトリごと落とせと言ってくることもありますが、膨大な時間がかかるのでおすすめしません。目的のファイルだけ直接ダウンロードすれば大丈夫です

Hugging Faceの使い方は、ほとんどGitHubと同じです。`File and versions`という欄から目的のモデルファイルをクリックし、`This file is stored with Git LFS . It is too big to display, but you can still download it.`という文の`download`をクリックすれば落とせます

落としてきたモデルは`stable-diffusion-webui/models/Stable-diffusion`配下に置いてください

## Pythonの仮想環境を構築

`stable-diffusion-webui`を実行する際にさまざまなパッケージ等がインストールされるのですが、なるべくまっさらできれいな状態で行いたいので、仮想環境を構築します。

仮想環境といっても構築はとても簡単です。`venv`というもので行うのですが、Pythonに標準でついてくるので特にインストールなどは必要ありません

```zsh
cd stable-diffusion-webui
```

```zsh
python -m venv .venv
```

これで`.venv`という名前の仮想環境が構築できます。名前は`venv`や`.venv`にするのが慣習だそうです

```zsh
source .venv/bin/activate
```

これで仮想環境に入れます。もし、仮想環境から出たくなったら

```zsh
deactivate
```

で抜けられます

## `stable-diffusion-webui`の実行

```zsh
sh webui.sh
```

初回起動は結構時間がかかります

```zsh
...

Running on local URL:  http://127.0.0.1:7860

...
```
という表示が出ていれば起動が完了しています。ブラウザで`http://127.0.0.1:7860`にアクセスしてください。

## `stable-diffusion-webui`の使い方

ここでは、 txt2img の基本的な使い方について説明します。 txt2img とは、 **テキストから画像を生成するための技術** です。

### Stable Diffusion checkpoint

使用するAIモデルを選択します

### Prompt

画像に表れて欲しい要素をテキストで書きます

### Negative prompt

画像に現れて欲しくない要素をテキストで書きます

### Sampling method

サンプリングに使用するメソッドを選択する必要がありますが、よくわからない場合は、AI モデルの説明欄にどのメソッドを選択すればよいかが書かれていることがあります。迷った場合は、とりあえず`DPM++ 2M Karras`または`DPM++ SDE Karras`を選択することをおすすめします

### Sampling steps

サンプリングの回数を指定します。画像生成AIでは、まず、seedからノイズを生成し、そこからpromptに沿って画像を変化させていきます。その回数をここで指定します。基本は20くらいで、多くて70くらいな気がします。5とかにするとバケモノが生まれます

### Restore faces

顔を綺麗にするためのオプションです

### Tiling

画像をタイル状に並べて表示するためのオプションです

### Hires. fix

解像度を上げることができるそうですが、使ったことがないので解説できません。すみません！

### Width & Height

生成する画像のサイズを指定します。デフォルトは512*512で、AIモデルは512*512に最適化されていることが多いのであまり動かさないほうがいいです。解像度を上げたい場合は、後述する方法を使います

### Batch count & Batch size

どちらも生成する画像の枚数を指定するものですが、`Batch count`が生成する回数を指定するもので、`Batch size`が一度に生成する枚数を指定するものとなっています。`Batch size`を上げすぎるとパソコンが死にます

### CFG Scale

どれだけpromptに忠実にさせるかを指定します。基本は7くらいだそうです

### Seed

シード値を指定します。-1にするとランダムになります

## AIモデルの追加

せっかくなので別のAIモデルも追加してみましょう

### AnythingV4

https://huggingface.co/andite/anything-v4.0

なんだかたくさん種類がありますね。どうやら`pruned`とはファイルサイズを抑えたバージョンらしいです。せっかくなので`pruned`のものをダウンロードしてみましょう

`anything-v4.0-pruned.safetensors`をダウンロードします。落としたファイルは`stable-diffusion-webui/models/Stable-diffusion`配下に置いてください

とりあえず何か生成してみましょうか。`Stable Diffusion checkpoint`の欄から`anythingv4.0`を選択してください

#### 生成結果

|settings|values|
|:----|:----|
|Prompt|((masterpiece, best quality)), high-resolution, super high res, 1 girl, character focus, upper body,  front view, pink hair, long hair, ((thick eyebrows)), open mouth, (loli, younger), ahoge, smile, laugh, illustration, (cute and kawaii), standing|
|Negative prompt|なし|
|Sampling method|DPM++ 2M Karras|
|Restore faces|on|
|Width|512|
|Height|512|
|CFG scale|7|
|Seed|3104403533|

![00031-3104403533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/c7f98119-aeee-0688-1d86-294fef76d687.png)

割とそれっぽいですが、細部を見ると結構崩れていますね

## VAEの導入

VAEを導入すると、画像が鮮明になったり細部の崩れを抑えたりすることができます
VAEには以下の種類があります

- 汎用的なVAE
- AIモデルが用意しているそのモデル専用のVAE

AnythingV4には専用のVAEがあるので導入してみましょう

https://huggingface.co/andite/anything-v4.0/tree/main

`anything-v4.0.vae.pt`というファイルをダウンロードしてください。VAEは`.vae.pt`という拡張子になっていることが多いみたいです

落としてきたVAEは`stable-diffusion-webui/models/VAE`配下に置いてください

VAEは`Settings`の欄の`Stable Diffusion`という欄から設定できます。`SD VAE`という項目から選択してください

同条件で、VAEだけ変えた結果が以下となります

![00032-3104403533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/f8ddaf6a-a6b7-8a4a-4758-a5dbb5f9214b.png)

比較してみると以下のようになります

|vaeなし|vaeあり|
|:----|:----|
|![00031-3104403533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/c7f98119-aeee-0688-1d86-294fef76d687.png)|![00032-3104403533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/f8ddaf6a-a6b7-8a4a-4758-a5dbb5f9214b.png)|

全体的に鮮やかになって、腕の消失などの崩れがなくなっていますね！　背景のバケモノも笑顔になっています

このように、きれいな画像を生成させるにはVAEを設定するのはほぼ必須級となっているので、ぜひ設定しましょう

## EasyNegativeの導入

ここまではNegative promptになにも設定していなかったのですが、`(worst quality), (missing finger), (extra fingers)`などと書くと崩れを抑えることができます。しかし、いちいちこれらを書くのは面倒なので、`EasyNegative`という簡単にNegative promptを設定できるものを導入します

https://huggingface.co/datasets/gsdf/EasyNegative/tree/main

上記から、`EasyNegative.safetensors`をダウンロードしてください。

落としてきたファイルは`stable-diffusion-webui/embeddings`配下に置いてください

EasyNegativeを使うには、Negative promptに`EasyNegative`と書くだけです。これだけで適用することができます

それでは、EasyNegativeを設定し、他は同条件で生成した結果をご覧ください

![00035-3104403533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/346d2f34-6c4e-6533-14ba-13fae3b0f9e2.png)

**太眉じゃなくなっているのですがそれは……**

唇もどこか不気味ですが、まあそれは置いといて、全体的なクオリティはとても上がっていますよね

ちょっと何枚か生成してみましょうか

![00036-2125694489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/bded37ec-847b-47d2-b0b0-6973621384ec.png)
![00052-2325242937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/4d3b36b1-071c-0cc6-16e6-14dd69af9b2d.png)
![00055-2325242940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/4835f2b1-49de-9239-8f18-38b9fa9719c4.png)
![00058-2325242943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/fdfb28b9-147c-9c72-4190-3ffb732cfd70.png)

😊

## 別のAIモデルも試す

AnythingV4以外にも試してみましょう。`ambientmix`というモデルでやってみます

https://huggingface.co/OedoSoldier/ambientmix/tree/main

vaeは推奨の`orangemix`を使います

https://huggingface.co/WarriorMama777/OrangeMixs/tree/main

結果は以下の通りになりました

![00008-1897145455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/9c80653f-3521-e60b-3764-dce9eb20ce1e.png)
![00106-3554280944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/ed1cc9b8-cd87-50e5-5cb9-03b53288d4a8.png)
![00013-312292687.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/b2a2b492-2ca5-a093-8534-86e7d8383fa4.png)
![00010-3437696616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/2811d617-f6de-1803-ca14-4c253ee31259.png)

アニメっぽい作風ですね。こっちのほうが好みかも

## 高解像度化

今のままでは512*512と解像度が良くないので、高解像度化したいですよね。そこで、Real-ESRGANというものを使用したいと思います

https://github.com/xinntao/Real-ESRGAN#portable-executable-files-ncnn

`You can download Windows / Linux / MacOS executable files for Intel/AMD/Nvidia GPU.`という文章の`MacOS`からzipファイルをダウンロードします

解凍したら任意のディレクトリに置き、以下のコマンドを実行します

```zsh
cd realesrgan-ncnn-vulkan-20220424-macos/
```

```zsh
chmod u+x realesrgan-ncnn-vulkan
```

```zsh
mkdir inputs
```

```zsh
mkdir outputs
```

次に、`inputs`ディレクトリの中に高解像度化したい画像ファイルを置きます。その後に以下のコマンドから実行します

```zsh
./realesrgan-ncnn-vulkan -i inputs -o outputs -n realesr-animevideov3 -s 2 -f png
```

実行が完了すると、`outputs`ディレクトリに高解像度化された画像ファイルが生成されています

### 比較

|before|after|
|:---|:---|
|![00052-2325242937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/4d3b36b1-071c-0cc6-16e6-14dd69af9b2d.png)|![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313032373836332f34643362333662312d303731632d306363362d313665362d3134646436396166396232642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/102011c4-bb9d-026d-4089-d7db003f7fb8.png)|

# おわりに

呪文は奥が深いですね。あと、モデルデータは容量がとても大きいのでストレージがすぐ膨れそうでこわいです

この記事はAI知識ゼロの人が書いているので、間違いがあったらコメントで教えて下さい🙇🏻