Как улучшить окклюзию людей в ARKit 3.0
Мы работаем над демонстрационным приложением, используя окклюзию людей в ARKit. Поскольку мы хотим добавить видео в финальную сцену, мы используемSCNPlane
s для рендеринга видео с помощью SCNBillboardConstraint
чтобы убедиться, что они смотрят в правильном направлении. Эти видео также частично прозрачны, с использованием настраиваемого шейдера наSCNMaterial
подаем заявку (таким образом проигрывая сразу 2 ролика).
Теперь у нас есть некоторые проблемы, при которых окклюзия людей очень ненадежна (см. Изображение). Видео, которое мы используем для тестирования, - это женщина в темных брюках и юбке (если вам интересно, что на изображении черного цвета).
Проблемы, которые у нас есть, заключаются в том, что окклюзия не всегда совпадает с лицом человека (как видно на картинке), и что чьи-то волосы не всегда правильно распознаются.
Теперь наш вопрос: что вызывает эти проблемы? И как мы можем улучшить проблемы, пока они не будут выглядеть, как это? В настоящее время мы изучаем, связаны ли проблемы с тем, что мы используем самолет, а просто используемSCNBox
не решает проблему.
1 ответ
Обновлено: 15 августа 2020.
Вы можете немного улучшить качество People Occlusion
функция в ARKit 4.0. Это потому, что ARKit имеет новый API глубины и более качественный канал ZDepth, который можно захватывать со скоростью 60 кадров в секунду. Однако для этого вам понадобится iPad Pro 2020 четвертого поколения со сканером LiDAR.
Но в ARKit 3.0 нельзя улучшить People Occlusion
если вы не используете Metal или MetalKit. Но с фреймворками семейства Metal непросто улучшитьPeople Occlusion
в ARKit 3.0, поверьте мне.
Совет: учтите, что фреймворки RealityKit и QuickLook поддерживаютPeople Occlusion
также.
Почему эта проблема возникает при использовании People Occlusion?
Это связано с природой пятого канала - ZDepth
канал. Все мы знаем, что визуализированное окончательное изображение 3D-сцены может содержать 5 основных каналов для цифрового композитинга:Red
, Green
, Blue
, Alpha
, а также ZDepth
.
Конечно, есть и другие полезные проходы рендеринга (также известные как AOV) для композитинга: Normals
, MotionVectors
, PointPosition
, UVs
, Disparity
и т.д. Но здесь нас интересуют только два основных набора рендеринга - RGBA
а также ZDepth
.
У канала ZDepth в ARKit 3.0 есть три серьезных недостатка.
Проблема 1. Сглаживание и сглаживание ZDepth.
Рендеринг канала ZDepth в любом программном обеспечении высокого класса (например, Nuke, Fusion, Maya или Houdini) по умолчанию приводит к неровным краям или так называемым неровным краям. Для игровых движков нет исключения - такая проблема есть у SceneKit, RealityKit, Unity, Unreal или Stingray.
Конечно, можно сказать, что перед рендерингом мы должны включить функцию под названием Anti-aliasing
. И да, он отлично работает почти для всех каналов, но не для ZDepth. Проблема ZDepth в том, что граничные пиксели каждого объекта переднего плана (особенно если он прозрачный) "переходят" в фоновый объект, еслиanti-aliased
. Другими словами, пиксели FG и BG смешиваются на краю объекта FG.
Откровенно говоря, есть одно рабочее решение для устранения проблемы с глубиной - вы должны использовать Deep channel
вместо ZDepth channel
. Но ни один игровой движок не поддерживает его, потому чтоDeep channel
устрашающе огромен. Такая глубокая компоновка каналов не подходит ни для игровых движков, ни для ARKit. Увы!
Проблема 2. Разрешение ZDepth.
Обычный канал ZDepth должен отображаться в 32-битном формате, даже если оба канала RGB и Alpha являются только 8-битными. Разрядность цвета 32-битных файлов ложится тяжелым бременем на CPU и GPU. И помните о наложении нескольких слоев в окне просмотра ARKit - вот наложение символа переднего плана на 3D-модель и на фоновый персонаж. Вам не кажется, что это слишком много для вашего устройства, даже если они составлены с разрешением области просмотра, а не с реальным разрешением экрана? Однако рендеринг канала ZDepth в 16-битном или 8-битном формате compresses
глубина вашей реальной сцены, снижение качества композитинга.
Для того, чтобы снизить нагрузку на CPU и GPU и для экономии заряда батареи, инженеры компании Apple решили использовать уменьшенную ZDepth изображения на этапе захвата, а затем масштабировать вверх вынесенное ZDepth изображения до разрешения Viewport и трафарет его, используя альфа - канал (так называемым сегментация), а затем исправьте края канала ZDepth, используя операцию композитинга Dilate. Таким образом, это привело нас к таким неприятным артефактам, которые мы видим на вашем снимке (своего рода "след").
Пожалуйста, обратите внимание на слайдах презентации в формате PDF изBringing People into AR
здесь.
Задача 3. Частота кадров ZDepth.
Третья проблема связана с тем, что ARKit работает со скоростью 60 кадров в секунду. Понижение только разрешения изображения ZDepth не решает проблему полностью. Итак, следующим логическим шагом инженеров Apple было снижение частоты кадров ZDepth до 15 кадров в секунду в ARKit 3.0. Однако последняя версия ARKit 4.0 захватывает канал ZDepth со скоростью 60 кадров в секунду, что значительно улучшает качество People Occlusion и Objects Occlusion. Но в ARKit 3.0 это тоже принесло артефакты (своего рода "пропуск кадра" для канала ZDepth, что приводит к эффекту "следа").
Вы не можете изменить качество вашего окончательного составного изображения при использовании свойства типа:
static var personSegmentationWithDepth: ARConfiguration.FrameSemantics { get }
потому что это свойство gettable и в ARKit 3.0 нет настроек качества ZDepth.
И, конечно же, если вы хотите увеличить частоту кадров канала ZDepth в ARKit 3.0, вы должны реализовать метод интерполяции кадров, используемый в цифровом композитинге (где промежуточные кадры генерируются компьютером):
Но этот метод интерполяции кадров требует не только больших ресурсов ЦП, но и очень затрат времени, потому что нам нужно генерировать 45 дополнительных 32-битных ZDepth-кадров в секунду (45 интерполированных + 15 реальных = 60 кадров в секунду).
Я считаю, что кто-то может улучшить функции композитинга ZDepth в ARKit 3.0 путем разработки кода с использованием Metal, но сейчас это настоящая проблема!
Вы должны посмотреть пример кода
People Occlusion in Custom Renderers
приложение здесь.
Поддержка ARKit 4.0 и сканера LiDAR
В ARKit 4.0 и ARKit 3.5 есть поддержка сканеров LiDAR (iPad Pro 2020 - первое устройство, оснащенное Light Detection And Ranging
сканер). Сканер LiDAR улучшает качество и скорость функции People Occlusion, потому что качество канала ZDepth немного выше, даже если вы физически не двигаетесь, когда отслеживаете окружающую среду. Система LiDAR также может помочь вам отобразить стены, потолок, пол и мебель, чтобы быстро получить виртуальную сетку для реальных поверхностей, с которыми можно динамически взаимодействовать, или просто найти на них трехмерные объекты (даже частично закрытые трехмерные объекты). Гаджеты, оснащенные сканерами LiDAR, могут достичь непревзойденной точности при определении местоположения реальных поверхностей. Рассматривая сетку, тесты попадания могут пересекаться с неплоскими поверхностями или поверхностями без каких-либо функций, такими как белые стены или едва освещенные стены.
Активировать sceneReconstruction
вариант используйте следующий код:
let arView = ARView(frame: .zero)
arView.automaticallyConfigureSession = false
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
arView.debugOptions.insert([.showSceneUnderstanding, .showAnchorGeometry])
arView.environment.sceneUnderstanding.options.insert([.occlusion,
.collision,
.physics])
arView.session.run(config)
Но перед использованием sceneReconstruction
instance в вашем коде, вам нужно проверить, есть ли на устройстве сканер LiDAR или нет. Вы можете сделать это вAppDelegate.swift
файл:
import ARKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
guard ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification)
else {
fatalError("Scene reconstruction requires a device with a LiDAR Scanner.")
}
return true
}
}
RealityKit 2.0
При использовании инфраструктуры RealityKit 2.0 на iPad Pro 2020 у вас есть несколько вариантов окклюзии - те же параметры доступны в ARKit 4.0 - улучшенная People Occlusion
, Object Occlusion
(например, мебель или стены) и Face Occlusion
. Чтобы включить окклюзию в RealityKit 2.0, используйте следующий код:
arView.environment.sceneUnderstanding.options.insert(.occlusion)