Neural Radiance Fields (NeRF) — горячая тема в сообществе компьютерного зрения. Это метод представления 3D-сцены, который обеспечивает высококачественный синтез нового вида и реконструкцию 3D из 2D-изображений. О его широком использовании в отрасли свидетельствует растущее количество объявлений о вакансиях крупных технологических компаний, которые ищут специалистов по NeRF.

В этом руководстве мы реализуем первоначальную статью NeRF с нуля в PyTorch, используя всего 100 строк кода Python. Хотя реализация проста и лаконична, она даст хорошие результаты, приведенные ниже.

Этот учебник в основном посвящен реализации и не углубляется в технические аспекты каждого уравнения. Если есть интерес, эту информацию можно было бы осветить в отдельной статье. Тем временем для тех, кто хочет получить всестороннее представление о технологиях и достижениях, сделанных с момента выхода первой статьи 2020 года, у меня есть 10-часовой курс, доступный на Udemy, в котором подробно рассматривается NeRF.

Рендеринг

Ключевым компонентом Neural Radiance Fields является дифференцируемый рендеринг, который отображает трехмерное представление, представленное моделью NeRF, в двухмерные изображения. Тогда задачу можно сформулировать как простую задачу восстановления

где A – отображаемая дифференцируемая величина, x – модель NeRF, а b — целевые 2D-изображения.

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

Начальная часть кода использует послойную выборку для выбора трехмерных точек вдоль лучей. Затем в этих точках запрашивается модель Neural Radiance Fields (вместе с направлениями лучей), чтобы получить информацию о плотности и цвете. Затем выходные данные модели можно использовать для вычисления линейных интегралов для каждого луча с помощью интегрирования по методу Монте-Карло, как показано в уравнении 3 статьи.

Накопленный коэффициент пропускания (Ti в статье) вычисляется отдельно в специальной функции.

Нерф модель

Теперь, когда у нас есть дифференцируемый симулятор, который может генерировать 2D-изображения из нашей 3D-модели, нам нужно реализовать саму модель.

Можно ожидать, что модель будет иметь сложную структуру, но на самом деле модели NeRF — это просто многослойные персептроны (MLP). Тем не менее, MLP с функциями активации ReLU смещены в сторону изучения низкочастотных сигналов. Это создает проблему при попытке моделировать объекты и сцены с высокочастотными функциями. Чтобы противодействовать этому предубеждению и позволить модели изучать высокочастотные сигналы, мы используем позиционное кодирование для сопоставления входных данных нейронной сети с многомерным пространством.

Обучение

Реализация обучающего цикла проста, так как включает контролируемый подход к обучению. Для каждого луча целевой цвет известен из 2D-изображений, что позволяет нам напрямую минимизировать потерю L2 между прогнозируемым и фактическим цветами.

Тестирование

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

Собираем все вместе

Наконец, все части можно легко комбинировать. Чтобы реализация была короткой, лучи кодируются в наборе данных, который можно загрузить. Если вы хотите узнать больше о вычислении лучей, я приглашаю вас взглянуть на этот код или пройти мой курс по Udemy.

Надеюсь, эта история была вам полезна. Если это так, рассмотрите возможность аплодировать этой истории и не забудьте подписаться на получение дополнительных руководств, связанных с NeRF и машинным обучением.

[Полный код] | [Курс Udemy] | [НерФ Консалтинг]