Làm quen với Scene Semantics API và Geospatial Depth API trong ARCore

1. Trước khi bắt đầu

ARCore là khung của Google để tạo trải nghiệm thực tế tăng cường (AR) trên điện thoại thông minh. API Ngữ nghĩa cảnh và API Độ sâu không gian địa lý giúp trải nghiệm thực tế tăng cường của bạn hiểu được môi trường xung quanh người dùng.

Scene Semantics API sử dụng một mô hình học máy (ML) để phân tích hình ảnh từ camera và cung cấp hình ảnh gồm các pixel được gắn nhãn. Công nghệ này có thể phân biệt 11 nhãn ngoài trời khác nhau.

Geospatial Depth API kết hợp thông tin về độ sâu từ chuyển động và mọi cảm biến phần cứng đang hoạt động (chẳng hạn như cảm biến đo thời gian bay) với dữ liệu Streetscape Geometry API. Thiết bị này giúp cải thiện các lỗi trong quan sát độ sâu ở khoảng cách lên đến 65 mét.

Trong lớp học lập trình này, bạn sẽ tạo một ứng dụng thực tế tăng cường (AR) để trực quan hoá kết quả của API Ngữ nghĩa cảnh và API Độ sâu không gian địa lý.

Điều kiện tiên quyết

  • Kiến thức cơ bản về AR

Kiến thức bạn sẽ học được

  • Cách bật Scene Semantics API.
  • Cách lấy và trực quan hoá hình ảnh ngữ nghĩa.
  • Cách lấy và trực quan hoá hình ảnh độ tin cậy ngữ nghĩa.
  • Cách xác định tỷ lệ phần trăm số pixel tương ứng với một nhãn nhất định.
  • Cách thiết lập một dự án Google Cloud có thể sử dụng ARCore Geospatial API.
  • Cách bật Geospatial Depth API.
  • Cách trực quan hoá hình ảnh độ sâu.

Bạn cần có

2. Thiết lập môi trường

Để giúp bạn bắt đầu sử dụng Geospatial API, chúng tôi đã cung cấp một dự án khởi đầu bao gồm những kiến thức cơ bản về dự án ARCore và một số hàm trợ giúp.

Để thiết lập dự án khởi đầu, hãy làm theo các bước sau:

  1. Mở Android Studio và làm theo một trong những cách sau:
    • Nếu bạn đã mở một dự án, hãy nhấp vào File > New > Project from version control (Tệp > Mới > Dự án từ chế độ quản lý phiên bản).
    • Nếu bạn thấy cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào Get from VCS (Lấy trên VCS). Nhận từ vị trí VCS
  2. Chọn Git rồi nhấn https://github.com/google-ar/codelab-scene-semantics-geospatial-depth.git để nhập dự án.

3. Trực quan hoá dữ liệu Scene Semantics API

Bật Scene Semantics API

Theo mặc định, Scene Semantics API bị tắt để tiết kiệm sức mạnh xử lý.

Để bật Scene Semantics API, hãy làm theo các bước sau:

  1. Trong tệp CodelabActivity.kt, hãy tìm dòng sau:
    // TODO: Enable the Scene Semantics API.
    
  2. Sau dòng đó, nếu thiết bị của bạn hỗ trợ, hãy bật Scene Semantics API trong cấu hình của phiên:
    if (session.isSemanticModeSupported(Config.SemanticMode.ENABLED)) {
      semanticMode = Config.SemanticMode.ENABLED
    }
    

Lấy và trực quan hoá hình ảnh ngữ nghĩa

Hình ảnh ngữ nghĩa là kết quả của mô hình học máy ARCore, mô hình này sẽ chỉ định một Enum SemanticLabel cho từng pixel trong nguồn cấp dữ liệu camera.

Ví dụ về hình ảnh ngữ nghĩa

Để lấy một hình ảnh ngữ nghĩa và hiển thị hình ảnh đó trên màn hình, hãy làm theo các bước sau:

  1. Trong tệp CodelabRenderer.kt, hãy tìm dòng sau:
    // TODO: Obtain the semantic image for this frame.
    
  2. Sau dòng đó, hãy lấy một hình ảnh ngữ nghĩa:
    frame.acquireSemanticImage().use { image ->
      semanticRenderer.updateCameraSemanticsTexture(image)
      activity.view.semanticLabelAtCenter = getLabelAt(image, image.width/2, image.height/2)
    }
    
    Hình ảnh ngữ nghĩa được dùng trong lớp SemanticRenderer để hiển thị trên màn hình. Bạn cập nhật biến semanticLabelAtCenter để hiển thị nhãn ngữ nghĩa ở giữa màn hình trong khung hiển thị của ứng dụng.
  3. Chạy ứng dụng và hướng camera vào nhiều đối tượng bên ngoài. Màn hình nhãn ngữ nghĩa sẽ thay đổi khi bạn nhìn vào các loại đối tượng khác nhau.
  4. Nhấn vào biểu tượng Biểu tượng cài đặt Cài đặt để bật lớp phủ hình ảnh có độ tin cậy ngữ nghĩa.

Lấy và trực quan hoá hình ảnh độ tin cậy ngữ nghĩa

Hình ảnh độ tin cậy ngữ nghĩa cho biết mức độ tin cậy của ARCore đối với nhãn ngữ nghĩa tại pixel phù hợp.

Để lấy một hình ảnh ngữ nghĩa và hiển thị hình ảnh đó trên màn hình, hãy làm theo các bước sau:

  1. Trong tệp CodelabRenderer.kt, hãy tìm dòng sau:
    // TODO: Obtain the confidence image for this frame.
    
  2. Sau dòng này, hãy lấy một hình ảnh ngữ nghĩa:
    frame.acquireSemanticConfidenceImage().use { image ->
      semanticRenderer.updateConfidenceSemanticsTexture(image)
      activity.view.confidenceAtCenter = getConfidenceAt(image, image.width/2, image.height/2)
    }
    
    Hình ảnh có độ tin cậy về ngữ nghĩa được dùng trong lớp SemanticRenderer để hiển thị trên màn hình. Bạn cập nhật biến confidenceAtCenter để hiển thị nhãn ngữ nghĩa ở giữa màn hình trong khung hiển thị của ứng dụng.
  3. Chạy ứng dụng và hướng camera vào nhiều đối tượng bên ngoài. Màn hình hiển thị độ tin cậy ngữ nghĩa sẽ thay đổi khi bạn nhìn vào các loại đối tượng khác nhau.
  4. Nhấn vào biểu tượng Biểu tượng cài đặt Cài đặt để bật lớp phủ hình ảnh có độ tin cậy ngữ nghĩa.

Xác định mức độ phổ biến của một nhãn

Mức độ phổ biến của nhãn là tỷ lệ phần trăm của một hình ảnh ngữ nghĩa bằng với một nhãn nhất định. Ví dụ: nếu 26% hình ảnh có giá trị SemanticLabel.SKY, thì giá trị mức độ phổ biến cho giá trị SemanticLabel.SKY0.26f.

Để lấy mức độ phổ biến của nhãn và hiển thị nhãn trên màn hình, hãy làm theo các bước sau:

  1. Trong tệp CodelabRenderer.kt, hãy tìm dòng sau:
    // TODO: Obtain the prevalence of the selected label for this frame.
    
  2. Sau dòng đó, hãy lấy tỷ lệ lưu hành cho nhãn đã chọn:
    activity.view.fractionOfLabel = frame.getSemanticLabelFraction(activity.view.selectedSemanticLabel)
    
  3. Chạy ứng dụng và hướng camera vào nhiều đối tượng bên ngoài. Giá trị phân số sẽ thay đổi khi bạn nhìn vào các loại đối tượng khác nhau. Nhấn vào Biểu tượng cài đặt Cài đặt để thay đổi phần nhãn đang hiển thị. Ví dụ: hãy thử BUILDING và cố gắng lấp đầy khung hiển thị bằng một toà nhà để xem điều đó ảnh hưởng đến phân số như thế nào.

4. Trực quan hoá dữ liệu Depth API không gian địa lý

Geospatial Depth API cải thiện các chỉ số về độ sâu khi bạn bật Geospatial API và Streetscape Geometry API. Để sử dụng Geospatial Depth API bằng Kotlin và Android Studio, bạn cần có một dự án Google Cloud.

Thiết lập một dự án trên Google Cloud

ARCore Geospatial API kết nối với Google Cloud để cung cấp thông tin bản địa hoá từ Hệ thống định vị bằng hình ảnh (VPS) của Google ở những khu vực được Google Street View hỗ trợ.

Để sử dụng máy chủ này trong dự án của bạn, hãy làm theo các bước sau:

  1. Tạo một dự án trên Google Cloud.

    Tạo một dự án trên Google Cloud
  2. Trong trường Project name (Tên dự án), hãy nhập một tên thích hợp, chẳng hạn như ARCore Geospatial API project, rồi chọn một vị trí bất kỳ.
  3. Nhấp vào Tạo.
  4. Trong Google Cloud Console, trên trang chọn dự án, hãy nhấp vào Tạo dự án.
  5. Nhấp vào đường liên kết sau để xem ARCore API cho dự án này rồi nhấp vào Bật:
  6. Tạo khoá API cho dự án của bạn:
    1. Trong phần API và dịch vụ, hãy chọn Thông tin xác thực.
    2. Nhấp vào Tạo thông tin xác thực rồi chọn Khoá API.
    3. Ghi lại khoá vì bạn sẽ cần đến khoá này sau.

Bạn đã tạo một dự án Google Cloud có uỷ quyền khoá API và bạn đã sẵn sàng sử dụng Geospatial API trong dự án mẫu.

Tích hợp khoá API với dự án Android Studio

Để liên kết khoá API từ Google Cloud với dự án của bạn, hãy làm theo các bước sau:

  1. Trong Android Studio, hãy nhấp vào app > src rồi nhấp đúp vào AndroidManifest.xml.
  2. Tìm các mục meta-data sau đây:
    <meta-data
        android:name="com.google.android.ar.API_KEY"
        android:value="API_KEY" />
    
  3. Thay thế phần giữ chỗ API_KEY bằng khoá API mà bạn đã tạo trong dự án Google Cloud. Giá trị được lưu trữ trong com.google.android.ar.API_KEY cho phép ứng dụng này sử dụng Geospatial API.

Xác minh dự án của bạn

  • Để xác minh dự án, hãy chạy ứng dụng trên thiết bị phát triển. Bạn sẽ thấy chế độ xem camera và thông tin gỡ lỗi không gian địa lý ở đầu màn hình.

Thông tin không gian địa lý sẽ xuất hiện trong ứng dụng

Bật các cấu hình bắt buộc

Geospatial Depth API yêu cầu bạn bật 3 chế độ cài đặt trong cấu hình phiên của ứng dụng.

Để bật các tính năng này, hãy làm theo các bước sau:

  1. Trong tệp CodelabRenderer.kt, hãy tìm dòng sau:
    // TODO: Enable the Geospatial API, the Streetscape Geometry API, and the Depth API.
    
  2. Ở dòng tiếp theo, hãy thêm mã sau:
    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
    }
    

Trực quan hoá thông tin về độ sâu

  1. Chạy ứng dụng và ghé thăm một toà nhà trong khu vực của bạn.
  2. Sau khi hoàn tất quá trình Bản địa hoá không gian địa lý, hãy nhấn vào Biểu tượng cài đặt Cài đặt rồi bật tính năng trực quan hoá độ sâu không gian địa lý.
  3. Xem toà nhà ở chế độ thực tế tăng cường và so sánh toà nhà đó với thông tin về độ sâu mà không có độ sâu không gian địa lý.

5. Kết luận

Xin chúc mừng! Bạn đã tạo một ứng dụng thực tế tăng cường có thể trực quan hoá ngữ nghĩa cảnh và độ sâu không gian địa lý!

Tìm hiểu thêm