AIでイラスト生成してみた

本記事はCraft Egg Advent Calendar 2022の12/24の記事です。
12/23の記事は@bikitaroさんの「ChatGPTに任せちゃおう」でした。
# はじめに
メリークリスマス！　@tsune_ceです。
![christmas.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/8ba1cb13-27fc-f7b7-ade6-03c2d7fe5e7d.jpeg)
最近話題になっているAIを利用した画像生成を試したく色々調べてみました。
画像生成のAIは色々リリースされており、それぞれ調べてみました。

| 画像生成AI | 説明 |
| -- | -- |
| Stable Diffusion | ディープラーニングでテキストから画像を生成するモデル。オープンソースでありライセンスを明記することで営利・非営利問わずに使用できるとされています。 |
| Waifu Diffusion | Stable Diffusionをファインチューニングしたオープンソースのモデルです。Stable Diffusionは、写実的なイラストを得意とするがアニメ調のイラストが苦手で、これを改善したモデルです。|
| NobelAI | NovelAIは、SaaSの有料サブスクリプションサービス。AIによってシチュエーションと文章から画像の出力を行う。2次元美少女に強くクオリティが高い。Stable Diffusionと同じ潜在拡散モデルが使われている。 |
| Anything v3.0 | Anyshing v3.0は、少しグレーなところがあります、出どころがはっきりとわかっておらず、NobelAIのモデルをリークして作成されたという噂もあります。コンピューターウィルスが検出</b>されたという情報もあり、ローカル環境で実行するにはリスクがあります。 |

イラストの見た目ではNobelAIやAnything v3.0で生成される画像がクオリティ高そうでした。
NobelAIは有料のサブスクリプションサービスでしたし、Anything v3.0はリスクがあるため、Waifu Diffusionを試してみることにしました。


# 動作環境
Waifu Diffusion利用するには、Stable Diffusionを動かせる環境が必要になります。

- NVIDIA製のGPU
    - Stable Diffusionは、AIの処理にNVIDIAのGPUを使います。
- Google corab
  - Google Colaboratoryのことで、Googleが機械学習の教育及び研究用に提供しているツールです。
インストール不要でPythonや機械学習・深層学習の環境を整えられる無料のクラウドサービスです。

# イラスト生成の手順

## GPUの初期設定
Google Colab にて、
- 新規の Colab のノートブックを作成する。
- メニュー「編集」→「ノートブックの設定」
- ハードウェアアクセラレータを「GPU」に選択する。
- コードセルを追加して以下のコードを実行し動作を確認する。
```python
!nvidia-smi
```

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

- <b>diffusers</b>
DiffusersはHugging Face社が開発元で、画像や音声に対応した事前学習済みの拡散モデルのことです。
機械学習を行う上で便利なツールです。
モデルのダウンロードも容易で、モデルの設定などの作業も不要になります。
また利用できるモデルの種類も豊富です。

- <b>transformers</b>
ディープラーニングのフレームワーク。こちらもHugging Face社が開発元。transformersは、「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ（BERT、GPT-2など）と膨大な事前学習済みモデルを提供するライブラリです。

- <b>scipy</b>
scipyとは高度な科学技術計算をおこなうことが可能なライブラリです。
微積分や統計で使われる標準偏差などの計算をおこない、機械学習やデータ分析など様々な分野で利用されています。

```python
!pip install --upgrade diffusers==0.8.0 transformers scipy
```

diffusersの実行ログにてランタイムの再起動を要求されます。
メニュー「ランタイム」 →「 ランタイムを再起動」 で再起動をしておきます。
- <b>Stable Diffusion Pipeline</b>
Stable Diffusionのパイプラインの準備をします。
モデルは<b>hakurei/waifu-diffusion</b>を指定します。
Stable Diffusionは潜在拡散モデルといい、潜在空間と呼ばれるピクセルよりも小さな次元があります。
この潜在空間でステップに分けてノイズを除去していき画像を生成します。 
<b>DDIMScheduler</b>は、この除去するノイズの量、除去する際のステップ数の設定を行います。
こうする事で画像生成時の出力結果が変わります。

```python
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, DDIMScheduler

pipe = StableDiffusionPipeline.from_pretrained(
    "hakurei/waifu-diffusion",
    revision="fp16",
    torch_dtype=torch.float16,
    scheduler=DDIMScheduler(beta_start=0.00085,　beta_end=0.012,　
    beta_schedule="scaled_linear",　clip_sample=False,　set_alpha_to_one=False,),
).to("cuda")
```

## テキストからの画像生成
以下のコードを実行で画像が生成されます。
AIによる画像生成の界隈では、<b>呪文</b>と呼ばれるキーワードをpromptに指定することでそれに関連した画像を生成します。

```python
#prompt = "{ここに呪文}"
prompt = "girl, chistmas"

with autocast("cuda"):
    images = pipe(prompt, guidance_scale=7.5).images  
images[0].save("output.png")
```

### アニマル系
Hugging Face社のサンプルの呪文で生成。

```python
prompt = "chen, arknights, 1girl, animal ears, brown hair, cat ears, cat tail, closed mouth, earrings, face, hat, jewelry, lips, multiple tails, nekomata, painterly, red eyes, short hair, simple background, solo, tail, white background"
```
![a9f23b84-d7c2-45c3-9db2-6dcd456b039b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/36ae66d7-83df-9819-e774-e37e2827b157.png)
後のしっぽ？が気になりますがなかなか。


### パーカーのフード被った女性
Hugging Face社のサンプルの呪文で生成。

```python
prompt = "original, 1girl, solo, portrait, hoodie, wearing hoodie"
```
![b83d5b65-72af-4820-b03a-c38c75d72c6d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/681d8896-d635-4bd2-775a-3f8953f83a95.png)
ちゃんとフード被ってますね。


### パーカーのフード被った女性を金髪にしてみる
```python
prompt = "original, 1girl, solo, portrait, hoodie, wearing hoodie,  blonde hair"
```
![eb793cad-7c11-4903-8cb8-8800f1319714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/41e050d3-84c1-e3cc-7a13-a3081522742e.png)

金髪ですが、ちがう構図になっちゃいますね。フードも被ってない。

### ふたりの学生

呪文にふたりを指定。

```python
prompt = "two girls, high-school, classroom, hug_from_behind, (ahoge), (((portrait))), absurdres, highres, dynamic angle, kuudere, (blush), wide shot, top lighting, dramatic lighting, perfect shadow, ((sharp contrast)), bokeh highlights"
```

![cecf44c6-9179-457c-9352-45a1bec13103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/10ca8c66-f16d-4794-5eb4-13ee8e265748.png)
うーん。口が不自然。手も崩れやすいです。

### ピンク髪の少女

さいごに色々な呪文で試します。

```python
prompt = "cute girl with pink hair, anime, fine face, symmetry face, fine details"
```
![43590e1e-0d10-4522-be3c-4f2a61ae0820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392109/eeeb1a8c-bf09-6923-0b91-84bdd0688ec0.png)
目の周辺が崩れてますが、なかなか良いイラストです。

# まとめ
はじめてAIを用いてイラストを生成してみましたが、他のユーザーのイラストをみるとクオリティの高いイラストばかりで、どうやっているのだろうと色々試してみましたが、自分では再現することができませんでした。

世の中には色々な画像生成に用いるモデルがあり、用途によってどれを選択すればよいか悩みました。
これからさらに高品質のモデルがリリースされると思うので、その際は色々試してみたいです。

今回はGoogle colabを用いましたが、イラストを何枚も同時生成などの負荷の高い命令処理を実行するとマシンリソースが足らずエラーになるため、本格的に何回もイラストを出力するには高スペックのマシンをローカル環境やクラウドサービス上に用意する必要があると感じました。
またGoogle colabを無料で使い続けると何かしらの上限に達し課金を促されます。何回も試したい場合はNobelAIのサブスクリプションサービスを利用する方が良いかもしれません。 

# さいごに
明日は@almaniさんの記事です。お楽しみに！