はじめに
昨年7月にHoloLensMeetupで発表した手の動作認識では、機械学習のライブラリとしてOpenCVForUnityを用いていました。 画像処理の機能が使える反面、OpenCVForuUnityを使用する場合だとライセンス料がかかってしまう、という欠点があります。
そこで、HoloLens2でWindows.AI.MachineLearningを使って手の動作認識をしてみました。 UWP標準の機能を用いることで、特別にライセンス料などのコストをかけることがなく機械学習を用いることができます。
コードはGithubに上げてあります。 ポイントをいくつか挙げて解説していきます。
Windows.AI.MachineLearningとは?
https://docs.microsoft.com/ja-jp/windows/ai/
Microsoft公式のWindowsアプリに機械学習を実装を行うことができます。UWPアプリにも対応しています。
動作認識モデル(onnxファイル)の準備
モデルファイルは下記を参考にしてください stopengin0012.hatenablog.com
HoloLens上で動作認識モデル(onnxファイル)をロードする
Capabilityの設定
アップしたコード上では、HoloLens実機のピクチャフォルダ以下を参照するようにしています。
private string dirName = "HandGestureModel"; private string fileName = "handgesture_v001.onnx"; private async Task LoadModelAsync() { #if WINDOWS_UWP var dir = await KnownFolders.PicturesLibrary.GetFolderAsync(dirName); var file = await dir.GetFileAsync(fileName); // モデルのロード handGestureModelGen = await HandGestureModel.CreateFromStreamAsync(file as IRandomAccessStreamReference); if (handGestureModelGen == null) { Debug.LogError("モデルデータの読み込みに失敗しました. "); } #endif }
したがって、下記図に示すように、ビルド時にCapabilityを設定してあげる必要があります。
.onnxファイルを有効にする
また、(結構忘れそうな事項として)onnx拡張子のファイルへの参照を有効にします。 下記の図のように、サポートされるファイルの種類に「.onnx」を指定してください。
ロードしたモデルを利用する
基本的には、先日の記事で実行確認した時と同じです。 入力を合わせることに注意してください。
... (using参照) #if WINDOWS_UWP using Windows.AI.MachineLearning; using Windows.Storage; using Windows.Storage.Streams; #endif ... private async Task<string> RecognizeGesture() { #if WINDOWS_UWP ... float[] data = ReadToFloatArray(handJointController.handGestureData); handGestureInput.Input120 = TensorFloat.CreateFromArray(new long[] { 1, columns * frameCount }, data); //Evaluate the model var handGestureOutput = await handGestureModelGen.EvaluateAsync(handGestureInput); IList<string> stringList = handGestureOutput.label.GetAsVectorView().ToList(); //Debug.Log($"判定された動作ラベル:{stringList[0]}"); //IL2CPP 確認用 var label = stringList[0]; return label; #endif }
おわりに
HoloLens2でWindows.AI.MachineLearningを使って手の動作認識を実装しました。 その上で気をつけるポイントをいくつかまとめました。
追記
昨年7月のスライドです
www.slideshare.net