Unity의 AR Foundation에 대한 사용자 환경 이해

자체 앱에서 Scene Semantics API를 사용하는 방법을 알아보세요.

Scene Semantics API를 사용하면 개발자가 ML 모델 기반의 실시간 시맨틱 정보를 제공하여 사용자 주변의 장면을 이해할 수 있습니다. 야외 장면의 이미지가 주어지면 API는 하늘, 건물, 나무, 도로, 인도, 차량, 사람 등 유용한 시맨틱 클래스 집합에서 각 픽셀의 라벨을 반환합니다. Scene Semantics API는 픽셀 라벨 외에도 각 픽셀 라벨의 신뢰도 값과 야외 장면에서 특정 라벨의 출현 빈도를 쿼리하는 간편한 방법을 제공합니다.

왼쪽에서 오른쪽으로 입력 이미지의 예, 픽셀 라벨의 시맨틱 이미지, 해당하는 신뢰도 이미지입니다.

입력 이미지, 시맨틱 이미지, 시맨틱 신뢰도 이미지의 예

기본 요건

계속하기 전에 기본 AR 개념ARCore 세션을 구성하는 방법을 이해해야 합니다.

장면 시맨틱 사용 설정

새로운 ARCore 세션에서 사용자의 기기가 Scene Semantics API를 지원하는지 확인합니다. 일부 ARCore 호환 기기는 처리 능력 제약으로 인해 Scene Semantics API를 지원하지 않습니다.

리소스를 절약하기 위해 Scene Semantics는 ARCore에서 기본적으로 사용 중지되어 있습니다. 시맨틱 모드를 사용 설정하여 앱에서 Scene Semantics API를 사용하도록 합니다.

ARCoreExtensionsConfig에서 Semantics Mode를 Enabled로 설정합니다.

시맨틱 모드가 사용 설정됨으로 설정되었습니다.

iOS를 사용하는 경우 프로젝트 설정에서 시맨틱도 사용 설정해야 합니다.

  1. Edit(수정) > Project Settings(프로젝트 설정) > XR Plug-In Management(XR 플러그인 관리) > ARCore Extensions(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프레임 후에 사용할 수 있습니다.

의미론적 라벨의 픽셀 비율 쿼리

또한 현재 프레임에서 하늘과 같은 특정 클래스에 속하는 픽셀의 비율을 쿼리할 수도 있습니다. 이 쿼리는 시맨틱 이미지를 반환하고 특정 라벨에 대해 픽셀 단위로 검색하는 것보다 효율적입니다. 반환된 분수는 [0.0, 1.0] 범위의 부동 소수점 값입니다.

ArSemanticManager.GetSemanticLabelFraction()을 사용하여 지정된 라벨의 분수를 가져옵니다.

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