【Unity】ML.NETの機械学習モデルをUnityに組み込む方法を紹介します!
ML.NETを利用して機械学習モデルをUnityに組み込む方法を紹介します。今回はML.NETのチュートリアルをUnity上で再現してみたいと思います。
https://dotnet.microsoft.com/ja-jp/learn/ml-dotnet/get-started-tutorial/intro
チュートリアルの概要
ローカルビジネスレビューサイトYelpのレビューを元にML.NETの機械学習モデルで学習して任意のレビューが肯定的なのか、あるいは否定的なのかを推測するチュートリアルとなっています。
レビューデータは UCI Machine Learning Repository からダウンロードできます。
sentiment_labelled_sentences.zipファイルを解凍してyelp_labelled.txtを学習データとして使います。中身は各レビューに対して1と0が割り振られていて1が肯定的なレビュー、0が否定的なレビューとなっています。
Wow... Loved this place. | 1 |
Crust is not good. | 0 |
Not tasty and the texture was just nasty. | 0 |
Stopped by during the late May bank holiday off Rick Steve recommendation and loved it. | 1 |
The selection on the menu was great and so were the prices. | 1 |
1000個のレビューを学習したモデルが任意のレビューを推測することになります。
機械学習モデルの作成
Visual Studioで機械学習モデルをプロジェクトに追加して動的リンクライブラリ(DLL)を作成します。このDLLをUnityへインポートして使います。
ML.NETモジュールをインストールする
Visual Studio Installerを起動してML.NET Model Builderモジュールをインストールします。
クラスライブラリプロジェクトを作成する
クラスライブラリ(.NET Framework)を選択します。
フレームワークには .NET Framework 4.x 番台を使います。今回は4.7.2を利用します。
機械学習モデルの追加
プロジェクトへ機械学習モデルを追加します。
SentimentModel.mbconfigという名前で作成します。
データ分類シナリオを選択
シナリオタブでデータ分類シナリオを選択します。
トレーニング環境の選択
環境タブでトレーニングの環境にローカル(CPU)を選択します。
サンプルデータの追加
データタブで入力に先程ダウンロードしておいたYelpのレビューデータを設定し、予測する列(ラベル)にcol1を選択します。
トレーニングする
トレーニングタブでトレーニングする時間を60秒にしてトレーニングを開始します。
60秒待って正しくトレーニングが終了したことを確認します。
トレーニング結果の評価
評価タブでcol0に任意のレビューをコピーして予測ボタンを押して結果を確認して下さい。
モデルの使用
使用タブでコードスニペットをコピーします。コピーしたコードはUnityのスクリプトで使います。
ビルド前の確認
SentimentModel.mbconfig内のSentimentModel.mlnetのプロパティ「出力ディレクトリにコピー」が「新しい場合はコピーする」になっていることを確認して下さい。「コピーしない」になっている場合はビルドディレクトリーにmlnetファイルが生成されないので注意して下さい。
SentimentModel.mbconfig内のSentimentModel.consumption.csとSentimentModel.training.csのプロパティ「ビルドアクション」が「コンパイル」になっていることを確認して下さい。「なし」になっている場合はDLLの中にモデルビルダーが生成したプログラムコードがビルドされませんので注意して下さい。
ビルド設定
アクティブな構成をReleaseにしてプロジェクトの設定のビルド項目の対象プラットフォームをx64にします。
機械学習モデルのビルド
ビルドしてbin/ReleaseにDLLとSentimentModel.mlnetが生成されたことを確認して下さい。
次の章ではこれらのデータをUnityへ組み込む方法を紹介します。
ビルドした機械学習モデルをUnityへ組み込む
ビルドした機械学習モデル(DLL)をUnityへ組み込みます。
プロジェクトの作成
適当なUnityプロジェクトを作成します。
DLLの追加
Assets以下へビルドした全てのDLLをコピーします。
Newtonsoft.Json.dllで競合エラーが発生します。
パッケージマネージャーを開いてVersion Controlを削除します。
DLL関係でエラーが出力されないことを確認して下さい。
機械学習データをコピーする
SentimentModel.mlnetファイルをプロジェクトのルートへコピーします。
スクリプトの作成
先程コピーしておいたコードスニペットをStartメソッドへ貼り付けます。result.PredicatedLabelに推測結果が格納されていますので1の場合は肯定的、0の場合は否定的とログ表示します。
using MyMLApp;
using UnityEngine;
public class MLTest : MonoBehaviour
{
void Start()
{
//Load sample data
var sampleData = new SentimentModel.ModelInput()
{
Col0 = @"Crust is not good.",
};
//Load model and predict output
var result = SentimentModel.Predict(sampleData);
Debug.Log(sampleData.Col0 + (result.PredictedLabel == 1 ? "は肯定的です" : "は否定的です"));
}
}
シーンの作成
適当なゲームオブジェクトを作成して先ほどのスクリプトを追加します。
シーンの実行
実行して Crust is not good. は否定的なレビューであることを確認します。
続いてレビュー文から not を消してもう一度実行して下さい。
Crust is good. は肯定的なレビューになることを確認します。
まとめ
UnityにML.NETを組み込む方法を紹介しました。ML.NETは多くのライブラリに依存しているためUnityにインポートするとライブラリの競合が発生する場合があります。今回はVersion Controlを削除することでNewtonsoft.Json.dllの競合を回避しましたが、他にも色々なパッケージを利用すると競合を回避できない状況に陥ることがあります。ですので無理にUnityへインポートするのではなく、機械学習用のサーバーを立てて通信する方法をオススメします。
機械学習ライブラリML.NETをUnityに組み込む方法を紹介しました。
今やAIをはじめ機械学習プログラム全盛期なのでどんどん活用していきましょう。
関連ページ
こちらのページも合わせてご覧下さい。