
В последнее время мы оцениваем на удивление много проектов, так или иначе связанных с 3D-пространством и нейросетями. По всей видимости по прошествии 2023 года люди воодушевились и начали видеть возможность реализации тех идей, которые ранее просто-напросто казались научной фантастикой - и они не ошибаются! Исследователи и разработчики последних технологий достигли сногсшибательных результатов. В связи с этим хотел бы накидать цикл обзорных статей, которых как мне лично, так и нашей рабочей группе очень сильно недоставало в процессе ресёрча.
Введение
Почему 3D? В отличие от тех же LLM или диффузионных 2D-моделей тема на первый взгляд совершенно не хайповая и, наверное, для восприятия более сложная, ну вот как-то не на слуху она совсем. Однако, понимая очевидную тенденцию развития технологий в этом направлении (VR/AR/Цифровые аватары и пр.), а также учитывая обыденное устремление человеческого познания в отношении нашего 4D мира, будет глупо отрицать, что в ближайшее время нас не захлестнёт волна открытий в данной области. В связи с этим хотел бы поучаствовать в создании плацдарма, который позволит большему числу людей ознакомиться с существующими подходами и также даст мотивацию как на углубление своих знаний, так и на создание новых.
Тема обширная, обозреть нужно много чего, поэтому повествование организую следующим образом: сначала я буду обозначать значимую для всей области модель машинного обучения, объясню принципы её работы своими словами, в процессе также предоставлю источники, которые стоит почитать/посмотреть для дальнейшего погружения в тему.
В первой части цикла рассмотрим следующие модели:
NeRF
GIRAFFE
SMPL
SMPLify
SMPL-X
В следующих частях будем иметь дело с более продвинутыми моделями для реконструкции 3D из 2D:
Mesh R-CNN
HSP
NeuralRecon
LegoFormer
Neural Fields as Learnable Kernels for 3D Reconstruction
Zero123
One-2-3-45
А также поразмышляем на тему, что нас ждёт в недалёком будущем.
Приступим!
NeRF
Моё знакомство с классом подобных нейронок началось с замечательного видео Two Minute Papers, где автор рассказывает о NeRF (Neural Radiance Fields), по сути модели для восстановления цвета и плотности распределения объёма объектов на заданном луче. Это в свою очередь позволяет по нескольким фото одной и той же сцены, снятых с разных ракурсов, получить возможность "рендерить" ту же самую сцену, но уже используя произвольное положение камеры в пространстве. Выглядит очень эффектно!

Удивительно то, что данная модель весит каких-то 5 МБ, что зачастую на несколько порядков меньше, чем суммарный размер обучающего датасета. То есть мы как бы упаковываем данные, находящиеся в фотографиях в одно непрерывное 3D-представление сцены.
Незамысловатая архитектура обычной MLP в сочетании с элегантной идеей производят довольно-таки мощный эффект:

Рассмотрим подробнее представленную схему. Здесь:
ɣ(x) - позиционное кодирование для пространственной координаты x=(x,y,z) внутри нашей сцены
ɣ(d) - позиционное кодирование для луча d=(θ,φ), в направлении которого мы наблюдаем точку x
σ - значение плотности объёма в заданной точке x (по сути прозрачность объекта в этой точке)
RGB - значение цвета точки x
Позиционное кодирование в данном случае является эвристикой, позволившей авторам оригинальной статьи улучшить восприятие моделью высокочастотных изменений цвета и геометрии внутри сцены. Задаётся оно следующей формулой:
Есть у NeRF и несколько недостатков: во-первых, в силу самой концепции NeRF мы намеренно переобучаем нейросеть на возможность представления исключительно одной сцены, т.е. для разных сцен понадобится обучить разные нейросети. Во-вторых, само по себе это обучение ну уж очень долгое (как следует из оригинальной статьи 1-2 дня на NVIDIA V100).
Советую также прочитать соответствующую статью на Хабре и посмотреть видео, где доходчиво с примерами объясняются ключевые идеи и детали реализации данного метода.
GIRAFFE
Продолжим рассмотрение 3D-нейросетей с GIRAFFE - как идеологически, так хронологически следующей после NeRF знаковой модели, предназначенной для настраиваемой генерации объёмных сцен. До её появления большая часть подходов концентрировалась на создании наиболее реалистичных изображений с ядром в виде GAN, не беря в расчёт композициональную природу сцены, которая, очевидно, состоит из фона и, возможно, нескольких объектов как-то расположенных в пространстве относительно друг друга.
В следствии этого генеративные модели оставались не способными к устойчивой генерации вариаций одной и той же сцены с теми же самыми объектами. Условно, сдвиг предмета вправо мог привести к его полной деформации, изменению текстуры, цвета или всей сцены в общем. То есть красный деревянный куб на фоне травы превратился бы в зелёный стеклянный шар на фоне забора (так себе эффект от перемещения, не правда ли?). Связано это с тем, что перемещение объекта в данном случае равносильно одновременному изменению многих скрытых параметров генерации модели - они все перепутаны между собой, один влияет на другой и у нас нет возможности проинтерпретировать их должным образом. Схема, которая обучалась генерировать 2D-изображения без понимания 3D-природы сцены не способна на такие финты. Авторы статьи дают нам наглядную визуализацию озвученной проблемы:

А вот какой результат получается у GIRAFFE в противовес на аналогичной задаче перемещения объектов внутри сцены:

Уже гораздо лучше! Но не идеально ¯\_(ツ)_/¯
Так как всё-таки у GIRAFFE получается осуществлять контролируемую генерацию объёмных сцен?
Дело в том, что у нас уже есть NeRF, которая по сути переобучается на одной единственной сцене, использую кучу картинок с разных ракурсов. На выходе у NeRF мы имеем поле признаков, которое сразу же принимаем за трёхканальное RGB изображение исходной размерности. Создатели GIRAFFE пошли чуть дальше и обобщили NeRF на генерацию скрытого поля признаков конкретного класса объектов произвольной размерности. Дальше, имея на руках несколько NeRF'ов для каждого из N необходимых объектов, задаём для них все настраиваемые параметры и получаем N полей соответствующих признаков. Далее объединяем их в одно поле при помощи композиционального оператора, применяем объёмный рендеринг для объединённого поля, расширяем размерность до исходного изображения и применяем GAN для обучения модели. Всё это описание можно уместить на следующей схеме:

Важная ремарка: RGB-изображения помимо последнего на выходе модели не нужно воспринимать буквально, это всё поля признаков. Сделано это для наглядной визуализации и упрощения понимания процесса генерации.
А что по источникам?
Во-первых, советую замечательную книжку, которая вобрала в себя описание многих интересных моделей, хоть и имеет небольшие проблемы с переводом.
Во-вторых, конечно же идёт оригинальная статья по GIRAFFE
Далее стоит обратить внимание на предшествующую статью о GRAF и краткое объясняющее видео по GRAF.
Ну и напоследок, если кто-то захочет попробовать всё это запустить своими руками, то вот статья с Хабра, в которой описана плотная работа с исходным кодом.
SMPL
А сейчас начнём разбор целого класса моделей по получению трёхмерной реконструкции человеческого тела. SMPL, которая впервые была представлена аж в 2015 году, является параметрическим представлением трехмерной модели человеческого тела, которое точно отображает самые разнообразные формы тела в естественных человеческих позах.
Хоть название SMPL и является акронимом слова simple, сама по себе она как нам показалось, к сожалению, таковой не является
