ぱふの自由帳

週3更新(火・木・日)を目指すUnityブログ。良ければフォローお願いします(`・ω・´)

【Unity ML-Agents】Unity-Agents-Overview.mdを日本語でまとめておく

はじめに

未来の自分用の備忘録記事です。

英語がとーーーーっても苦手で何度も訳すのはストレスで死んじゃいそうなので、、簡単にですが日本語に翻訳&まとめておきます。

英語が苦手+自分用に簡略化しているので、間違っている箇所や分かりづらい箇所もあると思います。是非ご指摘いただけると嬉しいです!

以下、翻訳&まとめ

Learning Environments Overview

上の画像(画像は省略)はML-Agents内で学習環境がどのように構築されているかを視覚的示したものである。

Agents学習環境内の主要な3種類のオブジェクトは次のようになっています。

  • Agent - 各エージェントは状態と観測の独自のセットを持ち、環境内で独自の行動を取ることが出来る。さらに環境内のイベントに対して独自の報酬を得ることが出来る。エージェントの行動は結合しているブレインによって決定される。

  • Brain - 各ブレインは特定の状態と行動空間を明確にし、ブレインと結合しているエージェントが取る行動を決定する責任がある。ブレインは次の4つのモードのいずれかに設定できる。

    • External - Python APIを用いたオープンソケットを介して通信することにより、TensorFlow(または、あなたが選んだMLライブラリ)を使用してアクションの決定が行われる。
    • Internal(Experimental) - TensorFlowSharpを介してプロジェクトに埋め込まれた訓練済みモデルを使用してアクションの決定が行われる。
    • Player - アクションの決定はプレイヤーの入力を使用する。
    • Heuristic - アクションの決定は手動で記述したコードを使用する。
  • Academy - シーン内のAcademyオブジェクトは、環境内のすべての脳を子供として含むことも出来る。各環境には、次のような環境の範囲を定義する単一のアカデミーが含まれている。

    • Engine Configuration(エンジンの構成) - トレーニングと推論モード内でのゲームエンジンのスピードとレンダリング品質。
    • Frameskip(フレームスキップ) - 新たな決定を行う各エージェント間をスキップするためのエンジンステップの数。
    • Global episode length - エピソードがどれぐらい続くか。結果に達すると全てのエージェントはdone(行動済み)がセットされる。

外部に設定されたブレインを持つ全てのエージェントの状態と観察は、外部コミュニケータによって収集され、Python APIを介して通信される。ニューラルネットワーク特有の並列計算方法のように、複数のエージェントを1つの脳に設定することで、アクションをバッチ式で決定できる。これらのオブジェクトがシーン内でどのように連動するかの詳細については、我々のwikiページを参照すること。

Flexible Training Scenarios

Unity ML-Agentでは、エージェント、ブレイン、報酬をどのように接続するか次第でさまざまな種類のトレーニングシナリオが可能である。私たちは、コミュニティがどのような革新的で楽しい環境を作り出しているかを見て楽しんでいる。優秀なエージェントを訓練する人のために、インスピレーションになりそうないくつかの例がある。これらの例は、ML-Agents SDKを使用してどのように作成できるかという説明を含んだ典型的な環境構築方法です。

  • Single-Agent - 1つの脳に結び付けられた1つのエージェント。エージェントを訓練する伝統的な方法。チキン(という名前のゲーム)のようなシングルプレイヤーゲームがこれにあたる。(ビデオリンクは省略)

  • Simultaneous Single-Agent - 1つの脳に結び付けられている独立報酬機能を持つ複数の独立エージェント。伝統的な訓練を並列化したもので、訓練のスピードアップと安定化が可能。十数個のロボットアームを訓練してドアを同時に開けるといった訓練がこれにあたる。(ビデオリンクは省略)

  • Adversarial Self-Play - 逆報酬関数を持ち、互いに影響し合うエージェントが1つの脳に結び付けられている。2人プレイのゲームでは、セルフプレイによって完全な敵と常に戦うことで、エージェントがどんどん熟練していく。これはAlphaGoを訓練する際に利用した方法であり、最近ではDota2の1v1で人間を打ち負かす訓練にも利用された。(デモプロジェクトは近日公開)

  • Cooperative Multi-Agent - 共有報酬機能を持ち、互いに影響し合う複数のエージェントが 1つまたは複数の異なる脳に結び付けられている。全てのエージェントは目標を達成するために単独ではなく、共に作業を行わなくてはならない。例としては、各エージェントが部分的な情報にしかアクセスできない環境があり、その部分的な情報がタスクを達成するために共有する必要があるといったもので、共同でパズルを完成させるといったタスクが具体例である。(デモプロジェクトは近日公開)

  • Competitive Multi-Agent - 逆報酬機能を持ち、互いに影響し合う複数のエージェントが1つまたは複数の異なる脳に結び付けられている。戦いに勝つ、または限られた数のリソースを獲得するために、互いに競争しなければならない。全てのチームスポーツはこれに該当する。(デモプロジェクトは近日公開)

  • Ecosystem - 独立した報酬機能を持ち、互いに影響し合う複数のエージェントが1つまたは複数の異なる脳に結び付けられている。これは、シマウマ、ゾウ、キリンなどのサバンナや都市環境内での自律的な運転シミュレーションなど、さまざまな目標を持つ動物が相互に作用する小さな世界を創造するものと考えることができます。(デモプロジェクトは近日公開)

Additional Features

ML-Agentsには、Academy / Brain / Agentシステムで可能となる柔軟なトレーニングシナリオ以外に、トレーニングプロセスの柔軟性と理解のしやすさを向上させるその他の機能も含まれている。

  • Monitoring Agent’s Decision Making - ML-Agentsでの通信は双方向なので、Unity環境内でのポリシーや値の出力など、訓練されたエージェントの側面を表示できるUnityのAgent Monitorクラスを提供している。これらの出力をリアルタイムで提供することで、研究者や開発者はエージェントの行動をより簡単にデバッグできる。

  • Curriculum Learning - エージェントが初期の訓練で複雑なタスクを習得することが困難な場合がしばしばある。カリキュラム学習(Curriculum Learning)はタスクの難易度を徐々に増加させることでより効率的な学習を可能にしている。ML-Agentsは、環境がリセットされるたびにカスタム環境パラメータのセッティングをサポートする。これにより、難易度または複雑さに関連する環境の要素を、トレーニングの進捗状況に基づいて動的に調整することができる。

  • Complex Visual Observations - エージェントの観察が1つのベクトルまたは画像に限定される可能性がある他のプラットフォームとは異なり、ML-Agentsでは複数のカメラをエージェントごとの観測に使用できる。これにより、異なる視点の複数のカメラを必要とする自走車、航空写真および一人称視点を統合する必要があるナビゲーションエージェント、または、視点の異なる複数のカメラを訓練する場合のように、エージェントは複数のビジュアルストリームから情報を統合することを学ぶことができる。また、エージェントは深度マップやオブジェクトをセグメント化した画像はもちろん、未熟な視覚入力のどちらも受け取れる。

  • Imitation Learning (Coming Soon) - たいていは、試行錯誤で学習を試みるよりも、エージェントに実行して欲しい行動をデモンストレーションする方が直感的である。将来のリリースでは、ML-Agentsは、模倣学習といった教師あり学習シナリオで使用するために、すべての状態/行動/報酬情報を記録する機能を提供する。模倣学習を利用することで、プレイヤーはエージェントが環境内でどのように行動すべきかのデモンストレーションを行い、そのデモンストレーションを利用してスタンドアロン式でエージェントを訓練したり、強化学習プロセスの第一歩として活用することができる。

疑問点

  • 逆報酬機能ってなんだろうか。勝てば+負ければ-の報酬を与える機能って意味で良いのかな。(AlphaGoと同じと書いてあるし...)

さいごに

意味がイマイチわからない部分もありますが、最後まで日本語に出来ました!
誤訳があると思うので、見つけた方はコメントかTwitterで教えて下さい。( ´∀`)

個人的に気になるのは最後のImitation Learningですね。実装されれば、「△△という挙動をさせたいから〇〇すると報酬を与えるようにする。」とやっていたものを「こういう感じでやってね。(実演)」と出来るようになるのでしょうか...?
出来たとしたら便利ですよね〜。

他にも英語チュートリアルはありますので適宜翻訳していきたいと思います。(私以外に需要があるか知りませんが...笑)
「英語得意だから翻訳やってやんよ」という神の出現お待ちしております〜〜!

【Unity2017.1】Materialのパラメータを動的に弄りたい...でもパラメータ名がわからない!そんな時

はじめに

タイトルだけでは分かりづらいかと思うので、画像をペタッと。

f:id:PafuOfDuck:20180131195733p:plain

赤枠の箇所の色変更したいけど、スクリプト内で指定するための正式名称がわからない!という方向けの記事です。

とても短いので困っている方はサラっと読んで見てください〜。

名称の確認方法

右上の歯車のとことろをポチッと押すと下の画像のような項目が出てくるのでSelect Shaderをクリックします。

f:id:PafuOfDuck:20180131200037p:plain

すると...どーーーーん。

f:id:PafuOfDuck:20180131200151p:plain

以上です。(笑)
左が名前、右がクラス名ですね。

おわり

完全に手抜き記事ですが、意外とハマることなのでこの機会に覚えてしまいましょ〜^^

【Unity2017.1】オブジェクトの角度を取得する

はじめに

オブジェクトの角度を取得するぞー!
transform.rotationはダメ...
transform.localRotationにしてももちろんダメ...

あれ?どうやって取得するんだ?って方への記事となっています。

取得方法

以下の方法で取得できます。(上からワールド / ローカルの順)

  • transform.eulerAngles
  • transform.localEulerAngles

おわり

「じゃあtransform.rotation.xってなにしてるの?」って疑問が生じると思います。
Unityは回転を表現するのにクォータニオンという数学の考え方を用いているので、それを取得してくれているのです。その証拠に、Debug.Logで値を表示してみると...値が4つ入っているのが確認できるかと!

【Unity2017.1】子オブジェクトを全て削除する方法

はじめに

子オブジェクトを全て削除した時に、結構な頻度で子オブジェクトの取得方法からググっているのでコードをコピペできるようにメモ。

取得→削除

以下のコードで実装できます。

foreach(Transform child in gameObject.transform){
    Destroy(child.gameObject);
}

おわりに

自分用のメモでした〜。使う方はガンガンコピってください。b

DoTweenで無限ループが実行されない!そんな時に確認すべきこと

はじめに

DoTweenでSetLoops(-1)と書くと無限ループになると思います。ですが、無限ループが実行されずにエラーも出ないという状況になる場合があります。

というわけで、早速その場合について見ていきましょう。

無限ループが実行されるコード

まず、無限ループが実行される場合について見ておきましょう。
以下のようなコードでは無限ループが正常に動きます。

gameObject.transform.DOMove (new vector3(1f, 1f, 1f), 1f)
.SetLoops (-1);

無限ループが実行されないコード

では、無限ループが実行されない場合について見てみましょう。

Sequence seq = DOTween.Sequence();
        seq.Append(
            gameObject.transform.DOMove(new vector3(1f, 1f, 1f), 1f)
            .SetLoops(-1)
        );

何がダメなのか

コードが明らかに違うので分かりやすいかもしれませんが、Sequence内では無限ループは実行されません。なので、Sequence外で無限ループを実行してあげれば解決します。

おわりに

実は公式ドキュメントに書いてある内容です。笑
私は英語がてんでダメなのでハマってしまいました...なので、同じように英語が苦手な方の助けになれば幸いです!

参考:公式で言及している部分のスクショ↓↓
f:id:PafuOfDuck:20180121174623p:plain

【Unity2017.1】Bloomエフェクトをかける方法

はじめに

まず、Bloomとはなんじゃという話ですが...
Blooming (ブルーム)とは明るい光源(例えば、閃光のような)からの光が周囲の物体に漏れるように見える光学効果のことです。

論より証拠ということで画像をペタっと貼っておきます。

  • Bloomなし
    f:id:PafuOfDuck:20180116154545p:plain

  • Bloomあり
    f:id:PafuOfDuck:20180116154548p:plain

とても簡単に実装できるので早速やっていきましょー!

実装

Post Processing Stackの準備

以下のアセットをインポートしてください。

Post Processing Stackの設定

  1. ProjectウィンドウからCreate > Post-Processing Profileを選択してPost-Processing Profileを作成する
    f:id:PafuOfDuck:20180116161002p:plain
  2. MainCameraPost Processing Behaviorをアタッチ
    f:id:PafuOfDuck:20180116161056p:plain
  3. Post Processing BehaviorProfileに1で作成したものをアタッチ
    f:id:PafuOfDuck:20180116161029p:plain
  4. Post-Processing ProfileのBloomを有効化する
    f:id:PafuOfDuck:20180116160826p:plain
  5. 完成
    f:id:PafuOfDuck:20180116161148p:plain

おわりに

Assets > Import Package > EffectでImportされるStandard Assets内にあるBloomエフェクトを使用する方法が古い記事で見かけます...ですが、現在Standard Assets内にBloomエフェクトが存在しないためうまくいきません。
なので、この方法が簡単なのではないかなと思っています。

より簡単な方法がありましたらコメント等でご教授ください><。

【unity2017.1】emissionで3Dオブジェクトを光らせる

はじめに

今回は静的な3Dオブジェクトを光らせ、静的な3Dオブジェクトに影響を与える方法についてです。動的な3Dオブジェクトには使えませんのでご注意を!

実装

  1. Materialを新規に作成します。
  2. 光らせたいオブジェクトに作成したMaterialをアタッチします。
  3. materialの設定からemssionを有効化します。
    f:id:PafuOfDuck:20180116153207p:plain
  4. 光らせたいオブジェクトと光の影響を受けたいオブジェクトをどちらもstaticにします。
    f:id:PafuOfDuck:20180116153247p:plain
  5. 光ります。
    f:id:PafuOfDuck:20180116153304p:plain

おわりに

光る側も光を受ける側もstaticにするというのを忘れずに...((ハマりました!

また、2Dの光らせ方は後々記事に直すと思いますので気になる方は確認してみてください。

【Rails】Font Awesomeの使い方

はじめに

Font Awesomeというサービスを知っているでしょうか?Webアイコンを使用したいときにちょうど良いサービスです。
f:id:PafuOfDuck:20180106233504p:plain

今回はこのサービスの導入〜使用までを紹介したいと思います。
注意:Railsでの導入方法です。Rails以外ではこの方法は使えません。

導入〜使用方法

  1. Gemfileにfont-awesome-railsを追加する
    gem 'font-awesome-rails'のように記述してください。

  2. bundle installを実行

  3. app/assets/stylesheets/application.css*= require font-awesomeを追加
    デフォルトで大量にコメントアウトされている箇所に記述してください。

    --参考画像--
    f:id:PafuOfDuck:20180106234308p:plain

  4. html内に<i class="fa fa-twitter" aria-hidden="true"></i>を記述
    これで、アイコンが表示されるはずです。

今回の例ではTwitterのアイコンが表示されます。他のアイコンが使用したい方は公式サイトから好きなアイコンのページに飛んで、用意されているコードを使用しましょう。

おわり

RailsはFont Awesomeの導入がとても簡単なので、是非使用しましょう!

プロver.もありますので気になる方はご確認を。では〜。

【Rails】uninitialized constant hogeController というエラーが出たときに確認すること

はじめに

タイトルにも書きましたが、uninitialized constant hogeControllerというエラーが出たときに確認すると良い事柄をまとめていく記事です。

確認すべき事項

  • コントローラのファイル名とクラス名が一致しているか
    ファイル名がhoges_controller.rbであるにも関わらずファイル内で定義しているクラス名がHogeControllerであればエラーが出ます。

  • route.rbに定義したコントローラ名/アクション名が正しいか
    hoges#actionと書くべきところをhoge#actionと書いてしまうとエラーが出ます。

おわり

他のエラーパターンが見つかり次第追記しますー。

【Rails】画像を表示する方法

はじめに

今回はサイトに画像を表示する方法です。
htmlだと

<img src="sample.jpg" alt="画像説明">

と書きますね。

では、Railsではどのように書くのかというお話です。

Railsでの書き方

『百聞は一見にしかず』ということでコードをペタッと。

<%= image_tag "sample.png", :alt => "画像説明" %>

これではじめにの箇所で紹介したhtmlのコードと同じ働きとなります。

オプション

せっかくなので一つだけオプションを紹介しておきます。

  • 画像のサイズを指定
    :size => "16x16"

使用上の注意としては掛け算の部分が英字の"x"である点ですね。

その他のオプションはこちらからどうぞ。

おわり

%= %を忘れないようにしてくださいね!では〜。