Исследователи из Google разработали алгоритмы и камеру для съемки объемных роликов. Камера состоит из множества отдельных камер, закрепленных на прозрачной полусфере. Алгоритмы преобразуют ролики с камер в массив полусферических слоев, каждый из которых содержит данные о цвете, прозрачности и глубине. Такое представление позволяет затем «пересобирать» слои и менять ракурс просмотра, корректно передавая параллакс, отражения и другие оптические эффекты. Помимо этого разработчики создали алгоритм сжатия, позволяющий в реальном времени передавать этот огромный массив данных через интернет. Статья с описанием разработки будет представлена на конференции SIGGRAPH 2020, а примеры видео опубликованы на сайте авторов.
Мы воспринимаем мир объемным в основном по двум причинам. Во-первых, поскольку у нас есть два глаза, расположенных, хотя и близко друг к другу, но все же в разных точках в пространстве, мозг получает два изображения с немного разных ракурсов. Одно это уже позволяет воспринимать мир объемным и понимать удаленность разных объектов (если у человека нет нарушений бинокулярного зрения). Во-вторых, мы также можем менять ракурс «съемки», поворачивая и двигая голову, задействуя параллакс движения, и понимая объем и расстояние по смещению объектов относительно друг друга.
Существуют серийные VR-шлемы и стереокамеры, которые воспроизводят бинокулярное зрение за счет того, что каждому глазу дается кадры с разных ракурсов. Но такой метод не позволяет воспроизвести параллакс движения, потому что в момент съемки камера находилась в одном месте и после съемки ракурс изменить нельзя. Исследователи из Google в последние несколько лет приблизились к решению этой проблемы. В их последних разработках можно выделить две основные идеи, одна из которых в основном программная, а вторая аппаратная: они научились разбивать изображения и кадры видео на множество плоских слоев, в которых объекты расположены по мере удаления от камеры, а также использовать массив из множества близко расположенных камер.
В новой статье исследователи из Google под руководством Пола Дебевека (Paul Debevec) объединили подходы из прошлых разработок и создали камеру и алгоритмы для нее, позволяющие пользователю двигать голову и видеть ролик с любого ракурса и направления, находящихся внутри 70-сантиметровой полусферы.
Камера состоит из прозрачной полимерной полусферы, внутри которой закреплены 46 отдельных небольших экшн-камер с разрешением 4K. Они соединены между собой и снимают синхронизированное видео.
Сверточная нейросеть собирает кадры с камер и разбивает их на множество слоев, которые располагаются на разном расстоянии, и, соответственно, захватывают разные объекты. Главное отличие нового подхода при формировании слоев заключается в том, что они имеют полусферическую форму, а не плоскую. В некотором смысле это представление сцены перед камерой можно представить в виде половины луковицы, состоящей из множества слоев с единым центром. Каждый из слоев это полусферическое изображение, в котором каждый пиксель имеет цвета, а также альфа-значение, то есть уровень прозрачности. Альфа-канал отвечает за отображение расстояния — если объект далеко, у него будет непрозрачные значения на дальних слоях, а если близко, то на близких слоях.
Каждое видео разбивается на 160 слоев с разрешением 1800 на 1350 пикселей. Это огромный объем данных, поэтому на следующем этапе он оптимизируется. Для этого алгоритм объединяет каждые восемь слоев, и в каждом из создает полигональную сетку, а изображение накладывается на нее в качестве текстуры. Это значительно снижает размер данных и вычислительную нагрузку при рендеринге, но при этом лишь немного снижает его качество по сравнению с исходным 160-слойным представлением.
После этого текстуры объединяются в текстурный атлас с разрешением 3240 на 5760 пикселей. Каждый атлас создается сразу для группы кадров (эта техника кодирования применяется во многих видеокодеках и экономит место), причем если в группе кадров какой-то из фрагментов полигональной сетки прозрачен или почти прозрачен, он удаляется.
В результате изначальный поток, в котором каждый кадр — это большой массив из множества слоев, превращается в два потока: изображения, который можно эффективно сжимать современными кодеками, и отдельный поток с полигональными сетками. Разработчики создали множество видеозаписей и протестировали на них сжатие. Результаты показали, что в зависимости от снимаемой сцены битрейт видеопотока составляет примерно 150-300 мегабит в секунду. Таким образом, потенциально этот алгоритм можно использовать для стриминга реалистичного объемного видео пользователям VR-шлемов в гигабитным интернетом. Разработчики опубликовали на своей странице несколько примеров видео и статичных кадров, в которых ракурс можно менять, двигая курсором.