セマンティック セグメンテーション

シーン内の現実世界の特徴を特定する。

概要

セマンティック セグメンテーションとは、画像中の特定の領域にクラスラベルを付与する処理を指します。このように環境をより深く理解することで、多くのクリエイティブなAR機能を活用できるようになります。たとえば、ARのペットが走る地面を識別したり、ARの惑星で空を埋め尽くしたり、現実世界の地面をARの溶岩に切り替えたりするなど、さまざまです。

ARDKでは、セマンティック予測は深度マップの各ピクセルに対して符号なし整数のバッファとして提供されます。ピクセルの32ビットはそれぞれセマンティッククラスに対応し、そのクラスに属するオブジェクトの一部がそのピクセルに存在すると判断されるかどうかに応じて、有効(値が1)または無効(値が0)になります。

注釈

各ピクセルには、 Artificial groundGround のように、複数のクラスラベルを割り当てることができます。

../../../_images/buffer_diagram.png

注釈

また、実験的機能を使用して、あるピクセルが「空」を表す可能性が80%、「葉」を表す可能性が30%というように、事前にしきい値を設定したセマンティック信頼度を取得することができます。詳細については、 セマンティック信頼度 をご参照ください。

セマンティック セグメンテーションを有効にする

まず、セマンティック セグメンテーションに対応したデバイスであるかどうかを確認します。対応デバイスの詳細なリストについては、 ARDKのシステム要件ページ を参照してください。

using Niantic.ARDK.AR.Configuration;

var isSupported = ARWorldTrackingConfigurationFactory.CheckSemanticSegmentationSupport();

ここで返される値は、あくまで推奨値です。セマンティック セグメンテーションは、非対応のデバイスでも実行できますが、パフォーマンスや精度、安定性のレベルは低下します。

void RunWithSemantics(IARSession arSession)
{
  var config = ARWorldTrackingConfigurationFactory.Create();

  config.IsSemanticSegmentationEnabled = true;

  // Default/recommended value is 20 to balance resource consumption with performance.
  config.SemanticTargetFrameRate = 20;

  arSession.Run(config);
  arSession.FrameUpdated += OnFrameUpdated;
}

セマンティックデータへのアクセス

セマンティックデータは、 IARFrame.Semantics プロパティを使用して取得できます。最新のフレームを取得するには、IARSession.CurrentFrame プロパティを使用するか、 IARSession.FrameUpdated イベントをサブスクライブします。

次の点に注意してください。

  • ARFrameの Semantics 値は、アルゴリズムの起動時や、ARの更新がセマンティック セグメンテーションの更新より速い場合などにNULLになる場合があります。

チャンネルクエリ

また、 ISemanticBuffer インターフェイスには、チャンネルが存在するかどうかを確認するためのヘルパー関数もあります。

  • 特定のピクセルを確認するには、 DoesChannelExistAt を使用します。

  • マップ全体を確認するには、 DoesChannelExist を使用します。

すべてのチャンネルは、チャンネル名またはチャンネルインデックスを使用してクエリを実行することができます。ただし、今後発売される新機種では、セマンティックチャンネルが異なったり並べ替えられる可能性がある点に注意してください。順番が変わる可能性があるため、インデックスよりも名前を使うことをお勧めします。現在利用可能なチャンネル名と順番は、以下のスニペットやこのページの 下部 でプログラムによって確認することができます。

セマンティックテクスチャを作成する

Semantics.Data のraw値は、 CreateOrUpdateTextureARGB32 メソッドを呼び出して、テクスチャに変換できます。テクスチャのピクセルは、所定のチャンネルが存在する場合は白、存在しない場合は黒になります。

using Niantic.ARDK.AR.Awareness.Semantics;

Texture2D _semanticTexture;
int _channelIndex = -1;

void UpdateSemanticTexture(ISemanticBuffer semantics)
{
  if (_channelIndex < 0)
    _channelIndex = semantics.GetChannelIndex("sky");

  semantics.CreateOrUpdateTextureARGB32
  (
    ref _semanticTexture,
    _channelIndex
  );
}

所定のチャンネルのセマンティックテクスチャを取得し、オーバーレイ効果を使用してレンダリングする例については、 中級チュートリアル: セマンティック セグメンテーションテクスチャ をご参照ください。

なお、 CreateOrUpdateTextureARGB32 では、画面のクロッピングや調整が行われていないバッファのrawデータが返ります。このデータの対応方法については、次のセクションを参照してください。

アスペクト比

セマンティックバッファのアスペクト比と解像度は、必ずしもデバイスのカメラや画面の解像度と一致するとは限りません(この値は、基礎となるディープラーニングモデルによって決まります)。 CopyToAlignedTextureARGB32 を使用すると、指定したカメラに合わせて寸法やアスペクト比が調整されたセマンティックテクスチャを取得することができます。このメソッドではピクセル単位でサンプリング処理が行われるため、時間がかかることがあります。または、AwarenessBufferProcessorから SamplerTransform を取得し、これをカスタムシェーダーで使用して、単一パスでクロッピングと調整を適用します。詳細については、 ARDKにおけるレンダリング の「アウェアネスバッファを画面に合わせて調整する」を参照してください。

アラインメントプロセスにより、クロッピングが生じる場合があります。クロッピングを行うと、データは常に水平方向に切り取られます。このメソッドでは垂直方向に切り取るのではなく、以下のスクリーンショットのように左右に余白を取ることで、データの欠損を抑えます。

ARSemanticSegmentationManagerの使用

セマンティック セグメンテーションデータを有効にして利用するためのプロセスを簡略化できるように、シーンに追加できる マネージャー 用意しています。使用方法については、ARSemanticSegmentationManagerのAPIリファレンスやコード内コメント、ツールヒントを参照してください。

セマンティックデータを活用する

セマンティックデータのユースケースに、環境の異なる部分をプッシュバックまたは転送する方法があります。ARDepthManagerとARSemanticSegmentationManagerを一緒に使用することで、セマンティックチャンネルを簡単に抑制(つまり、最大深度に設定)することができます。

../../../_images/sky_segmentation_inspector.png

この方法は、次のような場合に効果的です。

  • 空をプッシュバックし、大きな仮想オブジェクトを後方に配置することで、都市のスカイラインの背後で物体が動いているような錯覚を起こします。

  • 地面をプッシュバックすると、ノイズや不正確な深度出力によってオブジェクトが偶然に隠れてしまう可能性を抑えることができます。

../../../_images/sky_segmentation.png

深度チャンネルとセマンティックチャンネルの操作の詳細については、 仮想コンテンツのオクルージョン ページを参照してください。

利用可能なセマンティックチャンネル

現在利用可能なセマンティックチャンネルを以下のテーブルに示します。このリストのチャンネルの順序は、新しいバージョンのARDKで変更される可能性がありますので、ご注意ください。 `GetChannelIndex``ChannelCount``ChannelNames` などの `ISemanticBuffer` のメソッドやプロパティを使用して、実行時にチャンネルのインデックスのリストを取得し、名前を確認します。

インデックス

チャンネル名

説明

[0]

sky

雲を含みます。霧は含まれません。

[1]

ground

人工地面と自然地面(以下)のすべてを含み、自然地面か人工地面か曖昧な場合は、両者の組み合わせよりも信頼性が高い可能性があります。

[2]

natural_ground

土や草、砂、泥、その他の有機地面や自然界の地面を含みます。草木が生い茂った場所は地面として検出されず、葉っぱとして検出されます。

[3]

artificial_ground

道路や歩道、トラック、カーペット、ラグ、フローリング、小道、砂利、一部の競技場などを含みます。

[4]

water

川、海、池、湖、プール、滝、一部の水たまりを含みます。飲料水、コップ、ボウル、流し台、風呂の水は含まれません。反射の強い水は、水として検出されず、反射物として分類される場合があります。

[5]

person

身体の部位や髪、着用している服などを含みます。アクセサリーや携帯品は含まれません。個人は特定されません。マネキンや玩具、彫像、絵画など、人物を表現するその他の芸術作品は「人物」とはみなされませんが、検出されることがあります。人物の写実的な画像は「人物」と判断されます。画像に人物の一部しか表示されていない場合は、モデルのパフォーマンスが低下する可能性があります。しゃがんでいる人や腕を大きく伸ばしている人など、いつもと違う体勢を取っている場合は、予測が難しくなる傾向があります。基礎となるモデルの詳細については、 モデルカード:人物のセグメンテーション をご参照ください。

[6]

building

住宅や商業施設、近代的、伝統的な建物を含みます。壁と同義ではありません。

[7]

foliage

潅木、低木、樹木の葉の部分や幹、鉢植え、花などがあります。

[8]

grass

芝生などの草地。背の高い草などは対象外です。

また、ARDKには、テストや実験に使用できるいくつかの実験的なセマンティックチャンネルが付属しています。 実験的なセマンティックチャンネル をご参照ください。

セマンティックの情報とモックモード

Unityエディターでセマンティックデータにアクセスする場合は、 モックモード を使用します。ARDKのダウンロードページ から入手できるARDKのモック環境パッケージに含まれる複数の既製のモック環境のうちのいずれかを使用することができます。モック環境パッケージをシーンにインポートし、 ARDK > バーチャルスタジオ ウィンドウの順に移動してMockタブを開き、 Mock Scene(モックシーン) のドロップダウンから使用するプレハブを選択します。Unityのプレイモードで実行すると、モックモードで自動的にプレハブがインスタンス化され、セマンティックオブジェクトによって、設定されているチャンネルのセマンティックデータが返ります。例については、ParkPondプレハブの Sky か、 Trees > Tree > Branches オブジェクトで参照してください。

既成の環境がいずれもニーズに合わない場合は、自分でモック環境を作成することもできます。モックAR環境を作成するには、モック環境のジオメトリを指定してプロジェクトにプレハブを追加し、プレハブ内のルートGameObjectに MockSceneConfiguration コンポーネントを追加します。たとえば、「地面」を表す平面など、任意のセマンティックチャンネルを表すオブジェクトをプレハブに追加します。モックの各セマンティックオブジェクトに MockSemanticLabel コンポーネントを追加し、コンポーネントの「チャンネル」フィールドを適切なセマンティックチャンネルに設定します。その後、 Mock Scene(モックシーン) ドロップダウンでプレハブを選択します。

トラブルシューティング: セマンティック品質に関する考慮事項

現在のモデルは、目線の高さにあるオブジェクトのセマンティック情報を推定することに特化しています。つまり、カメラが上方や下方ではなく、水平方向に向いている方が、一般的にセマンティック推定の精度が高くなります。

こちらもご覧ください

アウェアネス