とある大学生の勉強メモ

バカでもいいじゃない,子供でもいいじゃない.

"ModelGenがNull" UWP(C#,Visual Studio2019)でopset≧10,format version≧6のonnxモデルを読み込むときの対処

環境
Windows10 2004 OSビルド19041,1052
onnx opset = 11
onnx format version = 6
Visual Studio 2019

問題

Pytorchで作成したonnxをVisual Studio(C#)で動かすチュートリアルを試していた.

github.com

こちらのWindows-Machine-Learning-master\Samples\Tutorial Samples\MLNET and Windows ML
が今回の主人公である.

実行すると, f:id:amakazeryu:20210703144057p:plain NullReferenceExceptionを頂戴したときのおはなし.

調べると読み込んだはずのModelがNullとなっている.
f:id:amakazeryu:20210702145134p:plain
理由はonnxを作成したときのformat versionopsetの違いである.
NugetのライブラリやOSのバージョンによっては対応していないopsetとformat versionがある.
こちらのエラーメッセージもvisual studio2019のコンソールに表示される筈.   WinRT Failed to load model with error: Unknown model file format version.

解決策

NugetパッケージでMicrosoft.AI.MachineLearning 1.8.0を入れて,
f:id:amakazeryu:20210702145914p:plain MainPagexaml.csとMNIST.cs(モデルのラッパーファイル)の両方で,
using Windows.AI.MachineLearningをコメントアウトし,
using Microsoft.AI.MachineLearning;を入れる. f:id:amakazeryu:20210702150009p:plain

Windows.AIとMicrosoft.AIは各種変数の名前が同じなので競合します.
ですのでwindowsの方を消しましょう.

補足

onnxの各バージョンの確認をするにはこちらのNetronを使うのが手っ取り早い github.com

モデルを読み込んだら赤丸でopsetとformat versionをチェックできる

f:id:amakazeryu:20210702145604p:plain

確認欄は下図のかんじ.

f:id:amakazeryu:20210702145744p:plain
MNIST.onnx
こちらのformat versionと,Importsのai.onnx v○○の○○がopsetに相当している.

MLNET and Windows ML にあるonnxモデルは

f:id:amakazeryu:20210703144316p:plain
bestModel.onnx
となっており,opset=9,format version = 6で,windows.AIでは読み込めない.

UWPの知見と人材が少なすぎて泣けてくる.