Die Nutzerumgebung unter iOS verstehen

Scene Semantics API in Ihren eigenen Apps verwenden

Mit der Scene Semantics API können Entwickler die Umgebung des Nutzers besser verstehen, indem sie auf ML-Modellen basierende semantische Echtzeitinformationen bereitstellt. Bei einem Bild einer Außenszene gibt die API ein Label für jedes Pixel über eine Reihe nützlicher semanischer Klassen wie Himmel, Gebäude, Baum, Straße, Bürgersteig, Fahrzeug, Person usw. zurück. Zusätzlich zu den Pixellabels bietet die Scene Semantics API auch Konfidenzwerte für jedes Pixellabel und eine benutzerfreundliche Methode, um die Verbreitung eines bestimmten Labels in einer Außenszene abzufragen.

Von links nach rechts sehen Sie Beispiele für ein Eingabebild, das semantische Bild von Pixellabels und das entsprechende Konfidenzbild:

Beispiel für ein Eingabebild, ein semantisches Bild und ein semantisches Konfidenzbild.

Voraussetzungen

Machen Sie sich mit den grundlegenden AR-Konzepten und zur 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. Aufgrund von Einschränkungen bei der Verarbeitungsleistung unterstützen nicht alle ARCore-kompatiblen Geräte die Scene Semantics API.

Die Szenensemantik ist in ARCore standardmäßig deaktiviert, um Ressourcen zu sparen. Aktivieren Sie den semantischen Modus, damit Ihre Anwendung die Scene Semantics API verwendet.

GARSessionConfiguration *configuration = [[GARSessionConfiguration alloc] init];
if ([self.garSession isSemanticModeSupported:GARSemanticModeEnabled]) {
    configuration.semanticMode = GARSemanticModeEnabled;
}

NSError *error;
[self.garSession setConfiguration:configuration error:&error];

Semantisches Bild abrufen

Sobald die Szenensemantik aktiviert ist, kann das semantische Bild abgerufen werden. Das semantische Bild ist ein kCVPixelFormatType_OneComponent8-Bild, wobei jedes Pixel einem durch GARSemanticLabel definierten semantischen Label entspricht.

Verwenden Sie GARFrame.semanticImage, um das semantische Bild abzurufen:

CVPixelBuffer semanticImage = garFrame.semanticImage;
if (semanticImage) {
    // Use the semantic image here
} else {
    // Semantic images are not available.
    // The output image may be missing for the first couple frames before the model has had a
    // chance to run yet.
}

Semantische Ausgabebilder sollten je nach Gerät etwa ein bis drei Frames nach Beginn der Sitzung verfügbar sein.

Bild zum Konfidenzintervall abrufen

Zusätzlich zum semantischen Bild, das für jedes Pixel ein Label bereitstellt, stellt die API auch ein Konfidenzbild der entsprechenden Pixelkonfidenzwerte bereit. Das Konfidenzbild ist ein kCVPixelFormatType_OneComponent8-Bild, wobei jedes Pixel einem Wert im Bereich [0, 255] entspricht, der der Wahrscheinlichkeit entspricht, die dem semantischen Label für jedes Pixel zugeordnet ist.

Verwenden Sie GARFrame.semanticConfidenceImage, um das semantische Konfidenzbild abzurufen:

CVPixelBuffer confidenceImage = garFrame.semanticConfidenceImage;
if (confidenceImage) {
    // Use the semantic image here
} else {
    // Semantic images are not available.
    // The output image may be missing for the first couple frames before the model has had a
    // chance to run yet.
}

Konfidenzbilder für die Ausgabe sollten je nach Gerät etwa ein bis drei Frames nach Beginn der Sitzung verfügbar sein.

Den Pixelanteil nach einem semantischen Label abfragen

Sie können auch den Anteil der Pixel im aktuellen Frame abfragen, der zu einer bestimmten Klasse wie z. B. sky gehört. Diese Abfrage ist effizienter, als das semantische Bild zurückzugeben und eine pixelweise Suche nach einem bestimmten Label durchzuführen. Der zurückgegebene Bruch ist eine Gleitkommazahl im Bereich [0.0, 1.0].

Verwenden Sie fractionForSemanticLabel:, um den Bruch eines bestimmten Labels abzurufen:

// Ensure that semantic data is present for the GARFrame.
if (garFrame.semanticImage) {
    float fraction = [garFrame fractionForSemanticLabel:GARSemanticLabelSky];
}