【動作検証】文章から連想される画像を生成する"Imagine"：24件の文章を与えて出力結果を考察

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

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

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

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

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

https://github.com/lucidrains/deep-daze

インストールと実行方法については、先行する次の記事をご参照ください。

__（ 前回の記事 ）__

https://qiita.com/electronics_diy721/items/1a56f42a8758e4fedd00

### *Deep-daze Imagine*について

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

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

####（ 結果の概要 ）

- __アニメ（*comic*）調の画風__という英文指示は理解できるが、__写真（*photo*）調__と__スケッチ調__という指示は理解できなかった。
- __分詞構文__や__*that*節__を含む複雑な英文に書かれた意味を、おおむね理解できる。
- レディー・ガガやマイケル・ジャクソン、ブレア（英国）首相の__人名を理解__し、似た人物の顔スケッチを描画できる。
- サンフランシスコやニュー・ヨーク、凱旋門、エッフェル塔など、__地名や広く知られた建造物は、認識できなかった__。
- 人物の体や顔が、完全に描かれず、下半身のみや、__顔の一部が欠落__したり、__他のオブジェクトとつながった不正確な描画__が散見される。
- *Never Never Never Give up*や*Bright Future shall come*など、__抽象的な英文の内容を、イメージとして捉えて画像に反映させる描画を行う能力__を持つ。
- __画面の左側と右側に異なる情景や事物を描け__、という英文による指示を正しく理解することができる。

なお、検証を行うに際しては、__*Imagine*__が採用しているアルゴリズムと、そのアルゴリズムに学ばせた学習用データの双方について、深く知る必要があります。

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

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

- __Deep Daze Imagine__は。__*clip*__と__*Siren*__の2つを組み合わせたものである。

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

- __*Siren*__ : 画像や動画、音声などのsignal dataの特徴を捉える精度に優れたニューラル・ネットワークモデル。スタンフォード大学から出たImplicit Neural Representations with Periodic Activation Functionsという表題の論文が初出。

__*Siren*__は、__*deep_daze.py*__の__10行目__でimportされている。
> from siren_pytorch import SirenNet, SirenWrapper

__clip__は、__*deep_daze.py*__の__23行目__でimportされている。
> from .clip import load, tokenize


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

|アルゴリズム名 |論文  |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/)|
|__*Siren*__|[Implicit Neural Representations with Periodic Activation Functions](https://arxiv.org/pdf/2006.09661.pdf)|[vsitzmann/siren](https://github.com/vsitzmann/siren)|(NA)|

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

https://github.com/lucidrains/deep-daze

__（ 実行されるのは、以下の部分 ）__

```Python:github.com/lucidrains/deep-daze/blob/main/deep_daze/deep_daze.py
class Imagine(nn.Module):
    def __init__(
            self,
            *,
            text=None,
            img=None,
            clip_encoding=None,
            lr=1e-5,
            batch_size=4,
            gradient_accumulate_every=4,
            save_every=100,
            image_width=512,
            num_layers=16,
            epochs=20,
            iterations=1050,
            save_progress=True,
            seed=None,
            open_folder=True,
            save_date_time=False,
            start_image_path=None,
            start_image_train_iters=10,
            start_image_lr=3e-4,
            theta_initial=None,
            theta_hidden=None,
            model_name="ViT-B/32",
            lower_bound_cutout=0.1, # should be smaller than 0.8
            upper_bound_cutout=1.0,
            saturate_bound=False,
            averaging_weight=0.3,

            create_story=False,
            story_start_words=5,
            story_words_per_epoch=5,
            story_separator=None,
            gauss_sampling=False,
            gauss_mean=0.6,
            gauss_std=0.2,
            do_cutout=True,
            center_bias=False,
            center_focus=2,
            optimizer="AdamP",
            jit=True,
            hidden_size=256,
            save_gif=False,
            save_video=False,
    ):

```


### 推論に要した時間

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

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

https://note.com/npaka/n/nb8331df40cfe
> #### 4. 高度な使用例
> 真の深層学習の方法では、層が多いほど良い結果が得られます。 デフォルトは16ですが、リソースに応じて32に増やすことができます。
>
>```bash:
> $ imagine "stranger in strange lands" --num-layers 32
>```

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

__（ 入力 ）__

```bash:Colab
!imagine "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" -num-layers 32
```

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

```bash:Colab+
Setting jit to False because torch version is not 1.7.1.
Starting up...
Imagining "Draw_a_French_restaurant_on_the_left._Draw_a_Japanese_restaurant_on_the_right" from the depths of my weights...
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]
                                  
image updated at "./Draw_a_French_restaurant_on_the_left._Draw_a_Japanese_restaurant_on_the_right.jpg"
epochs:   0% 0/20 [00:00<?, ?it/s]
iteration:   0% 0/1050 [00:00<?, ?it/s]
loss: -21.45:   0% 0/1050 [00:00<?, ?it/s]
loss: -21.45:   0% 1/1050 [00:00<11:39,  1.50it/s]
loss: -21.54:   0% 1/1050 [00:01<11:39,  1.50it/s]
loss: -21.54:   0% 2/1050 [00:01<10:58,  1.59it/s]
loss: -21.67:   0% 2/1050 [00:01<10:58,  1.59it/s]
loss: -21.67:   0% 3/1050 [00:01<10:43,  1.63it/s]
loss: -21.54:   0% 3/1050 [00:02<10:43,  1.63it/s]
loss: -21.54:   0% 4/1050 [00:02<10:36,  1.64it/s]
loss: -21.54:   0% 4/1050 [00:03<10:36,  1.64it/s]
loss: -21.54:   0% 5/1050 [00:03<10:41,  1.63it/s]
loss: -22.53:   0% 5/1050 [00:03<10:41,  1.63it/s]
loss: -22.53:   1% 6/1050 [00:03<10:44,  1.62it/s]
loss: -22.82:   1% 6/1050 [00:04<10:44,  1.62it/s]
loss: -22.82:   1% 7/1050 [00:04<10:44,  1.62it/s]
loss: -23.34:   1% 7/1050 [00:04<10:44,  1.62it/s]
loss: -23.34:   1% 8/1050 [00:04<10:44,  1.62it/s]
loss: -24.19:   1% 8/1050 [00:05<10:44,  1.62it/s]

（ 省略 ）

loss: -52.54: 100% 1046/1050 [10:51<00:02,  1.61it/s]
loss: -52.54: 100% 1047/1050 [10:51<00:01,  1.61it/s]
loss: -53.17: 100% 1047/1050 [10:52<00:01,  1.61it/s]
loss: -53.17: 100% 1048/1050 [10:52<00:01,  1.61it/s]
loss: -54.56: 100% 1048/1050 [10:53<00:01,  1.61it/s]
loss: -54.56: 100% 1049/1050 [10:53<00:00,  1.61it/s]
loss: -55.81: 100% 1049/1050 [10:53<00:00,  1.61it/s]
loss: -55.81: 100% 1050/1050 [10:53<00:00,  1.61it/s]
epochs: 100% 20/20 [3:37:57<00:00, 653.88s/it]
image updated at "./A_photo_of_French_restaurant_on_the_left,_a_hand-written_sketch_of_the_same_r.000209.jpg"
```


###【 動作検証 】

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

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

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

### 【 考察 】

- 例文 *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* から生成された画像をみると、__*that*節__のなかの__4人の子供__の顔だけでなく、__主節の主語 *"I"*の人物の顔__も、しっかりと書き込まれているのが秀逸です。
- *Never never never give up*の例では、卓球をしたり（左下）、何かの運動競技や作業（上段中央）をしたりと、人物が何かに夢中になって取り組んでいる様子が見て取れます。ハードな身体作業に従事しているけど、決して諦めないぞ、といった情景が描かれているのかもしれません。
- *It is a mistake to look too far ahead・・・"*では、人生の中で起きる出来事の連鎖（*chain of destiny*）、__「運命の糸（鎖）」__というくだリが、__抽象的な「鎖」ではなく、具体的な「鎖」として解釈__されています。
- *Photo of*と指示を与えても、実写写真のテイスト感のある絵は得られなたった（残念）。

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|1|![](https://user-images.githubusercontent.com/87643752/130201145-1e4cf8cb-cfa7-465a-a5de-b7fda2a90925.jpg)  |*The U.S President walking in the garden of the White House with his wife*  |   | |
|2|![](https://user-images.githubusercontent.com/87643752/130201313-1b941415-9745-42f7-b64d-b20534d03273.jpg)  |*A naked Italian beautiful girl without clothes standing in fromt of  the hotel*  | |
|3|![](https://user-images.githubusercontent.com/87643752/130201497-de6c8119-1e56-4656-9838-f4b41f484987.jpg)   |*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/130224493-49022d03-811c-4fbb-89d2-5d757a2d8f12.jpg) |*Inspire the next* |日立のスローガン|
|5|![](https://user-images.githubusercontent.com/87643752/130252035-1dd075d1-0ea3-483f-b223-1ace665d750a.jpg) |*Never never never give up* |英首相チャーチルの言葉 |
|6|![](https://user-images.githubusercontent.com/87643752/130278636-ed46e398-3de4-4488-8a83-bcff5eee9b92.jpg) |*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/130285112-2b999bc7-f61e-470a-ad98-200fbc755c40.jpg) |*The price of greatness is responsibility* |英首相チャーチルの言葉 |
|8|![](https://user-images.githubusercontent.com/87643752/130306114-2324c267-2911-4cfe-9ee9-921a7beb5f6a.jpg) |*The bright future shall come to the 21st Century* | |
|9|![](https://user-images.githubusercontent.com/87643752/130312783-a4c696cf-0f33-4912-a230-a9450941dbe9.jpg) |*Draw a French restaurant on the left. Draw a Japanese restaurant on the right* | |
|10|![](https://user-images.githubusercontent.com/87643752/130320403-71ad30ca-6e86-476e-82da-541fc9e1f05c.jpg)|*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/130326426-f18b8da2-5513-4e1f-ba07-cfce6b014426.jpg) |*a photo of a British gentle man* | |
|12|![](https://user-images.githubusercontent.com/87643752/130329054-2eb7b6ab-efed-4f82-b5dd-9def8cdd7111.jpg) |*a sketch of a British gentle man*| |
|13|![](https://user-images.githubusercontent.com/87643752/130343611-b9ebc850-d4f2-4faf-b05b-c377c7ecb344.jpg) |*Having forgotten to bring my wallet, I had to go back to home to get it*||
|14|![](https://user-images.githubusercontent.com/87643752/130343545-d082f9aa-0420-4898-8d4b-81750d5157e0.jpg) |*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/130349763-11f74786-0654-4012-88aa-bffa38a78c93.jpg)|*Stay hungry, stay foolish*|スティーブ・ジョブズの言葉|
|16|![](https://user-images.githubusercontent.com/87643752/130350126-4fdf9c55-4060-431c-8ce5-946e1714ac80.jpg)|*I don't know whether or not you want to work for the company or not*||

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

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|17|![](https://user-images.githubusercontent.com/87643752/130356502-71e94e28-091b-4222-93b5-7b68c9f11d49.jpg)|"U.K. Prime mInister Tony Blair and U.S. President George W.Bush shake hands in front of the UK Parliament"|

- 顔がブッシュJr.元大統領っぽい

![](https://user-images.githubusercontent.com/87643752/130356553-493e82e6-8a53-4e1c-89f3-bb9c202c6d8f.png)

- 髪型や顔の形が、ブレア元首相の面影を感じさせる

![](https://user-images.githubusercontent.com/87643752/130356558-4f25cdb7-4d59-4421-b5ab-84f9357b8680.png)

- 最終的に出力された画像は209回目の生成結果。これより前の50回目の画像がこれ。この時点の顔は、ブレア首相のそれにずっっと近かった。

![](https://user-images.githubusercontent.com/87643752/130356645-d20c5093-e4b2-40dc-88a6-8527c6cf5c01.png)

__（ 実物の画像 ）__

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

|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)|

今度は、レディ・ガガとマイケル・ジャクソンで検証してみます。また、英国国会議事堂という場所が認識されるかも併せて確認します。（Parliament: 英国国会議事堂）

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|19|![](https://user-images.githubusercontent.com/87643752/130356786-6dfcee36-ed2e-4cb3-9510-3d7088a3f4f7.jpg)|*Michael Jackson and Lady Gaga are dancing at the building of SONY Music Inc. located at New York city*|


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

![](https://user-images.githubusercontent.com/87643752/130356849-970ac12c-cc59-421c-82c6-e4ee88c3e169.png)

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

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|20|![](https://user-images.githubusercontent.com/87643752/130363780-6a39a0ec-4fd1-4bed-8941-f07423eadb3e.jpg)|*The Eiffel Tower on the left side and the triumphal arch on the right side*||
|21|![](https://user-images.githubusercontent.com/87643752/130363908-6905e221-4578-491f-b441-fcd75e3b749b.jpg)|*A Photo of the Golden Gate Bridge at San Francisco in winter*||

### 下書きの画像を指定する

Imagineモデルに画像を描画させる上で、初期値となる画像を指定することができます。

> #### 6. Priming
>
> Mario Klingemannによって最初に考案され共有された手法であり、テキストに向けて操作される前に、開始画像でジェネレーターネットワークをプライミングすることができます。
>
> 使用する画像へのパスと、オプションで初期学習ステップの数を指定するだけです。
>
>```bash:
> $ imagine 'a clear night sky filled with stars' --start-image-path ./cloudy-night-sky.jpg
>```

#### 初期値に指定した画像
![british_man_1](https://user-images.githubusercontent.com/87643752/130326554-2fe67c5b-b96b-4634-a958-6737ae80ec94.jpg)

**Current directory**

<img width="1082" alt="スクリーンショット 2021-08-22 0 19 08" src="https://user-images.githubusercontent.com/87643752/130326581-8b3609ec-aca5-4775-aefa-c583b404433a.png">

**渡した画像を初期値として、処理が開始される**

```bash:
!imagine "a photo of a British gentle man" --start-image-path ./british_man_1.jpg
```

<img width="1068" alt="スクリーンショット 2021-08-22 0 21 09" src="https://user-images.githubusercontent.com/87643752/130326570-c140c235-1bb0-48b0-bd0f-3815ef7ce2a0.png">

<img width="1082" alt="スクリーンショット 2021-08-22 0 24 13" src="https://user-images.githubusercontent.com/87643752/130326639-e95cc15a-969e-4fd1-8abb-f02fcb715a3a.png">

__出力された画像__

![a_photo_of_a_British_gentle_man 000209 (1)](https://user-images.githubusercontent.com/87643752/130331883-235d1419-e079-4fb6-a406-e9bb9862cf92.jpg)

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|22|![](https://user-images.githubusercontent.com/87643752/130331883-235d1419-e079-4fb6-a406-e9bb9862cf92.jpg)|*a photo of a British gentle man*||

__同じ画像を下敷きにして、もう１つ他の文を与えてみます。__
先ほどは、下敷きとなる画像と、与えた文の内容が同じでした。次は、__与えられた人物の画像にはない、「赤い壊れたメガネ」と「風にたなびく髪」__という要素を__文で与えて__みます。

```bash:
!imagine "a photo of a British gentle man with his hair blowing in the wind. and with his red glasses broken" --start-image-path ./british_man_1.jpg
```

__出力された画像__

- 髪が風にたなびいていて、という分詞構文のくだりが汲み取られて、表現されていない
- 赤い壊れたメガネ、という分詞構文の下りが、十分に表現されていない。画像を見ると、メガネは壊れていない。さらに、赤いのはメガネであるべきところ、別の部分が赤く塗られている。

![](https://user-images.githubusercontent.com/87643752/130332236-345fcd11-7e49-4a25-a76d-9854f799e58a.jpg)

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|23|![](https://user-images.githubusercontent.com/87643752/130332236-345fcd11-7e49-4a25-a76d-9854f799e58a.jpg)|*a photo of a British gentle man*||

次は、文の中でさらに、__「アニメーションのイラストのような筆致」__という注文を投げてみます。


```bash:
!imagine "draw pictures like in comics a British gentle man with his hair blowing in the wind. and with his red glasses broken" --start-image-path ./british_man_1.jpg
```

__出力された画像__

- 髪はたなびいている
- メガネが壊れていない
- 赤いのはメガネであるべきところ、別の部分が赤く塗られている。

![](https://user-images.githubusercontent.com/87643752/130334890-2a9e23c5-0ddf-4338-98da-098c4dce225d.jpg)

|No.|出力画像  |入力した英文  |備考 |
|:---:|:---:|:---:|:---:|
|24|![](https://user-images.githubusercontent.com/87643752/130334890-2a9e23c5-0ddf-4338-98da-098c4dce225d.jpg)|*draw pictures like in comics a British gentle man with his hair blowing in the wind. and with his red glasses broken*||