LoginSignup
1
3

More than 5 years have passed since last update.

LIS (Life in Silico) のソースを読んでみる

Last updated at Posted at 2019-09-19

全てを説明できているわけでは無いですが、とりあえず。

とりあえずインストール

以下を参照。特に、はまるところは無いです。

LIS (Life in Silico)をMacで動かす

ソースコード構成

  • unity-sample-environment => Unity に import するプロジェクトのルートディレクトリ
    • Assets
      • CameraBuffer => カメラで撮影した画像をTextureとして保持する。 こちらまたは、こちら参照
      • Editor => モバイル端末でジョイスティックをシュミレーションする。おそらく無関係(参照)
      • Materials => オブジェクトの色やテクスチャを設定
      • Packages => 外部ライブラリ。messagepack を使うライブラリと、webspcketを使うライブラリが置いてある
      • Prefabs => 参照
      • Scenes => シーン 参照
      • Scripts => C#のソース
      • Shader => 参照 参考
      • Standard Assets => 標準で入っているAsset?
    • Library => Unity でプロジェクトを読み込んだときにできるファイル。(gitには無い)
  • 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]で定義されているものです。

sc1.png

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側に送信
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3