ailia SDKを試す<第24回> ailia SDK×Unity6.2でオブジェクト検出

 今回は,最新のUnity 6.2とailia SDKを組み合わせて,Windows向けのオブジェクト検出アプリケーションを作成します.ailia SDKは,AIモデルを簡単に実装できる推論ライブラリであり,Unityと連携することで,画像内の物体をリアルタイムに検出/表示するアプリケーションを短時間で構築できます.ここでは,環境構築からモデルの導入,検出結果の可視化までの手順を順を追って紹介します.

 

●Unity 6.2のインストール
 Unityのインストール方法については,前回の記事(https://interface.cqpub.co.jp/ailia023/)を参照してください.
 まず,Unity Hubを起動し,「インストール」タブを開きます(図1).続いて,「エディターをインストール」をクリックし,利用可能なバージョン一覧からUnity 6.2のエディタを選択します.次に,エディタのバージョンとしてUnity 6.2(6000.2.9f1)を選択します(図2).本稿では,執筆時点で最新のこのバージョンを使用します.


図1 Unity Hubのインストールタブ画面


図2 Unity 6.2選択画面

 

●必要なモジュールの追加
 Unity 6.2のインストール後,開発に必要なモジュールを追加します(図3).特に,Microsoft Visual Studio 2022をインストールしておくことをおすすめします.これは,UnityでC#スクリプトを編集/デバッグする際に必要となる統合開発環境(IDE)です.
 ダウンロードが途中で失敗した場合でも,「やり直す」を選択すると継続してダウンロードできます(図4).慌てず再試行してください.また,Unity 6.2(6000.2.9f1)には既知の問題が幾つか報告されています.インストール前に,次の公式リリース・ノートで内容を確認しておくと安心です.
***
Unity 6.2(6000.2.9f1)リリースノート(日本語)
https://unity.com/ja/releases/editor/whats-new/6000.2.9f1#notes
***


図3 モジュール追加の画面


図4 ダウンロード失敗

 

●プロジェクトの読み込み
 前回記事を参考に,ailia-models-unityを取得します.次の手順で,リポジトリをクローンしてUnityプロジェクトとして追加します.
***
・1,GitHubからailia-models-unityをクローンし,任意のフォルダに展開
・2,Unity Hubを起動し,「プロジェクト」タブを開く
・3,「追加」→「ディスクから加える」を選択し,先ほど展開したailia-models-unity フォルダを指定
***
 なお,プロジェクト追加時に警告画面が表示される場合があります(図5).


図5 プロジェクト追加時の警告画面

 バージョン番号をクリックすると利用できるエディタのバージョンを選択できる画面が表示されます(図6).ここで先にインストールしたUnity6.2のエディタで開きます.続いて,「バージョンを変更」を選択して設定を確定します(図7).変更後,幾つかのメッセージや警告が表示されることがありますが(図8),そのまま「続行」をクリックして処理を継続してください.


図6 エディタ・インストールの画面


図7 エディタ・バージョンの変更画面


図8 メッセージの表示画面

 

 読み込みが完了すると,ailia-models-unityプロジェクトがUnity上に表示されます.このとき,「非推奨のパッケージが含まれています」というメッセージとともに,「パッケージマネージャを開く」というダイアログが表示されます(図9).表示された場合は,「パッケージマネージャを開く」をクリックして処理を続けてください.
 パッケージ・マネージャを開くと(図10),プロジェクトで使っている各種パッケージの一覧が表示されます.この中にあるVisual Studio Code Editorは今回の環境では使用しませんので,選択して「削除」をクリックしてください.
 これで,ailia-models-unity プロジェクトの読み込みが完了しました.Unity上でプロジェクトが正しく表示されていれば,セットアップは完了です(図11).


図9 非推奨パッケージ検出時のダイアログ画面

 


図10 パッケージ・マネージャの画面


図11 プロジェクト画面

 

●モデルの選択
 画面に表示するモデルを選択します.今回は,ObjectDetectionを使用します.手順は次の通りです.
***
・1,プロジェクト内のObjectDetectionフォルダを選択(図12)
・2,フォルダ配下にある「ObjectDetectionSample」をクリック
・3,Unity画面上部の「ゲーム」タブを開くと,ailia-modelの画面が表示される
***

図12 ObjectDetectionフォルダ選択とゲームタブの表示

 

●サンプル実行の確認
 続いて,画面上部の再生ボタンをクリックします.これでObjectDetectionSampleが実行され,オブジェクト検出の画面が表示されます(図13).初回起動時は,モデルや依存データのダウンロードが自動的に行われます.そのため,起動には少し時間がかかりますが,処理が完了するまで画面が表示されるのを待ってください.停止ボタンをクリックすると終了します(図14).

 
図13 ObjectDetectionSampleの実行画面


図14 停止ボタンをクリックすると終了する

 

●エラー・メッセージの確認
 実行すると,画面そのものは動作しているように見えますが,エラー・メッセージが表示されることがあります(図15).この状態では一応動作していますが,内部的には正常に処理されていない可能性があります.


図15 エラーメッセージとログの表示画面

 

 ログを見るとYolov11Seg.csのProcessMaskという箇所でエラーが発生していることが分かります.このため,リスト1にこの部分のコードを修正したものを示します.
***
private ImageF ProcessMask(float[] proto, Ailia.AILIAShape protoShape, float[] maskCoeffs, float[] box, int imgWidth, int imgHeight)
{
 if (protoShape == null)
 {
  return null;
 }
 int mw = (int)protoShape.x;
 int mh = (int)protoShape.y;
 int c = (int)protoShape.z;
 float[] mask = new float[mh * mw];
 for (int y = 0; y < mh; y++)
 {
  for (int x = 0; x < mw; x++)
  {
   float sum = 0;
   for (int i = 0; i < c; i++)
   {
    int protoIdx = i * mh * mw + y * mw + x;
    sum += maskCoeffs[i] * proto[protoIdx];
   }
   mask[y * mw + x] = Yolov11SegMathUtils.Sigmoid(sum);
  }
 }
 // crop the mask – 座標を範囲内にクランプ
 int x1 = Mathf.Clamp((int)(box[0] * mw / imgWidth), 0, mw – 1);
 int y1 = Mathf.Clamp((int)(box[1] * mh / imgHeight), 0, mh – 1);
 int x2 = Mathf.Clamp((int)(box[2] * mw / imgWidth), 0, mw);
 int y2 = Mathf.Clamp((int)(box[3] * mh / imgHeight), 0, mh);
 // x2, y2がx1, y1より大きいことを保証
 if (x2 <= x1) x2 = x1 + 1;
 if (y2 <= y1) y2 = y1 + 1;
 // 範囲チェック
 if (x2 > mw) x2 = mw;
 if (y2 > mh) y2 = mh;
 int newW = x2 – x1;
 int newH = y2 – y1;
 float[] croppedMask = new float[newW * newH];
 for (int y = 0; y < newH; y++)
 {
  for (int x = 0; x < newW; x++)
  {
   int srcY = y1 + y;
   int srcX = x1 + x;
   // 念のため境界チェック
   if (srcY >= 0 && srcY < mh && srcX >= 0 && srcX < mw)
   {
    int srcIdx = srcY * mw + srcX;
     int destIdx = y * newW + x;
     if (srcIdx >= 0 && srcIdx < mask.Length && destIdx >= 0 && destIdx < croppedMask.Length)
    {
     croppedMask[destIdx] = mask[srcIdx];
    }
   }
  }
 }
 ImageF maskData = new ImageF();
 maskData.w = newW;
 maskData.h = newH;
 maskData.c = 1;
 maskData.data = croppedMask;
 return maskData;
}
***
リスト1 Yolov11Seg.csの修正内容

 

 これでエラーは解消され,正常に動作することを確認できました.それでは,いよいよアプリケーションをビルドして実行ファイルを作成します.

 

●ビルド・プロファイルの追加と設定
 ファイル・メニューから「ビルドプロファイル」を選択します(図16).既定では,Windows用の基本プロファイルが設定されていますが,今回はailia SDK用のビルド・プロファイルを新しく追加します(図17).


図16 ビルド・プロファイル選択とビルド・プロファイル画面 


図17 ビルド・プロファイルの追加画面

 手順は次の通りです.
***
・1,ビルド・プロファイル画面で,「ビルドプロファイルを追加」をクリック
・2,新しいプロファイルが作成されたら,ほかのプロファイルと区別がつくように名前を変更.ここでは「AiliaSDK」とする
***
 次に,作成したAiliaSDKプロファイルを選択し,「プロファイルを切り替える」をクリックします(図18). プロファイルの切り替えが完了すると,プラットフォーム・リストの「AiliaSDK」の横に「有効」のメッセーが表示されます(図19).


図18 プロファイルの切り替え操作画面


図19 プロファイル切り替え後の画面

 これで,AiliaSDK専用のビルド設定を行う準備が整いました.
 このままでもアプリケーションをビルドできますが,デフォルトの状態では全画面モードで起動してしまいます.今回は,実行時に見やすいように画面サイズを変更しておきます.
***
・1,「Customize Player Settings(プレイヤー設定のカスタマイズ)」を開く(図20)
・2,表示モードが全画面(Fullscreen)になっている場合は,これを「ウィンドウ化(Windowed)」に変更
・3,デフォルトの画面サイズを設定.ここでは1024×768とする
***


図20 Customize Player Settings画面

 

●ビルドと実行
 設定が完了したら,最後に「ビルドして実行」をクリックし(図21),出力先フォルダを指定してアプリケーションを作成して実行してください.

図21 「ビルドして実行」をクリック

 

●アプリを起動する
 最初の起動時には,モデル・データや関連ファイルのダウンロード処理が行われるため,起動に時間がかかる場合があります.通信や処理が完了するまで,落ち着いてお待ちください.起動すると図22の画面が表示されます.
図22 アプリ起動時の画面

 

●まとめ
 今回は,最新のUnity 6.2環境でailia SDKを実行し,オブジェクト検出アプリケーションを作成しました.UnityのGUI上でAI推論を手軽に試せる点は,AILIA SDKの大きな魅力です.
 なお,Unity上でailia-models-unityの別モデルを動作させるには,追加の操作や設定変更が必要です.また,本稿で紹介した手順や設定内容は,筆者の検証環境で動作を確認したものです.ailia SDKの公式に保証された環境ではないので,使用するハードウェアやOS構成によっては挙動や結果が異なる場合があります.本稿の内容は,あくまで動作確認の一例として参考にしてください.次回は,ほかのモデルを実行するための設定方法について紹介する予定です.

 

氏森 充(うじもり・たかし)
約30年間,(株)構造計画研究所にてIoT,ビッグデータ,機械学習,AI関連のシステム開発や実務応用に従事.退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し,雑誌「Interface」でもLLM技術に関する記事を執筆中.