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

Dowiedz się, jak używać interfejsu Scene Semantics API w swoich 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 obrazu z poziomem pewności semantycznej

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

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

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)

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

Pobieranie obrazu z poziomem pewności

Oprócz obrazu semantycznego, który zawiera etykietę dla każdego piksela, interfejs API udostępnia też obraz ufności z odpowiadającymi mu wartościami 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.
}

Zdjęcia z wynikiem szacowania powinny być dostępne po około 1–3 klatkach od rozpoczęcia 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 bardziej wydajne niż zwracanie obrazu semantycznego i wyszukiwanie określonej etykiety w ramach pikseli. Zwracana iloraz jest wartością zmiennoprzecinkową z zakresu [0.0, 1.0].

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

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