Comprendre l'environnement de l'utilisateur sur le SDK Android (Kotlin/Java)

Découvrez comment utiliser l'API Scene Semantics dans vos propres applications.

L'API Scene Semantics permet aux développeurs de comprendre l'environnement de l'utilisateur en fournissant des informations sémantiques en temps réel basées sur un modèle de ML. À partir d'une image d'une scène extérieure, l'API renvoie un libellé pour chaque pixel dans un ensemble de classes sémantiques utiles, comme le ciel, un bâtiment, un arbre, une route, un trottoir, un véhicule, une personne, etc. En plus des étiquettes de pixel, l'API Scene Semantics propose des valeurs de confiance pour chaque libellé de pixel et permet d'interroger facilement la prévalence d'une étiquette donnée dans une scène en extérieur.

De gauche à droite, des exemples d'image d'entrée, l'image sémantique des étiquettes de pixels et l'image de confiance correspondante:

Exemple d'image d'entrée, d'image sémantique et d'image de confiance sémantique.

Conditions préalables

Assurez-vous de bien comprendre les concepts fondamentaux de la RA et de configurer une session ARCore avant de continuer.

Activer Scene Semantics

Dans une nouvelle session ARCore, vérifiez si l'appareil d'un utilisateur est compatible avec l'API Scene Semantics. Les appareils compatibles avec ARCore ne sont pas tous compatibles avec l'API Scene Semantics en raison de contraintes de puissance de traitement.

Pour économiser les ressources, Scene Semantics est désactivé par défaut sur ARCore. Activez le mode sémantique pour que votre application utilise l'API Scene Semantics.

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)

Obtenir l'image sémantique

Une fois Scene Semantics activé, l'image sémantique peut être récupérée. L'image sémantique est une image ImageFormat.Y8, où chaque pixel correspond à une étiquette sémantique définie par SemanticLabel.

Utilisez Frame.acquireSemanticImage() pour acquérir l'image sémantique:

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

Les images sémantiques de sortie doivent être disponibles après un à trois frames environ à partir du début de la session, en fonction de l'appareil.

Image "Obtenir le niveau de confiance"

En plus de l'image sémantique, qui fournit une étiquette pour chaque pixel, l'API fournit également une image de confiance correspondant aux valeurs de confiance du pixel. L'image de confiance est une image ImageFormat.Y8, où chaque pixel correspond à une valeur comprise dans la plage [0, 255], correspondant à la probabilité associée à l'étiquette sémantique de chaque pixel.

Utilisez Frame.acquireSemanticConfidenceImage() pour acquérir l'image de confiance sémantique:

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

Les images de confiance de sortie doivent être disponibles après un à trois frames environ à partir du début de la session, en fonction de l'appareil.

Interroger la fraction de pixels pour une étiquette sémantique

Vous pouvez également interroger la fraction de pixels de l'image actuelle qui appartient à une classe particulière, comme le ciel. Cette requête est plus efficace que de renvoyer l'image sémantique et d'effectuer une recherche par pixel sur une étiquette spécifique. La fraction renvoyée est une valeur flottante comprise dans la plage [0.0, 1.0].

Utilisez Frame.getSemanticLabelFraction() pour acquérir la fraction pour une étiquette donnée:

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