自作onnxをUnity sentisで動かしてみる

未分類

最近、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で動かせるのは、面白そうなのでいろいろやってみたくなった。

コメント

タイトルとURLをコピーしました