Yusuke Saitoの雑記

センサー類, Python, Unity(C#), Unreal Engine, 機械学習とかについてのメモ

HoloLens2でWindows.AI.MachineLearningを使って手の動作認識を行う

はじめに

昨年7月にHoloLensMeetupで発表した手の動作認識では、機械学習のライブラリとしてOpenCVForUnityを用いていました。 画像処理の機能が使える反面、OpenCVForuUnityを使用する場合だとライセンス料がかかってしまう、という欠点があります。

そこで、HoloLens2でWindows.AI.MachineLearningを使って手の動作認識をしてみました。 UWP標準の機能を用いることで、特別にライセンス料などのコストをかけることがなく機械学習を用いることができます。

youtu.be

コードはGithubに上げてあります。 ポイントをいくつか挙げて解説していきます。

Github github.com

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を設定してあげる必要があります。

f:id:stopengin0012:20210210031731p:plain

.onnxファイルを有効にする

また、(結構忘れそうな事項として)onnx拡張子のファイルへの参照を有効にします。 下記の図のように、サポートされるファイルの種類に「.onnx」を指定してください。

f:id:stopengin0012:20210210031839p:plain

ロードしたモデルを利用する

基本的には、先日の記事で実行確認した時と同じです。 入力を合わせることに注意してください。

... (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