Dowiedz się, jak używać interfejsu Scene Semantics API w swoich aplikacjach.
Interfejs Scene Semantics API umożliwia deweloperom analizowanie sceny wokół użytkownika dzięki dostarczaniu informacji semantycznych w czasie rzeczywistym na podstawie modelu uczenia maszynowego. Po otrzymaniu obrazu przedstawiającego scenę na zewnątrz interfejs API zwraca etykietę dla każdego piksela w ramach zestawu przydatnych klas semantycznych, takich jak niebo, budynek, drzewo, droga, chodnik, pojazd, osoba itp. Oprócz etykiet pikseli interfejs API semantyki sceny udostępnia też wartości ufności dla każdej etykiety piksela oraz łatwy sposób na zapytanie o występowanie danej etykiety w scenie na zewnątrz.
Od lewej do prawej: przykłady obrazu wejściowego, semantycznego obrazu z etykietami pikseli i odpowiedniego obrazu ufności:
Wymagania wstępne
Zanim przejdziesz dalej, upewnij się, że rozumiesz podstawowe zagadnienia związane z rozszerzoną rzeczywistością oraz że wiesz, jak skonfigurować sesję ARCore.
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.
GARSessionConfiguration *configuration = [[GARSessionConfiguration alloc] init];
if ([self.garSession isSemanticModeSupported:GARSemanticModeEnabled]) {
configuration.semanticMode = GARSemanticModeEnabled;
}
NSError *error;
[self.garSession setConfiguration:configuration error:&error];
Pobieranie obrazu semantycznego
Po włączeniu semantyki sceny można pobrać obraz semantyczny. Obraz semantyczny to obraz kCVPixelFormatType_OneComponent8
, w którym każdy piksel odpowiada etykiecie semantycznej zdefiniowanej przez GARSemanticLabel
.
Aby uzyskać obraz semantyczny, użyj GARFrame.semanticImage
:
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.
}
Zdjęcia semantyczne powinny być dostępne po około 1–3 klatkach od rozpoczęcia 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 kCVPixelFormatType_OneComponent8
, w którym każdy piksel odpowiada wartości z zakresu [0, 255]
, odpowiadającej prawdopodobieństwu związanemu z etykietą semantyczną dla każdego piksela.
Aby uzyskać obraz semantycznej pewności siebie, użyj GARFrame.semanticConfidenceImage
:
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.
}
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 etykiety semantycznej
Możesz też zapytać o część pikseli w bieżącym ujęciu, które należą do określonej klasy, np. nieba. To zapytanie jest bardziej wydajne niż zwracanie obrazu semantycznego i wyszukiwanie określonej etykiety w ramach pikseli. Zwracana iloraz jest liczbą zmiennoprzecinkową z zakresu [0.0, 1.0]
.
Aby uzyskać ułamek dla danej etykiety, użyj fractionForSemanticLabel:
:
// Ensure that semantic data is present for the GARFrame.
if (garFrame.semanticImage) {
float fraction = [garFrame fractionForSemanticLabel:GARSemanticLabelSky];
}