Компьютерное зрение
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, робототехники и автономной навигации.
Предварительные знания
- Модель камеры и формирование изображения
- Ключевые точки и сопоставление признаков
- Линейная алгебра: матрицы и проекции
Стереозрение
Закройте левый глаз, затем правый - ближние объекты заметно смещаются. Это **диспаратность**: разница в пиксельных координатах одной точки сцены между двумя камерами. Чем ближе объект, тем больше диспаратность. Мозг использует этот принцип для восприятия глубины; компьютерное стереозрение делает то же самое через алгоритм сопоставления пикселей между левым и правым изображением. Глубина вычисляется по формуле: 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