Comprendere l'ambiente dell'utente sull'SDK Android (Kotlin/Java)

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 l'immagine di una scena all'aperto, l'API restituisce un'etichetta per ciascun 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 affidabilità per ciascuna etichetta di pixel e un modo facile da usare per verificare la 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 la corrispondente immagine di confidenza:

Esempio di immagine di input, immagine semantica e immagine di confidenza semantica.

Prerequisiti

Assicurati di aver compreso i concetti fondamentali di AR e di configurare una sessione ARCore prima di procedere.

Attiva semantica della scena

In una nuova sessione ARCore, verifica 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 dei vincoli della potenza di elaborazione.

Per salvare risorse, Scene Semantics è disattivata per impostazione predefinita su ARCore. Attiva la modalità semantica per fare in modo che la tua app utilizzi 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)

Ottenere l'immagine semantica

Una volta abilitata la semantica di scena, l'immagine semantica può essere recuperata. L'immagine semantica è un'immagine ImageFormat.Y8, in cui ogni pixel corrisponde a un'etichetta semantica definita da SemanticLabel.

Utilizza Frame.acquireSemanticImage() per acquisire l'immagine semantica:

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

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

Immagine Ottenere l'affidabilità

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

Utilizza Frame.acquireSemanticConfidenceImage() per acquisire l'immagine di confidenza semantica:

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

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

Query sulla frazione di pixel per un'etichetta semantica

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

Utilizza Frame.getSemanticLabelFraction() per acquisire la frazione di una data etichetta:

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