
В предыдущей статье мы уже затрагивали задачу реконструкции 3D-объектов по их 2D-изображениям. В этой же углубимся в реконструкцию с головой! Вообще говоря, как мне кажется, сейчас мы рассмотрим гораздо более концептуально интересные методы, а именно - HSP и Mesh R-CNN. Это база, которая просто должна осесть в головах всех любителей ИИ в 3D!
HSP
Hierarchical Surface Prediction (HSP) можно попробовать перевести, как иерархическое предсказание поверхности. Это метод воксельной реконструкции 3D-объектов по их 2D-изображениям.
Воксели
Поскольку воксели являются краеугольным камнем реализации данного метода, остановимся на них поподробнее.
Воксели часто называют трёхмерным аналогом обычных пикселей, что неплохо отображено на следующей картинке

Они очень удобны для представления 3D-объектов сложной топологии, да и сами по себе являются достаточно естественным способом отображения нашего мира, как структурированного набора маленьких кирпичиков.
Какая основная проблема стоит перед нами, когда мы используем воксельную сетку? В первую очередь - это проклятие размерности, которое проявляется при увеличении детализации 3D-модели. Например, если мы будем напрямую хранить воксели в виде трёхмерного массива array[x][y][z], то для того, чтобы представить 3D-модель с детализацией хотя бы в 512 точек, нам понадобится байт, что в свою очередь равно 128 Мб. Короче, так себе история, имеем
по памяти.
Но люди не остановились и как всегда придумали более оптимальный способ представления данных. В случае вокселей - это октодеревья.
Октодеревья
Октодерево - это древовидная структура данных, в которой у каждого внутреннего узла либо ровно восемь потомков, либо ни одного. Дело в том, что куб (в нашем случае воксель) всегда можно разбить на 8 равных кубов меньшего размер, тем самым производя учащение сетки. Посмотрев на изображения ниже, можно понять, как возможно представить воксельную сетку при помощи октодеревьев:


Важная деталь состоит в том, что некоторые вершины помечаются, как заполненные, а некоторые - как пустые. У пустых вершин, очевидно, не может быть потомков, потому что нам не нужно увеличивать детализацию пространства, в котором ничего нет. Чем ближе к корню удастся найти пустую вершину, тем меньше места затратим на хранение объекта в памяти по сравнению с тем же трёхмерным массивом.
Вот пример того, как при помощи октодерева можно представить 3D-модель снеговика:

Ближе к границе объекта разбиение увеличивается, что позволяет сделать детализированную поверхность. А вот внутри снеговика разбиения большие: нам не нужно детализировать внутренний объём, который и так не сможем увидеть. Вот тут мы потихоньку и подобрались к сути метода HSP.
Суть метода
Для начала взглянем на схему:

Можем видеть, что HSP получает на вход RGB-изображение, преобразует его в вектор признаков C и не берётся за генерацию всей воксельной сетки разом. Вместо этого он последовательно получает пространства признаков и на основании этого продолжает строить октодерево, решая, лежит вершина и соответствующий ей воксель внутри объекта, вне объекта или на его границе. Для 2D домика такая классификация выглядела бы следующим образом:

Здесь
красный контур - истинный объект дома
белые пиксели - пиксели вне объекта
чёрные пиксели - пиксели на границе объекта
синие пиксели - пиксели внутри объекта
Если модель решает, что воксель лежит на границе объекта, производим дальнейшее построение дерева из данной ноды на 8 дочерних и получаем новое более детализированное разбиение. Для него повторяем всё снова, пока, либо не получим отсутствие предсказанных граничных вокселей, либо не пройдём все 5 уровней детализации. Почему 5? Просто авторы посчитали, что подобной детализации будет достаточно, да и по всей видимости улучшение было бы не сильно значимым в сравнении с увеличением потребляемых ресурсов.
В конечном счёте генерируется воксельная 3D-модель с детализацией в вокселей:


Стоит отметить, что блок признаков F формируется при помощи конволюций, которые также захватывают соседние блоки. С учётом этого мы получаем более сглаженную 3D-модель, поскольку воксели по-одиночке перестают в большой степени влиять на конечный результат:

Таким образом, HSP - это end-to-end подход, который, используя датасет ShapeNet с полигональными 3D-моделями различных классов объектов, учится по одной фотографии объекта строить его детализированную воксельную модель.
На обучении входные изображения получаются после рендеринга объекта из ShapeNet с разных ракурсов. Ну а дальше, имея на руках реальную модель, с которой рендерилось изображение, не представляет труда запустить процесс обучения при помощи базового оптимизатора.
Технические детали и прочие нюансы реализации данного метода можете прочитать в двух оригинальных статьях:
https://shubhtuls.github.io/papers/pami19hsp.pdf
https://arxiv.org/pdf/1704.00710.pdf
К сожалению, в интернете об HSP, за исключением упомянутых статей, дополнительных материалов особо не найти. Однако, мы для вас постарались исправить это неудобство нашим собственным разбором
