Zenn
🦁

Unity Sentisの基礎

2025/02/28に公開

Unity Sentisの利用

Unity Sentisを利用することで、AIモデルをUnityプロジェクトに組み込むことが出来るようになります。


1. Unity Sentisとは?

概要

Unity Sentisは、Unityランタイム上でONNX形式のAIモデルを直接実行できるツールです。
これにより、顔認識、対話システム、物体検出などのAI機能を、クラウドに依存せずにユーザーデバイス上でリアルタイムに利用できます。
例えば、YOLOv5やMobileNetSSDなどの人物検出モデルを使い、カメラ映像や静止画像から人物を検出することも可能になります。

特徴

  • 完全無料で利用可能
  • Unityがサポートする全プラットフォーム(PC、モバイル、コンソール、VR/ARなど)に対応
  • GPUやCPU上で効率的に推論を実行できる

2. 導入準備

  1. Unityのバージョン確認
    Unity 2023.2以降の利用が推奨されています。

  2. Sentisパッケージのインストール

    • Unityの「Package Manager」を開く
    • 「Install package by name」から com.unity.sentis を入力し、パッケージをインストールする

3. AIモデルの準備

  • モデルの作成または入手

    • 自分でPyTorchなどで学習させたモデルをONNX形式に変換する
    • 既存の学習済みONNXモデル(例:物体検出、手書き文字認識など)を利用する
  • モデルのインポート

    • ONNXファイルをUnityプロジェクトにドラッグ&ドロップする
    • 必要に応じて、Sentis用に変換(例:StreamingAssetsへシリアライズ)する

4. SentisでのAI modelの読み込み

Sentisの利用では、"ModelLoarder"、"ModelAsset"など、Unity sentisのimport時にデフォルトでインストールされる機能を利用して、簡単にmodelを取り込むことが出来ます。

① モデルのロード

// Resourcesフォルダに配置したモデルアセットを読み込む
ModelAsset modelAsset = Resources.Load("YourModelFileName") as ModelAsset;
Model runtimeModel = ModelLoader.Load(modelAsset);

5. 解析例として、Unity Sentisで人物検出アプリを開発

Unity Sentisでの解析例として、人物検出を行うアプリを作成する際の基本的な流れの一例を記載します。
*ここで記載したやり方は、ほんの一例ですので、他にも多数の解析方法があります。また、今後のUnity sentisのversion更新により、より実装しやすい方法での解析手法が提供されていることが期待されています。

ステップ1:人物検出用のモデルの準備

  • 人物検出用モデルの準備

    • 学習済みの人物検出モデル(例:YOLOv5、MobileNetSSDなど)をONNX形式で用意
    • 自作の場合は、PyTorchやTensorFlowで学習させ、ONNX形式に変換
    • ONNXファイルはUnityプロジェクト内(AssetsまたはResourcesフォルダ)に配置
  • 入力データの用意

    • カメラ映像(WebCamTextureなど)や静止画像(Texture2D)を使用
    • モデルが要求するサイズ(例:640×640、300×300など)にリサイズする必要があります

ステップ2:モデルのロード

  1. モデルアセットの用意
    ONNXファイルをプロジェクトにインポートし、Resourcesフォルダに配置して、Resources.Loadで読み込みます。他に、Inspectorでアサインする方法もあります。

  2. モデルのロードコード例

    // Resourcesフォルダ内のONNXモデルアセットを読み込む例
    ModelAsset modelAsset = Resources.Load("PersonDetectionModel") as ModelAsset;
    Model runtimeModel = ModelLoader.Load(modelAsset);
    

ステップ3:入力データの準備

  1. カメラまたは画像から入力を取得
  • カメラ映像の場合はWebCamTextureなどを利用
  • 静止画像の場合はTexture2Dとして読み込む
  1. 前処理
  • モデルが要求する解像度にリサイズする
  • 必要に応じて、正規化(ピクセル値を0~1に変換)やチャネル順の調整を行う。
  1. テンソルへの変換
     // 例:Texture2Dからテンソルに変換(例としてサイズ640x640、RGBの場合)
     Texture2D inputTexture = Resources.Load("SampleImage") as Texture2D;
     TensorFloat inputTensor = TextureConverter.ToTensor(inputTexture, width: 640, height: 640, channels: 3);
    

ステップ4:推論エンジン(Worker)の作成と実行

  1. Workerの作成

     // GPUComputeを使用する例
     IWorker worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);
    
  2. 推論の実行

     // 入力テンソルを用いて推論を実行
     worker.Execute(inputTensor);
    

ステップ5:出力結果の後処理

  1. 出力テンソルの取得
  • 出力テンソルを取得
    *モデルの出力は、検出されたバウンディングボックス、信頼度、クラス情報などが含まれる形式(例:YOLOなら [1,25200,85] のテンソル)となっています。
  1. 人物(person)クラスの抽出
  • 出力された各検出候補について、信頼度(confidence)を確認し、しきい値(例:0.5)以上かどうかでフィルタリング
    *COCOデータセットの場合、人物は通常クラスIDが0または1になっています(モデルによって異なるため、仕様を確認してください)
  1. 検出結果を描画
  • 各候補のバウンディングボックス(位置と大きさ)を取得し、画面上に矩形を描画するなどして検出結果を表示します
 // 出力テンソルの例(具体的な出力形式はモデルに依存)
TensorFloat outputTensor = worker.PeekOutput() as TensorFloat;
float[] outputData = outputTensor.ToReadOnlyArray();

// ここから後処理:例として、各検出候補をループ処理し、信頼度しきい値でフィルタリング
for (int i = 0; i < /*検出候補数*/; i++)
{
 // 例:出力データから、バウンディングボックス座標、信頼度、クラスIDを抽出する
 float conf = outputData[i * 85 + 4];  // 例:信頼度が4番目の値
 int classId = (int)outputData[i * 85 + 5]; // 例:人物検出の場合、クラスIDが対象
 if (conf > 0.5f && classId == /*人物クラスID*/)
 {
     // バウンディングボックス情報(x, y, width, height)の取得
     float x = outputData[i * 85 + 0];
     float y = outputData[i * 85 + 1];
     float w = outputData[i * 85 + 2];
     float h = outputData[i * 85 + 3];
     // ここで画面上に矩形を描画するなどの処理を行う
 }
}

ステップ6:リソースの開放

推論実行後は、メモリリークを防ぐためにWorkerをDisposeしてリソースを解放します。

 worker.Dispose();

6. 開発時のポイント

Unity Sentisでの解析例として、人物検出を行うアプリを作成する際の基本的な流れの一例を記載します。

  • 入力前処理
    • 入力画像は必ずモデルが想定するサイズ・形式に合わせる
    • リサイズや正規化、チャネル順(RGB→BGRなど)の調整を適切に行うこと
  • 出力後処理のカスタマイズ
    • 出力テンソルの構造を正確に理解し、不要な検出候補の除去(NMS:Non-Maximum Suppressionなど)を行うと、より正確な人物検出が可能になります
  • パフォーマンス
    • GPUComputeの活用により、リアルタイム処理が可能となりますが、実際のデバイスで動作確認を行い、最適化を検討することが重要です
  • デバッグと検証
    • 検出結果を画面上に描画して確認するなど、逐次動作を検証するとともに、XR系のデバイス(meta questやhololense,ARグラスなど) の利用では実機に落とし込んだ際の負荷テストなども組み合わせると、より実務に即した形となるかと想定されます。

7. まとめ

Unity Sentisを活用することで、ONNX形式の人物検出モデルをUnityプロジェクトに組み込み、リアルタイムで人の検出を行うアプリを開発できます。
基本の流れは以下の通りです:

  1. 環境準備とSentisパッケージの導入
  2. 人物検出モデル(ONNX)の準備とインポート
  3. 入力画像(カメラ映像や静止画像)の前処理とテンソル変換
  4. Workerを作成して推論実行
  5. 出力結果の後処理で、信頼度とクラスIDに基づいて人物検出候補を抽出・描画
  6. リソース解放

繰り返しになりますが、ここでご紹介した内容は、Unity Sentisでの活用例のごく一部であり、用途や可能性は多岐にわたります。
また、昨今のAI進化を加味すると、すぐに、よりよいやり方がいくつも出てくるかと思われます。
日頃からアンテナを張っておくことで、より幅広いビジネスニーズへの適用の幅が広がることが期待されます。

ヘッドウォータース

Discussion

ログインするとコメントできます