目次
はじめに
- 今回はHoloLens2向けの物体認識サービス「Azure Object Anchors」(以下AOA)の利用方法についてまとめてゆきます
- 別記事で概要編を投稿しているので、合わせて読んでいただく事をお勧めします
- それでは、さっそく解説してゆきます
STEP1 : 3Dモデルから特徴点を抽出する
- 概要編に記載したとおり、AOAは3Dモデルから抽出した特徴点をベースに、現実空間の物体の認識を行うサービスです
- そのため、まずは3Dモデルから特徴点を抽出する必要があります
クラウドリソースの作成
- Azure Portalにアクセスし、
Create a resource
をクリックします Object Anchors
を検索し、リソースを作成します
- 現時点では、
EastUS2
リージョンのみで利用可能なようです
- 現時点では、
特徴点の抽出
- 前提
- 対応する3Dモデルのサイズ・形式は以下の通りです
- https://docs.microsoft.com/ja-jp/azure/object-anchors/overview
- アセットの各ディメンションは、1 から 10 メートルである必要があり、ファイル サイズは 150 MB 未満である必要があります。
- 現在サポートされているアセットの形式は、
fbx
、ply
、obj
、glb
、gltf
です。
- https://docs.microsoft.com/ja-jp/azure/object-anchors/overview
- 対応する3Dモデルのサイズ・形式は以下の通りです
- まずは、Microsoftのリポジトリから、AOAのサンプルプロジェクトを取得します
git clone https://github.com/Azure/azure-object-anchors.git
- サンプルプロジェクト内の3Dモデル変換用のソリューションを使って、手持ちの3Dモデルから特徴点の抽出を行います
quickstarts/conversion/Conversion.sln
を、Visual Studioで開きます- Azure.MixedReality.ObjectAnchors.Conversionパッケージを使用して、3Dモデルから特徴点を抽出するプログラムのようです
- 特徴点を抽出するためのコードは比較的単純なので、自作アプリケーションに組み込んで、動的に特徴点を抽出するようなことも比較的簡単にできそうな雰囲気です(ただし、特徴点の抽出には1~2分かかります)
- 設定ファイル
Configuration.cs
を編集します- AccountId : Azure PortalからAOAリソースを参照し、
Account ID
をコピペします - AccountKey : Azure PortalからAOAリソースを参照し、Access Keys >
Primary key
をコピペします - AccountDomain : Azure PortalからAOAリソースを参照し、
Account Domain
をコピペします - InputAssetPath : アップロードする3Dモデルのローカルファイルパスを指定します
- Gravity : 3Dモデルの重力方向を指定します、Y軸が上方向の場合、-Y方向(0f, -1.0f, 0f)のベクトルを指定します
- Unit : 3Dモデルのスケールの単位を指定します、3Dモデルのスケール設定に合わせて指定します
- AccountId : Azure PortalからAOAリソースを参照し、
- プロジェクトをビルド実行します
- コンソールウィンドウが立ち上がり、以下のメッセージが表示されます
Do you want to monitor an existing job? If so, type the job id. If not, just leave it blank and press Enter. Job Id:
- 「Job Idを指定したら、過去のJobの結果を表示するよ」ということなので、何も入力せずにEnterを押します
- 以下のようなメッセージが表示されれば成功です
- コンソールウィンドウが立ち上がり、以下のメッセージが表示されます
- 3Dモデルと同じフォルダ階層に
<3Dモデルファイル名>_JobID.ou
というファイルが出力されます
- 以上で、特徴点の抽出は完了です
STEP2 : AOAを利用して物体認識を行う(サンプルプロジェクト)
- STEP1で取得したOUファイル(特徴点ファイル)を用いて、実際に物体認識ができるHoloLens2アプリをビルドします
物体の認識&位置合わせ
- 前提
- 開発環境
- Unity 2019.4以降
- その他、HoloLens2アプリ開発向けの各種設定が済んでいる事
- HoloLens2
- OS ビルド:18363.720 以降
- 開発環境
- STEP1で取得したサンプルプロジェクト内のUnityプロジェクトをHoloLens2にビルドします
quickstarts\apps\unity\mrtk
をUnityで開きます- AOASampleSceneを開きます
- TextMeshProのインポートを促すメッセージが表示されるので、
Import TMP Essentials
をクリックします - AOAのクラウドリソース情報を登録します
Asset/AzureObjectAnchors.SDK/ObjectAnchorsConfig
を選択し、クラウドリソースの認証情報を登録します- AccountId : Azure PortalからAOAリソースを参照し、
Account ID
をコピペします - AccountKey : Azure PortalからAOAリソースを参照し、Access Keys >
Primary key
をコピペします - AccountDomain : Azure PortalからAOAリソースを参照し、の
Account Domain
をコピペします
- AccountId : Azure PortalからAOAリソースを参照し、
- AOAはインターネット接続がない状態でも物体認識を行う事ができますが、クラウドリソース情報が入力されていないとサービス開始時にエラーとなるようです(おそらく、診断結果をクラウドに送信するオプションで利用するためのものだと思われます)
- AOAのRuntimeパッケージを取得します
- ここから、Runtimeパッケージ
com.microsoft.azure.object-anchors.runtime-x.x.x.tgz
をダウンロードします - 7-Zip等で解凍し、Unityプロジェクトにインポートします
- ここから、Runtimeパッケージ
AOASampleScene
をUWP向けにビルドします- VisualStudioを使用して、HoloLens2へデプロイします
- 続いて、STEP1で取得した特徴点ファイルをHoloLensアプリ内にアップロードします
- Device Portalに接続し、System > File explorerを開きます
- LocalAppData > AOAMRTKApp > LocalStateフォルダを参照し、STEP1で取得した.ouファイルをアップロードします
- LocalAppData > AOAMRTKApp > LocalStateフォルダを参照し、STEP1で取得した.ouファイルをアップロードします
- Device Portalに接続し、System > File explorerを開きます
- 以上で準備が完了です
- HoloLens2で「AOAMRTKApp」を起動します
- 操作方法
- BoudingBoxが表示されるので、検出したい物体が入るように移動・サイズ調整します
- ハンドメニューのSearch Area Settings > Lock SearchLock をクリックし、BoundingBoxの位置(=検出エリア)を固定します
- ハンドメニューの「Start Search」をクリックし、AOAによる物体認識を開始します
- 物体が検出されると、認識した位置にメッシュが表示されます
- その他の機能の詳細はこちらを参照してください
- 操作方法
STEP3 : AOAを利用した物体認識の実装
- サンプルプロジェクト内の
ObjectSearch.cs
を参考に、 自作アプリにAOAを組み込む方法について簡単に説明します
物体の認識処理の組み込み
- 前提
- 開発環境
- Unity 2019.4以降
- その他、HoloLens2アプリ開発向けの各種設定が済んでいる事
- HoloLens2
- OS ビルド:18363.720 以降
- 開発環境
- AOAのRuntimeをインポートします
- Runtimeパッケージを取得し、Unityプロジェクトへインポートします(手順はSTEP2を参照してください)
- ※ ver
0.13.0
では、ARFoundationが導入されていない場合にコンパイルエラーが出ます - Package ManagerからARFoundationをインポートする、もしくは以下のように修正する事でエラーを解消できます(後者は正しい手順ではないため、自己責任で)
com.microsoft.azure.object-anchors.runtime-0.13.0\package\Runtime\Core\ObjectAnchorsWorldManager
の先頭行の#if UNITY_2019_4_OR_NEWER && !ARFOUNDATION_OPT_OUT
を#if UNITY_2019_4_OR_NEWER && ARFOUNDATION_OPT_OUT
に修正
- ※ ver
- Runtimeパッケージを取得し、Unityプロジェクトへインポートします(手順はSTEP2を参照してください)
- Runtimeのインポート後に、設定ファイルの作成を促されるので、作成してもらいます
- 設定ファイルにAOAのクラウドリソース情報を登録します(手順はSTEP2を参照してください)
- 続いて物体検出処理を実装します
- サンプルプロジェクト内の
quickstarts\apps\unity\basic\Assets\MixedReality.AzureObjectAnchors\Scripts\ObjectSearch.cs
を参考に実装すると良いと思います - 大まかな処理の流れは以下のようになります
- ObjectAnchorsサービスを開始する
- ObjectAnchorsサービスのイベントに接続する
- 物体認識用のモデルデータを登録する
- 物体検出処理を実行する
- Box、Sphere、FOVなどで物体検出範囲を指定して検索します
- 検出結果イベントを取得して、結果に応じた処理を行う
- ObjectAnchorsサービスを終了する
- サンプルプロジェクト内の
HandleObjectAnchorsServiceEvent
メソッドで、ObjectAnchorsサービスの各種イベントハンドリングを行っているので、イベントに応じた処理を記述するとよいと思います(_event.Args
から検出結果を拾えるようになっています)
ObjectSearch.cs
では、HoloLensの3D Objects
フォルダから特徴点ファイルをロードする処理が入っています- そのまま使用する場合は、フォルダへのアクセス権限が必要となるので、PlayerSettings > Capabilities で
Objects3D
をONにしましょう
- そのまま使用する場合は、フォルダへのアクセス権限が必要となるので、PlayerSettings > Capabilities で
- また、物体をうまく認識できない場合は、物体検出の条件を変更する事が可能です
- 詳細については、以下を確認しながら試してみてください
- https://docs.microsoft.com/ja-jp/azure/object-anchors/detect-difficult-object