Text2Image：テキストから連想される画像を生成: Big sleep dreamに24個の英文を与えて、挙動を考察！

###*Text2Image*というAI領域

テキストを与えると、その文（章）の内容を描写した画像や、文（章）の内容から連想される画像を描いてくれるAIは、__Text2Image__と呼ばれています。

この領域では、__OpenAIのDALL-E__が有名です。

https://openai.com/blog/dall-e/

DALLE-E以外にも、調べてみると、数多くのアルゴリズムに立脚した多くのモデルの実装コードやツールが公開されています。今回は、__*Big sleep dream*__を取り上げます。

https://github.com/lucidrains/big-sleep

__（ 解説サイト ）__

- [Big Sleep の使い方](https://note.com/npaka/n/n6ab3332a78f8)

#### インストールと推論工程の実行方法

- 以下は、英文 "a pyramid made of ice"の連装画像を生成する場合

```bash:
$ pip install big-sleep
$ dream "a pyramid made of ice"
```

### *Big sleep dream*について

今回、__*Text2Image*__を行うアルゴリズムの１つである__*Big sleep dream*__の__学習済みモデル__に__24件の英文を与えた__とき、__どのような画像が描かれるのかを観察して、得られた結果に対する考察__を行いました。

結果を先取りすると、検証を経て、__概ね次の考察__を得ました。

####（ 結果の概要 ）

- 写真のような写実的な画像が出力される。
- 人物を指定した場合は、写真のような綺麗な絵が生成される。
- 抽象的な概念や箴言・格言を入れると、なぜか鳥や昆虫の画像が描画されてしまう（学習データの偏り？）
- *sketch*調で描け、と文で指定すると、ちゃんとそれらしいテイストの絵が描かれる。
- __マイケル・ジャクソン__と__レディ・ガガ__という__著名人__の名前を与えると、それらしい人物が描画された。
- __アメリカの金門橋（ゴールデン・ブリッジ）__と__フランスのエッフェル塔__は、それらしく描かれた。しかし、フランスの凱旋門は無視されて描かれなかった。

#### アルゴリズムと学習用データ

学習データについては公的に述べられた記述がなく、またアルゴリズムについても、論文やスライド、ノートといった類の資料の公開がなく、公式サイトに次の記載があるのみです。

- __*Big sleep dream*__は、__*clip*__と__*BigGAN*__の2つを組み合わせたものである。

> Ryan Murdock has done it again, combining OpenAI's CLIP and the generator from a BigGAN! This repository wraps up his work so it is easily accessible to anyone who owns a GPU.

https://github.com/lucidrains/big-sleep

- __*clip*__ : OpenAIから公開されたツール。引数で渡した画像が、*str*型のテキストで渡した複数の単語のうち、どの単語に一番近いかのスコア値を返してくれる。Open AIから出た論文Learning Transferable Visual Models From Natural Language Supervisionで提案された。

- __*BigGAN*__ : （記載）

__論文と実装コードは次の通りです。__

|アルゴリズム名 |論文  |GitHub  |ポスター動画|
|:---:|:---:|:---:|:---:|
|__*clip*__|[Learning Transferable Visual Models From Natural Language Supervision](https://arxiv.org/pdf/2103.00020.pdf)|[openai/CLIP](https://github.com/openai/CLIP)|[Implicit Neural Representations with Periodic Activation Functions NeurIPS 2020 (Oral)](https://vsitzmann.github.io/siren/)|
|__*Big GAN*__|[Large Scale GAN Training for High Fidelity Natural Image Synthesis](https://arxiv.org/pdf/1809.11096.pdf)|[様々な実装コードへのリンク集](https://paperswithcode.com/paper/large-scale-gan-training-for-high-fidelity)|

幸い、ソースコードの全文はGitHubで公開されているため、コードリーディングを行うことで、アルゴリズムの内実を窺い知ることができます。この作業は、別の機会に譲りたいと思います。

https://github.com/lucidrains/big-sleep

### 推論に要した時間

以下の条件で、一つの英文を画像に変換するのに2〜3時間かかりました。

- エポック数： 20
- イテレーション数： 1050
- Google Colab+ （定額月額 5,243円）
- GPU: Tesla-NVIDIA V100
- Python ver.: 3.7.11

なお、与えた英文１件に対して、210個の画像ファイルが順次、カレント・ディレクトリに生成されます。時間が経ってから出力される画像が、より高精細な画像ファイルになります。

#### 実行例 （Colab+ Jupyter notebook）

__（ 入力 ）__

```bash:Colab
!dream "The U.S President walking in the garden of the White House with his wife" --save-progress --save-every 100 --save-best
```

オプションとして、**--save-best**を指定すると、以下に説明がある通り、出力される画像を毎回、__*clip*__でスコア評価を行い、最も良いスコアが与えられた画像ファイルが選択されます。

> Due to the class conditioned nature of the GAN, Big Sleep often steers off the manifold into noise. You can use a flag to save the best high scoring image (per CLIP critic) to {filepath}.best.png in your folder.
>
> $ dream "a room with a view of the ocean" --save-best

https://github.com/lucidrains/big-sleep


__（ 実行中の出力画面 ）__

- 210枚の画像が生成されて、カレント・ディレクトリに画像ファイルが保存されます。

```bash:Colab+
Starting up... v0.8.5
setting seed of 0
Imagining "The_U.S_President_walking_in_the_garden_of_the_White_House_with_his_wife" ...
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  /pytorch/c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
Warning: unknown mime-type for "./" -- using "application/octet-stream"
Error: no "view" mailcap rules found for type "application/octet-stream"
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: www-browser: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links2: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: elinks: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: lynx: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: w3m: not found
xdg-open: no method available for opening './'


      epochs:   0% 0/20 [00:00<?, ?it/s]
   iteration:   0% 0/1050 [00:00<?, ?it/s]
loss: -6.49:   0% 0/1050 [00:00<?, ?it/s] 
loss: -6.49:   0% 1/1050 [00:00<03:56,  4.43it/s]
loss: -7.64:   0% 1/1050 [00:00<03:56,  4.43it/s]
loss: -7.64:   0% 2/1050 [00:00<03:49,  4.57it/s]
loss: -8.33:   0% 2/1050 [00:00<03:49,  4.57it/s]
loss: -8.33:   0% 3/1050 [00:00<03:42,  4.70it/s]
loss: -11.97:   0% 3/1050 [00:00<03:42,  4.70it/s]
loss: -11.97:   0% 4/1050 [00:00<03:39,  4.77it/s]

（ 省略 ）

loss: -49.28: 100% 1046/1050 [03:38<00:00,  4.84it/s]
loss: -49.03: 100% 1046/1050 [03:38<00:00,  4.84it/s]
loss: -49.03: 100% 1047/1050 [03:38<00:00,  4.85it/s]
loss: -48.44: 100% 1047/1050 [03:38<00:00,  4.85it/s]
loss: -48.44: 100% 1048/1050 [03:38<00:00,  4.86it/s]
loss: -49.37: 100% 1048/1050 [03:39<00:00,  4.86it/s]
loss: -49.37: 100% 1049/1050 [03:39<00:00,  4.85it/s]
loss: -49.21: 100% 1049/1050 [03:39<00:00,  4.85it/s]
loss: -49.21: 100% 1050/1050 [03:39<00:00,  4.79it/s]
      epochs: 100% 20/20 [1:13:17<00:00, 219.90s/it]
image update:  95% 200/210.0 [1:13:17<03:39, 21.99s/it]
```

###【 動作検証 】

今回、__*Text2Image*__を行うアルゴリズムの１つである__*Deep-daze Imazine*__の__学習済みモデル__に__24件の英文を与えた__とき、__どのような画像が描かれるのかを観察して、得られた結果に対する考察__を行いました。

結果をまとめた表は次の通りです。

なお、3列目の「英文の出典」に記載のない入力文は。今回、この記事の筆者が作成した文です。

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|1|![](https://user-images.githubusercontent.com/87643752/130399294-007275b9-fd15-4ec4-a0f8-dac7cb52a38b.png)  |*The U.S President walking in the garden of the White House with his wife*  |   | |
|2|![](https://user-images.githubusercontent.com/87643752/130417822-4917302a-1429-4487-853a-bf302215c273.png)  |*A naked Italian beautiful girl without clothes standing in fromt of  the hotel*  | |
|3|![](https://user-images.githubusercontent.com/87643752/130460922-fc424b5a-516a-44fe-9e3c-d87a013bd76c.png)   |*I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character*   |キング牧師の有名な演説|
|4|![](https://user-images.githubusercontent.com/87643752/130525941-80a484fb-54b4-454c-b77e-aef652f915d7.png) |*Inspire the next* |日立のスローガン|
|5|![](https://user-images.githubusercontent.com/87643752/130525884-1655c90d-f8c4-4aa9-8dc5-8c884a7a34a9.png) |*Never never never give up* |英首相チャーチルの言葉 |
|6|![](https://user-images.githubusercontent.com/87643752/130537933-3c7d446a-e758-4a9c-8a9d-5331ab7b9cfb.png) |*It is a mistake to look too far ahead. Only one link of the chain of destiny can be handled at a time* |英首相チャーチルの言葉 |
|7|![](https://user-images.githubusercontent.com/87643752/130545163-8935308f-2edd-4adb-94f3-087af1558abe.png) |*The price of greatness is responsibility* |英首相チャーチルの言葉 |
|8|![](https://user-images.githubusercontent.com/87643752/130549379-6faf83d6-2f3d-4cdf-ac97-6a91a463e8cd.png) |*The bright future shall come to the 21st Century* | |
|9|![](https://user-images.githubusercontent.com/87643752/130555853-1cf2a21d-f7b9-4513-b38a-c0cf19faffed.png) |*Draw a French restaurant on the left. Draw a Japanese restaurant on the right* | |
|10|![](https://user-images.githubusercontent.com/87643752/130417633-c235c35b-aca4-4c68-9f13-de3282c04951.png)|*A photo of French restaurant on the left, a hand-written sketch of the same restaurant on the right and a photo of a British gentle man at the bottom*||
|11|![](https://user-images.githubusercontent.com/87643752/130556174-5113d75d-b810-4bac-bfd5-23fb86c7d394.png) |*a photo of a British gentle man* | |
|12|![](https://user-images.githubusercontent.com/87643752/130562635-8a7d5c14-c491-4ec5-9bff-452b9892880d.png) |*a sketch of a British gentle man*| |
|13|![](https://user-images.githubusercontent.com/87643752/130563559-802ad7f6-6544-4ab1-8c78-3926489f0f5c.png) |*Having forgotten to bring my wallet, I had to go back to home to get it*||
|14|![](https://user-images.githubusercontent.com/87643752/130593220-360190e3-0336-4cce-b936-425e1be9de8b.png) |*Every spirit builds itself a house; and beyond its house, a world; and beyond its world a heaven. Know then, that the world exists for you: build, therefore, your own world* |エマソンの言葉|
|15|![](https://user-images.githubusercontent.com/87643752/130593245-56a352b1-f1c4-48b7-a231-0c13647fe10c.png)|*Stay hungry, stay foolish*|スティーブ・ジョブズの言葉|
|16|![](https://user-images.githubusercontent.com/87643752/130608806-85f4f930-db06-4c2f-b984-d314a1df91f5.png)|*I don't know whether or not you want to work for the company or not*||

### 地名や著名人の固有名詞の認識力（学習済みか検証）

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|17|![](https://user-images.githubusercontent.com/87643752/130667953-233201ee-f091-41fa-bad9-9b3e72d319e7.png)|™U.K. Prime mInister Tony Blair and U.S. Presiden George W.Bush shake hands in front of the UK Parliament"|


__（ 実物の画像 ）__

- 以下、米ブッシュ（元）大統領も英ブレア（元）首相も、いずれも現職在任当時の画像

|No.|実際の画像１  |実際の画像２  |実際の画像３ |
|:---:|:---:|:---:|:---:|
|18|![](https://user-images.githubusercontent.com/87643752/130356680-bdec6032-a35f-46d1-8492-3e8a04f6f6e4.png)|![](https://user-images.githubusercontent.com/87643752/130356682-96b3b30e-d8ae-4528-8826-4f7c1807bbbc.png)|![](https://user-images.githubusercontent.com/87643752/130356683-92d8f5d7-9c90-44ce-a2c1-2f8125e470f8.png)|

今度は、レディ・ガガとマイケル・ジャクソンで検証してみます。

- レディガガ（左）とマイケルジャクソン（右）に見えなくもない

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|19|![](https://user-images.githubusercontent.com/87643752/130620211-7139d7b9-325b-494f-8923-34aa96501ac6.png)|*Michael Jackson and ady Gaga are dancing at the building of SONY Music Inc. located at New York city*|

今度は、広く知られた地名と建物物が学習済みか、検証してみます。

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|20|![](https://user-images.githubusercontent.com/87643752/130640282-1d83db8c-ac1c-4bd6-98b4-3e0bd45fd63c.png)|*The Eiffel Tower on the left side and the triumphal arch on the right side*||
|21|![](https://user-images.githubusercontent.com/87643752/130655644-8d9453d6-3e60-4135-bfdf-a0dbdabe6335.png)|*A Photo of the Golden Gate Bridge at San Francisco in winter*||