ARCore에서 Scene Semantics 및 Geospatial Depth API 시작하기

1. 시작하기 전에

ARCore는 스마트폰에서 증강 현실(AR) 환경을 구축하기 위한 Google의 프레임워크입니다. Scene Semantics 및 Geospatial Depth API를 사용하면 AR 환경이 사용자 주변 환경을 파악하는 데 도움이 됩니다.

Scene Semantics API는 머신러닝(ML) 모델을 사용하여 카메라 이미지를 분석하고 라벨이 지정된 픽셀을 이미지로 제공합니다. 또한 11개의 서로 다른 실외 라벨을 구별할 수 있습니다.

Geospatial Depth API를 사용하면 움직임 감지 센서와 비행시간 등 기타 활성화된 하드웨어 센서에서 가져온 깊이 정보를 Streetscape Geometry API 데이터와 결합하여 깊이 관측 오류를 최대 65m까지 개선할 수 있습니다.

이 Codelab에서는 Scene Semantics 및 Geospatial Depth API의 결과를 시각화하는 AR 앱을 빌드합니다.

기본 요건

  • AR 관련 기본 지식

학습할 내용

  • Scene Semantics API를 사용 설정하는 방법
  • 시맨틱 이미지를 가져와 시각화하는 방법
  • 신뢰도 높은 시맨틱 이미지를 가져와 시각화하는 방법
  • 특정 라벨의 픽셀 비율을 확인하는 방법
  • ARCore Geospatial API를 사용할 수 있는 Google Cloud 프로젝트 설정 방법
  • Geospatial Depth API를 사용 설정하는 방법
  • 깊이 이미지를 시각화하는 방법

필요한 항목

2. 환경 설정

Geospatial API를 시작할 수 있도록 ARCore 프로젝트 기본사항과 도우미 함수가 포함된 시작 프로젝트를 준비했습니다.

시작 프로젝트를 설정하려면 다음 단계를 따르세요.

  1. Android 스튜디오를 열고 다음 중 하나를 실행합니다.
    • 프로젝트가 이미 열려 있다면 File > New > Project from version control을 클릭합니다.
    • Welcome to Android Studio 창이 표시되면 Get from VCS를 클릭합니다. VCS 위치에서 가져오기
  2. Git을 선택하고 https://github.com/google-ar/codelab-scene-semantics-geospatial-depth.git을 입력하여 프로젝트를 가져옵니다.

3. Scene Semantics API 데이터 시각화

Scene Semantics API 사용 설정

처리 능력 절감을 위해 Scene Semantics API는 기본적으로 사용 중지되어 있습니다.

Scene Semantics API를 사용 설정하려면 다음 단계를 따르세요.

  1. CodelabActivity.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Enable the Scene Semantics API.
    
  2. 해당 줄 다음에 세션 구성에서 Scene Semantics API를 사용 설정합니다(기기에서 지원하는 경우).
      if (session.isSemanticModeSupported(Config.SemanticMode.ENABLED)) {
        semanticMode = Config.SemanticMode.ENABLED
      }
    

시맨틱 이미지를 가져와 시각화하기

시맨틱 이미지는 카메라 피드의 각 픽셀에 SemanticLabel enum을 할당하는 ARCore ML 모델의 결과물입니다.

시맨틱 이미지의 예

시맨틱 이미지를 가져와 화면에 표시하려면 다음 단계를 따르세요.

  1. CodelabRenderer.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Obtain the semantic image for this frame.
    
  2. 해당 줄 다음에 시맨틱 이미지를 가져옵니다.
      frame.acquireSemanticImage().use { image ->
        semanticRenderer.updateCameraSemanticsTexture(image)
        activity.view.semanticLabelAtCenter = getLabelAt(image, image.width/2, image.height/2)
      }
    
    시맨틱 이미지는 SemanticRenderer 클래스에 사용되어 화면에 표시됩니다. semanticLabelAtCenter 변수를 업데이트하면 앱의 뷰 화면 중앙에 시맨틱 라벨이 표시됩니다.
  3. 앱을 실행하고 카메라를 외부의 다른 사물에 맞춰 조준합니다. 조준한 사물의 유형에 따라 표시된 시맨틱 라벨이 변경됩니다.
  4. 신뢰도 높은 시맨틱 이미지 오버레이를 사용 설정하려면 설정 아이콘 설정을 탭합니다.

신뢰도 높은 시맨틱 이미지를 가져와 시각화하기

신뢰도 높은 시맨틱 이미지는 픽셀에 상응하는 시맨틱 라벨의 ARCore가 얼마나 신뢰할 수 있는지를 알려줍니다.

시맨틱 이미지를 가져와 화면에 표시하려면 다음 단계를 따르세요.

  1. CodelabRenderer.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Obtain the confidence image for this frame.
    
  2. 해당 줄 다음에 시맨틱 이미지를 가져옵니다.
    frame.acquireSemanticConfidenceImage().use { image ->
      semanticRenderer.updateConfidenceSemanticsTexture(image)
      activity.view.confidenceAtCenter = getConfidenceAt(image, image.width/2, image.height/2)
    }
    
    신뢰도 높은 시맨틱 이미지는 SemanticRenderer 클래스에 사용되어 화면에 표시됩니다. confidenceAtCenter 변수를 업데이트하면 앱의 뷰 화면 중앙에 시맨틱 라벨이 표시됩니다.
  3. 앱을 실행하고 카메라를 외부의 다른 사물에 맞춰 조준합니다. 조준한 사물의 유형에 따라 표시된 신뢰도 높은 시맨틱이 변경됩니다.
  4. 신뢰도 높은 시맨틱 이미지 오버레이를 사용 설정하려면 설정 아이콘 설정을 탭합니다.

라벨 보급률 확인하기

라벨 보급률이란 특정 라벨에 상응하는 시맨틱 이미지의 백분율을 말합니다. 예를 들어 이미지의 26%가 SemanticLabel.SKY 값을 가지고 있다면 SemanticLabel.SKY 값의 보급률 값은 0.26f가 됩니다.

라벨의 보급률을 가져와 화면에 표시하려면 다음 단계를 따르세요.

  1. CodelabRenderer.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Obtain the prevalence of the selected label for this frame.
    
  2. 해당 줄 다음에 선택한 라벨의 보급률을 가져옵니다.
    frame.acquireSemanticConfidenceImage().use { image ->
      semanticRenderer.updateConfidenceSemanticsTexture(image)
      activity.view.confidenceAtCenter = getConfidenceAt(image, image.width/2, image.height/2)
    }
    
  3. 앱을 실행하고 카메라를 외부의 다른 사물에 맞춰 조준합니다. 조준한 사물의 유형에 따라 표시된 신뢰도 높은 시맨틱이 변경됩니다.
  4. 신뢰도 높은 시맨틱 이미지 오버레이를 사용 설정하려면 설정 아이콘 설정을 탭합니다.

4. Geospatial Depth API 데이터 시각화

Geospatial Depth API를 사용하면 Geospatial 및 Streetscape Geometry API가 사용 설정되었을 때 깊이 측정값을 향상할 수 있습니다. Geospatial Depth API를 Kotlin 및 Android Studio와 함께 사용하려면 Google Cloud 프로젝트가 필요합니다.

Google Cloud 프로젝트 설정

ARCore Geospatial API는 Google Cloud와 연결하여 Google 스트리트 뷰가 적용되는 영역에서 Google VPS(Visual Positioning System)의 현지화 정보를 제공합니다.

프로젝트에서 이 서버를 사용하려면 다음 단계를 따르세요.

  1. Google Cloud에서 프로젝트를 만듭니다.

    Google Cloud 프로젝트 만들기
  2. 프로젝트 이름 필드에 적절한 이름(예: ARCore Geospatial API project)을 입력하고 위치를 선택합니다.
  3. 만들기를 클릭합니다.
  4. 프로젝트 선택기 페이지의 Google Cloud 콘솔에서 프로젝트 만들기를 클릭합니다.
  5. 이 프로젝트에 대한 ARCore API를 보려면 다음 링크를 클릭하고 사용 설정을 클릭합니다.
  6. 프로젝트에 대한 API 키를 만듭니다.
    1. API 및 서비스에서 사용자 인증 정보를 선택합니다.
    2. 사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
    3. 이 키는 나중에 필요하므로 기록해 둡니다.

API 키 승인으로 Google Cloud 프로젝트를 만들었고 샘플 프로젝트에서 Geospatial API를 사용할 준비가 되었습니다.

API 키를 Android 스튜디오 프로젝트에 통합

Google Cloud의 API 키를 프로젝트와 연결하려면 다음 단계를 따르세요.

  1. Android 스튜디오에서 app > src를 클릭하고 AndroidManifest.xml을 더블클릭합니다.
  2. 다음 meta-data 항목을 찾습니다.
    <meta-data
        android:name="com.google.android.ar.API_KEY"
        android:value="API_KEY" />
    
  3. API_KEY 자리표시자를 Google Cloud 프로젝트에서 만든 API 키로 바꿉니다. com.google.android.ar.API_KEY에 저장된 값은 이 앱이 Geospatial API를 사용하도록 승인합니다.

프로젝트 확인

  • 개발 기기에서 앱을 실행하여 프로젝트를 확인합니다. 화면 상단에 카메라 뷰와 공간 디버그 정보가 표시됩니다.

공간 정보가 앱에 표시됩니다.

필수 구성 사용 설정

Geospatial Depth API를 사용하려면 앱의 세션 구성에서 세 가지 설정을 사용 설정해야 합니다.

사용 설정하려면 다음 단계를 따르세요.

  1. CodelabRenderer.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Enable the Geospatial API, the Streetscape Geometry API, and the Depth API.
    
  2. 다음 행에 아래 코드를 추가합니다.
    val isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)
    val isGeospatialSupported = session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED)
    if (isDepthSupported && isGeospatialSupported) {
      // These three settings are needed to use Geospatial Depth.
      geospatialMode = Config.GeospatialMode.ENABLED
      streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
      depthMode = Config.DepthMode.AUTOMATIC
    }
    

깊이 정보 시각화하기

  1. CodelabRenderer.kt 파일에서 다음 줄을 찾습니다.
    // TODO: Obtain depth information and display it.
    
  2. 다음 행에 아래 코드를 추가합니다.
    try {
      frame.acquireDepthImage16Bits().use { image ->
        backgroundRenderer.updateCameraDepthTexture(depthImage)
      }
    } catch (e: NotYetAvailableException) {
      // No depth information is available.
    }
    
  3. 앱을 실행하고 현재 지역의 건물을 방문합니다.
  4. Geospatial 현지화가 완료되었다면 설정 아이콘 설정을 탭하고 Geospatial Depth 시각화를 사용 설정합니다.
  5. AR로 건물을 확인한 다음, 지형 공간적 깊이가 포함되지 않은 깊이 정보와 비교합니다.

5. 결론

축하합니다. Scene Semantics 및 Geospatial Depth 데이터를 시각화하는 AR 앱이 완성되었습니다.

자세히 알아보기