はじめに
今回は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
は推論だけでなく、モデルの構築・訓練までできるより汎用的なものだったようです。
うっかり。