Unity の AR Foundation でユーザーの環境を把握

独自のアプリで Scene Semantics API を使用する方法を確認する。

Scene Semantics API は、ML モデルベースのリアルタイムのセマンティック情報を提供することで、開発者がユーザーの周囲の状況を把握できるようにします。屋外の画像を指定すると、API は空、建物、木、道路、歩道、車両、人など、一連の有用なセマンティック クラスにわたる各ピクセルのラベルを返します。ピクセルラベルに加えて、Scene Semantics API は、各ピクセルラベルの信頼値と、屋外シーンにおける特定のラベルの占有率を照会する簡単な方法も提供します。

<ph type="x-smartling-placeholder">

左から順に、入力画像、ピクセルラベルのセマンティック画像、対応する信頼度画像の例を示しています。

入力画像、セマンティック画像、セマンティック信頼度画像の例。

前提条件

AR の基礎的なコンセプトを理解しておいてください。 と ARCore セッションを構成する方法を確認してください。

シーンのセマンティクスを有効にする

新しい ARCore セッションで、ユーザーのデバイスが Scene Semantics API をサポートしているかどうかを確認します。処理能力に制約があるため、すべての ARCore 対応デバイスが Scene Semantics API をサポートしているわけではありません。

リソースを節約するため、ARCore の Scene Semantics はデフォルトで無効になっています。アプリで Scene Semantics API を使用するには、セマンティック モードを有効にします。

ARCoreExtensionsConfig で、セマンティクス モードを有効に設定します。

セマンティクス モードを有効に設定。

iOS を使用している場合は、プロジェクト設定でもセマンティクスを有効にする必要があります。

  1. [編集] >プロジェクト設定 >XR プラグイン管理 >ARCore 拡張機能
  2. [オプション機能] で [iOS のセマンティクス] を選択します。

オプション機能で iOS のセマンティクスを有効にしました。

セマンティック画像を取得する

シーンのセマンティクスを有効にすると、セマンティック画像を取得できます。セマンティック画像は TextureFormat.R8 画像で、各ピクセルは SemanticLabel で定義されたセマンティック ラベルに対応しています。

ArSemanticManager.TryGetSemanticTexture() を使用してセマンティック画像を取得します。

if (semanticManager.TryGetSemanticTexture(out Texture2D semanticImage))
{
    using (semanticImage)
    {
        // Use the semantic image here.
    }
}

デバイスに応じて、セッションの開始から約 1 ~ 3 フレーム後に出力セマンティック画像を利用できるようになる必要があります。

信頼度の画像を取得する

各ピクセルのラベルを提供するセマンティック画像に加えて、API は対応するピクセル信頼値の信頼画像も提供します。信頼度の画像は TextureFormat.Alpha8 画像です。ここで、各ピクセルは [0, 255] の範囲の値に対応し、各ピクセルのセマンティック ラベルに関連付けられた確率に対応します。

ArSemanticManager.TryGetSemanticConfidenceTexture() を使用して、セマンティック信頼度の画像を取得します。

if (semanticManager.TryGetSemanticConfidenceTexture(out Texture2D semanticConfidenceImage))
{
    using (semanticConfidenceImage)
    {
        // Use the semantic confidence image here.
    }
}

出力信頼度の画像は、デバイスに応じて、セッションの開始から約 1 ~ 3 フレーム後に利用可能になります。

セマンティック ラベルのピクセル数をクエリする

また、現在のフレーム内で Sky などの特定のクラスに属するピクセルの割合をクエリすることもできます。このクエリは、セマンティック画像を返して特定のラベルをピクセル単位で検索するよりも効率的です。返される小数は、範囲 [0.0, 1.0] 内の浮動小数点値です。

ArSemanticManager.GetSemanticLabelFraction() を使用して、特定のラベルに対する割合を取得します。

var fraction = semanticManager.GetSemanticLabelFraction(SemanticLabel.SKY);