Neural Radiance Fields (NeRF)
Нейронные поля излучения (NeRF) кодируют 3D-сцену в нейросети, обученной на фотографиях с известными параметрами съёмки, и создают новые ракурсы методом объёмного рендеринга вдоль лучей камеры.
Поле нейронного излучения (NeRF) представляет 3D-сцену в виде нейронной сети, которая сопоставляет любой трехмерной позиции и направлению взгляда плотность и цвет; сеть обучается на наборе обычных фотографий с известными позициями камеры. Для рендеринга вида через каждый пиксель проводят луч, запрашивают значения сети в точках вдоль него, а затем смешивают результаты с помощью объемного рендеринга. Поэтому обученный NeRF показывает сцену с ракурсов, которые не снимала ни одна камера. Бен Милденхолл, Пратул Шринивасан, Мэттью Танчик и их коллеги из UC Berkeley, Google Research и UC San Diego представили этот метод в работе NeRF: представление сцен в виде полей нейронного излучения для синтеза видов на ECCV 2020. NeRF воспроизводит отражения, тонкие структуры и полупрозрачные материалы, с которыми плохо справляется основанная на сетках фотограмметрия, и положил начало волне исследований нейронного рендеринга, приведшей к гауссовому сплаттингу.
Принцип работы нейронных полей излучения#
Исходный NeRF — это многослойный перцептрон без сверток. Он обрабатывает закодированную трехмерную позицию с помощью 8 полносвязных слоев по 256 каналов и выдает плотность объема и вектор признаков из 256 значений. Вектор признаков объединяется с закодированным направлением взгляда и проходит еще через один слой из 128 каналов, который выдает цвет RGB. Плотность зависит только от позиции, что сохраняет согласованность геометрии между видами, а цвет также зависит от направления, благодаря чему учитываются блики и отражения, смещающиеся при движении камеры:
Для рендеринга пикселя NeRF выбирает 64 точки вдоль луча камеры с помощью грубой сети, затем еще 128 точек там, где грубый проход обнаружил плотность, и вычисляет значения тонкой сети во всех этих точках. Каждый образец вносит свой цвет пропорционально непрозрачности и пропусканию — доле света, проходящего через предыдущие образцы; взвешенная сумма дает цвет пикселя. Во время обучения минимизируется квадрат разности между цветами пикселей на отрендеренных и исходных фотографиях для пакетов из 4096 лучей. Положения камер обычно определяются с помощью программ для Structure from Motion, например COLMAP, а обучение на одной сцене занимало от 100 000 до 300 000 итераций, то есть примерно один-два дня на GPU NVIDIA V100.
Обычный MLP, которому подают исходные координаты, обучается гладким функциям и размывает мелкие детали, поэтому NeRF сначала отображает каждую координату в синусы и косинусы с удваивающимися частотами: 10 частот для позиции и 4 для направления. В этом примере кода на PyTorch одна и та же сеть обучается на полосатом одномерном сигнале — с позиционным кодированием и без него:
import torch
from torch import nn
torch.manual_seed(0)
# Color along one line through a scene, with fine detail such as a striped texture
x = torch.linspace(-1, 1, 512).unsqueeze(1)
target = torch.sin(12 * torch.pi * x) * torch.cos(3 * torch.pi * x)
# NeRF's positional encoding: sines and cosines of the coordinate at 10 doubling frequencies
freqs = 2.0 ** torch.arange(10) * torch.pi
encoded = torch.cat([torch.sin(x * freqs), torch.cos(x * freqs)], dim=1)
for name, inputs in (("raw coordinate", x), ("positional encoding", encoded)):
mlp = nn.Sequential(nn.Linear(inputs.shape[1], 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 1))
optimizer = torch.optim.Adam(mlp.parameters(), lr=1e-3)
for step in range(1000):
loss = ((mlp(inputs) - target) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"{name}: mean squared error {loss.item():.4f}")Код выводит raw coordinate: mean squared error 0.0870 и positional encoding: mean squared error 0.0000. Средняя мощность сигнала равна 0,25, поэтому сеть на исходных координатах не улавливает около трети сигнала — мелкие полосы, — а сеть с кодированием воспроизводит его.
Более быстрые и надежные NeRF#
- Сглаживание алиасинга и неограниченные сцены: Mip-NeRF рендерит конусы вместо бесконечно тонких лучей, чтобы устранять алиасинг, а Mip-NeRF 360 расширяет этот подход на неограниченные панорамные съемки 360°.
- Скорость: Instant NGP от NVIDIA заменяет большую часть сети мультимасштабной хеш-таблицей обучаемых признаков. Это сокращает обучение с нескольких дней до секунд или минут, а рендеринг изображения размером 1920×1080 — до десятков миллисекунд.
- Фотографии, сделанные в реальных условиях: NeRF in the Wild добавляет эмбеддинги внешнего вида для каждой фотографии и отдельный компонент для временных объектов, благодаря чему даже коллекции интернет-фотографий с меняющимся освещением и проходящими туристами позволяют получить четкую реконструкцию.
- Преобразование текста в 3D: DreamFusion оптимизирует NeRF, пока его изображения со всех ракурсов не станут правдоподобными для двумерной диффузионной модели преобразования текста в изображение. Так объекты создаются по запросам без обучающих данных в 3D.
NeRF и связанные понятия#
- Гауссов сплаттинг: явно хранит сцену в виде миллионов трехмерных гауссиан и растеризует их, обеспечивая рендеринг в реальном времени без вычисления сети для каждого пикселя. В 2023 году его качество сравнялось с Mip-NeRF 360, и во многих инструментах захвата он заменил NeRF, хотя требует больше памяти.
- Фотограмметрия: создает явную сетку, сопоставляя признаки на фотографиях. Сетки компактны и редактируются в стандартных программах для работы с 3D, но плохо справляются с блестящими, прозрачными и очень тонкими поверхностями.
- Оценка глубины: NeRF попутно создает карту глубины — ожидаемое расстояние, на котором останавливается каждый луч, — но только после оптимизации на множестве фотографий одной сцены с известными положениями камер. Модели оценки монокулярной глубины предсказывают глубину по одному изображению за один прямой проход.
- Неявные нейронные представления: NeRF — это неявное нейронное представление, специализирующееся на излучении и плотности; существуют и сети, которые хранят изображения, формы или аудио в виде непрерывных функций.
Требования к съемке#
NeRF предполагает, что сцена статична и освещение постоянно, а съемка ведется с множества перекрывающихся ракурсов с точными координатами камер. В исходной статье для обучения на каждом синтетическом объекте использовалось 100 отрендеренных видов, а на каждой реальной сцене с фронтальным обзором — от 20 до 62 фотографий. Любое движение во время съемки, например проходящий человек или автомобиль, попадает на одни фотографии, но отсутствует на других, и при оптимизации представляется полупрозрачными «плавающими» объектами. Модели сегментации экземпляров Ultralytics YOLO26 маскируют людей и транспортные средства на каждой фотографии, чтобы пиксели с ними можно было исключить из обучения.
Примеры применения в реальных условиях#
- Кино и виртуальное производство: отснятые локации реконструируются и рендерятся с новых траекторий камеры, создавая фотореалистичные фоны и референсы декораций.
- Робототехника и симуляция вождения: записанные среды реконструируются, чтобы команды автономных транспортных средств и робототехники могли рендерить виды с датчиков из точек, в которых исходная машина не проезжала.
- Визуализация продуктов: несколько десятков фотографий товара превращаются в интерактивное изображение, которое покупатели могут свободно вращать.
- Карты: для функции Immersive View в Google Maps компания Google реконструировала интерьеры ресторанов и кафе с помощью NeRF, используя фотографии с DSLR-камер, снятые примерно за час на каждое заведение. В основе лежал Mip-NeRF 360 с эмбеддингами внешнего вида из NeRF in the Wild и учетом экспозиции из Block-NeRF; результатом стали интерактивные видео 360° по выбранным маршрутам полета.










