ゆにてく備忘録

Unityやその他学んだ事を忘れないために書くぶろぐ

【Unity】UnityでOnnx Runtimeを使ってMNISTの手書き文字認識をする

Unityの公式でOnnxを使用できるようになりました.

unitech.hatenablog.com

 

ディープラーニングで学習したOnnx形式のモデルをUnityで使う方法を説明します.

Onnx形式のモデルをUnityで使用するには,

  • Onnx Runtime
  • OpenCVSharp

が使えそうですが,今回はOnnx Runtimeを使用したいと思います.

Unityのバージョンは2019.3.1fを使用しています.

SampleとしてMnistの手書き文字認識をしています.

f:id:n_taku:20200229141158g:plain

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

f:id:n_taku:20200229111950p:plain

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フォルダに入れます.

f:id:n_taku:20200229114045p:plain

推論

推論部分のソースコードは長くないです.ONNXをロードをして,ONNXの入力の次元に合わせた,今回のMnistなら28x28の画像が入力なので,float[784]の配列を変換したものを関数に渡せば,推論できます.

ONNX Runtimeの詳しい使い方は

onnxruntime/CSharp_API.md at master · microsoft/onnxruntime · GitHub

推論部分のソースコード

MnistInference.cs

UnityでOnnx Runtimeを使ってMnistの手書き文字認識をする

--------

手書き文字

Physics.Raycastを飛ばして,当たったオブジェクトのuv座標を取得して,対応する場所のtextureの色を書き換えることで文字を書いています.

ソースコード

Physics.Raycastを飛ばして,当たったオブジェクトのuv座標を取得して,対応する場所のt ...

--------

Sample

f:id:n_taku:20200229141158g:plain

github.com

参考

Unityでディープラーニングする方法調べた - Qiita

Unityでテクスチャにお絵描きしよう - おもちゃラボ