最近、unityにsentisという機能があることを知った。
unityでAI機能が使えるようなものだったので、具体的に動かしてみたいと思い試してみた。流れとしては、以下の通り
- PyTorchでモデルを作成
- 作成したモデルをonnxファイルに変換
- onnxファイルの中身を確認
- unityに取り込み、sentisで動かす
参考サイトのリンクは以下の通り
この記事のとおりonnxファイルの中身を確認までは進めたが、私がsentisを知った時点で(2025/3)、unityエディターvar6以上でないとsentisのインストールができず、また、コードの書き方が変わっていたので補足する
onnxファイルのインプット形式の確認
unity sentisでonnxファイルを動かす際、unity側で評価されたいデータ(今回は28*28ドットの画像ファイル)を用意し、それをonnxファイルにインプットするのだが、onnxファイル側がどんな形式のインプットデータを要求しているかを調べておく必要がある。分析ツールとしてnetronを使った。
まず、作成したonnxファイルをnetronで確認すると、以下の通りとなる

INPUTSの「tensor:float32[1,784]」が、要求する形式だった。
Unityにonnxファイルを取り込んで動かしてみる
まずは、Unityにsentisをパッケージマネージャからインストールする。(2025/3時点でUnity var6でないとインストールできず、sentisのバージョンも2であった。)

次に、評価する手書きの画像ファイル(28*28ドット、以下の画像は一例)を準備する。この画像と作成したonnxファイルをプロジェクトに追加する。

スクリプトは以下を参考
以下のスクリプトを用意し、空のゲームオブジェクトにアタッチし、先ほどの画像ファイルとonnxファイルをインスペクタウインドウからアタッチする。
//Sentis呼び出し
using Unity.Sentis;
public class test1 : MonoBehaviour
{
public Texture2D inputTexture;
public ModelAsset modelAsset;
Model runtimeModel;
Worker worker;
public float[] results;
private void Start()
{
//1.ONNXモデルの読み込み
Model sourceModel = ModelLoader.Load(modelAsset);
//2.関数グラフのコンパイル(入力モデルを実行し、出力にソフトマックスを適用)
FunctionalGraph graph = new FunctionalGraph();
FunctionalTensor[] inputs = graph.AddInputs(sourceModel);
FunctionalTensor[] outputs = Functional.Forward(sourceModel, inputs);
FunctionalTensor softmax = Functional.Softmax(outputs[0]);
runtimeModel = graph.Compile(softmax);
//3.実行するエンジンを作成する
worker = new Worker(runtimeModel, BackendType.GPUCompute);
//4.入力データをテンソルに変換する
Tensor<float> inputTensor = TextureConverter.ToTensor(inputTexture);
TensorShape shape = new TensorShape(1, 784);
inputTensor.Reshape(shape);
//5.入力データを使用してモデルを実行する
worker.Schedule(inputTensor);
//6.結果を受け取る
Tensor<float> outputTensor = worker.PeekOutput() as Tensor<float>;
results = outputTensor.DownloadToArray();
int index = 0;
float resultmax = 0;
int nummax = 0;
foreach (var result in results)
{
if(resultmax < result)
{
nummax = index;
resultmax = result;
}
Debug.Log($"確率[{index}]:{result}");
index++;
}
Debug.Log($"書かれている数字は:{nummax}");
}
private void OnDisable()
{
//7.エンジンを廃棄する
worker.Dispose();
}
}
以上で、準備完了。あとは動かしてみる。
unity sentisはまだまだ参考サイトが少ないので、そのまま写した感じになった。しかし、pytorchでモデルを作成してunityで動かせるのは、面白そうなのでいろいろやってみたくなった。




コメント