Comprender el entorno del usuario en el SDK de Android (Kotlin/Java)

Aprende a usar la API de Scene Semantics en tus propias apps.

La API de Scene Semantics permite a los desarrolladores comprender la escena que rodea al usuario, ya que proporciona información semántica en tiempo real basada en modelos de AA. Dada una imagen de una escena al aire libre, la API muestra una etiqueta para cada píxel de un conjunto de clases semánticas útiles, como el cielo, el edificio, el árbol, la carretera, la acera, el vehículo y la persona, entre otros. Además de las etiquetas de píxeles, la API de Scene Semantics también ofrece valores de confianza para cada etiqueta de píxel y una manera fácil de usar de consultar la prevalencia de una etiqueta determinada en una escena al aire libre.

De izquierda a derecha, ejemplos de una imagen de entrada, la imagen semántica de etiquetas de píxeles y la imagen de confianza correspondiente:

Ejemplo de imagen de entrada, imagen semántica y, también, imagen de confianza semántica.

Requisitos previos

Asegúrate de comprender los conceptos fundamentales de RA y cómo configurar una sesión de ARCore antes de continuar.

Cómo habilitar la semántica de escenas

En una nueva sesión de ARCore, verifica si el dispositivo de un usuario es compatible con la API de Scene Semantics. No todos los dispositivos compatibles con ARCore admiten la API de Scene Semantics debido a restricciones de potencia de procesamiento.

Para guardar recursos, Scene Semantics está inhabilitado de forma predeterminada en ARCore. Habilita el modo semántico para que tu app use la API de 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)

Obtén la imagen semántica

Una vez que se habilita Scene Semantics, se puede recuperar la imagen semántica. La imagen semántica es una imagen ImageFormat.Y8, en la que cada píxel corresponde a una etiqueta semántica definida por SemanticLabel.

Usa Frame.acquireSemanticImage() para adquirir la imagen semántica:

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

Las imágenes semánticas de salida deben estar disponibles después de unos 1 a 3 fotogramas desde el inicio de la sesión, según el dispositivo.

Obtén la imagen de confianza

Además de la imagen semántica, que proporciona una etiqueta para cada píxel, la API también proporciona una imagen de confianza de los valores de confianza de píxeles correspondientes. La imagen de confianza es una imagen ImageFormat.Y8, en la que cada píxel corresponde a un valor en el rango [0, 255], que corresponde a la probabilidad asociada con la etiqueta semántica para cada píxel.

Usa Frame.acquireSemanticConfidenceImage() para adquirir la imagen de confianza semántica:

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

Las imágenes de confianza de salida deben estar disponibles después de 1 a 3 fotogramas desde el inicio de la sesión, según el dispositivo.

Consulta la fracción de píxeles para una etiqueta semántica

También puedes consultar la fracción de píxeles en el marco actual que pertenecen a una clase en particular, como el cielo. Esta consulta es más eficiente que mostrar la imagen semántica y realizar una búsqueda de píxeles para una etiqueta específica. La fracción que se muestra es un valor de número de punto flotante en el rango [0.0, 1.0].

Usa Frame.getSemanticLabelFraction() para adquirir la fracción de una etiqueta determinada:

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