Как мы получили реалистичные лица с новых ракурсов с помощью нейросетей

В этой статье вы узнаете про глубокий нейросетевой подход Neural Radience Fields — метод для генерации новых изображений сцены с различных ракурсов. Основная задача — интерполяция новых views между исходными оригинальными изображениями для получения «непрерывной сцены» из ограниченного числа фотографий.

Нейросеть NeRF может интерполировать между изначальными изображениями за счет восстановления непрерывного представления сцены и позволяет получать изображения с новых ракурсов.Нейросеть NeRF может интерполировать между изначальными изображениями за счет восстановления непрерывного представления сцены и позволяет получать изображения с новых ракурсов.

Поскольку в нашем стартапе twin3d мы занимаемся созданием фотореалистичных 3D моделей людей, то упор будет сделан именно на фотографии людей. Мы расскажем, какие подзадачи нам пришлось решить, чтобы получить новые фотореалистичные изображения людей с разных ракурсов.

Описание метода

Neural Radiance Fields (NeRF) — метод глубокого обучения для генерации изображений новых любых ракурсов для конкретного фотосета. Сама нейросеть обучается на ограниченном числе фотографий. В нашем случае это всего лишь 22 фотографии лица с различных ракурсов. Таким образом, наша сцена довольно разреженная, решение задачи построения изображений с нового ракурса не является очевидным.

Базовый подход для генерации новых изображений с помощью NeRF. Базовый подход для генерации новых изображений с помощью NeRF.

Данный метод был представлен на конференции ECCV весной 2020. Сама статья была удостоена награды Best Paper Honorable Mention. С тех пор появились новые подходы для решения подобной задачи, но, тем не менее, данный подход до сих пор актуален и показывает SOTA результаты для генерации новых изображений.

Как же выглядит данная нейронная сеть и как её учить? Саму нейронную сеть можно представить как сложную функцию многих переменных. На вход этой функции подаются положение точки пространства(x, y, z), в которой предполагаемо находится объект, и вектор направления, заданный углами\thetaи\phi.

image-loader.svg

Функция F возвращает 4 числа.\sigmaили же плотность, это некоторое число, значение которого даёт нам понять, есть ли в указанной точке пространства какой-то объект или нет. Можно считать это некоторым аналогом прозрачности со значениями от 0 до 1. RGB же показывают значения цвета в указанной точке пространства(x, y, z).

Эта функцияFявляется полносвязной нейронной сетью MLP. Сначала на вход подаются координаты(x, y, z), которые обрабатываются 8 полносвязными слоями (с функциями активации ReLU после каждого слоя, имеющим 256 каналов). Выход из этой части сети это плотность\sigmaи 256 размерный вектор, который затем конкатенируется с вектором направления(\theta, \phi)и подаётся одному полносвязному слою (с ReLU активацией), чтобы получить значения RGB.

Вы спросите, зачем нам направление(\theta, \phi), ведь нам достаточно знать положение точки в пространстве(x, y, z)? Дополнительная зависимость от направления «взгляда» учитывается для того, чтобы более точно моделировать эффекты отражения и освещенности и консистентно их обобщать в каждой точке пространства.

Почему сетка называется Neural Radiance Fields? Дело в том, что через каждую точку пространства проходит лучи, задаваемые радиальными координатами\thetaи\phi. На каждом луче задается некоторое распределение\sigma(x)для того, чтобы моделировать непрерывный объём, volume, внутри пространства и показывать, в какой момент возникает препятствие на пути луча. Таким образом, учится распределение внутри объёма — прямая альтернатива вокселизации.

На луче сэмплируются N точек, чтобы смоделировать распределение плотности на конкретном направлении.На луче сэмплируются N точек, чтобы смоделировать распределение плотности на конкретном направлении.

Параметрыt_{1}и t_{N}задают грубые границы объекта. Данные значения могут быть получены с помощью Multiview Stereo приложений COLMAP или Agisoft Metashape.

По сути, мы имеем модель для восстановления цвета и плотности распределения на луче. Между значениямиt_1и t_Nмы равномерно сэмплируемNточек. Значение цвета на луче \textbf{r}(t) = \textbf{o} + t \textbf{d} в указанной точке вычисляется приближенно:

image-loader.svg

Где\delta_{i} = t_{i+1} - t_{i}, аT_{i}показывает как много света было поглощено перед точкой c индексомiна луче, то есть по сути это вероятность, что луч пройдет от точкиt_{N}до точкиtбез препятствий.

Величина\alpha_{i} = 1 - \exp(-\sigma_{i} \delta_{i})приводит функцию\sigma(x)к виду вероятностного распределения.

Заметим, что величинаC(\mathbb{r})дифференцируема по параметрамFMLP, и мы можем использовать градиентные методы, чтобы оптимизировать NeRF.

Чтобы сделать сэмплирование на луче более оптимальным, авторы предлагают следующую эвристику — оптимизацию сразу двух сетей, одна из которых называется Coarse, а другая Fine. Первая сеть получает первое грубое приближение цвета в заданной точке пространства на луче, на котором равномерно насэмплированыN_cточек:

image-loader.svg

Веса, с которыми суммируются значения цвета RGB на луче, после нормализации задают некоторое распределение, из которого можно дополнительно сэмплироватьN_fточек на луче в местах, где вероятность нахождения объекта высока, и тем самым получать более точные значение плотности\sigmaи цвета RGB.

На этом дополненном множестве изN_c + N_fточек вычисляется финальное значения цвета Fine сеткой. Это требует значительно больше вычислительных ресурсов, но даёт более точную оценку распределения.

Распределение на луче уточняется после дополнительного сэмплирования для Fine сетки.Распределение на луче уточняется после дополнительного сэмплирования для Fine сетки.

Что касается обучения NeRF, то это происходит следующим образом. Выбирается изображение из обучающей выборки, и для него сэмплируется заданное число лучей, проходящих через эту фотографию. На каждом луче оценивается значение цветаC(\mathbb{r}) — цвет там, где начинается объект.

image-loader.svg

В итоге вычисляется лосс-функция, оптимизируемая с помощью Adam.

image-loader.svg

Одним из бонусов моделирования распределения плотности на луче является возможность понимать расположение объектов в пространстве. Таким образом, NeRF можно использовать для получения весьма качественных карт глубин изображений.

NeRF может генерировать качественные карты глубин.NeRF может генерировать качественные карты глубин.

Наш опыт работы с NeRF

Подготовка данных

Исходные фотографии имеют сложный фон и, как мы покажем, это вносит существенный шум в модель. Для решения этой проблемы мы применяем background matting с помощью нейросети, которая крайне точно убирает фон с фотографии. О поразительных результатах background matting мы уже писали в нашей предыдущей статье.

До и после удаления фона. Фон убирается с потрясающей точностью!До и после удаления фона. Фон убирается с потрясающей точностью!

Данные для обучения

Мы имеем ограниченное число фотографий лица с разных ракурсов. Наш сетап будет выглядеть таким образом. Здесь мы имеем 22 фотографии лица человека высокого разрешения 6000×4000 с разных ракурсов, полученных с помощью камер для фотограмметрии.

Набор фотографий лица, полученных с помощью камер для фотограмметрии. Здесь был применён background matting для удаления фона с фотографий.Набор фотографий лица, полученных с помощью камер для фотограмметрии. Здесь был применён background matting для удаления фона с фотографий.Для наглядности. Так выглядит наш сетап сцены, выгруженный в Blender.Для наглядности. Так выглядит наш сетап сцены, выгруженный в Blender.

В дальнейшем для модели важно оценить по имеющемуся набору фотографий экстринсики и интринсики камер, также называемые параметрами внешней и внутренней калибровки — положения камер в пространстве, фокусные расстояния, principal points и тд. Это можно сделать как и в бесплатном софте COLMAP, так и в платном Agisoft Metashape. В нашем случае мы пользуемся последним (это не реклама).

Полученные результаты

Теперь перейдём к нашим результатам. В twin3d мы имеем возможность применять и тестировать state-of-the-art подходы машинного и глубокого обучения на наших данных-фотографиях крайне высокого разрешения и фотореалистичных 3D моделях, полученных с помощью сетапа для фотограмметрии. Нам было весьма интересно испытать NeRF на наших high-resolution фотосетах. Мы протестировали алгоритм на различных сценах лиц, каждая из которых имела всего 22 фотографии с разных ракурсов. Результаты поразительные!

На gif изображены лица с новых ракурсов, сгенерированные NeRF. Важно отметить, что на исходных фотографиях освещение немного отличалось. NeRF выучил свет ровно таким, каким он был на каждой фотографии, и равномерно интерполировал его между novel views!

Обратите внимание на консистентность между кадрами! Геометрия и черты лица сохранены, освещение меняется непрерывно между всеми новыми изображениями. Нейросеть выучила мельчайшие детали на каждом лице: щетину, морщинки, особенности и дефекты кожи. Также она неплохо справилась с рендерингом волос и глаз — довольно сложной задачей в области 3D Computer Vision. Так, на первых трёх gif получилось выучить прическу с точностью до волосков. Таким образом, NeRF показал весьма интересные и впечатляющие результаты на фотосетах для 3D фотограмметрии.

Примеры сгенерированных лиц с новых ракурсов. Выглядят весьма фотореалистично!Примеры сгенерированных лиц с новых ракурсов. Выглядят весьма фотореалистично!

С какими трудностями мы столкнулись?

Для решения этой проблемы мы использовали удаление фона с помощью упомянутой background matting нейросети. На gif вы можете видеть результат. Слева фон был оставлен в фотографиях обучающей выборки. Справа фон в обучающей выборке был удален.

Нашей целью было сгенерировать изображение лица в высоком разрешении с нового ракурса. Для этого нужны значительные как вычислительные (GPU, TPU), так и временные ресурсы.

Для ускорения экспериментов разумно использовать версию NeRF от Google Research, написанную с элементами JAX и распараллеливания на нескольких GPU и TPU. По нашему опыту, это значительно сокращает как время обучения нейросети, так и финальное время генерации новых изображений.

Из-за архитектуры NeRF можно обучить только под конкретную сцену. Если вы хотите восстановить непрерывное представление новой сцены, вам потребуется заново тренировать эту нейросеть на новом наборе фотографий. В свежих статьях представлены способы получения novel views на сценах, которых не было в обучающей выборке. Но об этом мы поговорим в наших следующих публикациях.

Итоги

NeRF — крайне значимая работа в области генерации новых фотореалистичных изображений с разных ракурсов. Она вызвала феномен в области 3D Deep Learning, называемый NeRF Explosion — в течение года после публикации появилось много статей с выдающимися результатами, использующих и дополняющих идеи NeRF для Novel View Synthesis.

У подхода много плюсов: непрерывное и консистентное восстановление сцены, возможность работы в сценарии, когда число фотографий, как у нас, крайне ограничено, и высокая детализированность генерируемых изображений по сравнению со стандартными методами рендеринга мешей с текстурой.

Однако много и заметных недостатков: число фотографий для обучения не может быть слишком маленьким — должно быть заметное пересечение областей на изображениях. Также для обучения требуются значительные ресурсы, при этом сеть тренируется только под конкретную сцену.

Тем не менее, нам было интересно прощупать этот алгоритм на наших данных в контексте внутренних разработок для фотореалистичной 3D реконструкции людей.

В наших следующих публикациях мы расскажем о новых, самых свежих результатах из области Novel View Synthesis, представленных на конференции CVPR 2021. В них вы узнаете о модификациях NeRF, совершенно новых подходах для воссоздания непрерывной сцены и генерации novel views.

Также всем интересующимся темой 3D реконструкции людей могут быть полезны наши последние публикации на Хабр:

В twin3d мы занимаемся разными и интересными задачами, связанными с созданием фотореалистичных 3D моделей людей. Не пропустите наши следующие публикации на Хабр, будет интересно :)

Будем рады вашим комментариям и обсуждениям!

© Habrahabr.ru