Несколько лет назад генерация 3D-сетки из единственного двумерного изображения была сложной задачей. Но сегодня благодаря продвижению глубокого обучения разработано множество монокулярных моделей оценки глубины, дающих точную оценку карты глубины изображения. С помощью этой карты, выполнив реконструкцию поверхности, можно создать сетку. Подробности — к старту нашего курса по Fullstack-разработке на Python. Монокулярная оценка глубины — это задача оценки значения глубины (расстояния относительно камеры) каждого пикселя для одного (монокулярного) изображения RGB. Результат такой оценки — карта глубины, которая в основном представляет собой матрицу, где каждый элемент соответствует спрогнозированной глубине соответствующего пикселя входного изображения: 
Карта глубины Точки на карте глубины можно рассматривать как множество точек с координатами по трём осям. Карта — это матрица, а значит, каждый её элемент имеет компоненты x, y (столбец и строка соответственно), а z — значение спрогнозированной глубины в точке (x, y). Список точек (x, y, z) в области обработки трёхмерных данных называется облаком точек. 
Облако точек. Оригинальный файл Open3D Можно начать с неструктурированного облака точек и получить сетку, то есть трёхмерное представление объекта из множества вершин и многоугольников [полигонов]. Самый распространённый тип сетки — треугольная сетка, состоящая из множества соединённых общими рёбрами или вершинами трёхмерных треугольников. В литературе вы найдёте несколько методов получения треугольной сетки из облака точек; самые популярные — альфа-форма¹, шаровое вращение² и реконструкция поверхности Пуассона³. Эти методы называют алгоритмами реконструкции поверхности. 
Треугольная сетка. Оригинальный файл Open3d Процедура создания сетки из изображения в этом руководстве состоит из трёх этапов: Чтобы выполнить эту процедуру, вам понадобится изображение. Если его нет под рукой, скачайте его здесь: 
Спальня. Изображение из NYU-Depth V2 Выбранная для этого руководства модель монокулярной оценки глубины — GLPN⁴. Получить её можно в Hugging Face Model Hub с помощью библиотеки Transformers от Hugging Face. Для этого установите последнюю версию Transformers из PyPI: Приведённый ниже код оценивает глубину входного изображения: Для работы с GLPN библиотека Transformers предоставляет два класса: GLPNFeatureExtractor — для предварительной обработки входных данных, и класс модели — GLPNForDepthEstimation. Из-за архитектуры выходной размер модели составляет: 
Выходной размер. Изображение сгенерировано с помощью CodeCogs Таким образом, размер image изменяется так, чтобы высота и ширина были кратны 32, а иначе выходные данные модели окажутся меньше входных. Это необходимо, поскольку облако точек будет прорисовано с использованием пикселей изображения, для чего входное изображение и выходная карта глубины должны обладать одинаковым размером. Монокулярные модели оценки глубины пытаются получить прогнозы высокого качества вблизи границ, поэтому выходные данные (output) обрезаются по центру (строка 33). Чтобы сохранить одинаковые размеры, также обрезается по центру image (строка 34). Вот некоторые прогнозы: 
Прогноз глубины спальни. На входе изображение из NYU-Depth V2 
Прогноз глубины игровой комнаты. На входе изображение из NYU-Depth V2 
Прогноз глубины офиса. На входе изображение из NYU-Depth V2 В части 3D-обработки будет использоваться Open3d⁵. Наверное, это лучшая библиотека Python для задач такого рода. Установите последнюю версию Open3d из PyPI: Код ниже преобразует предполагаемую карту глубины в объект облака точек Open3D: Изображение RGBD — это просто комбинация RGB-изображения и соответствующего изображения глубины. Класс PinholeCameraIntrinsic хранит так называемую внутреннюю матрицу камеры. С этой матрицей Open3D может создать облако точек из изображения RGBD с правильным расстоянием между точками. Внутренние параметры оставьте как есть. Дополнительные сведения смотрите в дополнительных ресурсах в конце руководства. Для визуализации выполните эту строку: Среди различных методов для этой задачи, которые вы найдёте в литературе, здесь используется алгоритм реконструкции поверхности Пуассона³: он обычно даёт результаты лучше и мягче других. С помощью алгоритма из полученного на последнем шаге облака точек Пуассона этот код генерирует сетку: Сначала код удаляет выбросы из облака точек. Облако может содержать шум и артефакты по разным причинам. В этом сценарии модель могла бы предсказать некоторые глубины, которые слишком сильно различаются с соседними глубинами. Следующий шаг — оценка нормали. Нормаль — это вектор (естественным образом обладающий величиной и направлением), перпендикулярный поверхности или объекту, и для обработки алгоритмом Пуассона их необходимо оценить. Дополнительные сведения об этих векторах смотрите в дополнительных ресурсах в конце руководства. Наконец, алгоритм выполняется. Уровень детализации сетки определяется значением depth. Помимо повышения качества сетки более высокое значение глубины увеличивает размеры вывода. Для визуализации сетки советую скачать MeshLab, потому что есть программы 3D-визуализации только в ч/б. Вот окончательный результат: 
Сгенерированная сетка 
Сетка с другого ракурса Поскольку окончательный результат изменяется в зависимости от значения depth, это сравнение его различных значений: 
Сравнение различных значений глубины Алгоритм с depth=5 привёл к сетке в 375 КБ, depth=6 — к 1,2 МБ, depth=7 — к 5 МБ, depth=8 — к 19 МБ, depth=9 — к 70, а depth=10 — к 86 МБ. Несмотря на использование одного изображения, итог достаточно хороший. Подправив 3D, можно достичь результатов ещё лучше. Это руководство не может полностью охватить все детали обработки 3D-данных, а потому я советую вам прочитать другие ресурсы (они перечислены ниже), чтобы лучше разобраться со всеми аспектами. Дополнительные ресурсы: Спасибо, что прочитали. Надеюсь, вы нашли материал полезным. [1] H. Edelsbrunner, and E. P. Mücke, Three-dimensional Alpha Shapes (1994) [2] F. Bernardini, J. Mittleman, H. Rushmeier, C. Silva, and G. Taubin, [The ball-pivoting algorithm for surface reconstruction](http://The ball-pivoting algorithm for surface reconstruction) (1999) [3] M. Kazhdan, M. Bolitho and H. Hoppe, Poisson Surface Reconstruction (2006) [4] D. Kim, W. Ga, P. Ahn, D. Joo, S. Chun, and J. Kim, Global-Local Path Networks for Monocular Depth Estimation with Vertical CutDepth (2022) [5] Q. Zhou, J. Park, and V. Koltun, Open3D: A Modern Library for 3D Data Processing (2018) [6] N. Silberman, D. Hoiem, P. Kohli, and Rob Fergus, Indoor Segmentation and Support Inference from RGBD Images (2012) А мы научим работать с Python, чтобы вы прокачали карьеру или стали востребованным IT-специалистом:  Чтобы посмотреть все курсы, кликните по баннеру:   Data Science и Machine Learning  Python, веб-разработка  Мобильная разработка  Java и C#  От основ — в глубину  А также