Azure Object Anchorsの調査②

目次

はじめに

  • 今回は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 未満である必要があります。
        • 現在サポートされているアセットの形式は、fbxplyobjglbgltfです。
  • まずは、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モデルのスケール設定に合わせて指定します
    • プロジェクトをビルド実行します
      • コンソールウィンドウが立ち上がり、以下のメッセージが表示されます
        • 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をコピペします
      • AOAはインターネット接続がない状態でも物体認識を行う事ができますが、クラウドリソース情報が入力されていないとサービス開始時にエラーとなるようです(おそらく、診断結果をクラウドに送信するオプションで利用するためのものだと思われます)
    • AOAのRuntimeパッケージを取得します
      • ここから、Runtimeパッケージcom.microsoft.azure.object-anchors.runtime-x.x.x.tgzをダウンロードします
      • 7-Zip等で解凍し、Unityプロジェクトにインポートします
    • AOASampleSceneをUWP向けにビルドします
    • VisualStudioを使用して、HoloLens2へデプロイします
  • 続いて、STEP1で取得した特徴点ファイルをHoloLensアプリ内にアップロードします
    • Device Portalに接続し、System > File explorerを開きます
      • LocalAppData > AOAMRTKApp > LocalStateフォルダを参照し、STEP1で取得した.ouファイルをアップロードします
  • 以上で準備が完了です
  • 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を参照してください)
      • ※ ver0.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に修正
  • Runtimeのインポート後に、設定ファイルの作成を促されるので、作成してもらいます
  • 設定ファイルにAOAのクラウドリソース情報を登録します(手順はSTEP2を参照してください)
  • 続いて物体検出処理を実装します
    • サンプルプロジェクト内のquickstarts\apps\unity\basic\Assets\MixedReality.AzureObjectAnchors\Scripts\ObjectSearch.csを参考に実装すると良いと思います
    • 大まかな処理の流れは以下のようになります
      1. ObjectAnchorsサービスを開始する
      2. ObjectAnchorsサービスのイベントに接続する
      3. 物体認識用のモデルデータを登録する
      4. 物体検出処理を実行する
        • Box、Sphere、FOVなどで物体検出範囲を指定して検索します
      5. 検出結果イベントを取得して、結果に応じた処理を行う
      6. ObjectAnchorsサービスを終了する
  • HandleObjectAnchorsServiceEventメソッドで、ObjectAnchorsサービスの各種イベントハンドリングを行っているので、イベントに応じた処理を記述するとよいと思います(_event.Argsから検出結果を拾えるようになっています)
  • ObjectSearch.csでは、HoloLensの3D Objectsフォルダから特徴点ファイルをロードする処理が入っています
    • そのまま使用する場合は、フォルダへのアクセス権限が必要となるので、PlayerSettings > Capabilities でObjects3D をONにしましょう

参考

よかったらシェアしてください

この記事を書いた人

目次
閉じる