はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】ML.NETを利用をしてUnityで機械学習を行ってみる

はじめに

今回はML.NETというマイクロソフトが作成している機械学習ライブラリをUnityで利用してみようという記事になります。

ML.NET を使用すると、オンラインまたはオフラインのどちらのシナリオでも、.NET アプリケーションに機械学習を追加できます。 この機能により、データを使う自動予測をアプリケーションに利用できるようになります。 機械学習アプリケーションでは、明示的なプログラミングを必要とする代わりに、データ内のパターンを利用して予測を行います。

ML.NET の中心となるのは、機械学習モデルです。 このモデルでは、入力データを予測に変換するために必要な手順が指定されます。 .ML.NET を使用すると、アルゴリズムを指定してカスタム モデルをトレーニングすることができます。または、事前トレーニング済みの TensorFlow および ONNX モデルをインポートすることもできます。

モデルを用意したら、それをアプリケーションに追加して予測を行うことができます。

docs.microsoft.com

サンプルコードをUnityで動作させてみた様子

環境

Unity2020.3.32f1
ML.NET v1.7.1

dllの取得

NuGetForUnityというUnity用のNuGetクライアントがあるのですが、経験上うまくいったことが少ないのでVisual StudioNuGetから取ってきてUnityに入れます。
github.com


Visual Studioを立ち上げ、TargetPlatform.NET Framework4.72のコンソールアプリケーションを作成します。

TargetFrameworkがnuget471

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

NuGetパッケージの管理
x64, x84でそれぞれビルド
出力された中身

Unityにdllをインポート

先程取得したdllにインポートします。

ここで注意してほしいのは、x84dllx64dllはそれぞれUnityのインスペクターのPlatformSettingsで設定を行う必要があります。

Platform settingsを設定

サンプルコード

まずはドキュメントに記載されている簡単なサンプルコードを実行してみます。

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

うっかり。