• Xin

Keras で学習させたモデルを Unity 上で実行する(1)

 こちらの記事は「Deep Learning を勉強して、 Google colab 上でなら Keras を使って自分でモデルを作れるようになった……なったのはいいけれど、作ったモデルを Unity に組み込んで実行するには、一体どうすればいいのだろう」とお悩みの方向け(ピンポイントすぎる)の解説記事となります。つまりかつての私向けの記事です。


 最終的なゴールは、以下の画像のような感じです。

 エディター上で数字を手書きしたら、手書きした数字を識別して表示するプログラムです。


 まず、前提知識として、Deep Learning で学習したモデルを使って、新しいデータから出力を得ることを「推論」といい、その推論をおこなうことに特化したライブラリなどを「推論ライブラリ」や「推論エンジン」と呼ぶそうです。英語では inference engine ですね。これを知っているだけでも、自分でググって調べる難易度がだいぶ下がると思います。

 有名どころだと、

・TensorFlowLight:TensorFlow モデルを C++ で実行するためのライブラリ

・WinML:Microsoft による Windows 用 API

・CoreML:Apple による iOS 用ライブラリ

などがあるそうです。


 学習済みのモデルを使った推論を Unity 上で実行するには、Barracuda という公式の推論エンジンを使用します。

 ただし、Unity の推論エンジン周りの技術はちょうど過渡期※1にありまして、この Barracuda という推論エンジンも現在プレビュー版のため、今後仕様が大きく変わる可能性もあります。その点はご注意ください。


※1:ml-agents という Unity の強化学習用 Toolkit では、少し前まで TensorFlowSharp という推論エンジンが使われていました。しかし、この推論エンジンは一部のプラットフォームでは動作しないという課題がありました。Unity はマルチプラットフォーム対応を謳うゲームエンジンなので、それでは困ります。また TensorFlowSharp はサードパーティ製エンジンであるため、Unity との高い統合性を実現するには困難がありました。そこで、マルチプラットフォームに対応し、かつ Unity との高い統合性を可能にする推論エンジンを実現するために Unity が公式で推論エンジンの開発に乗り出しました。それが Barracuda です。このあたりの経緯は Unity Blog に記載されています。

https://blogs.unity3d.com/jp/2019/03/01/unity-ml-agents-toolkit-v0-7-a-leap-towards-cross-platform-inference/


 ちなみに、Barracuda では ONNX フォーマットのモデルの使用が推奨されており、Keras で学習させたモデルを使うにはひと手間かかる上に、一部使えない層が存在します(Dropout 層など)。


 ですので、Deep Learning 対応の GPU をお持ちの皆さんで、これから Deep Learning を学習される方は、Keras ではなく、PyTorch あたりを使われると良いと思います。

 私も最近つよつよ GPU を購入したので、これから PyTorch を勉強しようと思っています。


 話がそれましたが、ここまでの話を簡単にまとめると、Keras で学習したモデルを Unity で使用するには、大まかに以下の手順を踏む必要があるということになります。

・Keras で学習させたモデルを Barracuda で使用できるかたちに変換する

・Unity プロジェクトに Barracuda を導入し、学習したモデルを使って推論を実行する


 まずは、Keras で学習させたモデルを Barracuda にて使用できるかたちに変換する方法について説明します。


Keras で学習させたモデルを Barracuda にて使用できるかたちに変換する


 Keras で学習させたモデルを Barracuda にて使用できるかたちにするには、大まかに以下の手順を踏みます。


・Keras で学習させたモデルを TensorFlow フォーマットのモデルに変換

・TensorFlow フォーマットのモデルを「.pb」ファイルとして出力

・「.pb」ファイルを Barracuda にて使用できる「.nn」ファイルに変換

・「.nn」 ファイルを Unity にインポート


 順に見ていきましょう。


 まずは、Keras で学習させたモデルを TensorFlow フォーマットのモデルに変換し、「.pb」ファイルとして出力します。


 こちらにサンプルのノートブックをご用意しました。

https://colab.research.google.com/drive/1wYP2kGEu6K6vmytO_0JEkakIt-OyLVbv


 サンプルを見ていただくと分かりますが、モデルを作成し、学習させるところまでは特に難しいことはやっていません。

 注意点として、Barracuda では対応していない層があることが挙げられます。

 こちらのマニュアルの「Approximate list of TensorFlow nodes supported by Barracuda script converter」にて対応済みの層の一覧が確認できます。

https://docs.unity3d.com/Packages/com.unity.barracuda@0.3/manual/index.html


 Keras から学習させたモデルを TensorFlow フォーマットのモデルに変換するコードは、偉大なる先駆者様である @yanosen_jp 様の記事を参考にさせていただきました。

https://qiita.com/yanosen_jp/items/4a35f31831b7f7b5d0cd


 TensorFlow フォーマットのモデルを、「.pb」ファイルに保存したら、Google Colab 側での作業は完了です。


 次に、「.pb」ファイルを Barracuda で使用できる「.nn」ファイルに変換します。

 変換には Barracuda が公式に用意している変換スクリプト「tensorflow_to_barracuda.py」を利用します。

 このスクリプトを利用するために、まずは Unity プロジェクトに Barracuda をインポートします。


Barracuda の導入


 基本的に公式ドキュメントに沿った形で作業を進めていきます。ドキュメントはこちらにあります。

https://docs.unity3d.com/Packages/com.unity.barracuda@0.3/manual/index.html


 また、サンプルプログラムをこちらにご用意しました。

https://github.com/XinGames/BarracudaSample

サンプルプログラムの作成には Unity 2019.3.0f1を使用しています。


 まず、Barracuda をプロジェクトで使えるようにするには、Unity Package Manager を使用する方法と、GitHub から取得する方法の2通りのやり方があります。

 今回は GitHub から取得する方法を利用します。


 プロジェクトフォルダ下の

Packages > manifest.json ファイルの中の、「dependencies」という項目に、以下の項目を追加します。

"com.unity.barracuda" : "https://github.com/Unity-Technologies/barracuda-release.git"


 そうすると、次にプロジェクトを開いたときに Unity Package Manager によるパッケージの管理が走り、barracuda が自動でインポートされます(プロジェクトを開いていた場合は即時にインポートが自動で走ります)。


 これで、Barracuda が使えるようになりました。


「.pb」ファイルを「.nn」ファイルに変換する


 肝心の変換スクリプトのありかですが、GitHub 経由で Unity プロジェクトに Barracudad をインポートすると、

プロジェクトフォルダ > Library > PackageCache の下に

「com.unity.barracuda@適当な文字列」というフォルダが作成されていて、

その下の Tools というフォルダに「tensorflow_to_barracuda.py」ファイルが用意されています。これが変換スクリプトになります。

 「.py」拡張子であることから、実行には Python が必要なことが分かります。

 Windows 上で Python を動作させるには、様々な方法がありますが、ここでは簡単に Python 環境を構築できる Anaconda を利用します。

 Anaconda の公式ページは以下になります。

https://www.anaconda.com/

 インストール方法や使い方については、多くの方がまとめてくださっているので、本記事では説明を省略します。ググってください。


 さて、環境を構築するにあたって、実行に必要な Python のバージョンとパッケージを確認する必要があります。


 まず、Python のバージョンからです。

 変換スクリプトと同じフォルダにある「run-in-docker.sh」※2の中身を見ると動作に必要な Python のバージョンは3であることが分かります。


※2:多分 Barracuda の作者様は Docker で動作させることを想定されていたのだと思いますが、面倒なので無理矢理 Anaconda で実行しちゃいます。


 同様に、変換スクリプトと同じフォルダにある「requirements.txt」の中身を見ると動作に必要なパッケージが分かります。

・numpy Ver.1.16.4

・tensorflow Ver.1.14.0

・onnx Ver.1.2.2

・h5py Ver.2.8.0

・Keras Ver.2.1.6


 ただし、今回 onnx ファイルは使わないので、onnx はインポートしなくても大丈夫です(インポートしようとしてもエラーが出ると思います)。


 これで、変換スクリプトを実行する上で必要な要素は

・Python 3

・numpy Ver.1.16.4

・tensorflow Ver.1.14.0

・h5py Ver.2.8.0

・Keras Ver.2.1.6

であることが分かりました。これらを導入した環境を構築していきます。


 まず、Anaconda Navigator を開いて Python 3 が使える仮想環境を作ります。

 ここでは「Barracuda」という名前の仮想環境を作成しました。


 次に、この仮想環境に必要なパッケージをインストールしていきます。


 Anaconda Prompt を開き、

activate Barracuda

コマンドで、仮想環境を起動します。


 次に以下のコマンドを順に実行していき、必要なパッケージをインストールします。

pip install numpy==1.16.4

pip install tensorflow==1.14.0

pip install h5py==2.8.0

pip install Keras==2.1.6

 これで、変換スクリプトを使用する準備ができました。


 変換スクリプトを使用する前に、変換したい「.pb」ファイルを変換スクリプトがあるフォルダに移動させます。ちなみに、今回変換するファイルの名前は「saved_model.pb」になります。


 「.pb」ファイルの準備ができたら、Anaconda Prompt の作業ディレクトリを変換スクリプトがあるフォルダに移動させます。

cd 【変換スクリプトがあるフォルダへの絶対パス】

で、そのフォルダに移動することができます。


 移動できたら、以下のコマンドを実行します。

python tensorflow_to_barracuda.py saved_model.pb saved_model.nn

 「saved_model.nn」という名前のファイルが生成されていれば、変換は成功です。


 最後に、以下のコマンドを実行して、起動中の仮想環境を終了させます。

conda deactivate


学習済みモデルのインポート


 Tensorflow から変換した学習済みモデルのインポート先はデフォルトで決まっています。

 Assets フォルダの直下に「StreamingAssets」フォルダを作成し、そこに学習済みのモデルをインポートします。

「.nn」ファイルは、他のアセット同様、エディター上にドラッグ & ドロップするだけでインポートすることができます。


 これで、Keras で学習させたモデルを Unity 上で実行させる準備が整いました。

 次の記事で Unity 上での実行方法について説明します。

36回の閲覧

XIN GAMES © 2019

  • Twitter Social Icon