Comprendre l'environnement de l'utilisateur sur AR Foundation d'Unity

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

L'API Scene Semantics permet aux développeurs de comprendre la scène qui entoure 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 en plein air, l'API renvoie une étiquette pour chaque pixel dans un ensemble de classes sémantiques utiles (ciel, bâtiment, arbre, route, trottoir, véhicule, personne, etc.). En plus des étiquettes de pixel, l'API Scene Semantics fournit des valeurs de confiance pour chaque étiquette de pixel, ainsi qu'un moyen simple d'interroger la prévalence d'une étiquette donnée dans une scène en plein air.

De gauche à droite, voici 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.

Prérequis

Assurez-vous de bien maîtriser les concepts fondamentaux de la RA. et comment 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 ARCore ne sont pas tous compatibles avec l'API Scene Semantics en raison de contraintes de puissance de traitement.

Pour économiser des 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.

Dans ARCoreExtensionsConfig, définissez le mode sémantique sur "Enabled" (Activé).

Mode sémantique activé.

Si vous utilisez iOS, vous devez également activer la sémantique dans les paramètres du projet:

  1. Accédez à Modifier > Paramètres du projet > Gestion des plug-ins XR > Extensions ARCore.
  2. Sous Fonctionnalités facultatives, sélectionnez Sémantique sur iOS.

Sémantique sur iOS activée dans les fonctionnalités facultatives.

Obtenir l'image sémantique

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

Utilisez ArSemanticManager.TryGetSemanticTexture() pour acquérir l'image sémantique:

if (semanticManager.TryGetSemanticTexture(out Texture2D semanticImage))
{
    using (semanticImage)
    {
        // Use the semantic image here.
    }
}

Les images sémantiques de sortie doivent être disponibles environ une à trois images après le début de la session, selon l'appareil.

Image "Obtenir l'image de confiance"

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

Utilisez ArSemanticManager.TryGetSemanticConfidenceTexture() pour obtenir l'image de confiance sémantique:

if (semanticManager.TryGetSemanticConfidenceTexture(out Texture2D semanticConfidenceImage))
{
    using (semanticConfidenceImage)
    {
        // Use the semantic confidence image here.
    }
}

Les images de confiance des résultats doivent être disponibles environ une à trois images après le début de la session, selon 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 appartiennent à une classe particulière, telle que le ciel. Cette requête est plus efficace que de renvoyer l'image sémantique et d'effectuer une recherche pixel par pixel pour une étiquette spécifique. La fraction renvoyée est une valeur flottante comprise dans la plage [0.0, 1.0].

Utilisez ArSemanticManager.GetSemanticLabelFraction() pour obtenir la fraction d'une étiquette donnée:

var fraction = semanticManager.GetSemanticLabelFraction(SemanticLabel.SKY);