【Unity】UnityでOnnx Runtimeを使ってMNISTの手書き文字認識をする
Unityの公式でOnnxを使用できるようになりました.
ディープラーニングで学習したOnnx形式のモデルをUnityで使う方法を説明します.
Onnx形式のモデルをUnityで使用するには,
- Onnx Runtime
- OpenCVSharp
が使えそうですが,今回はOnnx Runtimeを使用したいと思います.
Unityのバージョンは2019.3.1fを使用しています.
SampleとしてMnistの手書き文字認識をしています.
ONNX Runtime
Microsoftがオープンソースで公開しているクロスプラットフォームで高性能を目指している推論エンジンです.ONNXとはtensorflowやpytorchなどのフレームワークに依存しない,DeepLearningモデルのフォーマットです.
ONNXをUnityで使用するには以下のdllをUnityのPluginsフォルダに入れる必要があります.
Microsoft.ML.OnnxRuntimeはc#でonnx runtimeを使うためのラッパーで,その他のdllは依存パッケージです.NugetのパッケージをUnityで使用するには,ダウンロードした.nupkgファイルを.zipにリネームして解凍して,その中にあるdllをPluginsフォルダに入れる必要があります.詳細は
Unity で.NET 4.x を使用する - Visual Studio | Microsoft Docs
libonnxruntimeはダウンロードするとlibonnxruntime.1.1.2.dylibのような名前になっています,1.1.2の部分を削除しないとエラーになるので,リネームしてlibonnxruntime.dylibをPluginsに入れます.自分の環境ではdylibのままで読み込めましたが,読み込みできないこともあるようです?
Unity x C++プラグインの連携【Windows/OSX】 - tecotec_engineer’s blog
ONNX
今回はMNISTの手書き文字認識のONNXモデルを使用して推論します.今回はgithubに上がっているモデルを使用します.
https://github.com/onnx/models/tree/master/vision/classification/mnist
model.onnxファイルをAssetsフォルダに入れます.
推論
推論部分のソースコードは長くないです.ONNXをロードをして,ONNXの入力の次元に合わせた,今回のMnistなら28x28の画像が入力なので,float[784]の配列を変換したものを関数に渡せば,推論できます.
ONNX Runtimeの詳しい使い方は
onnxruntime/CSharp_API.md at master · microsoft/onnxruntime · GitHub
推論部分のソースコード
手書き文字
Physics.Raycastを飛ばして,当たったオブジェクトのuv座標を取得して,対応する場所のtextureの色を書き換えることで文字を書いています.