Custom Vision の WinML モデル Export を利用した ユニバーサル Windows アプリ の開発

[English Ver]
Cognitive Services Custom Vision Service は 画像分類 および 物体認識を行う ML (機械学習) モデル を数枚の写真から作成できるサービスです。作成した ML モデルは Web API として利用できるだけでなく、アプリ等で利用できる形でダウンロードすることも可能です。これにより、Web API ではなく、ローカルの環境で (=インターネット接続なしで) Custom Vision を利用できることになります。

ONNX 形式で定義された WinML を利用すると、ユニバーサル Windows  アプリ (UWP: Universal Windows App) に MLモデルによる分析機能を簡単に追加することが可能です。

Custom Vision Service を用いて WinML フォーマットの ML モデルを作成するには、Custom Vision Service の新規 Project 作成で、"compact" タイプの Domain を選択する必要があります。作成済みの Project でも、設定で Domain Type を compact に変更し、再度 Train を行うことでモデルを再作成可能です。

"compact" タイプのモデルを作成、学習が完了すると、"export" ボタンから ML モデルをダウンロード可能になります。"WinML" を選択すると、"*.onnx" という形式のファイルがダウンロードできます。

Visual Studio 2017 に加えて  Visual Studio Tools for AI (無償) をインストールすると、 Visual Studio プロジェクトに ONNX ファイルを追加するだけで、それを利用するためのライブラリが自動で作成されます。Custom Vision Service 上の認識番号でクラスが作成させているため、名前を変更してみると分かりやすくなります。

自動作成されたライブラリは Windows.AI.MachineLearning というライブラリを使用ししており、LearningModel を作成して (CreateXXXXXModel)、EvaluateAsync メソッドで投入された ModelInput を判定して、ModeOutput を出力します。この ModelInput は Video Frame 型になります。

"FruitDetection.onnx" という名前の ONNX モデルを呼び出すサンプルコードはこちら;

[csharp]
private async Task EvaluateVideoFrameAsync(VideoFrame inputFrame)
{
if (inputFrame != null)
{
try
{
// Get ONNX file
string modelPath
= Path.Combine(Windows.ApplicationModel.Package.Current.InstalledLocation.Path, "FruitDetection.onnx");
var modelFile = await StorageFile.GetFileFromPathAsync(modelPath);

// Create WinML Model
var model = new FruitDetectionModel();
var learninModel = await model.CreateFruitDetectionModel(modelFile);

// Set image(VideoFrame)
var input = new FruitDetectionModelInput
{
data = inputFrame
};

// Detect image
var output = await learninModel.EvaluateAsync(input);

ResultText.Text = output.classLabel[0];
ResultText.Visibility = Visibility.Visible;
}
catch(Exception ex)
{
}
}
}
[/csharp]

FruitDetection.onnx は Custom Vision Service から以下のようにフルーツの種類を判別するモデルです。

こちらを利用して、以下のようにローカルの写真を選択して判別を行う UWP アプリ (ソースコード) を作成できます。