Узнайте, как использовать API семантики сцены в своих приложениях.
API семантики сцены позволяет разработчикам понять сцену, окружающую пользователя, предоставляя семантическую информацию на основе модели машинного обучения в реальном времени. Учитывая изображение сцены на открытом воздухе, API возвращает метку для каждого пикселя в наборе полезных семантических классов, таких как небо, здание, дерево, дорога, тротуар, транспортное средство, человек и т. д. В дополнение к меткам пикселей API семантики сцены также предлагает значения достоверности для каждой метки пикселя и простой в использовании способ запроса распространенности данной метки в сцене на открытом воздухе.
Слева направо примеры входного изображения, семантического изображения меток пикселей и соответствующего доверительного изображения:
Предварительные условия
Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .
Включить семантику сцены
В новом сеансе ARCore проверьте, поддерживает ли устройство пользователя API семантики сцены. Не все ARCore-совместимые устройства поддерживают API семантики сцены из-за ограничений вычислительной мощности.
Для экономии ресурсов семантика сцены по умолчанию отключена в ARCore. Включите семантический режим, чтобы ваше приложение использовало API семантики сцены.
Ява
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);
Котлин
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)
Получить смысловой образ
После включения семантики сцены можно получить семантическое изображение. Семантическое изображение — это изображение ImageFormat.Y8
, где каждый пиксель соответствует семантической метке, определенной SemanticLabel
.
Используйте Frame.acquireSemanticImage()
для получения семантического изображения:
Ява
// 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. }
Котлин
// 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. }
Выходные смысловые изображения должны быть доступны примерно через 1-3 кадра от начала сеанса, в зависимости от устройства.
Получите имидж уверенности
В дополнение к семантическому изображению, которое предоставляет метку для каждого пикселя, API также предоставляет доверительное изображение соответствующих значений достоверности пикселей. Достоверное изображение — это изображение ImageFormat.Y8
, где каждый пиксель соответствует значению в диапазоне [0, 255]
, соответствующему вероятности, связанной с семантической меткой для каждого пикселя.
Используйте Frame.acquireSemanticConfidenceImage()
для получения семантического достоверного изображения:
Ява
// 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. }
Котлин
// 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. }
Выходные достоверные изображения должны быть доступны примерно через 1–3 кадра с начала сеанса, в зависимости от устройства.
Запрос доли пикселей для семантической метки
Вы также можете запросить долю пикселей в текущем кадре, принадлежащих определенному классу, например небу. Этот запрос более эффективен, чем возврат семантического изображения и выполнение попиксельного поиска конкретной метки. Возвращаемая дробь представляет собой значение с плавающей запятой в диапазоне [0.0, 1.0]
.
Используйте Frame.getSemanticLabelFraction()
чтобы получить дробь для данной метки:
Ява
// 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. }
Котлин
// 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. }