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 pozwala deweloperom zrozumieć scenę otaczającą użytkownika i udostępnia oparte na modelu ML informacje semantyczne w czasie rzeczywistym. Po przeanalizowaniu obrazu otoczenia interfejs API zwraca etykietę dla każdego piksela w zestawie przydatnych klas semantycznych, takich jak niebo, budynek, drzewo, droga, chodnik, pojazd, osoba i inne. Poza etykietami pikseli interfejs Scene Semantics API udostępnia też wartości ufności dla każdej etykiety piksela i łatwy w użyciu sposób sprawdzania, czy dana etykieta jest często występująca na scenie na zewnątrz.

Od lewej do prawej przykłady obrazu wejściowego, semantyczny obraz etykiet pikseli i odpowiadający mu obraz ufności:

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

Wymagania wstępne

Upewnij się, że znasz podstawowe pojęcia związane z AR. i dowiedz się, jak skonfigurować sesję ARCore, zanim przejdziesz dalej.

Włącz semantykę sceny

W nowej sesji ARCore sprawdź, czy urządzenie użytkownika obsługuje interfejs Scene Semantics API. Nie wszystkie urządzenia zgodne z ARCore obsługują interfejs Scene Semantics API ze względu na ograniczenia mocy przetwarzania.

Aby można było 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)

Uzyskiwanie obrazu semantycznego

Obraz semantyczny można pobrać po włączeniu semantyki sceny. Obraz semantyczny to obraz ImageFormat.Y8, w którym każdy piksel odpowiada etykiecie semantycznej zdefiniowanej przez SemanticLabel.

Użyj metody Frame.acquireSemanticImage(), aby uzyskać obraz semantyczny:

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.
}

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

Uzyskiwanie obrazu ufności

Oprócz obrazu semantycznego, który zapewnia etykietę dla każdego piksela, interfejs API udostępnia również obraz ufności odpowiednich wartości ufności piksela. Obraz ufności to obraz ImageFormat.Y8, w którym każdy piksel odpowiada wartości z zakresu [0, 255] odpowiadającemu prawdopodobieństwu związanemu z etykietą semantyczną każdego piksela.

Użyj metody Frame.acquireSemanticConfidenceImage(), aby uzyskać semantyczny obraz ufnoś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 w celu uzyskania etykiety semantycznej

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

Użyj funkcji Frame.getSemanticLabelFraction(), aby pobrać 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.
}