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