Weitere Informationen zur Verwendung der Scene Semantics API in Ihren eigenen Apps
Die Scene Semantics API ermöglicht es Entwicklern, die Umgebung des Nutzers zu verstehen, indem sie ML-Modell-basierte semantische Informationen in Echtzeit bereitstellen. Wenn Sie ein Bild einer Außenszene angeben, gibt die API für jedes Pixel ein Label für eine Reihe nützlicher semantischer Klassen zurück, z. B. Himmel, Gebäude, Baum, Straße, Bürgersteig, Fahrzeug oder Person. Neben Pixellabels bietet die Scene Semantics API auch Konfidenzwerte für jedes Pixellabel und eine nutzerfreundliche Möglichkeit, die Häufigkeit eines bestimmten Labels in einer Außenszene abzufragen.
Von links nach rechts: Beispiele für ein Eingabebild, das semantische Bild der Pixellabels und das entsprechende Konfidenzbild:
Vorbereitung
Machen Sie sich mit den grundlegenden AR-Konzepten und der Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.
Szenensemantik aktivieren
Prüfen Sie in einer neuen ARCore-Sitzung, ob das Gerät eines Nutzers die Scene Semantics API unterstützt. Nicht alle ARCore-kompatiblen Geräte unterstützen die Scene Semantics API aufgrund von Einschränkungen bei der Rechenleistung.
Aus Ressourcengründen ist die Szenensemantik in ARCore standardmäßig deaktiviert. Aktivieren Sie den semantischen Modus, damit Ihre App die Scene Semantics API verwendet.
// Check whether the user's device supports the Scene Semantics API. int32_t is_scene_semantics_supported = 0; ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported); // Configure the session for AR_SEMANTIC_MODEL_ENABLED. ArConfig* ar_config = NULL; ArConfig_create(ar_session, &ar_config); if (is_scene_semantics_supported) { ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED); } CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS); ArConfig_destroy(ar_config);
Semantisches Bild abrufen
Sobald die Szenensemantik aktiviert ist, kann das semantische Bild abgerufen werden. Das semantische Bild ist ein AR_IMAGE_FORMAT_Y8
-Bild, bei dem jedes Pixel einem semantischen Label entspricht, das von ArSemanticLabel
definiert wird.
Verwenden Sie ArFrame_acquireSemanticImage()
, um das semantische Bild zu erfassen:
// Retrieve the semantic image for the current frame, if available. ArImage* semantic_image = NULL; if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) { // 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. return; } // If a semantic image is available, use it here.
Die Ausgabe semantisch relevanter Bilder sollte je nach Gerät nach etwa 1–3 Frames nach Beginn der Sitzung verfügbar sein.
Bild mit Zuverlässigkeitsbewertung abrufen
Neben dem semantischen Bild, das ein Label für jedes Pixel enthält, stellt die API auch ein Konfidenzbild mit den entsprechenden Pixelkonfidenzwerten bereit. Das Konfidenzbild ist ein AR_IMAGE_FORMAT_Y8
-Bild, bei dem jedem Pixel ein Wert im Bereich [0, 255]
zugeordnet ist, der der Wahrscheinlichkeit entspricht, die mit dem semantischen Label für jedes Pixel verknüpft ist.
Verwenden Sie ArFrame_acquireSemanticConfidenceImage()
, um das Bild mit der semantischen Konfidenz zu erhalten:
// Retrieve the semantic confidence image for the current frame, if available. ArImage* semantic_confidence_image = NULL; if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) { // 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. return; } // If a semantic confidence image is available, use it here.
Bilder mit dem Konfidenzgrad sollten je nach Gerät nach etwa 1–3 Frames nach Beginn der Sitzung verfügbar sein.
Den Anteil der Pixel für ein semantisches Label abfragen
Sie können auch den Anteil der Pixel im aktuellen Frame abfragen, die zu einer bestimmten Klasse gehören, z. B. zum Himmel. Diese Abfrage ist effizienter als die Rückgabe des semantischen Bilds und die pixelweise Suche nach einem bestimmten Label. Der zurückgegebene Bruch ist ein Float-Wert im Bereich [0.0, 1.0]
.
Verwenden Sie ArFrame_getSemanticLabelFraction()
, um den Bruchteil für ein bestimmtes Label abzurufen:
// Retrieve the fraction of pixels for the semantic label sky in the current frame. float out_fraction = 0.0f; if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) { // No fraction of semantic labels was retrieved for this frame. }