Poznaj środowisko użytkownika za pomocą pakietu Android SDK (Kotlin/Java)

Dowiedz się, jak używać interfejsu Scene Semantics API we własnych aplikacjach.

Interfejs Scene Semantics API umożliwia programistom zrozumienie otaczającej je sceny przez dostarczanie w czasie rzeczywistym informacji semantycznych opartych na modelach systemów uczących się. Biorąc pod uwagę obraz sceny na zewnątrz, interfejs API zwraca etykietę każdego piksela w zestawie przydatnych klas semantycznych, takich jak niebo, budynek, drzewo, droga, chodnik, pojazd, osoba i inne. Oprócz etykiet pikseli interfejs Scene Semantics API udostępnia też wartości ufności dla każdej etykiety piksela i umożliwia łatwe w użyciu zapytanie o częstotliwość występowania danej etykiety w plenerze.

Przykłady obrazu wejściowego, semantyczna grafika etykiet pikseli oraz odpowiedni obraz ufności (od lewej do prawej):

Przykład obrazu wejściowego, obrazu semantycznego i semantycznego obrazu ufności.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.

Włącz semantyka sceny

W nowej sesji ARCore sprawdź, czy urządzenie użytkownika obsługuje interfejs Scene Semantics API. Z powodu ograniczeń mocy obliczeniowej nie wszystkie urządzenia zgodne z ARCore obsługują interfejs Scene Semantics API.

Aby oszczędzać zasoby, semantyka sceny jest domyślnie wyłączona w ARCore. Włącz tryb semantyczny, aby aplikacja używała interfejsu Scene Semantics API.

Java

Config config = session.getConfig();

// Check whether the user's device supports the Scene Semantics API.
boolean isSceneSemanticsSupported =
    session.isSemanticModeSupported(Config.SemanticMode.ENABLED);
if (isSceneSemanticsSupported) {
  config.setSemanticMode(Config.SemanticMode.ENABLED);
}
session.configure(config);

Kotlin

val config = session.config

// Check whether the user's device supports the Scene Semantics API.
val isSceneSemanticsSupported = session.isSemanticModeSupported(Config.SemanticMode.ENABLED)
if (isSceneSemanticsSupported) {
  config.semanticMode = Config.SemanticMode.ENABLED
}
session.configure(config)

Pobierz obraz semantyczny

Po włączeniu semantyki sceny można pobrać semantyczny obraz. Ten obraz to obraz ImageFormat.Y8, gdzie każdy piksel odpowiada etykiecie semantycznej zdefiniowanej przez SemanticLabel.

Użyj narzędzia Frame.acquireSemanticImage(), aby uzyskać semantyczny obraz:

Java

// Retrieve the semantic image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticImage()) {
  // Use the semantic image here.
} catch (NotYetAvailableException e) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a
  // chance to run yet.
}

Kotlin

// Retrieve the semantic image for the current frame, if available.
try {
  frame.acquireSemanticImage().use { semanticImage ->
    // Use the semantic image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic image retrieved for this frame.
}

W zależności od urządzenia wyjściowe obrazy semantyczne powinny być dostępne po około 1–3 klatkach od początku sesji.

Pobierz obraz pewności

Oprócz obrazu semantycznego, który zawiera etykietę każdego piksela, interfejs API zapewnia też obraz ufności odpowiadającym wartościom ufności pikseli. Obraz ufności to obraz ImageFormat.Y8, gdzie każdy piksel odpowiada wartości z zakresu [0, 255], która odpowiada prawdopodobieństwu związanym z etykietą semantyczną każdego piksela.

Użyj narzędzia Frame.acquireSemanticConfidenceImage(), aby uzyskać semantyczny obraz pewności:

Java

// Retrieve the semantic confidence image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticConfidenceImage()) {
  // Use the semantic confidence image here.
} catch (NotYetAvailableException e) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a
  // chance to run yet.
}

Kotlin

// Retrieve the semantic confidence image for the current frame, if available.
try {
  frame.acquireSemanticConfidenceImage().use { semanticConfidenceImage ->
    // Use the semantic confidence image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic confidence image retrieved for this frame.
}

Wyjściowe obrazy ufności powinny być dostępne po około 1–3 klatkach od początku sesji, w zależności od urządzenia.

Zapytanie o ułamek pikseli na potrzeby etykiety semantycznej

Możesz też wysyłać zapytania o ułamek pikseli w bieżącej ramce, które należą do określonej klasy, na przykład do nieba. To zapytanie jest skuteczniejsze niż zwracanie semantycznego obrazu i wyszukiwanie konkretnej etykiety z użyciem pikseli. Zwracany ułamek jest wartością zmiennoprzecinkową w zakresie [0.0, 1.0].

Użyj funkcji Frame.getSemanticLabelFraction(), aby uzyskać ułamek dla danej etykiety:

Java

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  float outFraction = frame.getSemanticLabelFraction(SemanticLabel.SKY);
  // Use the semantic label fraction here.
} catch (NotYetAvailableException e) {
  // No fraction of semantic labels was retrieved for this frame.
}

Kotlin

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  val fraction = frame.getSemanticLabelFraction(SemanticLabel.SKY)
  // Use the semantic label fraction here.
} catch (e: NotYetAvailableException) {
  // No fraction of semantic labels was retrieved for this frame.
}