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

独自のアプリで Scene Semantics API を使用する方法を学びます。

Scene Semantics API を使用すると、ML モデルベースのリアルタイムのセマンティック情報を提供することで、デベロッパーはユーザーの周囲のシーンを理解できます。屋外シーンの画像を指定すると、API は、空、建物、木、道路、歩道、車両、人物など、有用なセマンティック クラスのセットで各ピクセルのラベルを返します。Scene Semantics API は、ピクセルラベルに加えて、各ピクセルラベルの信頼度値も提供します。また、屋外シーンで特定のラベルがどの程度存在するかを簡単にクエリすることもできます。

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

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

前提条件

続行する前に、基本的な AR コンセプトARCore セッションを構成する方法を理解してください。

Scene Semantics を有効にする

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

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

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

セマンティクス モードが有効に設定されている。

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

  1. [Edit] > [Project Settings] > [XR Plug-In Management] > [ARCore Extensions] に移動します。
  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 フレーム後に利用可能になります。

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

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

ArSemanticManager.GetSemanticLabelFraction() を使用して、指定したラベルの分数を取得します。

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