[Unity]超絶初心者でもML-Agents Release8を動かす方法[Windows] 

#免責
この記事を見てる人は超絶初心者なので問題が起こったとしても私は責任を負わないこととします。また記事を見て進めた時点で同意したとみなします。またWindows以外のユーザーは今回扱いません。


#バージョン確認
結構な速度で更新されてる[ML-Agents](https://unity3d.com/jp/machine-learning)ですが`2020/10/19`時点の最新版である[ML-Agents Release 8](https://github.com/Unity-Technologies/ml-agents/releases/tag/release_8)の環境構築とテストをしていきたいと思います。

#実行環境
わかりやすく言うと`インストールするものリスト`です。

|            | バージョン   | インストール |
|:----------:|:-----------:|:------------:|
| ML-Agents  |[Release 8](https://github.com/Unity-Technologies/ml-agents/releases/tag/release_8)| 未       |
| Unity      |[2019.4.1f1](https://unity3d.com/jp/get-unity/download/archive)|済        |
| Anaconda3   | [2020.7](https://www.python.jp/install/anaconda/windows/install.html)          | 未           |
| Python     | 3.7.9        | 未         |


Unityは[2018.4以降が対応](https://github.com/Unity-Technologies/ml-agents/blob/release_6/docs/Installation.md)してますが、
今回は`Unity2019.4.1f1`で進めていきます。
同様に[Python3.6.1以降が対応](https://github.com/Unity-Technologies/ml-agents/blob/release_6/docs/Installation.md)してますが、
今回は仮想化とは？？？の人のためにAnacondaで仮想環境を作っていこうと思います。
Anacondaは後述で3.7環境を作るので、3.8対応の一番新しい2020.7(2020/10/19時点)を使います。
また`UnityとUnity Hubはすでにインストールが済んでいる前提`で進めます。
当然ですがネット環境も必要です。
今回GPUでの学習に関しては動かすことが目的なので含んでいません、予めご了承ください。

#ANACONDA3インストール手順
既にインストール済みの方は飛ばしてください。
ダウンロード場所は[Anaconda3のサイト](https://www.anaconda.com/products/individual)をスクロールしたところにあります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/0c5bccaf-9998-665b-c4be-e1bee624bfe7.png)
とりあえずNEXTで読み進めていってください。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/010c5860-641e-eafc-fc29-9dda408b05c6.png)
今回はディレクトリを合わせるためJust Meで
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/3201ff45-e2c5-02ed-677c-bf48197e9a08.png)
インストール先のフォルダを聞かれますが今回はC:\Users\ `ユーザー名`\anaconda3に素直にインストールしましょう。
最後の項目ですが下の画像のようにチェックします。赤くなっていますが気にしないでOKです。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/f15ddb74-1d21-db74-1e04-f793df4e39b2.png)
上の項目は面倒な`パス`を通すために必要で、下の項目はあまり関係がないのですが今回Python3.7をメインに使う都合上外します。
チェックでき次第インストールしましょう。
インストールが済んだら`コマンドプロンプト`を開いて`conda`と打ち確認しましょう。
コマンドプロンプトがわからない方はWindowsの検索バーにcmdと打ちアプリを開きましょう。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/afcf60d0-1d02-ebf8-6ade-75342ad38ea9.png)
開くと黒地に、
C:\Users\ `ユーザー名`\>
と表示されているので
`conda`と入力してエンター、以下のようにヘルプが出力されればインストール完了です。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/6feeeece-c1c6-050f-3885-a7431d17de2f.png)

今後このように`コマンドプロンプト`から`コマンドを実行`する際は、

```
$ conda
```
のように表記するので`覚えておいて下さい`。（$は、`続くコマンドを実行する`の意味）

#ML-Agentsダウンロード手順
すでにダウンロードしている方はディレクトリ階層だけ合わせてください。
[ML-Agents Release 8のサイト](https://github.com/Unity-Technologies/ml-agents/releases/tag/release_8)をスクロールして`Source code(zip)`をダウンロード、
C:\Users\ `ユーザー名`\　直下に解凍しましょう。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/147be819-161d-fbf0-5071-cfdc072ce827.png)
ディレクトリはC:\Users\ `ユーザー名`\ml-agents-release_8 となるはずです。
フォルダ内の`com.unity.ml-agents`ファイルはUnityで使います。

* mlagents
* mlagents_envs
* gym_unity

のファイルは次のPythonのインストールの時に使います。
[それぞれの働きについて詳しくはここを見てください。](https://github.com/Unity-Technologies/ml-agents/blob/release_8_docs/docs/Installation.md)

#Python3.7インストール手順
コマンドを実行します。

```
$ conda create -n ml-agents python=3.7
```
実行したら仮想環境の構築が終わるまでしばらく待ちましょう。
途中y/n？ときかれるので `yを押してエンター`
動作が終わると、再び
C:\Users\ `ユーザー名`>　
と表示されるのでそれから次のステップに移ります。
以降も同様に一つのコマンドの処理が`終わるまで待って`から行ってください。

```
$ conda activate ml-agents
```
コマンドプロンプトが、(ml-agents)C:\Users\ `ユーザー名`>　のように変化します。
これで仮想環境にライブラリを追加できます。

```
$ pip install -e ./ml-agents-release_8/ml-agents-envs
$ pip install -e ./ml-agents-release_8/ml-agents
$ pip install -e ./ml-agents-release_8/gym-unity
```
`上から順に`入れていきます。ちゃんとディレクトリ階層があっていればインストールが始まります。
時間がかかるので焦らずお茶を飲みましょう。

```
$ pip list
```
最後に追加したライブラリがあるか確認します。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/fe832e9e-5e82-b5cd-a28e-3148de589640.png)

#Unityのテスト環境構築
Unity Hubを開いてプロジェクト>リストに追加をクリック。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/16bf137c-9034-0324-3d92-4a0448ebbd6a.png)

C:\Users\ `ユーザー名`\ml-agents-release_8 内の`Project`フォルダを選んで、フォルダーの選択。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/ad11e657-e293-9ed8-b0f4-3cf68828e147.png)
Unityバージョンを`2019.4.1f1`に変更後、プロジェクト名をクリックして起動。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/7ee323c0-2474-b561-1c1e-b8f70ede7307.png)
プロジェクトの`アップグレード`の確認をする。次に出てくるポップアップも`Yes`を選択。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/476711bf-44b9-8621-6ce0-62238607eaff.png)
インポートが終わるまでお茶でも飲みましょう。
次に、Assets>ML-Agents>Examples>3DBall>Scenesフォルダから`3DBall.unity`をダブルクリックで実行します。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/26781e2e-1047-bdc8-7f12-aa633594279d.png)
シーンが読み込まれたらUnity上部の`Playボタン`を押して、シーンを実行してみます。
(少し読み込みがあるので待ちましょう）
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/61f4617a-ab43-2601-a5f3-d247af57fcb2.png)
可愛いシーンが再生されましたね！
このシーンには頭の上に乗ったボールを落とさないように学習済みのデータが設定されています。
ではPlayをもう一度押しシーンを終了して、1から学習してみましょう。
(ml-agents) C:\Users\ `ユーザー名`> の状態で

```
$ mlagents-learn ./ml-agents-release_8\config\ppo\3DBall.yaml --run-id=3DBall-1 --train
```
色々出てきた最後に、`Start training by pressing the Play button in the Unity Editor.`
と表示されたらUnityの`Playボタン`を押してください。
そうするとボックス君たちが微振動を始めるかと思います。~~それが世界のおわｒ~~　学習の始まりです。
人によってはパソコンがブオーンと唸るかもしれませんが我慢です。（古いパソコンでさすがにヤバそうだったらPlayを停止するか、コマンドプロンプトでCtrl+Cを押して終了してください。）
しばらくはコマンドプロンプトとUnityを眺めててください。学習が終われば自動的に止まります。
コマンドプロンプトに表示されてくる`Mean Reward`が平均的な報酬ですので、これが高くなっていくようなら学習が順調に進んでます。

学習が終わると色々コマンドプロンプトに表示されたあと、(ml-agents) C:\Users\ `ユーザー名`>　の状態に戻りますので、
C:\Users\ `ユーザー名`\results\3DBall-1ファイルを開きます。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/a3756ae6-b518-0e4b-bacc-7d4d29324ec1.png)
`3DBall.nn`というNN形式のファイルが先ほどの学習で手に入った`学習済みデータ`です。(NNはニューラルネットワークの意(Neural Network))
UnityのProject内にドラッグアンドドロップで移して、右クリックRenameで`3DBall-NN`と間違わないよう名前を変更します。
次にHierarchyから3DBallの右の矢印`>`をクリックして、3DBallのPrefabを開きます。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/bebf2cdf-e19d-1ae0-f65e-6160fd3b3956.png)
するとPrefabの設定画面に移るのでSceneの背景が青色に代わるのを確認した後、Hierarchyから`Agent`を選択状態にすると、Inspectorに`Behavior Parameters`というコンポーネントがあります。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/53c86857-305e-6b02-bfff-5aecde4d3f1d.png)
そこのModelに先ほど`追加した学習済みのNNファイル`をドラッグアンドドロップ等で設定してください。
設定後Hierarchyの左上の小さな左矢印`<`でPrefabの設定画面から抜けます。
Unity上部のPlayを押してシーンを再生すると、Hierarchy内の3DBallが割り当てた学習済みファイルになってるのが確認できるかと思います。（見た目上大きな変化はないかもしれませんが、先ほど学習したデータです）

以上で学習のテストは終了です。
他にもデモシーンが用意されてるので学習時のシーンと.yamlの名前を変えながら試してみるとよいかと思います。




#まっさらなUnityのプロジェクト構築
番外編ですが、デモシーン無しのまっさらなML-Agents用の新規プロジェクトの作り方です。
メニューからWindow>Package Managerを開きます。
左上の`+`ボタンを押して`Add package from disk`を選びます。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/9c700a6b-d2b0-c518-8425-8632949aa098.png)
C:\Users\ `ユーザー名`\ml-agents-release_8 に移動して`com.unity.ml-agents`フォルダ内の`package.json`を開きます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802018/f6243b77-9466-d773-9fe2-a37c2f3065f5.png)
インポートが終われば完了です。