MacでUnity ML-Agentsの環境を構築する(v0.5.0対応)

これは[cloudpack あら便利カレンダー 2018](https://benri2018.rnd.cloudpack.jp/)の記事です。

## 追記

### 2019/09/20

v0.9.1で動作させる方法をまとめました。

MacでUnity ML-Agentsの環境を構築する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/268ccf6f961f8ca8cba8


### 2019/04/05

2019/02/28にML-Agentsのv0.7.0がリリースされました。

@kingyo222 さんが利用手順をまとめてくれています。(Win)

Unity：ML-Agents 2019年04月(ver0.7.0)での使い方 – 初心者向けUnity情報サイト
https://www.fast-system.jp/unity%ef%bc%9aml-agents-2019%e5%b9%b404%e6%9c%88ver0-7-0%e3%81%a7%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9/


### 2018/12/26

2018/12/15にML-Agentsのv0.6.0がリリースされました。

MacでUnity ML-Agentsの環境を構築する(v0.6.0対応) - Qiita
https://qiita.com/kai_kou/items/2a6545d1f9d83178d0c0


### 2018/09/13

**記事投稿時はバージョンが0.4.0でしたが、2018/09/11にバージョン0.5.0がリリースされたので、0.4.0と0.5.0の手順を併記するようにしました。(2018/09/13)**

https://github.com/Unity-Technologies/ml-agents/releases

## 概要

Unityで機械学習ができると聞いて試してみたくなり、環境をつくってみました。

参考)
【Unity】Unityで機械学習する「ML-Agent」を色々と試して得た知見とか
http://tsubakit1.hateblo.jp/entry/2018/02/18/233000

Unityをまだインストールしていないという方は下記をご参考ください。

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033


## 手順

基本的には公式のドキュメントに沿えばよい感じです。

Unity-Technologies/ml-agents/docs/Installation.md
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md


### Pythonをインストールする

~~Python 3.5または3.6が必要だそうなので、お手元に環境がない方は下記ご参照~~
現在、Python 3.6での動作がサポートされているそうです(2018/09/13現在)

>We do not currently support Python 3.7 or Python 3.5.


お手元に環境がない方は下記をご参照ください。
https://qiita.com/kai_kou/items/f54931991a781b96bb9c


### ML-Agentsリポジトリをダウンロード

適当なディレクトリにリポジトリをダウンロードする。

```sh
> mkdir 適当なディレクトリ
> cd 適当なディレクトリ
> git clone https://github.com/Unity-Technologies/ml-agents.git
```

### 必要なライブラリをインストールする

TensorFlowなどを利用するみたいなので、pipを利用してインストールします。
ここではPythonの仮想環境を作ってインストールします。

仮想環境？なにそれ？な方は下記をご参照(再掲
https://qiita.com/kai_kou/items/f54931991a781b96bb9c

```sh
> cd 適当なディレクトリ
> pyenv local 3.6.6
> python -m venv venv
> . venv/bin/activate
> cd ml-agents

# fishな方は下記
> . venv/bin/activate.fish
```

**v0.5.0からディレクトリ構成が変更になり、```python``` フォルダが```ml-agents``` に名称変更されています。**

```sh
# v0.5.0からディレクトリ構成が変わったのでこちら
> cd 適当なディレクトリ/ml-agents/ml-agents

# v0.4.0はこちら
# > cd 適当なディレクトリ/ml-agents/python

> pip install .

Processing 適当なディレクトリ/ml-agents/ml-agents
Collecting tensorflow<1.8,>=1.7 (from mlagents==0.5.0)
(略)
Successfully installed MarkupSafe-1.0 Pillow-5.2.0 Send2Trash-1.5.0 absl-py-0.4.1 appnope-0.1.0 astor-0.7.1 atomicwrites-1.2.1 attrs-18.2.0 backcall-0.1.0 bleach-1.5.0 cycler-0.10.0 decorator-4.3.0 defusedxml-0.5.0 docopt-0.6.2 entrypoints-0.2.3 gast-0.2.0 grpcio-1.11.1 html5lib-0.9999999 ipykernel-4.9.0 ipython-6.5.0 ipython-genutils-0.2.0 ipywidgets-7.4.1 jedi-0.12.1 jinja2-2.10 jsonschema-2.6.0 jupyter-1.0.0 jupyter-client-5.2.3 jupyter-console-5.2.0 jupyter-core-4.4.0 kiwisolver-1.0.1 markdown-2.6.11 matplotlib-2.2.3 mistune-0.8.3 mlagents-0.5.0 more-itertools-4.3.0 nbconvert-5.4.0 nbformat-4.4.0 notebook-5.6.0 numpy-1.14.5 pandocfilters-1.4.2 parso-0.3.1 pexpect-4.6.0 pickleshare-0.7.4 pluggy-0.7.1 prometheus-client-0.3.1 prompt-toolkit-1.0.15 protobuf-3.6.1 ptyprocess-0.6.0 py-1.6.0 pygments-2.2.0 pyparsing-2.2.0 pytest-3.8.0 python-dateutil-2.7.3 pytz-2018.5 pyyaml-3.13 pyzmq-17.1.2 qtconsole-4.4.1 simplegeneric-0.8.1 six-1.11.0 tensorboard-1.7.0 tensorflow-1.7.1 termcolor-1.1.0 terminado-0.8.1 testpath-0.3.1 tornado-5.1 traitlets-4.3.2 wcwidth-0.1.7 werkzeug-0.14.1 wheel-0.31.1 widgetsnbextension-3.4.1
```

はい。

v0.4.0時点での```pip install .``` 時のログも置いておきます。


```sh:0.4.0のログ
Processing 適当なディレクトリ/ml-agents/python
Collecting tensorflow==1.7.1 (from unityagents==0.4.0)
(略)
Successfully installed MarkupSafe-1.0 Pillow-5.2.0 Send2Trash-1.5.0 absl-py-0.3.0 appnope-0.1.0 astor-0.7.1 atomicwrites-1.1.5 attrs-18.1.0backcall-0.1.0 bleach-1.5.0 cycler-0.10.0 decorator-4.3.0 docopt-0.6.2 entrypoints-0.2.3 gast-0.2.0 grpcio-1.11.0 html5lib-0.9999999 ipykernel-4.8.2 ipython-6.4.0 ipython-genutils-0.2.0 ipywidgets-7.3.1 jedi-0.12.1 jinja2-2.10 jsonschema-2.6.0 jupyter-1.0.0 jupyter-client-5.2.3 jupyter-console-5.2.0 jupyter-core-4.4.0 kiwisolver-1.0.1 markdown-2.6.11 matplotlib-2.2.2 mistune-0.8.3 more-itertools-4.2.0 nbconvert-5.3.1 nbformat-4.4.0 notebook-5.6.0 numpy-1.15.0 pandocfilters-1.4.2 parso-0.3.1 pexpect-4.6.0 pickleshare-0.7.4 pluggy-0.6.0 prometheus-client-0.3.0 prompt-toolkit-1.0.15 protobuf-3.5.2 ptyprocess-0.6.0 py-1.5.4 pygments-2.2.0 pyparsing-2.2.0 pytest-3.6.3 python-dateutil-2.7.3 pytz-2018.5 pyyaml-3.13 pyzmq-17.1.0 qtconsole-4.3.1 simplegeneric-0.8.1 six-1.11.0 tensorboard-1.7.0 tensorflow-1.7.1 termcolor-1.1.0 terminado-0.8.1 testpath-0.3.1 tornado-5.1 traitlets-4.3.2 unityagents-0.4.0 wcwidth-0.1.7 werkzeug-0.14.1 wheel-0.31.1 widgetsnbextension-3.3.1
```

## 動かしてみる

引き続き、公式のドキュメントに沿って実際に動かして見ます。

Using an Environment Executable
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Executable.md

Installationから進むと下記ガイドへ自然と進んでしまうのですが、上記のほうが、お試しするには罠が少なかったです。(1敗)

Basic Guide
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md


### Unityの起動とプロジェクトファイル読み込み

Unityを立ち上げます。
アプリが立ち上がったら「開く」ボタンからml-agentsの以下フォルダを選択します。

<img width="1001" alt="Unity_Hub.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/2bcdf91e-649e-6a71-3061-f7cfb8e89374.png">

**v0.5.0からディレクトリ構成が変更されたようです。**

- v0.5.0
    - ml-agents\UnitySDK
- v0.4.0
    - ml-agents\unity-environment

Unityエディタのバージョンによって、再インポートするか、確認ダイアログが立ち上がります。
<img width="422" alt="UnitySDK.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/30fd2547-6066-86e6-a52a-f7fca2191654.png">

「Continue(続行)」ボタンをクリックして進めます。


再インポート処理すると初回、プロジェクトが開くまでに時間がかかります。

<img width="1679" alt="スクリーンショット 2018-09-13 10.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/3b9869f9-6c07-86e9-94aa-4f85bc1d9a10.png">

起動しました。


### Scenes(シーン)が開くか確認する

サンプルが動作するか、Unityでプロジェクトを読み込み、動作させてみます。

参考)
Unityの公式サンプルml-agentsでAIを試す
http://am1tanaka.hatenablog.com/entry/2017/11/08/230525


- Unityの下パネルにある[Project]タブから以下のフォルダまで開く。
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く。

<img width="557" alt="Scenes選択" src="https://qiita-image-store.s3.amazonaws.com/0/48549/d77344b9-ba61-94ca-a515-88fd5ff6e199.png">

なんかでてきたー(感動)
<img width="1679" alt="3DBall Scenes" src="https://qiita-image-store.s3.amazonaws.com/0/48549/a0f7d411-81a0-87c8-7171-27ff5e76c8be.png">

Unityの上にある再生ボタンをクリックします。

なんかうごいたー(感動)
<img width="911" alt="3DBall Scenes Play" src="https://qiita-image-store.s3.amazonaws.com/0/48549/23f60e82-f51d-b691-f6a2-a224b0a5358c.png">

読み込んだサンプルが動作することが確認できました。
現時点ではボールが板からすぐに落ちてしまいます。これを機械学習させて、落とさないようにするわけです。


### Scenes(シーン)の設定

ML-Agentsで学習させるための設定です。

- Unityの[Edit]メニューから[Project Settings] > [Player]を開く
<img width="560" alt="学習のための設定" src="https://qiita-image-store.s3.amazonaws.com/0/48549/0485c977-bd34-6b60-3cc4-d9caa04377ab.png">

- [Inspector]ビューで以下の設定を確認する。
    - [Resolution and Presentation]の[Run In Background]がチェックされている
    - [Display Resolution Dialog]がDisableになっている
<img width="477" alt="ResolutionAndPresentation.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/4a5fc294-2c77-40bc-0e3f-12f829c4536f.png">


- [Hierarchy]ビューから[Ball3DAcademy] > [Ball3DBrain]を開く
    - [Inspector]ビューで[Brain Type]を[External]に変更する
<img width="475" alt="学習のための設定" src="https://qiita-image-store.s3.amazonaws.com/0/48549/37d21892-4706-fd7c-6239-b911e519e195.png">

- [Ctrl] + [s]キーでシーンを保存する

設定変更後、しっかりと保存しないとビルド時に設定が反映されなくてハマります。(1敗)


### ビルド

- [File]メニューから[Build Settings]を選択する
- [Build Settings]ダイアログで[Platform]で[PC, Mac & Linux Standalone]が選択されていることを確認する
- [Build Settings]ダイアログで[Build]ボタンをクリックする
- <img width="631" alt="Build" src="https://qiita-image-store.s3.amazonaws.com/0/48549/e95d6a72-8423-7f4f-255e-826f89187f2b.png">
- ファイル保存ダイアログで以下を指定してビルドする
    - v0.5
        - ml-agents\ml-agents\3DBall.app
    - v0.4
        - ml-agents\python\3DBall.app


### 学習の実行

ターミナルで以下を実行して、学習を開始します。
実行時にビルドしたAppが起動して学習が開始されます。

trainer_config.yamlの```max_steps``` で指定されているステップ数が完了するか、ctrl+cキーで学習が終了します。

**v0.5.0から学習開始のコマンドが変更されたようです。**

- v0.5.0
    - ```mlagents-learn ```
- v0.4.0
    - ```python learn.py ```

```sh:v0.5.0
# ../config/trainer_config.yaml: ハイパーパラメータ指定ファイル
# 3DBall: 出力したapp名(拡張子なし)
# firstRun: 実行ごとに結果が保存されるので、名称をつける(任意)

> mlagents-learn ../config/trainer_config.yaml --env=3DBall --run-id=firstRun --train


                        ▄▄▄▓▓▓▓
                   ╓▓▓▓▓▓▓█▓▓▓▓▓
              ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
            ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
          ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
        ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
        ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
          ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
            '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
               ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
                   `▀█▓▓▓▓▓▓▓▓▓▌
                        ¬`▀▀▀█▓


INFO:mlagents.trainers:{'--curriculum': 'None',
 '--docker-target-name': 'None',
 '--env': '3DBall',
 '--help': False,
 '--keep-checkpoints': '5',
 '--lesson': '0',
 '--load': False,
 '--no-graphics': False,
 '--num-runs': '1',
 '--run-id': 'firstRun',
 '--save-freq': '50000',
 '--seed': '-1',
 '--slow': False,
 '--train': True,
 '--worker-id': '0',
 '<trainer-config-path>': '../config/trainer_config.yaml'}
CrashReporter: initialized
Mono path[0] = '/Users/kai/dev/unity/ml-agents-v0.5/ml-agents/ml-agents/3DBall.app/Contents/Resources/Data/Managed'
Mono config path = '/Users/kai/dev/unity/ml-agents-v0.5/ml-agents/ml-agents/3DBall.app/Contents/MonoBleedingEdge/etc'
INFO:mlagents.envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
        Number of Brains: 1
        Number of External Brains : 1
        Reset Parameters :

Unity brain name: Ball3DBrain
        Number of Visual Observations (per agent): 0
        Vector Observation space size (per agent): 8
        Number of stacked Vector Observation: 1
        Vector Action space type: continuous
        Vector Action space size (per agent): [2]
        Vector Action descriptions: ,
2018-09-13 11:04:05.526598: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
INFO:mlagents.envs:Hyperparameters for the PPO Trainer of brain Ball3DBrain:
        batch_size:     64
        beta:   0.001
        buffer_size:    12000
        epsilon:        0.2
        gamma:  0.995
        hidden_units:   128
        lambd:  0.99
        learning_rate:  0.0003
        max_steps:      5.0e4
        normalize:      True
        num_epoch:      3
        num_layers:     2
        time_horizon:   1000
        sequence_length:        64
        summary_freq:   1000
        use_recurrent:  False
        graph_scope:
        summary_path:   ./summaries/firstRun-0
        memory_size:    256
        use_curiosity:  False
        curiosity_strength:     0.01
        curiosity_enc_size:     128
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 1000. Mean Reward: 1.163. Std of Reward: 0.703. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 2000. Mean Reward: 1.252. Std of Reward: 0.675. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 3000. Mean Reward: 1.426. Std of Reward: 0.822. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 4000. Mean Reward: 1.738. Std of Reward: 0.979. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 5000. Mean Reward: 2.171. Std of Reward: 1.435. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 6000. Mean Reward: 3.092. Std of Reward: 2.115. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 7000. Mean Reward: 5.216. Std of Reward: 4.223. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 8000. Mean Reward: 8.289. Std of Reward: 7.247. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 9000. Mean Reward: 14.327. Std of Reward: 16.329. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 10000. Mean Reward: 20.652. Std of Reward: 21.575. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 11000. Mean Reward: 31.991. Std of Reward: 30.879. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 12000. Mean Reward: 69.667. Std of Reward: 34.240. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 13000. Mean Reward: 69.212. Std of Reward: 30.811. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 14000. Mean Reward: 96.167. Std of Reward: 9.023. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 15000. Mean Reward: 84.800. Std of Reward: 32.185. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 16000. Mean Reward: 75.419. Std of Reward: 36.776. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 17000. Mean Reward: 62.006. Std of Reward: 37.141. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 18000. Mean Reward: 67.176. Std of Reward: 37.284. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 19000. Mean Reward: 62.800. Std of Reward: 38.609. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 20000. Mean Reward: 77.593. Std of Reward: 34.332. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 21000. Mean Reward: 57.233. Std of Reward: 38.476. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 22000. Mean Reward: 93.675. Std of Reward: 20.978. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 23000. Mean Reward: 84.953. Std of Reward: 31.018. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 24000. Mean Reward: 70.656. Std of Reward: 38.178. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 25000. Mean Reward: 97.483. Std of Reward: 5.971. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 26000. Mean Reward: 75.956. Std of Reward: 31.658. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 27000. Mean Reward: 83.686. Std of Reward: 29.105. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 28000. Mean Reward: 70.971. Std of Reward: 40.723. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 29000. Mean Reward: 68.047. Std of Reward: 37.695. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 30000. Mean Reward: 79.062. Std of Reward: 32.291. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 31000. Mean Reward: 95.692. Std of Reward: 14.922. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 32000. Mean Reward: 85.615. Std of Reward: 29.706. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 33000. Mean Reward: 95.538. Std of Reward: 11.622. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 34000. Mean Reward: 77.938. Std of Reward: 34.877. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 35000. Mean Reward: 86.019. Std of Reward: 28.801. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 36000. Mean Reward: 70.865. Std of Reward: 37.673. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 37000. Mean Reward: 70.993. Std of Reward: 38.820. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 38000. Mean Reward: 94.583. Std of Reward: 12.756. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 39000. Mean Reward: 88.071. Std of Reward: 29.266. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 40000. Mean Reward: 81.744. Std of Reward: 33.346. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 41000. Mean Reward: 92.908. Std of Reward: 16.905. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 42000. Mean Reward: 92.423. Std of Reward: 24.867. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 43000. Mean Reward: 93.900. Std of Reward: 20.231. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 44000. Mean Reward: 81.671. Std of Reward: 34.627. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 45000. Mean Reward: 99.733. Std of Reward: 0.884. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 46000. Mean Reward: 83.680. Std of Reward: 34.004. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 47000. Mean Reward: 94.323. Std of Reward: 19.665. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 48000. Mean Reward: 83.192. Std of Reward: 27.346. Training.
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 49000. Mean Reward: 79.593. Std of Reward: 31.094. Training.
INFO:mlagents.envs:Saved Model
INFO:mlagents.trainers: firstRun-0: Ball3DBrain: Step: 50000. Mean Reward: 83.050. Std of Reward: 33.231. Training.
INFO:mlagents.envs:Saved Model
INFO:mlagents.envs:List of nodes to export :
INFO:mlagents.envs:     action
INFO:mlagents.envs:     value_estimate
INFO:mlagents.envs:     action_probs
INFO:mlagents.envs:     value_estimate
INFO:tensorflow:Restoring parameters from ./models/firstRun-0/model-50001.cptk
INFO:tensorflow:Froze 16 variables.
Converted 16 variables to const ops.
```

```sh:v0.4.0
# 3DBall: 出力したapp名(拡張子なし)
# firstRun: 実行ごとに結果が保存されるので、名称をつける(任意)
> python3 learn.py 3DBall --run-id=firstRun --train


                    ▄▄▄▓▓▓▓
               ╓▓▓▓▓▓▓█▓▓▓▓▓
          ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
        ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
      ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
    ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
    ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
      ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
        '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
           ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
               `▀█▓▓▓▓▓▓▓▓▓▌
                    ¬`▀▀▀█▓


INFO:unityagents:{'--curriculum': 'None',
 '--docker-target-name': 'Empty',
 '--help': False,
 '--keep-checkpoints': '5',
 '--lesson': '0',
 '--load': False,
 '--no-graphics': False,
 '--run-id': 'firstRun',
 '--save-freq': '50000',
 '--seed': '-1',
 '--slow': False,
 '--train': True,
 '--worker-id': '0',
 '<env>': '3DBall'}
CrashReporter: initialized
Mono path[0] = '適当なディレクトリ/ml-agents/python/3DBall.app/Contents/Resources/Data/Managed'
Mono config path = '適当なディレクトリ/ml-agents/python/3DBall.app/Contents/MonoBleedingEdge/etc'
INFO:unityagents:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
        Number of Brains: 1
        Number of External Brains : 1
        Lesson number : 0
        Reset Parameters :

Unity brain name: Ball3DBrain
        Number of Visual Observations (per agent): 0
        Vector Observation space type: continuous
        Vector Observation space size (per agent): 8
        Number of stacked Vector Observation: 1
        Vector Action space type: continuous
        Vector Action space size (per agent): 2
        Vector Action descriptions: ,
INFO:unityagents:Hyperparameters for the PPO Trainer of brain Ball3DBrain:
        batch_size:     64
        beta:   0.001
        buffer_size:    12000
        epsilon:        0.2
        gamma:  0.995
        hidden_units:   128
        lambd:  0.99
        learning_rate:  0.0003
        max_steps:      5.0e4
        normalize:      True
        num_epoch:      3
        num_layers:     2
        time_horizon:   1000
        sequence_length:        64
        summary_freq:   1000
        use_recurrent:  False
        graph_scope:
        summary_path:   ./summaries/firstRun
        memory_size:    256
        use_curiosity:  False
        curiosity_strength:     0.01
        curiosity_enc_size:     128
INFO:unityagents: Ball3DBrain: Step: 1000. Mean Reward: 1.293. Std of Reward: 0.742.
INFO:unityagents: Ball3DBrain: Step: 2000. Mean Reward: 1.345. Std of Reward: 0.802.
INFO:unityagents: Ball3DBrain: Step: 3000. Mean Reward: 1.592. Std of Reward: 1.001.
INFO:unityagents: Ball3DBrain: Step: 4000. Mean Reward: 2.028. Std of Reward: 1.306.
INFO:unityagents: Ball3DBrain: Step: 5000. Mean Reward: 3.289. Std of Reward: 2.465.
INFO:unityagents: Ball3DBrain: Step: 6000. Mean Reward: 5.163. Std of Reward: 4.913.
INFO:unityagents: Ball3DBrain: Step: 7000. Mean Reward: 9.106. Std of Reward: 10.157.
INFO:unityagents: Ball3DBrain: Step: 8000. Mean Reward: 17.119. Std of Reward: 17.467.
INFO:unityagents: Ball3DBrain: Step: 9000. Mean Reward: 41.421. Std of Reward: 28.326.
INFO:unityagents: Ball3DBrain: Step: 10000. Mean Reward: 48.120. Std of Reward: 34.576.
INFO:unityagents: Ball3DBrain: Step: 11000. Mean Reward: 72.271. Std of Reward: 33.733.
INFO:unityagents: Ball3DBrain: Step: 12000. Mean Reward: 69.794. Std of Reward: 34.551.
INFO:unityagents: Ball3DBrain: Step: 13000. Mean Reward: 95.523. Std of Reward: 15.509.
INFO:unityagents: Ball3DBrain: Step: 14000. Mean Reward: 92.423. Std of Reward: 26.247.
INFO:unityagents: Ball3DBrain: Step: 15000. Mean Reward: 76.550. Std of Reward: 35.733.
INFO:unityagents: Ball3DBrain: Step: 16000. Mean Reward: 81.850. Std of Reward: 29.841.
INFO:unityagents: Ball3DBrain: Step: 17000. Mean Reward: 69.775. Std of Reward: 32.864.
INFO:unityagents: Ball3DBrain: Step: 18000. Mean Reward: 87.154. Std of Reward: 25.547.
INFO:unityagents: Ball3DBrain: Step: 19000. Mean Reward: 81.967. Std of Reward: 36.149.
INFO:unityagents: Ball3DBrain: Step: 20000. Mean Reward: 83.971. Std of Reward: 24.420.
^]INFO:unityagents: Ball3DBrain: Step: 21000. Mean Reward: 93.446. Std of Reward: 22.703.
INFO:unityagents: Ball3DBrain: Step: 22000. Mean Reward: 90.321. Std of Reward: 25.878.
INFO:unityagents: Ball3DBrain: Step: 23000. Mean Reward: 89.362. Std of Reward: 26.171.
INFO:unityagents: Ball3DBrain: Step: 24000. Mean Reward: 82.127. Std of Reward: 33.026.
INFO:unityagents: Ball3DBrain: Step: 25000. Mean Reward: 72.694. Std of Reward: 40.881.
INFO:unityagents: Ball3DBrain: Step: 26000. Mean Reward: 91.575. Std of Reward: 16.235.
INFO:unityagents: Ball3DBrain: Step: 27000. Mean Reward: 81.640. Std of Reward: 32.242.
INFO:unityagents: Ball3DBrain: Step: 28000. Mean Reward: 100.000. Std of Reward: 0.000.
INFO:unityagents: Ball3DBrain: Step: 29000. Mean Reward: 80.227. Std of Reward: 39.547.
INFO:unityagents: Ball3DBrain: Step: 30000. Mean Reward: 79.075. Std of Reward: 38.136.
INFO:unityagents: Ball3DBrain: Step: 31000. Mean Reward: 95.458. Std of Reward: 15.063.
INFO:unityagents: Ball3DBrain: Step: 32000. Mean Reward: 100.000. Std of Reward: 0.000.
INFO:unityagents: Ball3DBrain: Step: 33000. Mean Reward: 83.950. Std of Reward: 32.743.
INFO:unityagents: Ball3DBrain: Step: 34000. Mean Reward: 76.846. Std of Reward: 36.478.
INFO:unityagents: Ball3DBrain: Step: 35000. Mean Reward: 93.162. Std of Reward: 23.689.
INFO:unityagents: Ball3DBrain: Step: 36000. Mean Reward: 93.200. Std of Reward: 23.246.
INFO:unityagents: Ball3DBrain: Step: 37000. Mean Reward: 93.077. Std of Reward: 17.433.
INFO:unityagents: Ball3DBrain: Step: 38000. Mean Reward: 87.154. Std of Reward: 29.409.
INFO:unityagents: Ball3DBrain: Step: 39000. Mean Reward: 87.671. Std of Reward: 28.051.
INFO:unityagents: Ball3DBrain: Step: 40000. Mean Reward: 98.158. Std of Reward: 6.108.
INFO:unityagents: Ball3DBrain: Step: 41000. Mean Reward: 83.300. Std of Reward: 30.993.
INFO:unityagents: Ball3DBrain: Step: 42000. Mean Reward: 83.147. Std of Reward: 34.732.
^C--------------------------Now saving model-------------------------
INFO:unityagents:Learning was interrupted. Please wait while the graph is generated.
INFO:unityagents:Saved Model
INFO:unityagents:List of nodes to export :
INFO:unityagents:       action
INFO:unityagents:       value_estimate
INFO:unityagents:       action_probs
INFO:tensorflow:Restoring parameters from ./models/firstRun/model-42346.cptk
INFO:tensorflow:Froze 16 variables.
Converted 16 variables to const ops.
```

学習中の様子
<img width="881" alt="学習中" src="https://qiita-image-store.s3.amazonaws.com/0/48549/e4afcfaf-20cd-cfca-9fe3-927695e1a647.png">

学習がすすむと、徐々にボールが落ちないようになっていきました。


### 学習結果をアプリに組み込む

学習が完了すると学習結果が```.bytes``` ファイルに保存されます。
それをUnityでアプリに組み込むことができるようです。

#### Unityの設定

Unityの設定を確認します。
設定を変更したらUnityの再起動が必要です。

- [Edit]メニューから[Project Settings]>[Player]を選択する
- [Inspector]ビューの[Other Settings]欄で以下を設定する
    - [Scripting Runtime Version]を[.Net 4.x Equivalent]にする
    - [Scripting Defined Symbols]に```ENABLE_TENSORFLOW``` を入力する
<img width="448" alt="tensorflow設定" src="https://qiita-image-store.s3.amazonaws.com/0/48549/7642392f-f312-bca6-8382-856c436211ea.png">

#### TensorFlowSharpプラグインのインポート

TensorFlowSharpプラグインをダウンロードしてインポートします。

以下の、Basic Guideに説明がありますが、[プラグインをダウンロード](https://s3.amazonaws.com/unity-ml-agents/0.5/TFSharpPlugin.unitypackage)してファイルを開くと、UnityでImport確認ダイアログが表示されます。[Import]ボタンをクリックしてインポートします。
<img width="349" alt="スクリーンショット 2018-09-13 11.57.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/80670481-e965-57b3-8158-7908e41af9f6.png">

Basic Guide
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md#setting-up-ml-agents-within-unity

#### 学習結果ファイルの取り込み

ターミナルかFinderで学習結果を以下フォルダにコピーします。

- v0.5.0
    - 学習結果ファイル: ml-agents/models/firstRun-0/3DBall_firstRun-0.bytes
    - 保存先: UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/
- v0.4.0
    - 学習結果ファイル: python/models/firstRun/3DBall_firstRun.bytes
    - 保存先: unity-environment/Assets/ML-Agents/Examples/3DBall/TFModels/


```sh:v0.5.0
> cp models/firstRun-0/3DBall_firstRun-0.bytes ../UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels
```

- Unityの[Hierarchy]パネルから以下を選択する
    - [3DBall] > [Ball3DAcademy] > [Ball3DBrain]
- Unityの[Inspector]パネルにある[Brain Type]を[internal]に変更する
- [Project]パネルで以下フォルダを選択する
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
- [Brain Type]下に[Graph Model]という項目が現れてるので、そこに[TFModels]フォルダ内の以下ファイルをドラッグ＆ドロップする
    - v0.5.0
        - 3DBall_firstRun-0.bytes
    - v0.4.0
        - 3DBall_firstRun.bytes  
<img width="475" alt="model-file-drag.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/15afa98b-2393-9670-eb4c-fdfcdd5efee7.png">
- Unity上部にある再生(三角)ボタンをクリックする

これで、学習結果が組み込まれた状態でアプリが起動します。
50,000ステップ学習すると動きが穏やかで、もはやプロです。

<img width="1677" alt="スクリーンショット 2018-09-13 12.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/5ac93f64-7289-bfc2-fe7c-41f8a8da796d.png">


サンプルは他にもあるので、いろいろとお試しあれ。

## 参考

【Unity】Unityで機械学習する「ML-Agent」を色々と試して得た知見とか
http://tsubakit1.hateblo.jp/entry/2018/02/18/233000

Unity-Technologies/ml-agents/docs/Installation.md
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md

Using an Environment Executable
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Executable.md

Basic Guide
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md#setting-up-ml-agents-within-unity

Unityの公式サンプルml-agentsでAIを試す
http://am1tanaka.hatenablog.com/entry/2017/11/08/230525