Stable Diffusionがロールシャッハテストでクリスマスカードを作ってくれる記事

こんにちは。EngineerでもDesignerでもない野生のKDDI社員です。  
この記事は、[KDDI Engineer&Designer Advent Calendar 2022](https://qiita.com/advent-calendar/2022/engineer-designer)の24日目の記事になります。
メリークリスマスイブ！

# この記事の経緯
この記事は、最近技術的な業務が回ってこなくて拗ねていた私が、
KDDI Advent Calendar 2022にお招きされて舞い上がった結果、
ロールシャッハテストがクリスマスカードにしか見えなくなった為に、
StableDiffutionに具現化させた。という記事になります。


# ロールシャッハテストとは
インクの染みが何に見えますかー？っていう人格診断のあれです。
はい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/1b3bb97f-8719-da4a-4e2c-cbfe086f40b0.png" width="480">
画像引用元：https://gigazine.net/news/20190308-rorschach-test/
もう貴方にも「天使が二人、クリスマスツリーで戯れている」ようにしか見えないはずです。



# StableDiffusionとは
話題のお絵描きAIちゃんです。文字と画像を与えると、絵を生成してくれます。
私が説明するよりも、めちゃくちゃ分かりやすい解説記事がありますので貼っておきます。

https://ja.stateofaiguides.com/20221012-stable-diffusion/


# Stable Diffutionにロールシャッハテストを受けさせる
本来であればロールシャッハテストは「絵にキャプションをつけるタスク」です。
ですがネットで受けようとすると「絵に対して最も適切なキャプションを選択肢から選ぶ」になります。
これが研究会投稿だったら、
**絵と選択肢のキャプションを入力として画像生成を行い、Discriminatorで自然さを評価する**
とかやるところなんですが、この記事では
**単に私が見えたクリスマスカードを再現してもらうこと**
だけします。
まぁ方法さえつかめば、あとはStable Diffutionが自力でテスト突破してくれるでしょう。

# 実装したもの
## 環境
+ 実行環境　　　：WSLのUbuntu
+ バージョン管理：pyenv
+ python　　　　：3.8.12
+ お絵描きAI　　：stable_diffusion.openvino
+ 画像処理　　　：Image Magick　　　　#sudo apt-get install imagemagick

https://github.com/bes-dev/stable_diffusion.openvino

## 目標
まだクリスマスカードが見えていない人のために説明すると、こんな絵が求めているものです。
キャプションは「天使、クリスマスツリー、ベル、翼、見上げる少年、巻き毛、俯瞰」でしょうか。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/c96241c1-d072-08ad-550d-c0898c125686.png" width="480">

## 失敗した方法
まず画像00.jpgを用意して安直に画像生成しました。
openvinoは正方形のみ対応しているので、事前にトリミングしています。
左右対称ですし、一人描ければ十分ですよね。

##### ■00.jpg
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/46e2852c-5803-db1c-e4aa-bff6d644f175.jpeg" width="240">  

##### ■コード
```
# 画像生成する
python demo.py --prompt "an angel, Christmas tree, Christmas bells, Angel wings,boy looking up, boy with blonde curly hair, bird's-eye view" --init-image ./input/00.jpg
```
##### ■生成画像
黒い…
![失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/08b33f16-7739-dce3-33cb-3155943b26f9.png)

##### ■敗因
**さすがに黒い染みから妄想できるほどAIは想像力豊かじゃない。**
因みにデフォルトイメージを与えずに画像生成すると、色々素敵な絵を提案してくれます。
でも私は、私の考えたクリスマスカードを具現化したいんだ…！
![デフォルトなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/2b81b7de-0b1f-fe52-dc0d-1dbf3f859521.png)



# うまくいった方法
仕方がないのでもう少し色の指示を与えます。
またStableDiffutionは元々ノイズ除去のモデルですから、ノイズも載せておきます。
人間も、よく見えない方が想像力が掻き立てられますしね。
##### 01.png
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/5cfc73a3-e61f-e898-33ff-9bce5a9f73d0.png" width="240">  

##### ■コード
```
# noiseを載せる
convert +noise Gaussian -attenuate 10 ./input/00.jpg ./input/02.png
convert -gaussian-blur 10 ./input/02.png ./input/03.png
# 画像生成する
python demo.py --prompt "an angel, Christmas tree, Christmas bells, Angel wings,boy looking up, boy with blonde curly hair, bird's-eye view" --init-image ./input/03.png　--strength 0.9　
```

##### ■生成画像
そうそう、こういうの。
![出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/0c6ba4dd-01a6-b208-2b95-8cd3fbbb10ee.png)
この辺なんて目標に近いんじゃないでしょうか。
![この辺.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/f25a4a11-b951-fb60-51ce-67124176aabf.png)



##### ■イメージに近づける
とりあえず解釈が近い画像を重ね合わせてみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/88ac2a42-a7fe-733a-b47d-3d8791eed5b0.png" width="240"> 

うーん、こう具現化してくると、なんか違うというか…
私が求めていたのは**もうちょっとボッティチェリみたいな宗教画**なんですよね（わがまま）
というわけで、リテイクをお願いしましょう。
この重ね画像04.pngに、キャプション「ボッティチェリ」を加えて、再チャレンジ。

##### ■リテイクのコード
```
# 画像生成する
python demo.py --prompt "peinted by Botticelli, an angel, Christmas tree, Christmas bells, Angel wings,boy looking up, boy with blonde curly hair, bird's-eye view" --init-image ./input/04.png　--strength 0.5
```
##### ■生成画像
天才です。ありがとうございます。
![1207__05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/7537d22e-2fcc-87d5-b579-b034e900607f.png)<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818987/46e2852c-5803-db1c-e4aa-bff6d644f175.jpeg" width="150">  


# まとめ

- 私のコーディング欲を満たす
- クリスマスらしいことをした実績を開放する
- Stable Diffutionちゃんの人格テスト突破

で一石三鳥できました！

# 参考文献
#### ロールシャッハテスト 解説
https://en.wikipedia.org/wiki/Rorschach_test
#### ロールシャッハテスト 画像引用元
https://gigazine.net/news/20190308-rorschach-test/
#### Stable Diffusion 解説
https://ja.stateofaiguides.com/20221012-stable-diffusion/
#### Stable Diffusion 本家
https://github.com/bes-dev/stable_diffusion.openvino
#### ImageMagick 本家
https://imagemagick.org/