Unityで機械学習やってみる(ML-Agents)　最初のサンプル動かすとこまで

環境 mac
Unity 2017.4.4.f1

ちょっとUnityで機械学習試して見たいのでやってみる
学習させるところまでとりあえず・・・。

##必要なものをダウンロード
###Unity ML-Agentsのアセットをダウンロードする
<a href="https://github.com/Unity-Technologies/ml-agents" target="_blank">Unity Machine Learning Agents Toolkit </a>

中身はこんな感じ
<img width="250" alt="スクリーンショット 2018-08-07 00.07.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/95fbb469-1b3d-93a9-7608-36048a0a4e2f.png">

###TensorFlowSharpプラグインをダウンロード
<a href="https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md" target="_blank">ここから</a>

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/49ecddea-4074-1de3-4c24-7d90bf841a23.png" width="500">
上記リンクのBasic GuideのところにあるDownloadをクリックするとpackageをダウンロードできる
unitypackageの状態で落とせるよ

###Pythonをインストールしてない人はPythonもインストール
わからないときはターミナルから

```
python --version
```
すればバージョンが表示される。
2.7.10だったので3系インストールする
手っ取り早く<a href="https://www.anaconda.com/" target="_blank">Anaconda</a>でPhthonの環境構築
2系と3系があるけど3系の方をチョイス
そしてインストールして起動

##Anaconda起動
左メニューEnvironmentsを選択し、左下のCreateボタンを押す
<img width="960" alt="スクリーンショット 2018-08-07 00.23.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/2ce3109c-69c2-9cc6-ce4d-0286ff238a7d.png">

適当に名前つけて、Pythonのバージョンを設定してCreate
![スクリーンショット 2018-08-07 00.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/46444/4e3c6b3b-bc26-4bcd-5cf3-09c9251612f9.png)

作成したものをクリックしてOpen Terminalでターミナルが開く
![スクリーンショット 2018-08-07 00.28.15.png](https://qiita-image-store.s3.amazonaws.com/0/46444/a8113525-1a52-1e98-f638-2d70819f962e.png)

バージョンを確認
<img width="300" alt="スクリーンショット 2018-08-07 00.32.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/dd6aa114-22a7-7e70-cc3b-11dddf601a3a.png">


##ML-Agentsのアセットサンプルを動かす
まずはUnityで新規プロジェクト3Dで作成

ダウンロードしたUnity ML-Agentsnounity-environmentのAssetsフォルダを作成したプロジェクトに突っ込む
<img width="285" alt="スクリーンショット 2018-08-07 00.20.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/8d0f9cf4-9803-6002-ed39-d10a2ad38321.png">

そしてTensorFlowSharpのプラグイン TFSharpPlugin.unitypackageもインポート
これ結構大きい

ここまでできたら
PlayerSettingのResolution and Presentationの
Runin Backgroundをチェック
Display Resolution DialogをDisabled

Other SettingsのScripting Runtime VersionをExperimental(.NET 4.6 Equivalent) Unity再起動するよ
Scripting Defined SymbolsにENABLE_TENSORFLOW を記載
<img width="380" alt="スクリーンショット 2018-08-07 00.43.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/54e0a007-debe-ddd5-0e05-3462c6b07996.png">

###シーンの設定
現状でこのようなフォルダ構成になっているはずなので
ML-Agents/Examples/3DBall/Scenes/3DBallのシーンを開く
<img width="184" alt="スクリーンショット 2018-08-07 00.44.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/38b4ccc7-381d-02f3-c0b6-f574dd689e64.png">

ボールを落とさないように板を傾けるやつです
<img width="436" alt="スクリーンショット 2018-08-07 00.46.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/0fbc4a18-66dd-e73f-8087-969498cbd8d1.png">

学習方法の設定は
ヒエラルキーのBall3DAcademy/Ball3DBrainのインスペクターにある
Brain.csのBrainTypeで変更します。
学習させたいので今回はExternalに。
デフォルトだとPlayerになっていて十字キーで自分で操作できます
<img width="874" alt="スクリーンショット 2018-08-07 00.49.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/5594ed9e-73ba-4d01-1ae9-2fbe2237ed9a.png">

Brain TypeはPlayer, Heuristic, External, Internalの4種類
Playerは人間が動かす
Heuristicはコードで動かす
ExternalはUnityEditor上もしくはコンソールからの起動で自動で学習させる
Internalは学習させたデータを使って動かす

BuildSettingにシーンを追加してmacでビルド
このまま実行してもボールが落ちるだけなので学習させる

###必要なPythonのパッケージのインストール
ターミナルにてml-agents-masterのpythonフォルダに移動

```
pip install .
```
上記コマンドを実行
すると色々インストールされる。
<img width="800" alt="スクリーンショット 2018-08-07 01.10.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/63449a52-c737-369d-4de3-dbcec3997bd8.png">

pythonフォルダの状態で

```
python3 learn.py <ビルドしたappのパス> --train
```
上記コマンドを実行するとappが立ち上がって勉強し始める
![study.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/ecf23c38-ca42-43c6-afae-66d4106126fe.gif)

しばらく放置すると落とさなくなってきてる！
![study2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/ec59b062-de35-cae4-b2d2-329759bed491.gif)

デフォルトだとStepが50000だから結構ほっとかないと終わらなかった。
もっと少なくすればよかった　--save-freq=回数 のパラメータを設定してあげれば変更可能
終わるとball3D_ppo.bytesがml-agents-master/python/models/ppoに出力されます
<img width="300" alt="スクリーンショット 2018-08-07 01.26.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/2a94dce5-0203-7c1b-87eb-d7be9c177b61.png">

ソースとかまだ読んでないからあまり中身わかってないけど・・・
一旦ここまで。