Comprendi l'ambiente dell'utente su Unity's AR Foundation

Scopri come utilizzare l'API Scene Semantics nelle tue app.

L'API Scene Semantics consente agli sviluppatori di comprendere la scena che circonda l'utente, fornendo informazioni semantiche in tempo reale basate su modelli ML. Data un'immagine di una scena all'aperto, l'API restituisce un'etichetta per ogni pixel in un insieme di classi semantiche utili, come cielo, edificio, albero, strada, marciapiede, veicolo, persona e altro ancora. Oltre alle etichette dei pixel, l'API Scene Semantics offre anche valori di confidenza per ogni etichetta del pixel e un modo semplice per eseguire query sulla prevalenza di una determinata etichetta in una scena all'aperto.

Da sinistra a destra, esempi di un'immagine di input, l'immagine semantica delle etichette dei pixel e l'immagine di confidenza corrispondente:

Esempio di immagine di input, immagine semantica e immagine di attendibilità semantica.

Prerequisiti

Prima di procedere, assicurati di conoscere i concetti fondamentali dell'AR e come configurare una sessione ARCore.

Attivare la semantica della scena

In una nuova sessione ARCore, controlla se il dispositivo di un utente supporta l'API Scene Semantics. Non tutti i dispositivi compatibili con ARCore supportano l'API Scene Semantics a causa di limitazioni della potenza di elaborazione.

Per risparmiare risorse, la funzionalità Scene Semantics è disattivata per impostazione predefinita su ARCore. Attiva la modalità semantica per consentire alla tua app di utilizzare l'API Scene Semantics.

In ARCoreExtensionsConfig, imposta la modalità di semantica su Abilitata.

La modalità semantica è impostata su Abilitata.

Se utilizzi iOS, la funzionalità Semantika deve essere attivata anche nelle impostazioni del progetto:

  1. Vai a Modifica > Impostazioni progetto > Gestione plug-in XR > Estensioni ARCore.
  2. In Funzionalità facoltative, seleziona Semantica su iOS.

La semantica su iOS è abilitata nelle funzionalità facoltative.

Ottenere l'immagine semantica

Una volta attivata la funzionalità Scienza delle scene, l'immagine semantica può essere recuperata. L'immagine semantica è un'immagine TextureFormat.R8, in cui ogni pixel corrisponde a un'etichetta semantica definita da SemanticLabel.

Utilizza ArSemanticManager.TryGetSemanticTexture() per acquisire l'immagine semantica:

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

Le immagini semantiche di output dovrebbero essere disponibili dopo circa 1-3 frame dall'inizio della sessione, a seconda del dispositivo.

Ottenere l'immagine "con fiducia"

Oltre all'immagine semantica, che fornisce un'etichetta per ogni pixel, l'API fornisce anche un'immagine di confidenza dei valori di confidenza dei pixel corrispondenti. L'immagine di confidenza è un'immagine TextureFormat.Alpha8, in cui ogni pixel corrisponde a un valore nell'intervallo [0, 255], corrispondente alla probabilità associata all'etichetta semantica per ogni pixel.

Utilizza ArSemanticManager.TryGetSemanticConfidenceTexture() per acquisire l'immagine dell'affidabilità semantica:

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

Le immagini di confidenza in uscita dovrebbero essere disponibili dopo circa 1-3 frame dall'inizio della sessione, a seconda del dispositivo.

Esegui una query sulla frazione di pixel per un'etichetta semantica

Puoi anche eseguire query sulla frazione di pixel nell'inquadratura corrente che appartengono a una determinata classe, ad esempio il cielo. Questa query è più efficiente rispetto alla restituzione dell'immagine semantica ed esecuzione di una ricerca pixel per pixel di un'etichetta specifica. La frazione restituita è un valore in virgola mobile compreso nell'intervallo [0.0, 1.0].

Utilizza ArSemanticManager.GetSemanticLabelFraction() per acquisire la frazione per una determinata etichetta:

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