ML-Agentsの学習環境をつくる
前回はExampleのプロジェクトを使って、PythonでAgentに学習させて、学習モデルを作ってみた。今回は、プロジェクトの作成から始まり、ML-Agentsを使ってボール(Agent)を箱(Traget)の方に動かすモデルをつくるための学習環境をつくってみる。参考文献の本で言うと2章の2-1~2-3までの部分にあたる。
ちなみに、本で紹介されているサンプルコードはML-Agents公式ドキュメントから引用されているようで、内容はほとんど同じ。ただ、本のコードそのままだと動かない部分があるので、以下の現状最新版のコードを使った方が無難だと思う。
また、前回はExampleプロジェクトのに合わせてUnity 2019.4.25f1を使ったが、今回は現時点で最新のLTS版であるUnity 2020.3.25f1を使ってやってみる。
実行環境
Windows 10
Unity 2020.3.25f1
Anaconda 4.6.11 (Python 3.7.3)
ML-Agents Release 18
Unityの3Dプロジェクトを新規作成&ML-Agentsのパッケージ追加
まずはUnity 2020.3.25f1で3Dのプロジェクトを新規作成する。
プロジェクトを作成したら、まずは前回同様にML-Agentsの以下のpackageをimportする。今回の内容だけだったらml-agenstsのものだけでも良いのだが、発展して色々いじるかもしれないので一応ml-agents.extensionsの方もimportしておいた。
com.unity.ml-agents\package.json
com.unity.ml-agents.extensions\package.json
3Dオブジェクトの配置&Behavior Parametersの追加
Create → 3D Objectから以下の3つのオブジェクトを追加する。SphereにだけAdd ComponentでRigid Bodyを追加しておく。
- Plane (今回はFloorという名前をつけた)
- Cube (今回はTargetという名前をつけた)
- Sphere (今回はRollerAgentという名前を付けた。Rigid Bodyを追加しておくこと)
Materialは設定しなくても良いが、お好みでCreate → Materialで適当にMaterialを作ってオブジェクトに付加して色を付けても良い。
最後に、RollerAgentオブジェクトにAdd ComponentでBehavior Parametersを追加する。本に書かれている内容からVector Actionの設定項目が少し変わっているので注意。
ML-Agentsのスクリプト作成&オブジェクトへの追加
今回は公式のドキュメントのコードをほぼ丸写ししてるのでここではコード全ては載せないが、公式ドキュメントのコードを以下のように並べてRollerAgent.csという名前で保存すればOK。
using System.Collections.Generic; using UnityEngine; using Unity.MLAgents; using Unity.MLAgents.Sensors; using Unity.MLAgents.Actuators; public class RollerAgent : Agent { Rigidbody rBody; void Start () {…省略…} public Transform Target; public override void OnEpisodeBegin() {…省略…} public override void CollectObservations(VectorSensor sensor) {…省略…} public float forceMultiplier = 10; public override void OnActionReceived(ActionBuffers actionBuffers) {…省略…} public override void Heuristic(in ActionBuffers actionsOut) {…省略…} }
ちなみに、本のRollerAgent.csのコードを使う場合は、ML-AgentsのRelease 18 + Unity 2020.3.25f1の環境だと以下のようなエラーが出てそのままだと使用できない。
RollerAgent.cs(45,26): error CS0115: 'RollerAgent.OnActionReceived(float[])': no suitable method found to override RollerAgent.cs(70,26): error CS0115: 'RollerAgent.Heuristic(float[])': no suitable method found to override
もし本のコードを使いたい場合は、以下2点の変更を加えればOK。
- using Unity.MLAgents.Actuators;を追加
- OnActionReceived、Heuristicの部分を上記の公式ドキュメントのものにさしかえ
あとはRollerAgentオブジェクトにRollerAgent.csを追加し、Add ComponentでDesicion Requesterを追加すれば完了。パラメータは以下のように設定した。
まだ学習は未実行なので、この状態で実行するとヒューリスティックモード(手動で操作できるモード)で動くため、キーボードで操作ができる。静止画だとよくわからないと思うが、以下が主導で動かしているときの画像。キーボードの方向キーで操作している。
これで学習環境の作成は完了。長くなったので今回はここで切って、次回はこの環境を使って学習を実行し、RollerAgentをTargetの方に動くモデルを作ってみたいと思う。
参考文献
基本的には以下の本を読みつつ勉強していき、最終的には自分で何かしらゲームを作っていく予定。最低限ML-Agentsを使うための流れはブログで書いていこうと思っているが、詳細については説明しないので、深く理解するには本を買って勉強してみることをオススメする。
古くなった情報を補完するため、本と合わせて以下のML-Agents Release 18の公式ドキュメントを参照している。
https://github.com/Unity-Technologies/ml-agents/tree/release_18_docs/
日記まとめ
この日記は以下でまとめてます。