NeRF - это метод аппроксимации объемной сцены нейросетью по серии изображений с известными положениями камер и рендеринга этой сцены. Вот ссылка на ригинальную статью: https://arxiv.org/pdf/2003.08934.pdf

Весь код доступен в репозитории: https://github.com/DeliriumV01D/NeRFpp

 

Вся "физика" сводится к формуле объемного рендеринга:

Здесь C - результирующий цвет луча, T - коэффицицент пропускания, c - локальный цвет, σ - его плотность, r - коордната на луче, а d - направление.

NERF кодирует непрерывную объемную функцию что дает хорошее качество и требует мало места для хранения

5D(x,y,z,theta,phi) -> 3D(r,g,b)

8 слоев по 256 нейронов с активациями ReLU формируют фичер вектор к которому конкатенируется направление камеры и подается на оставшиеся 256-128-3

 

Что можно делать с помощью NeRF? NeRF - это избавление от шумов за счет статистичекого "усреднения", замена плотному стерео, рендеринг сцены из новых позиций, ускорение отрисовки сложных сцен, сжатое представление, простое извлечение формы, замена освещения и материалов, аугментация(из всех промежуточных положений)

подготовка локаций для AR, создание аватара, объединение с 3D печатью/строительством/позиционированием - построение NeRF проекции. Объединив NeRF с генеративной моделью можно выглючивать объемные сцены из единственного либо нескольких плоских изображений.

В текущей реализации имеется:

Модуль обучения нейросети, реализация метода forward и регистрация сабмодулей, инициализация и хранение весов, чтение входных данных в формате blender, модуль позиционного кодирования для NeRF, цикл обучения и инференс, объемный рендеринг, батчификация, грубая и точная сети и иерархическое семплирование. c++ и libTorch все как мы любим. Есть также зависимости от библиотек OpenCV и nlohman json. Референсная реализация на PyTorch: https://github.com/yenchenlin/nerf-pytorch

Дополнение:

Добавлена реализация HashNeRF - быстрый в обучении NeRF который представляет из себя большую обучаемую хэш-таблицу (HashEmbedder) поверх которой работает очень маленькая моделька для цветовой плотности. Также используется энкодер на сферических гармониках для зависимости от угла обзора. Придумали HashNeRF и очень эффективно реализовали в nvidia: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding: https://nvlabs.github.io/instant-ngp/ . Моя реализация, к сожалению, сильно проигрывает. Я использовал как референс следующую реализацию на PyTorch: https://github.com/yashbhalgat/HashNeRF-pytorch.