![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/21f/a6e/46a/21fa6e46a4a7409e0cc99770031126cb.png)
В последнее время мы оцениваем на удивление много проектов, так или иначе связанных с 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), по сути, модели для восстановления цвета и плотности распределения объёма объектов на заданном луче. Это, в свою очередь, позволяет по нескольким фото одной и той же сцены, снятых с разных ракурсов, получить возможность "рендерить" ту же самую сцену, но уже используя произвольное положение камеры в пространстве. Выглядит очень эффектно!
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/44b/d15/cd7/44bd15cd7abf407e62201c87ce686cf1.gif)
Удивительно то, что данная модель весит каких-то 5 МБ, что зачастую на несколько порядков меньше, чем суммарный размер обучающего датасета. То есть мы как бы упаковываем данные, находящиеся в фотографиях в одно непрерывное 3D-представление сцены.
Незамысловатая архитектура обычной MLP в сочетании с элегантной идеей производят довольно-таки мощный эффект:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/475/302/012/475302012e7d17ca17f4c0eacdc1b1a2.png)
Рассмотрим подробнее представленную схему. Здесь:
ɣ(x) - позиционное кодирование для пространственной координаты x=(x,y,z) внутри нашей сцены
ɣ(d) - позиционное кодирование для луча d=(θ,φ), в направлении которого мы наблюдаем точку x
σ - значение плотности объёма в заданной точке x (по сути прозрачность объекта в этой точке)
RGB - значение цвета точки x
Позиционное кодирование в данном случае является эвристикой, позволившей авторам оригинальной статьи улучшить восприятие моделью высокочастотных изменений цвета и геометрии внутри сцены. Задаётся оно следующей формулой:
Есть у NeRF и несколько недостатков:
Во-первых, в силу самой концепции NeRF мы намеренно переобучаем нейросеть на возможность представления исключительно одной сцены, т.е. для разных сцен понадобится обучить разные нейросети.
Во-вторых, само по себе это обучение ну уж очень долгое (как следует из оригинальной статьи 1-2 дня на NVIDIA V100).
Советую ещё прочитать соответствующую статью на Хабре и посмотреть видео, где доходчиво с примерами объясняются ключевые идеи и детали реализации данного метода.
GIRAFFE
Продолжим рассмотрение 3D-нейросетей с GIRAFFE - как идеологически, так хронологически следующей после NeRF знаковой модели, предназначенной для настраиваемой генерации объёмных сцен. До её появления большая часть подходов концентрировалась на создании наиболее реалистичных изображений с ядром в виде GAN, не беря в расчёт композициональную природу сцены, которая, очевидно, состоит из фона и, возможно, нескольких объектов, как-то расположенных в пространстве относительно друг друга.
Вследствие этого, генеративные модели оставались не способными к устойчивой генерации вариаций одной и той же сцены с теми же самыми объектами. Условно, сдвиг предмета вправо мог привести к его полной деформации, изменению текстуры, цвета или всей сцены в общем. То есть красный деревянный куб на фоне травы превратился бы в зелёный стеклянный шар на фоне забора (так себе эффект от перемещения, не правда ли?). Связано это с тем, что перемещение объекта в данном случае равносильно одновременному изменению многих скрытых параметров генерации модели - они все перепутаны между собой, один влияет на другой, и у нас нет возможности проинтерпретировать их должным образом. Схема, которая обучалась генерировать 2D-изображения без понимания 3D-природы сцены, не способна на такие финты. Авторы статьи дают нам наглядную визуализацию озвученной проблемы:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/165/d0d/3de/165d0d3deceb3ff03a6d43c8802ee047.gif)
А вот какой результат получается у GIRAFFE в противовес на аналогичной задаче перемещения объектов внутри сцены:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/492/123/747/4921237477cdd649fb28c3c73adc2b8a.gif)
Уже гораздо лучше! Но не идеально ¯\_(ツ)_/¯
Так как всё-таки у GIRAFFE получается осуществлять контролируемую генерацию объёмных сцен?
Дело в том, что у нас уже есть NeRF, которая переобучается на одной единственной сцене, используя кучу картинок с разных ракурсов. На выходе у NeRF мы имеем поле признаков, которое сразу же принимаем за трёхканальное RGB изображение исходной размерности. Создатели GIRAFFE пошли чуть дальше и обобщили NeRF на генерацию скрытого поля признаков конкретного класса объектов произвольной размерности. Дальше, имея на руках несколько NeRF'ов для каждого из N необходимых объектов, задаём для них все настраиваемые параметры и получаем N полей соответствующих признаков. Далее объединяем их в одно поле при помощи композиционального оператора, применяем объёмный рендеринг для объединённого поля, расширяем размерность до исходного изображения и применяем GAN для обучения модели. Весь этот процесс можно уместить на следующей схеме:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/5bf/56b/2e8/5bf56b2e8c0e29ff7e3ff7f9bb84d33e.jpeg)
Важная ремарка: RGB-изображения, помимо последнего, на выходе модели не нужно воспринимать буквально, это всё поля признаков. Сделано это для наглядной визуализации и упрощения понимания процесса генерации.
А что по источникам?
Во-первых, советую замечательную книжку, которая вобрала в себя описание многих интересных моделей, хоть и имеет небольшие проблемы с переводом.
Во-вторых, конечно же идёт оригинальная статья по GIRAFFE
Далее стоит обратить внимание на предшествующую статью о GRAF и краткое объясняющее видео по GRAF.
Ну и напоследок, если кто-то захочет попробовать всё это запустить своими руками, то вот статья с Хабра, в которой описана плотная работа с исходным кодом.
SMPL
А сейчас начнём разбор целого класса моделей по получению трёхмерной реконструкции человеческого тела. SMPL, которая впервые была представлена аж в 2015 году, является параметрическим представлением трехмерной модели человеческого тела, которое точно отображает самые разнообразные формы тела в естественных человеческих позах.
Хоть название SMPL и является акронимом слова simple, сама по себе она, как нам показалось, к сожалению, таковой не является 😢 Ну ничего, разберёмся!
SMPL использует сетку с фиксированной топологией из 6890 вершин для представления человеческого тела. Эта сетка обеспечивает стандартную структуру, к которой можно применять различные деформации. На изображении ниже она расположена слева:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/201/f3d/8b0/201f3d8b04e4e1a9743b9c9eb0eee07e.png)
M(θ,β) - это, как можно догадаться, результат работы модели. Отлично, давайте зафиксируем первый ключик к пониманию того, зачем вообще всё это нужно: SMPL на входе получает 2 вектора θ и β, и каким-то образом они полностью описывают модель человека. На выходе SMPL даёт нам 3D-модель в виде сетки из 6980 точек в нужной нам позе с заданной формой тела.
У читателя, который в теме, может возникнуть вопрос: "ок, а что тут такого необычного? У нас уже есть модель LBS (Linear Blend Skinning), которая способна деформировать 3D модели в соответствии с заданной матрицей весов."
Дело в том, что при сильных сгибах она начинает давать неестественные результаты, вот пример сравнения LBS и SMPL:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/b1a/bee/646/b1abee646ebd8f7960d5b3c12e996a4f.jpeg)
Собственно SMPL и призвана обеспечить такие изменения базовой модели, чтобы в конечной деформированной 3D-модели не возникало подобных неестественных артефактов.
Перейдём к тому, как именно она устроена. Разберём следующую схему:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/e40/77c/a40/e4077ca4059d4ecc1ef31c24c76a6424.png)
Введём для ясности определения (если понять их в совокупности, поймёте SMPL):
Шаблон позы покоя T - полигональная сетка (mesh) базовой 3D-модели человека, состоящая из N=6980 точек
Весовые коэффициенты смешивания W - матрица из LBS, определяющая насколько смещение костей влияет на смещение вершин базовой 3D модели
Блендшейп формы - 3D-модель идентичная исходной, но учитывающая особенности формы тела человека
Блендшейп позы - 3D-модель идентичная исходной, но учитывающая деформацию тела человека в конкретной позе
Регрессионная матрица J - матрица, задающая местоположение суставов 3D-модели в зависимости от блендшейпа формы (у разных людей с разной формой тела по разному расположены суставы)
Параметры формы β: Вариации форм тела задаются при помощи блендшейпов форм. Это векторы главных компонент, полученные на основе обучающего набора 3D-сканирований тела. Пространство формы определяется 10 основными компонентами, следовательно, изменяя их при помощи коэффициентов β, можно управлять формой тела
Параметры позы θ: Вариации поз задаются с помощью бледшейпов поз. В контексте модели SMPL, деформации, зависящие от бледшейпа позы, относятся к деформациям, которые возникают в человеческом теле из-за позирования. Эти деформации связаны не с индивидуальными различиями формы тела, а с изменениями, возникающими при движении частей тела, например, при сгибании руки или ноги. Они предназначены для корректировки артефактов и нереалистичных деформаций, возникающих при позиционировании базовой сетки с использованием стандартного LBS.
Модель SMPL обучается в два этапа:
Оптимизируются коэффициенты W, блендшейпы поз, базовая 3D модель и регрессор суставов, чтобы минимизировать ошибку расположения вершин модели при обучении. Обучающий набор для этого этапа состоит из 1786 3D-сканов различных людей в самых разных позах с высоким разрешением.
Независимо от первого этапа, линейные модели формы мужского и женского тела изучаются на основе набора данных CAESAR (приблизительно 2000 сканирований для каждого пола) с использованием анализа главных компонентов (PCA). Сначала регистрируем mesh шаблона 3D-модели для каждого сканирования и нормализуем данные, что имеет решающее значение при обучении модели формы на основе вершин. Затем полученные в результате основные компоненты становятся блендшейпами формы тела.
Читать нужно усердно и много, чтобы разобраться в этом с нуля, надеюсь этой статьёй хоть как-то помогу погрузиться в тему. По традиции материалы:
SMPLify
Недостатком SMPL было отсутствие прямого механизма оценки 3D-позы и формы человеческого тела по предоставленным 2D-изображениям. В 2016 году для решения этой проблемы был предложен метод SMPLify. Используя модель SMPL, SMPLify применяет 2D-обнаружение суставов для «проецирования» 3D-формы человека в 2D-пространство, тем самым создавая последовательное 3D-представление из одного изображения.
SMPLify не является моделью глубокого обучения: это метод, который использует модель тела SMPL в цикле оптимизации для того, чтобы сделать вывод о трехмерной позе и форме человека на основе обнаруженных двумерных суставов на изображении.
Вначале SMPLify получает 2D-точки суставов, которые могут быть определены любым методом 2D-оценки позы человека. Модель SMPL имеет параметры положения (θ) и формы (β). Цель SMPLify - найти значения этих параметров так, чтобы проекция 3D-позы модели SMPL на 2D-плоскость наилучшим образом соответствовала обнаруженным 2D-суставам. На обучении авторы метода брали входное изображение и использовали DeepCut CNN для прогнозирования местоположения 2D-суставов тела:
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/167/5c3/0ee/1675c30ee4795ecb96526b2f92dd6a37.png)
SMPLify определяет целевую функцию, которая измеряет разницу между 2D проекциями 3D-суставов модели SMPL (с использованием текущих значений θ и β) и обнаруженными на фото 2D суставов. Ещё целевая функция учитывает, насколько естественными получились поза и форма человеческого тела после генерации.
Стоит отметить, что при работе с предыдущими методами была следующая проблема: позу человека было невозможно адекватно построить в связи с взаимопроникновением частей тела друг относительно друга, а делать расчеты для такой сложной поверхности - очень дорогостоящая операция. В видеоиграх для эффективного расчета коллизий обычно используется аппроксимация модели простыми фигурами. Авторы использовали этот подход и аппроксимировали поверхность тела набором «капсул». Каждая капсула имеет радиус и длину оси.
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/91b/5c4/557/91b5c45578102f8e6eb8a82927577e48.png)
Преимуществом SMPLify является то, что она может по одному изображению оценить трехмерную позу и форму человека, что позволяет использовать её тогда, когда многосторонних фото нет, и информация о глубине отсутствует. Ещё не может не радовать надежность модели: использование априорных данных о позе и форме помогает добиться более анатомически правдоподобных результатов даже в тех случаях, когда двумерное представление позы является слегка неточным.
Источники:
Оригинальная статья
SMPL-X
SMPL-X значительно упростил трехмерную реконструкцию человеческого тела за счет совмещения в единую связную структуру нескольких моделей: SMPL для тела, отдельные модели для лица и MANO для рук.
![](https://webcf.waybackmachine.org/web/20240301024707/https://habrastorage.org/getpro/habr/upload_files/853/98d/0c2/85398d0c2b6bd5ebc8cb1bd0c48afe76.png)
Эта интеграция стала возможной благодаря использованию тысяч 3D-сканов, которые значительно усовершенствовали исходную модель SMPL, включив в нее выразительное лицо и детальную жестикуляцию рук. SMPL-X предоставляет комплексную модель, которая отражает сложности всего тела, включая нюансы мимики и жестов (они также управляются унифицированным набором параметров формы). Это стало скачком в детализации и функциональности: количество вершин увеличено до 10 475 с 6 890 в SMPL, что повышает способность модели отображать более мелкие анатомические детали, особенно лиц и рук.
Источники:
Оригинальная статья
Заключение
Вот и подошла к концу первая обзорная статья ML-моделей, концептуально завязанных на объёмном представлении объектов нашего мира. Жду ваших предложений и идей по следующим статьям в данном цикле. Спасибо за внимание!
Благодарности
Также хочу высказать благодарность своему коллеге Александру Додонову, который помог разобраться в части из представленных моделей!