Компьютерное зрение

3D Reconstruction

В 2021 году Mars Perseverance Rover создал 3D-карту кратера Езеро из стереопары камер, используя те же принципы, что применяются в iPhone Face ID. Цена ошибки на Марсе - застрявший марсоход ценой 2.7 млрд USD. Как фотографии превращаются в трёхмерную модель, достаточно надёжную для автономной навигации?

  • **Apple Face ID** использует инфракрасный структурированный свет (30 000 точек) для 3D-реконструкции лица с точностью менее 1 мм
  • **Tesla FSD** строит 3D-модель дороги из 8 монокамер через stero-matching и монокулярную оценку глубины в реальном времени
  • **Matterport 3D** сканирует интерьеры в фотореалистичные 3D-туры для недвижимости - технология используется в 10 млн объектов

От фотограмметрии к SfM и SLAM

Восстановление 3D из снимков началось задолго до компьютеров: фотограмметрия измеряла рельеф по аэрофотоснимкам ещё в начале XX века. С появлением CV эти идеи формализовались в structure from motion (SfM) и multi-view stereo - алгоритмах, восстанавливающих геометрию сцены и положения камер из набора кадров. В 2003 году Andrew Davison представил MonoSLAM - первую систему, строившую карту и одновременно отслеживавшую положение одной камеры в реальном времени. В 2015 году ORB-SLAM сделал такой подход точным и доступным, и сегодня SLAM лежит в основе AR, робототехники и автономной навигации.

Предварительные знания

  • Модель камеры и формирование изображения
  • Ключевые точки и сопоставление признаков
  • Линейная алгебра: матрицы и проекции
  • Цифровое изображение: пиксели и цвет
  • Признаки: SIFT, SURF, ORB

Стереозрение

Закройте левый глаз, затем правый - ближние объекты заметно смещаются. Это **диспаратность**: разница в пиксельных координатах одной точки сцены между двумя камерами. Чем ближе объект, тем больше диспаратность. Мозг использует этот принцип для восприятия глубины; компьютерное стереозрение делает то же самое через алгоритм сопоставления пикселей между левым и правым изображением. Глубина вычисляется по формуле: depth = (f * B) / disparity, где f - фокусное расстояние, B - базис (расстояние между камерами).

Стереопипeline: (1) Ректификация - трансформация пары изображений так, чтобы эпиполярные линии были горизонтальны (упрощает поиск соответствий); (2) Matching - нахождение соответствующих пикселей (алгоритмы: SGBM, Semi-Global Matching, MC-CNN, PSMNet); (3) Диспаратность -> глубина через геометрику камеры; (4) Постобработка - фильтрация шума WLS filter, устранение окклюзий. Intel RealSense, Microsoft Azure Kinect используют ИК-стереопары для метрической глубины в реальном времени.

Почему при стереозрении более близкие объекты имеют большую диспаратность?

Depth Estimation

Стереозрение требует двух откалиброванных камер. Но смартфон снимает одной камерой - и Apple Depth Effect работает. **Монокулярная оценка глубины** извлекает глубину из одного изображения, используя обученные на миллиардах фото паттерны: перспективу, окклюзии, текстурные градиенты, известные размеры объектов. MiDaS и Depth Anything v2 (Meta, 2024) делают это за 50 мс на GPU, превзойдя стерео в сценах с однородными поверхностями.

Типы depth estimation: (1) Метрическая глубина - реальные метры (нужна стерео/LiDAR калибровка); (2) Относительная (affine-invariant) - правильные пропорции, но не абсолютные значения, как у MiDaS/Depth Anything. Архитектуры: DPT (Vision Transformer + Dense Prediction), Depth Anything v2 (ViT-L, 335M параметров, 142M изображений синтетических данных). Apple iPhone использует LiDAR сканер + монокулярную CNN для метрической глубины в ARKit.

В чём ключевое отличие аффинно-инвариантной глубины (MiDaS) от метрической?

Point Clouds

Карта глубины - это матрица чисел. Облако точек - это те же данные в 3D: каждый пиксель превращается в точку (X, Y, Z) в пространстве с опциональным цветом (R, G, B). LiDAR Tesla Model 3 генерирует 1.2 млн точек в секунду. SLAM-алгоритмы в роботах объединяют облака точек из последовательных кадров в 3D-карту окружения. PointNet (2017) доказал, что нейросети могут классифицировать 3D-объекты прямо из облаков точек без преобразования в воксели.

Операции с облаками точек: (1) Проекция (depth map -> point cloud): unproject каждого пикселя (u,v,d) через матрицу камеры K^(-1); (2) ICP (Iterative Closest Point) - выравнивание двух облаков точек; (3) Voxel grid downsampling - прореживание для ускорения обработки; (4) Normal estimation - вычисление нормалей поверхности для каждой точки через PCA соседей; (5) RANSAC - устойчивая оценка плоскостей и других примитивов. Open3D - основная библиотека для работы с облаками точек в Python.

Зачем при работе с облаками точек применяют voxel grid downsampling?

Mesh Reconstruction

Облако точек - это набор дискретных точек без поверхности. **Мешевая реконструкция** строит из них непрерывную поверхность из треугольников, которую можно рендерить, анимировать и печатать на 3D-принтере. Алгоритм Poisson Surface Reconstruction (Kazhdan, 2006) решает задачу нахождения функции, градиент которой наилучшим образом аппроксимирует нормали точек - глобально гладкое решение без артефактов соединения. NeRF и Gaussian Splatting (2023) предлагают альтернативу: имплицитные представления без явного меша.

Алгоритмы построения меша: (1) Poisson Surface Reconstruction - гладкая замкнутая поверхность, требует нормалей; (2) Ball Pivoting Algorithm (BPA) - строит меш «прокаткой шара», хорошо для плотных облаков; (3) Marching Cubes - воксельный подход, извлекает изоповерхность из скалярного поля; (4) Screened Poisson - улучшение Poisson, точнее на входных точках; (5) DeepSDF / OccNet - нейронные имплицитные поверхности. Формат PLY/OBJ для хранения; Three.js, Blender, Unity для визуализации.

Больше точек в облаке всегда даёт лучший меш

Качество меша зависит от равномерности распределения точек и точности нормалей, а не от их абсолютного количества

Избыточно плотное облако с шумом даст зашумлённый меш. Prerequisite для хорошего Poisson меша - статистически очищенное равномерное облако с правильно ориентированными нормалями.

Почему Poisson Surface Reconstruction требует нормалей точек в дополнение к координатам?

Ключевые идеи

  • **Стерео** извлекает глубину через диспаратность (смещение проекций точки в двух камерах) - формула depth = f*B/d геометрически точна при известных параметрах камеры
  • **Монокулярная оценка глубины** (MiDaS, Depth Anything v2) даёт аффинно-инвариантную глубину из одного кадра через паттерны, выученные на миллиардах изображений
  • **Облака точек** и **меши** - два представления 3D-поверхности: первое дискретное (быстро строить), второе непрерывное (для рендеринга, физики, печати)

Связанные темы

3D-реконструкция лежит в основе многих направлений современного CV:

  • NeRF и Neural Rendering — NeRF - альтернативный подход к 3D-реконструкции через имплицитное нейронное представление без явного облака точек или меша
  • Image Generation: Diffusion — Диффузионные модели применяются для генерации novel-view изображений из 3D-реконструкции (Zero-1-to-3, SyncDreamer)

Вопросы для размышления

  • Монокулярная оценка глубины работает за счёт паттернов из обучающих данных. Как это ограничивает надёжность метода в нестандартных сценах?
  • Poisson Surface Reconstruction строит замкнутую поверхность даже там, где нет точек. Когда это преимущество, а когда - проблема?
  • Облако точек от LiDAR имеет равномерное распределение по углу, но не по расстоянию (ближние объекты плотнее). Как это влияет на качество меша?

Связанные уроки

  • cv-13 — NeRF это нейронная альтернатива классической 3D-реконструкции
  • cv-03 — Сопоставление фич вроде SIFT двигает structure-from-motion
  • la-15-svd — SVD решает триангуляцию и оценку позы камеры
  • calc-19-gradient — Bundle adjustment это градиентная минимизация репроекции
  • rob-07 — SLAM в робототехнике строит 3D-карты по движению камеры
  • la-06-transformations
3D Reconstruction

0

1

Войти