MRが楽しい

MRやVRについて学習したことを書き残す

Unity AIのドキュメントを読む その38(推論エンジンのワークフローを理解する)

本日はUnityの技術調査枠です。
Unity AIのドキュメントを読みながら実際に操作を試して記事に残します。

Unity AI

以下のUnity AIのドキュメントを試しながら実行時のキャプチャをしていきます。
docs.unity3d.com

推論エンジンのワークフローを理解する

Unityで推論エンジンを使用してニューラルネットワークを実行するには以下の手順を実施します。

1. Unity.InferenceEngine 名前空間を使用します。
2. ニューラルネットワークモデルファイルを読み込みます。
3. モデルの入力を作成します。
4. 推論エンジン(ワーカー)を作成します。
5. 入力を使用してモデルを実行し、結果(推論)を計算します。
6. 結果を取得します。

Unity.InferenceEngine名前空間を使用する

スクリプトの先頭に以下のように Unity.InferenceEngine 名前空間を記述します。

using Unity.InferenceEngine;

モデルのロード

推論エンジンはOpen Neural Network Exchange (ONNX) 形式のモデルファイルをインポートできます。
モデルをロードするには以下の手順を実施します。

1. 機械学習フレームワークからモデルをONNX形式にエクスポートするかインターネットからONNXモデルをダウンロードします。
2. モデルファイルをプロジェクトウィンドウのAssetsフォルダに追加します。
3. スクリプト内でランタイムモデルを以下のように作成します。

ModelAsset modelAsset = Resources.Load("model-file-in-assets-folder") as ModelAsset;
var runtimeModel = ModelLoader.Load(modelAsset);

ゲームオブジェクトに public ModelAsset modelAsset をpublic変数として追加することもできます。
この場合はモデルを手動で指定してください。

モデルへの入力を作成する

Tensor APIを使用してモデルのデータを含むテンソルを作成します。
以下のように配列またはテクスチャをテンソルに変換できます。

// Convert a texture to a tensor
Texture2D inputTexture = Resources.Load("image-file") as Texture2D;
Tensor<float> inputTensor = new Tensor<float>(new TensorShape(1, 4, inputTexture.height, inputTexture.width));
TextureConverter.ToTensor(inputTexture, inputTensor);
// Convert an array to a tensor
int[] array = new int[] {1,2,3,4};
Tensor<int> inputTensor = new Tensor<int>(new TensorShape(4), array);

推論エンジン(ワーカー)を作成する

ワーカーを作成すると、モデルを実行可能なタスクに分割して中央処理装置(CPU)メモリまたはグラフィックス処理装置(GPU)上でタスクを実行して結果を取得できます。
例えば、以下のコードは推論エンジンのコンピュートシェーダーを使用してGPU上で実行されるワーカーを作成します。

Worker worker = new Worker(runtimeModel, BackendType.GPUCompute);

モデルのスケジュール設定を行う

モデルを実行するにはワーカーオブジェクトのScheduleメソッドに入力テンソルを渡します。

worker.Schedule(inputTensor);

推論エンジンは指定されたバックエンド上でモデルレイヤーをスケジュールします。
処理は非同期であるため、この呼び出し後も一部のテンソル演算が実行中である可能性があります。

出力を取得する

PeekOutputなどのメソッドを使用して、以下のようにモデルから出力データを取得できます。

Tensor<float> outputTensor = worker.PeekOutput() as Tensor<float>;