全てを説明できているわけでは無いですが、とりあえず。
とりあえずインストール
以下を参照。特に、はまるところは無いです。
ソースコード構成
- unity-sample-environment => Unity に import するプロジェクトのルートディレクトリ
- Assets
- CameraBuffer => カメラで撮影した画像をTextureとして保持する。 こちらまたは、こちら参照
- Editor => モバイル端末でジョイスティックをシュミレーションする。おそらく無関係(参照)
- Materials => オブジェクトの色やテクスチャを設定
- Packages => 外部ライブラリ。messagepack を使うライブラリと、webspcketを使うライブラリが置いてある
- Prefabs => 参照
- Scenes => シーン 参照
- Scripts => C#のソース
- Shader => 参照 参考
- Standard Assets => 標準で入っているAsset?
- Library => Unity でプロジェクトを読み込んだときにできるファイル。(gitには無い)
- Assets
- python-agent => Pythonで書かれたサーバ。ここで、強化学習をしている
Scriptsの中身
- SceneController.cs => シーン(Hierarchyペイン -> sample-> SceneController)に設定されているスクリプト。シーンの基本的な動作はここに書かれている。
- IAIClient.cs => AIClient/AIClientAsync のインターフェース
- AIClient.cs => Websocket で通信する役割。SYNC(同期的)に動作
- AIClientAsync.cs => Websocket で通信する役割。ASYNC(非同期的)に動作
- Action.cs => アクション(Agentの行動)を保持
- Agent.cs => Agent(Hierarchペイン -> sample -> Agents -> Agent)に設定されているスクリプト。Agentから満たしてんのが増の取得が書かれている
- MyFirstpersonController.cs => Agent(Hierarchペイン -> sample -> Agents -> Agent)に設定されているスクリプト。一人称視点(FPS視点)の制御を行うコントローラ。
- Defs.cs => 定数
- Environment.cs => Environments の items(Hierarchペイン -> sample -> Environments -> items)に設定されているスクリプト。Rewordアイテムをランダムに配置
- State.cs => Agent の状態を保持
- Events
- ResetEvent.cs => プレハブの ResetItem (Projectペイン -> Prefabs -> ResetItem) に設定されているスクリプト。ゲームがリセット(Agentが死ぬ)する。
- RewardEvent.cs => プレハブの PlusRewardItem (Projectペイン -> Prefabs -> PlusRewardItem) に設定されているスクリプト。Reward(報酬)がもらえる。
- RewardTriggerEvent.cs => プレハブの RewardArea (Projectペイン -> Prefabs -> RewardArea) に設定されているスクリプト。一定のエリアに入るとRewardがもらえ、でると、失うというようなことができる。
「シーン(Hierarchy-> sample->SceneController)に設定されているスクリプト。」等がどういう意味かと言うと、以下のように、Unityのオブジェクトに設定されています。SceneController.cs は、左のHierarchyペインのSceneControllerに設定されています。また、インスペクタのScriptにある設定項目は、ソースコード中に、[SerializeField]で定義されているものです。
pythonのコード
- cnn_dqn_agent.py => Agentの実装。bvlc_alexnet.caffemodel で画像認識し、Q Networkに入力している
- cnn_feature_extractor.py => bvlc_alexnet.caffemodel から、feature vector を取り出す
- multi_agent.py => 複数のAgentを起動するスクリプト(内部でserver.pyを呼ぶ)
- plot_reward_log.py => rewardのログ表示
- q_net.py => Q Networkのモデルを作成している
- server.py => 起動スクリプト
基本的な動作の流れ
Unity側
- SceneController が起動
- AIClient がInitialize
- 別スレッドで、Queueを監視。何か入ったら、WebSocketで、MessagePackを送信
- Environment で、rewardのオブジェクトを作成
- AIClient で画像をPython側に送り、Python側からメッセージを受けり、アクションを実行、を繰り返す
Python側
- server.py がメッセージを受け取り、画像を取り出す
- 画像をAgent(cnn_dqn_agent.py)に入力
- 画像をCnnFeatureExtractor(cnn_feature_extractor.py)にわたして、feature vectorに変換
- feature vector を Q(q_net.py)にわたして、actionを得る
- action を Unity側に送信