NeRF – поля излучения нейронов для синтеза изображения
Есть несколько статей, которые в обязательном порядке дают читать студентам курсов по ИИ, чтобы сформировать базовое понимание области. Мы их потихоньку разбираем:
- «Attention Is All You Need» – в посте про устройство GPT;
- «BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding» – в посте про модель BERT;
- «Generative Adversarial Networks» – в посте про обучение через состязание;
- «Neocognitron: A Self-organizing Neural Network Model for a Mechanism of Pattern Recognition Unaffected by Shift in Position» – в посте про компьютерное зрение.
Так что мы с вами уже неплохо продвинулись в своем познании, и пришло время еще одной важной для развития ИИ работы – «NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis» («NeRF: представляя сцены как поля излучения нейронов для синтеза изображения»). Да, звучит кошмарно. Но сейчас мы во всем разберемся.
Основная идея
Идея в том, чтобы сгенерировать изображение объекта под новым углом зрения, имея несколько изображений, полученных под разными углами зрения. Авторы используют многослойный перцептрон. Я здесь не буду рассказывает, что это за зверь, поэтому, если вам нужно освежить память, обратитесь к посту про обучение через состязание.
Пример: у вас есть фотография вашего кота сзади, слева и справа. Вы передаете эти фотографии нейросети, и она вам возвращает изображение анфас.
Это намеренно упрощенный пример, а вот пример из статьи:
На вход дается 100 изображений барабанной установки, на выходе получается еще два новых изображения, которые показывают установку с новых углов обзора.
Чтобы этого достичь, для каждой точки каждого изображения взяли следующие параметры:
- координаты в трехмерном пространстве;
- угол обзора;
- направление взгляда;
- плотность цвета.
Представьте себе такую сцену: вы взяли камеру и прикрутили к ней маленький фонарик, свет которого в точности показывает, куда направлен центр линзы. Перед вами поставили барабанную установку, и вы направляете на нее камеру с разных сторон и делаете снимок. Каждый раз луч света падает на определенную точку, и для нее вы знаете:
- угол падения луча света;
- координаты (допустим, вы заранее навели очень мелкую лазерную сетку на ваши барабаны);
- расстояние от линзы камеры до точки;
- цвет точки и его насыщенность.
А теперь представьте, что у вас очень много очень маленьких фонариков, которые вы закрепили на линзу так, чтобы каждая точка барабанной установки была отмечена лучом света. И теперь вы водите камеру вокруг установки, записывая всю перечисленную информацию для каждой точки.
«Поле излучения нейрона» – это как раз точка, на которую светит один луч света. Я прибегаю здесь к существенному упрощению, но, надеюсь, общий смысл вам ясен.
Имея полученный набор данных, вы можете по нему восстановить снимок барабанной установки под определенным углом. А еще вы можете рассчитать, как выглядел бы снимок барабанной установки под другим углом, потому что вы снимали ее под разными углами и знаете, как менялись параметры каждой точки в зависимости о того, с какой стороны на нее посмотреть.
Точнее, вы не можете, потому что данных получается невероятно много. А вот многослойный перцептрон вполне справится, если его натренировать, что авторы статьи и сделали.
Они передали огромный массив собранных данных: координаты точек, их удаленность от камеры и угол обзора – для всех снимков, чтобы модель предсказала цвет и плотность для каждой точки. Реальный цвет и плотность уже для всех точек известны. Сравнили предсказанное с реальным, вычислили ошибку, скорректировали предсказание. И так много раз с разными изображениями.
Если говорить точнее, модель предсказывает не конкретные параметры – цвет и плотность – а то, как соотносятся цвет и плотность с координатами, удаленностью и углом обзора. То есть, моделируется не сам объект, а то, как его вид зависит от точки зрения.
Я также говорю «сравнили», «посчитали», но на деле, конечно, воспользовались формулами и запустили автоматический процесс обучения. Вы это понимаете, конечно, но на всякий случай уточняю.
В итоге получилось с помощью сравнительно простой нейросети получать реалистичные изображения в высоком разрешении, и это очень здорово. «Сравнительно простой» – это без сверточных слоев, о которых шла речь в посте про компьютерное зрение.
Чтобы построить максимально точное изображение, авторы обучили два перцептрона: один на точках, которые наиболее важны для восстановления картинки, а другой – на всех. То есть, первая, более разреженная сеть, была сфокусирована на самом объекте и не на фоне изображения. Это было сделано для того, чтобы фону и объекту не присваивалась одинаковая значимость. Изображения получились гораздо более детальными и реалистичными, чем в предшествующих экспериментах.
Заключение
Технология NeRF с момента своего обнародования в 2020 году претерпела много изменений и, насколько я могу судить, до сих пор используется в компьютерной графике. У себя в телеграме я писала про стартап Word Labs, который запустила Фей-Фей Ли (Fei-Fei Li) для создания 3D-сцен из 2D-изображений. Выяснить, используют ли там NeRF, мне не удалось: Word Labs не делится подробностями своих разработок. Однако в команде есть Бен Милденхолл (Ben Mildenhall), который является соавтором сегодняшней статьи. Это, впрочем, еще ничего не доказывает.