Автор: Александр Лекомцев

Редактура: Давид Свитов, Иван

Перед прочтением статьи рекомендуем к просмотру наше видео с разбором NeRF и Instant NeRF.

Давайте вспомним для чего нужен и что делает классический NeRF. Это нейросеть, обученная с целью создания одной 3D сцены по нескольким её 2D фото с разных ракурсов. Для этого мы учим сеть предсказывать цвет и прозрачность точки в трёхмерном пространстве. На вход подаются координаты точки начала луча из камеры и углы, определяющие его поворот в трёхмерном пространстве (см. Рисунок 1).

Рисунок 1.1. NeRF принимает на вход координаты точки и углы, под которыми точку видит камера. Сеть предсказывает цвет и прозрачность этой точки. Источник

Рисунок 1.1. NeRF принимает на вход координаты точки и углы, под которыми точку видит камера. Сеть предсказывает цвет и прозрачность этой точки. Источник

Рисунок 1.2. Рендеринг двух 2D картинок по 3D сцене. Красная стрелка — луч камеры, для черных точек вычисляем цвет и плотность

Рисунок 1.2. Рендеринг двух 2D картинок по 3D сцене. Красная стрелка — луч камеры, для черных точек вычисляем цвет и плотность

Рендеринг — получение 2D картинки из 3D сцены. Для получения 2D изображения из NeRF мы пустим из каждого пикселя изображения луч (назовём его лучом камеры), получим для точек на лучах значения цвета $(r, g, b)$ и плотность, или прозрачность ( $\sigma$), а затем просуммируем цвета с учётом их прозрачности вдоль этих лучей.

По архитектуре сеть представляет собой multilayer perceptron (MLP).

Зачем менять освещение?

Вы модный молодёжный 3D художник и хотите максимально упростить себе жизнь с помощью нейронок. Вы узнаёте про NeRF, очень радуетесь, бегом получаете через него рендеры для пары объектов из дома и… Не можете их особо нигде использовать. Потому что освещение в них фиксированное.

Представление NeRF не отделяет эффект падающего света от свойств материала поверхностей. Из-за этого при желании заменить источники света нам нужно будет сделать новые фото для каждого варианта освещения и заново обучить сеть. Это приводит к более дорогому сбору данных и обучению моделей. А если освещение динамическое, как при движении Солнца — непонятно, зачем нужен этот ваш нейронный рендеринг, дешевле же нарисовать…

Как обучить сеть, которая будет принимать источники освещения как часть входных данных и выдавать рендер для сцены с таким освещением?

Рисунок 2.1. Для обучения NeRV делаем несколько фото с разными источниками освещения (a), после чего получаем сцену с освещением в любых точках (b). Если гифка не грузится, перезагрузите страницу.

Рисунок 2.1. Для обучения NeRV делаем несколько фото с разными источниками освещения (a), после чего получаем сцену с освещением в любых точках (b). Если гифка не грузится, перезагрузите страницу.

Рисунок 2.2. После обучения получаем рендер для сцены с динамическим освещением

Рисунок 2.2. После обучения получаем рендер для сцены с динамическим освещением

Освещение

Для качественного предсказания освещения нужно научиться работать с двумя его типами — прямым (direct) и отражённым (indirect). Их различия показаны на Рисунке 3:

Рисунок 3. Разные виды освещения. Источник

Рисунок 3. Разные виды освещения. Источник

Можно предсказать direct illumination методом NeRF. Выпускаем из источника света несколько лучей (назовём их лучи освещения), проверяем прозрачность всех точек между точкой на луче из камеры и источником света. Можно на каждом луче освещения брать столько точек, сколько их на луче из камеры. Если возьмем меньше точек — потеряем часть информации о освещении. Следовательно, для качественного рендера нам понадобится вычислить плотность в $O(n^2)$ точках.

Теперь рассмотрим indirect освещение для одной точки на луче из камеры. Сначала мы берём $d$ лучей освещения (это выделено синим на Рисунке 4), каждый из которых требует вычисления в $n$ точках. Для этого нам придётся посчитать плотность в этих $n$ точках и на $(n - 1)$ лучах освещения между этими точками и источником освещения.

Итого: в indirect освещении для одной точки мы имеем $d \cdot n \cdot (n - 1) + 1 = O(n^2d)$ вычислений. Теперь мы вспоминаем, что считали только для одной точки на луче из камеры. Значит, для всех точек при единственном источнике освещения имеем $O(n^3d)$, а при $l$ источниках освещения будет уже $O(n^3dl)$.