はじめに
今回はML.NETというマイクロソフトが作成している機械学習ライブラリをUnityで利用してみようという記事になります。
ML.NET を使用すると、オンラインまたはオフラインのどちらのシナリオでも、.NET アプリケーションに機械学習を追加できます。 この機能により、データを使う自動予測をアプリケーションに利用できるようになります。 機械学習アプリケーションでは、明示的なプログラミングを必要とする代わりに、データ内のパターンを利用して予測を行います。
ML.NET の中心となるのは、機械学習モデルです。 このモデルでは、入力データを予測に変換するために必要な手順が指定されます。 .ML.NET を使用すると、アルゴリズムを指定してカスタム モデルをトレーニングすることができます。または、事前トレーニング済みの TensorFlow および ONNX モデルをインポートすることもできます。
モデルを用意したら、それをアプリケーションに追加して予測を行うことができます。

環境
Unity2020.3.32f1
ML.NET v1.7.1
dllの取得
NuGetForUnityというUnity用のNuGetクライアントがあるのですが、経験上うまくいったことが少ないのでVisual StudioのNuGetから取ってきてUnityに入れます。
github.com
Visual Studioを立ち上げ、TargetPlatformを.NET Framework4.72のコンソールアプリケーションを作成します。

後はNuGetからML.NET v1.7.1をインポートし、x64・x84それぞれでビルドを行います。



Unityにdllをインポート
先程取得したdllにインポートします。
ここで注意してほしいのは、x84のdllとx64のdllはそれぞれUnityのインスペクターのPlatformSettingsで設定を行う必要があります。


サンプルコード
まずはドキュメントに記載されている簡単なサンプルコードを実行してみます。
using Microsoft.ML; using Microsoft.ML.Data; using UnityEngine; public class Test : MonoBehaviour { private void Start() { MLContext mlContext = new MLContext(); // 1. Import or create training data HouseData[] houseData = { new HouseData() { Size = 1.1F, Price = 1.2F }, new HouseData() { Size = 1.9F, Price = 2.3F }, new HouseData() { Size = 2.8F, Price = 3.0F }, new HouseData() { Size = 3.4F, Price = 3.7F } }; IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData); // 2. Specify data preparation and model training pipeline var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" }) .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100)); // 3. Train model var model = pipeline.Fit(trainingData); // 4. Make a prediction var size = new HouseData() { Size = 2.5F }; var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size); Debug.Log($"Predicted price for size: {size.Size * 1000} sq ft= {price.Price * 100:C}k"); // Predicted price for size: 2500 sq ft= $261.98k } } public class HouseData { public float Size { get; set; } public float Price { get; set; } } public class Prediction { [ColumnName("Score")] public float Price { get; set; } }

ひとこと
ML.NETを利用しようと思った目的がonnxを使って推論することだったのですが、どうやらそれはMicrosoft.ML.OnnxRuntimeだけで良かったみたいですね。
github.com
ML.NETは推論だけでなく、モデルの構築・訓練までできるより汎用的なものだったようです。
うっかり。