Google Colabo環境でStable Diffusion を使ったときのメモ

# はじめに
Google Colabo環境でStable Diffusionを使うメモ（N番煎じ）。

- 参考：[画像生成AI「Stable Diffusion」をスペックPCでも無料かつ待ち時間なしで使う方法まとめ](https://gigazine.net/news/20220824-stable-diffusion-google-colaboratory/)

呪文にもノウハウがあるらしい。以下のページが参考になった。

- 参考：[Prompt 呪文詠唱 完全入門 ~ Midjourney , StableDiffusion ~](https://zenn.dev/silverbirder/scraps/7fa03e90779cdd)

# Hugging Faceのトークンを発行

アクセストークンを発行する必要があります。以下の記事を参考にアクセストークンを発行してメモする。

> Stable DiffusionのコードやドキュメントはAI関連コミュニティサイト「Hugging Face」で公開されており、自分で構築した環境でStable Diffusionを用いるにはHugging Faceのアカウントを作成してトークンを発行する必要があります。
CompVis/stable-diffusion-v1-4 · Hugging Face https://huggingface.co/CompVis/stable-diffusion-v1-4

参考：[画像生成AI「Stable Diffusion」をスペックPCでも無料かつ待ち時間なしで使う方法まとめ](https://gigazine.net/news/20220824-stable-diffusion-google-colaboratory/)、
# Stable Diffusionのインストール

```python
pip install diffusers==0.2.4 transformers scipy ftfy
```

# Google Colabの設定確認
ランタイム→ランタイムのタイプを変更→ハードウェアアクセラレータがGPUになっていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/34c7ba8f-8f7e-b832-9491-0dbef891f9a1.png)

# アクセストークンの入力
メモしておいてアクセストークンを記載します。このアクセストークンで認証して各種ファイルをダウンロード。
```
YOUR_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
```
# 各種ファイルのダウンロード
数分かかる。
```python
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=YOUR_TOKEN)
```

```python
pipe.to("cuda")
```
# Drive のマウント
```python
from google.colab import drive
drive.mount('/content/drive')
```

任意のフォルダに移動する
```
%cd /content/drive/MyDrive/Colab\ Notebooks/StableDiffusion/
%pwd
import os
path = os.getcwd()
```

# Stable Diffusionで画像を生成
以下のコマンドを実行すればOK。「指示」の部分には生成して欲しい画像の説明を英語で入力し、「ファイル名」の部分には生成する画像を保存する際の名前を入力する。

（画像を保存する際はDriveにマウントしてDrive上に保存、もしくは生成したファイルを個別にダウンロードしてください。）

> prompt = "指示"
image = pipe(prompt)["sample"][0]
image.save(f"ファイル名.png")
```python
import matplotlib.pyplot as plt
from glob import glob
import cv2

def show_images_glob(images, figsize=(20,10), columns = 5):
  plt.figure(figsize=figsize)
  for i, image in enumerate(images):
      plt.subplot(len(images) / columns + 1, columns, i + 1)
      img = cv2.cvtColor(cv2.imread(image), cv2.COLOR_BGR2RGB)
      plt.imshow(img)
      plt.axis("off")
```

呪文を設定する。

今回はあるキーワードのロゴを、たくさん作ってみた時の例。
keyword * painting_style * repNum の回数だけ画像を作ってみた。

```python
from IPython.display import Image
def logo_make(keyword1,painting_style):
  prompt = "Logo about " + keyword1 + "by " +  painting_style + ",no background"
  image = pipe(prompt)["sample"][0]
  return image;
```
 
```python
keyword        = ['Development Club','Challenge','TC']
painting_style = ['Eichiro Oda in One Piece style' ,\
                  'Akira Toriyama in DQ style'     ,\
                  'Disney style'                   ,\
                  'Hokusai style'                  ,\
                  'Hayao Miyazaki in Tonarino Totoro style',\
                  'Takehiko Inoue in SLAM DUNK style',\
                  'Kazuo Umezu style'              ,\
                  'Shigeru Mizuki style'           ,\
                  'Yudetamago in Kinnikuman style' ,\
                  ]

repNum         = 5
```

```python
for kwd in keyword:
  kwd_dir = kwd.replace(' ', '_')
  os.makedirs(kwd_dir,exist_ok=True)

  for pntstl in painting_style:
    fname_base = (kwd_dir + '/' + pntstl).replace(' ', '_')

        
    for i_rep in range(repNum):
    
      # Make Logo
      image = logo_make(kwd,pntstl)
      # display(image)

      # Save Image
      fname = fname_base + '_' + str(i_rep) + '.png'
      fname = fname.replace(' ', '_')
      print(fname)
      
      image.save(fname)
      del image
```

1枚の画像を作るのに30秒程度かかる。

# 画像を表示する
```python
for kwd in keyword:
  kwd_dir = kwd.replace(' ', '_')
  os.makedirs(kwd_dir,exist_ok=True)

  for pntstl in painting_style:
    fname_base = (kwd_dir + '/' + pntstl).replace(' ', '_')
 
    FILE_PATTERN = fname_base + '*.png'  #ワイルドカードでフィルタリング    
    images = glob(os.path.join(FILE_PATTERN))
    print(kwd + ' + ' + pntstl)
    show_images_glob(images)
```
下は一例（たしか”Challenge” のキーワードのはず）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/e7f66760-9fcf-2672-1617-3aaf0ce471ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/831d449a-7d86-c34d-1d82-270435daf4c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/2c16cbf5-fca6-fd65-d88d-d225f35cd0d8.png)

いい感じにパチモンっぽい。特に、鳥山明風や井上雄彦風が…。北斎風はそれっぽく北斎に寄ってる。

# 最後に

流行っているからやってみたが、簡単なロゴやアイコンはこれで作れそう。Stable Diffusionを使ってどう遊ぶか考えたい。