Поля нейронного излучения, в просторечии известные как NeRF поразил мир штурмом в 2020 году, выпущенный вместе с газетой «NeRF: представление сцен как полей нейронного излучения для синтеза представлений», и по-прежнему являются краеугольным камнем высококачественного синтеза новых видов, учитывая разреженные изображения и положения камеры.
С тех пор они нашли множество применений, но, вероятно, наиболее заметное в геопространственном объемном моделировании: такие компании, как Google, полагаются на NeRF для создания 3D-структур зданий и объектов наследия с разных углов спутниковых изображений, а также компании, специализирующиеся на выполнении 3D-реконструкции и оцифровка известных культурных объектов.
В этом руководстве мы будем обучать модель Neural Radiance Field (NeRF) на исходном наборе данных Tiny NeRF, используя TensorFlow/Keras и DeepVision, для выполнения нового синтеза представления/3D-реконструкции.
За один час на коммерческой машине вы будете отображать новые виды изображений из набора данных TinyNeRF:
Синтез нового взгляда и поля нейронного излучения
В этом разделе представлено упрощенное резюме / введение в то, как работают поля нейронного излучения, но может потребоваться некоторое время, чтобы по-настоящему интуитивно понять, как они работают, если вы новичок в этой области.
Примечание: Оригинальная статья, а также связанное с ней обучающее видео и графика являются отличными учебными материалами. Если вам интересно понять основную концепцию поля сияния которые NeRF используют для представления сцены, Запись в Википедии о «световых полях» представляет собой отличное введение, но их можно резюмировать на высоком уровне как
«Световое поле — это векторная функция, описывающая количество света, проходящего во всех направлениях через каждую точку пространства».
NeRF используются для синтез нового взгляда – создание новых видов объектов и изображений с учетом некоторых видов. По сути, вы можете думать о синтезе нового вида как о преобразовании 2D->3D, и существует множество подходов к решению этой проблемы, некоторые из которых более успешны, чем другие.
Исторически сложная проблема, решение, предложенное NeRF, чрезвычайно простое, но дает самые современные результаты, создавая изображения очень высокого качества с новых углов:
Это, естественно, позиционировало их как основополагающий подход к решению синтеза новых представлений, и многие последующие статьи исследуют, корректируют и улучшают представленные в них идеи.
Совет: Ассоциация веб-сайт выпущенный вместе с статьей, содержит удивительную демонстрацию метода и его результатов, и обучающее видео который создает хорошее представление о том, как работают эти сети, был официально выпущен.
Конвейер от данных к результатам можно резюмировать следующим образом:
Где нейронная сеть учится на разреженных изображениях с синтетически сгенерированными лучей которые проецируются и отбираются через равные промежутки времени. Изображения располагаются в пространстве с учетом метаданных об изображениях, таких как положение камеры при съемке изображений. Из-за этого — вы не можете просто вводить любые изображения, и требовать положения камеры, чтобы иметь возможность точно позиционировать изображения в пространстве, чтобы лучи создавали понятный набор точек. Затем выбранные точки формируют трехмерный набор точек, представляющих объемную сцену:
Нейронная сеть аппроксимирует функция объемной сцены – значения RGB и плотность (σ) сцены. По сути, мы обучаем сеть запоминать цвет и плотность каждой входной точки, чтобы иметь возможность реконструировать изображения с новых точек обзора. При этом NeRF не обучаются на наборе изображений и могут экстраполировать на новые. NeRF обучены кодировать сцену, а затем используются только для этой одной сцены. поскольку веса самой сети представляют сцену.
Это главный «недостаток» NeRF — вам нужно обучать сеть для каждой сцены, которую вы хотите закодировать, а процесс обучения несколько медленный и требует много памяти для больших входных данных. Улучшение времени обучения является областью исследований с использованием новых методов, таких как «Прямая оптимизация воксельной сетки» которые значительно сокращают время обучения, не жертвуя при этом качеством изображения.
Поля нейронного излучения в DeepVision и TensorFlow
Реализации NeRF могут быть немного сложными для новичков в объемном рендеринге, а репозитории кода обычно включают множество вспомогательных методов для работы с объемными данными, которые для некоторых могут показаться неинтуитивными. DeepVision — это новая библиотека компьютерного зрения, целью которой является унификация компьютерного зрения с помощью общего API с взаимозаменяемыми бэкендами (TensorFlow и PyTorch), автоматическим преобразованием веса между моделями и моделями с идентичными реализациями в бэкэнд-фреймворках.
Чтобы снизить порог входа, ДипВижн предлагает простую, но верную оригинальную реализацию моделей Neural Radiance Field с несколькими настройками для размещения более и менее мощных машин с различными настройками оборудования:
NeRFTiny
NeRFSmall
NeRFMedium
NeRF
NeRFLarge
Для создания этих настроек используются два параметра: width
и depth
. Поскольку NeRF, по сути, являются просто моделью MLP, состоящей из tf.keras.layers.Dense()
слоев (с одиночной конкатенацией между слоями), depth
непосредственно представляет количество Dense
слои, при этом width
представляет количество единиц, используемых в каждом из них.
NeRF
соответствует настройке, используемой в оригинальной статье, но может быть сложно запустить на некоторых локальных машинах, и в этом случае NeRFMedium
обеспечивает очень похожую производительность с меньшими требованиями к памяти.
Давайте продолжим и установим DeepVision с pip
:
$ pip install deepvision-toolkit
Создать экземпляр модели так же просто, как:
import deepvision
model = deepvision.models.NeRFMedium(input_shape=(num_pos, input_features), backend='tensorflow') model.summary()
Сама модель чрезвычайно проста:
Model: "ne_rftf"
__________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 640000, 195 0 [] )] dense (Dense) (None, 640000, 128) 25088 ['input_1[0][0]'] dense_1 (Dense) (None, 640000, 128) 16512 ['dense[0][0]'] dense_2 (Dense) (None, 640000, 128) 16512 ['dense_1[0][0]'] dense_3 (Dense) (None, 640000, 128) 16512 ['dense_2[0][0]'] dense_4 (Dense) (None, 640000, 128) 16512 ['dense_3[0][0]'] concatenate (Concatenate) (None, 640000, 323) 0 ['dense_4[0][0]', 'input_1[0][0]'] dense_5 (Dense) (None, 640000, 128) 41472 ['concatenate[0][0]'] dense_6 (Dense) (None, 640000, 4) 516 ['dense_5[0][0]'] ==================================================================================================
Total params: 133,128
Trainable params: 133,124
Non-trainable params: 4
__________________________________________________________________________________________________
Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!
Мы подробнее рассмотрим, как работать с выходными данными модели и как визуализировать изображения, созданные весами модели, через мгновение.
Загрузка набора данных TinyNeRF
Поскольку обучение NeRF на больших входных изображениях может быть несколько дорогостоящим, они были выпущены с небольшим набором данных 100 × 100 изображений, получившим название TinyNeRF чтобы упростить тестирование и итерации. Впоследствии он стал классическим набором данных для опробования NeRF и для входа в поле, подобно тому, как MNIST стал «Hello World» распознавания цифр.
Набор данных доступен в виде .npz
файл и содержит изображения, фокусные точки (используемые для нормализации) и позы камеры, и может быть получен из официального выпуска кода:
import requests
import numpy as np
import matplotlib.pyplot as plt url = "https://people.eecs.berkeley.edu/~bmild/nerf/tiny_nerf_data.npz"
save_path = 'tiny_nerf.npz' file_data = requests.get(url).content
with open(save_path, "wb") as file: file.write(file_data) data = np.load(save_path) images, poses, focal = data["images"], data["poses"], data["focal"] print(images.shape) print(poses.shape) print(focal)
Есть 106 изображений, 100×100 каждое, с 3 каналами (RGB). На всех изображениях изображен небольшой бульдозер из лего. Давайте построим первые пять изображений:
fig, ax = plt.subplots(1, 5, figsize=(20, 12))
for i in range(5): ax[i].imshow(images[i])
Ассоциация положения камеры предоставленные в наборе данных, имеют решающее значение для возможности восстановить пространство, в котором были сделаны изображения, что позволяет нам проецировать лучи через изображения и формировать объемное пространство с точками выборки на каждой проекции.
Однако, поскольку этот набор данных требует серьезной подготовки к этапу обучения, DeepVision предлагает load_tiny_nerf()
загрузчик набора данных, который выполнит для вас подготовку, с необязательным validation_split
, pos_embed
и num_ray_samples
, и возвращает ваниль tf.data.Dataset
что вы можете создавать высокопроизводительные конвейеры с помощью:
import deepvision train_ds, valid_ds = deepvision.datasets.load_tiny_nerf(pos_embed=16, num_ray_samples=32, save_path='tiny_nerf.npz', validation_split=0.2, backend='tensorflow')
Вам абсолютно не нужно создавать набор проверки здесь, так как точка is для полного соответствия и запоминания изображений, и набор проверки здесь создан в первую очередь как проверка работоспособности.
Давайте посмотрим на длину и входные формы в наборе обучающих данных:
print('Train dataset length:', len(train_ds))
print(train_ds)
Это приводит к:
Train dataset length: 84
<ZipDataset element_spec=(TensorSpec(shape=(100, 100, 3), dtype=tf.float32, name=None), (TensorSpec(shape=(320000, 99), dtype=tf.float32, name=None), TensorSpec(shape=(100, 100, 32), dtype=tf.float32, name=None)))>
Ассоциация pos_embed
аргумент задает количество позиционные вложения используется для преобразования координат 5D (x, y, z и углов обзора Theta и Phi). Позиционные вложения были решающее значение чтобы сеть могла представлять высокочастотные функции, что было «недостающим ингредиентом» для того, чтобы этот метод работал в прошлом, поскольку сети изо всех сил пытались аппроксимировать функции, представляющие высокочастотные вариации цвета и геометрии, из-за их предвзятости. вместо этого к изучению низкочастотных функций:
Ассоциация num_ray_samples
представляет количество выборок, сделанных по длине каждого луча, проецируемого на изображение.
Естественно, чем больше позиционных вложений и выборок лучей вы используете, тем выше разрешение объемной сцены, которую вы аппроксимируете, и, следовательно, тем более подробными будут окончательные изображения за счет более высоких вычислительных затрат.
Обучение NeRF с помощью TensorFlow/Keras и DeepVision
Давайте рассмотрим сквозной пример загрузки данных, подготовки набора данных, создания экземпляра модели и ее обучения с использованием DeepVision и экосистемы TensorFlow/Keras:
import deepvision
from deepvision.datasets import load_tiny_nerf
import tensorflow as tf config = { 'img_height': 100, 'img_width': 100, 'pos_embed': 32, 'num_ray_samples': 64, 'batch_size': 1
} num_pos = config['img_height'] * config['img_width'] * config['num_ray_samples']
input_features = 6 * config['pos_embed'] + 3 train_ds, valid_ds = load_tiny_nerf(pos_embed=config['pos_embed'], num_ray_samples=config['num_ray_samples'], save_path='tiny_nerf.npz', validation_split=0.2, backend='tensorflow') train_ds = train_ds.batch(config['batch_size']).prefetch(tf.data.AUTOTUNE)
valid_ds = valid_ds.batch(config['batch_size']).prefetch(tf.data.AUTOTUNE) model = deepvision.models.NeRFMedium(input_shape=(num_pos, input_features), backend='tensorflow') model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), loss=tf.keras.losses.MeanSquaredError()) callbacks = [tf.keras.callbacks.ReduceLROnPlateau()] history = model.fit(train_ds, epochs=50, validation_data=valid_ds, callbacks=callbacks)
На Nvidia GTX1660Super обучение с 32 позиционными встраиваниями и 64 выборками лучей занимает ~1 минуту на эпоху, но меньшие настройки, такие как 8-16 позиционных вложений и 32 выборки лучей, могут занимать всего ~7 секунд на эпоху:
Epoch 1/50
84/84 [==============================] - 65s 746ms/step - loss: 0.0603 - psnr: 12.6432 - val_loss: 0.0455 - val_psnr: 13.7601 - lr: 0.0010
...
Epoch 50/50
84/84 [==============================] - 55s 658ms/step - loss: 0.0039 - psnr: 24.1984 - val_loss: 0.0043 - val_psnr: 23.8576 - lr: 0.0010
Примерно через час на одном коммерческом графическом процессоре модель достигает ~ 24 PSNR. Дело в том, что с NeRFs чем дольше вы тренируетесь, тем ближе они будут к представлениям исходных изображений, а это означает, что вы, как правило, будете видеть, как показатели увеличиваются с течением времени по мере того, как вы больше тренируетесь. Это помогает иметь ReduceLROnPlateau
обратный вызов для управления снижением скорости обучения для точной настройки результатов ближе к концу обучения.
Модель сообщает о двух показателях: loss
и psnr
. Потеря представляет собой среднеквадратичную ошибку для каждого пикселя и работает как отличная функция потерь для NeRF, но ее трудно интерпретировать.
Пиковое отношение сигнал/шум (PSNR) это отношение между сигналом (максимальная мощность сигнала) и шумом (мощность шума, который искажает точность сигнала), который ухудшает качество изображения. Пиковое отношение сигнал/шум можно использовать как Качество изображения метрика и очень интуитивно понятна для человека.
Уже при PSNR 24 изображения становятся довольно четкими, а NeRF может достигать PSNR более 40 на TinyNeRF при достаточном времени обучения.
Визуализация результатов
Сеть выводит тензор формы [batch_size, 640000, 4]
где каналы представляют RGB и плотность, а 640000 точек кодируют сцену. Чтобы представить их в виде изображений, мы хотим изменить форму тензора в форме (batch_size, img_height, img_width, num_ray_samples, 4)
, а затем разделите 4 канала на RGB и сигма и обработайте их в изображение (и, возможно, карту глубины/точности).
В частности, каналы RGB передаются через сигмоид активации, а сигма-канал проходит через РЕЛУ активации перед дальнейшей обработкой и приведением к тензору формы (batch_size, img_height, img_width, rgb_channels)
, и два тензора формы (batch_size, img_height, img_width, depth_channel)
и (batch_size, img_height, img_width, accuracy)
.
Чтобы упростить этот процесс, мы можем использовать nerf_render_image_and_depth_tf()
функция от volumetric_utils
, который принимает модель для предсказания RGB и сигмы из входных данных и возвращает пакет изображений, карт глубины и карт точности:
import matplotlib.pyplot as plt
from deepvision.models.volumetric.volumetric_utils import nerf_render_image_and_depth_tf for batch in train_ds.take(5): (images, rays) = batch (rays_flat, t_vals) = rays image_batch, depth_maps, _ = nerf_render_image_and_depth_tf(model=model, rays_flat=rays_flat, t_vals=t_vals, img_height=config['img_height'], img_width=config['img_width'], num_ray_samples=config['num_ray_samples']) fig, ax = plt.subplots(1, 2) ax[0].imshow(tf.squeeze(image_batch[0])) ax[1].imshow(tf.squeeze(depth_maps[0]))
Здесь мы рисуем 5 пакетов (каждый с одним изображением) и их карты глубины.
Во время обучения сама модель опирается на nerf_render_image_and_depth_tf()
функция для преобразования прогнозов в изображения и вычисления среднеквадратичной ошибки и PSNR для результатов. Запуск этого кода приводит к:
Заключение
В этом руководстве мы обобщили некоторые ключевые элементы Neural Radiance Fields в качестве краткого введения в предмет, после чего последовала загрузка и подготовка набора данных TinyNeRF в TensorFlow с использованием tf.data
и обучение модели NeRF с помощью экосистем Keras и DeepVision.
- SEO-контент и PR-распределение. Получите усиление сегодня.
- Платоблокчейн. Интеллект метавселенной Web3. Расширение знаний. Доступ здесь.
- Источник: https://stackabuse.com/training-a-neural-radiance-field-nerf-model-with-keras-tensorflow-and-deepvision/
- 1
- 100
- 1984
- 2020
- 3d
- 7
- 84
- 9
- a
- в состоянии
- О нас
- абсолютно
- Принимает
- точность
- точно
- Достигает
- через
- Активация
- на самом деле
- впереди
- Цель
- Оповещение
- Все
- позволяет
- рядом
- удивительный
- количество
- и
- API
- Приложения
- подхода
- подходы
- ПЛОЩАДЬ
- аргумент
- Искусство
- связанный
- Автоматический
- доступен
- Backend
- барьер
- колотить
- , так как:
- становиться
- до
- не являетесь
- Беркли
- между
- смещение
- Немного
- граница
- строит
- вычислять
- камера
- случаев
- сложные
- Канал
- каналы
- проверка
- классический
- Очистить
- ближе
- код
- цвет
- коммерческая
- Общий
- Компании
- компьютер
- Компьютерное зрение
- сама концепция
- заключение
- подключенный
- Состоящий из
- содержит
- содержание
- Конверсия
- конверсий
- конвертировать
- соответствует
- Цена
- Расходы
- Создайте
- создали
- Создающий
- решающее значение
- культурный
- данным
- Наборы данных
- сделка
- занимавшийся
- глубина
- подробный
- трудный
- Digest
- оцифровка
- направлять
- направление
- непосредственно
- дублированный
- каждый
- легче
- экосистема
- Экосистемы
- образовательных
- эффект
- элементы
- впритык
- достаточно
- запись
- эпоха
- ошибка
- сущность
- Каждая
- пример
- дорогим
- Исследование
- достаточно
- Фэшн
- верность
- поле
- Поля
- Файл
- окончательный
- конец
- First
- текущий
- Фокус
- следует
- форма
- найденный
- каркасы
- частота
- от
- полностью
- функция
- Функции
- далее
- генерируется
- порождающий
- получить
- идти
- GitHub
- данный
- Go
- хорошо
- GPU / ГРАФИЧЕСКИЙ ПРОЦЕССОР
- графика
- большой
- сетка
- инструкция
- обрабатывать
- практический
- Аппаратные средства
- помощь
- здесь
- наследие
- High
- Высокая частота
- на высшем уровне
- высокая производительность
- высший
- история
- зависать
- Как
- How To
- HTTPS
- Людей
- ICON
- идеи
- идентичный
- изображение
- изображений
- реализация
- улучшать
- улучшение
- улучшение
- in
- включают
- включены
- повышение
- вход
- устанавливать
- вместо
- заинтересованный
- Введение
- интуитивный
- IT
- итерации
- саму трезвость
- keras
- Основные
- известный
- большой
- больше
- слой
- слоев
- изучение
- Длина
- LG
- Библиотека
- легкий
- Световые поля
- мало
- загрузчик
- погрузка
- локальным
- дольше
- посмотреть
- от
- потери
- машина
- Продукция
- Главная
- сделать
- Создание
- многих
- карта
- Карты
- материалы
- Matplotlib
- максимальный
- смысл
- Память
- Метаданные
- метод
- методы
- метрический
- Метрика
- отсутствующий
- модель
- Модели
- момент
- БОЛЕЕ
- самых
- с разными
- приближается
- Необходимость
- Nerf
- сеть
- сетей
- нейронной сети
- Новые
- Шум
- роман
- номер
- многочисленный
- NumPy
- Nvidia
- объекты
- полученный
- Предложения
- Официальный представитель в Грузии
- Официально
- ONE
- оптимизация
- заказ
- оригинал
- Другое
- бумага & картон
- бумага
- параметры
- Прошло
- мимо
- Вершина горы
- Выполнять
- производительность
- выполнения
- фаза
- трубопровод
- Pixel
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- Точка
- пунктов
- представляет
- должность
- расположены
- позиции
- мощностью
- мощный
- практическое
- предсказывать
- Predictions
- подготовка
- представить
- в первую очередь
- вероятно
- Проблема
- процесс
- Обработанный
- Произведенный
- Проект
- прогнозируемых
- Проекция
- предложило
- приводит
- pytorch
- Обменный курс
- соотношение
- RAY
- RE
- достигать
- признание
- Цена снижена
- регулярный
- освободить
- выпустил
- оказание
- Отчеты
- представлять
- представляющий
- представляет
- Запросы
- Требования
- требуется
- исследованиям
- Постановления
- Итоги
- Возвращает
- RGB
- кольцо
- грубо
- Run
- Бег
- Сказал
- сцена
- Сцены
- Раздел
- набор
- Наборы
- установка
- Shadow
- Форма
- формы
- демонстрации
- Сигма
- сигнал
- существенно
- аналогичный
- просто
- упрощенный
- с
- одинарной
- Сайтов
- медленной
- небольшой
- меньше
- Решение
- РЕШАТЬ
- Решение
- некоторые
- в некотором роде
- Space
- специализация
- В квадрате
- Стекабьюс
- стандартов
- Область
- По-прежнему
- Stop
- буря
- предмет
- последующее
- впоследствии
- успешный
- такие
- поставляется
- SVG
- синтетически
- взять
- принимает
- снижения вреда
- tensorflow
- Тестирование
- Ассоциация
- мир
- их
- в нем
- Theta
- задача
- Через
- время
- в
- Всего
- к
- Торговля
- Train
- специалистов
- Обучение
- Transform
- переход
- правда
- типично
- под
- лежащий в основе
- понимать
- неинтуитивными
- единиц
- URL
- us
- использование
- Проверка
- Наши ценности
- различный
- Ve
- Видео
- Вид
- Просмотры
- видение
- Воксельный
- вес
- который
- в то время как
- Википедия.
- будете
- без
- Работа
- работает
- Мир
- X
- доходность
- Ты
- YouTube
- зефирнет