Глава 9 — SfM-бэкенды


Переключатель Camera Alignment в Инспекторе — это сегментированный элемент управления с двумя вариантами — Apple Photogrammetry (значение по умолчанию для сборок App Store, полностью совместимо с песочницей) и Native (Beta) (собственный бэкенд RadianceKit на базе FAST+BRIEF+GLOMAP, разработанный в фазах 3.8/3.9, по состоянию на 2026-05). Native (Beta) проверен только на орбитальных съёмках и быстрее Apple Photogrammetry при ≥1 000 кадров, но пока не проходит порог качества фазы 3 §5 (finalLoss ≤ 0.0115) — отсюда и тег Beta. Внешние результаты SfM из Metashape, COLMAP или любого другого фотограмметрического ПО можно дополнительно импортировать через меню File (текстовый формат Q3 COLMAP, импорт рабочей области Q6) — сам переключатель при этом не меняется, но импортированные позы заменяют результат SfM.
SfM расшифровывается как Structure from Motion. Из набора перекрывающихся фотографий программа восстанавливает для каждого изображения положение и направление взгляда камеры в общей 3D-системе координат. Попутно создаётся грубое 3D-облако точек, которое инициализирует обучение Gaussian Splatting. Результат SfM является входом для собственно обучения и решающим образом определяет конечное качество изображения.
RadianceKit предлагает пять путей SfM: два бэкенда, встроенных в само приложение (Q1 Apple Photogrammetry, Q4/Q5 Native), два пути импорта из внешних инструментов (Q3 текстовый формат COLMAP, Q6 двоичный импорт Workspace), а также Q2 двоичный COLMAP, доступный только в сборках для разработчиков вне App Store. Какой из них подходит, зависит от типа сцены (орбита вокруг объекта, помещение, полёт дрона) и от того, предоставляет ли уже внешнее ПО готовую реконструкцию.
Q1 — Apple Photogrammetry
ГДЕ
Режим эксперта → Инспектор → Training Configuration → переключатель Camera Alignment, запись «Apple Photogrammetry».
ТЕХНИЧЕСКИ
Обёртка над встроенным фреймворком фотограмметрии Apple, изначально разработанным для Object Capture. Внутри Apple извлекает признаки своим проприетарным конвейером (этапы публично не документируются), проверяет их многоракурсным сопоставлением и решает bundle adjustment на Apple Silicon Neural Engine + GPU. Бэкенд полностью совместим с App Store (никакого внешнего бинарного файла, Sandbox=true, on-device), но выдаёт только позы камер плюс грубое облако точек — никаких диагностических метрик вроде длины треков или ошибки репроекции. Масштабируется согласно рекомендации Apple до нескольких сотен изображений. При количестве кадров более ~500 в линейных пролётах дронов или больших уличных сценах наблюдались воспроизводимые сбои или тихий пропуск отдельных камер.
Q3 — текстовый формат COLMAP (Metashape / ETH3D)
ГДЕ
Меню «File → Import COLMAP / Metashape Workspace…» (Cmd+⇧+I) ИЛИ перетаскивание папки с sparse/0/cameras.txt.
ТЕХНИЧЕСКИ
Читает стандартизированный текстовый экспорт COLMAP — три текстовых файла cameras.txt, images.txt, points3D.txt в подпапке sparse/0/ — и преобразует во внутреннюю модель результата SfM. То же определение формата, что и у двоичного экспорта COLMAP, только в ASCII вместо двоичного представления. Экспортируется Agisoft Metashape, RealityCapture, PolyCam и бенчмарком ETH3D ровно в этом виде. Парсер разделяет с двоичным парсером определение модели камеры (все распространённые модели: SIMPLE_PINHOLE, PINHOLE, OPENCV, OPENCV_FISHEYE, FULL_OPENCV). Устойчив к строкам-комментариям и пустым строкам. В тестах масштабируется до ~1 400 камер (ETH3D Tunnel) без проблем.
Q4 — Native SfM (инкрементальный)
ГДЕ
Режим эксперта → Инспектор → Training Configuration → переключатель Camera Alignment, запись «Native (Beta)». Инкрементальный — режим по умолчанию для этого бэкенда — отдельного переключателя маппера в Инспекторе нет. Через CLI режим можно задать явно ключом –native-sfm или –sfm-mapper incremental.
ТЕХНИЧЕСКИ
Собственная реализация всего конвейера SfM с ускорением на GPU: признаки FAST+BRIEF ИЛИ SuperPoint+LightGlue через CoreML (с –coreml-features), затем сопоставление Hamming-KNN, RANSAC фундаментальной матрицы, построение треков, выбор начальной пары, двухвидовый bootstrap (F→E плюс DLT), жадный инкрементальный маппер с регистрацией PnP и многоракурсной триангуляцией, и наконец bundle adjustment через Schur-редуцированный Levenberg-Marquardt с функцией потерь Хьюбера и аналитическими якобианами через Cholesky-solve. Полностью совместим с App Store: никакого внешнего бинарного файла, Sandbox=true. С детектором коллапса R2, поставляемым в фазе 3.10: если приложение регистрирует менее 60 % входных кадров или количество точек на камеру падает ниже 13, оно автоматически переключается на глобальный маппер (Q5). Эмпирически чист на сценах орбита/поворотный стол; при более общих движениях (полёт дрона, помещения со сложной геометрией) показатель успешности ниже — однако детектор такие случаи перехватывает. Надёжно масштабируется до ~200 камер, выше — со значительно бóльшим временем выполнения.
Q5 — Native SfM (глобальный)
ГДЕ
Вызывается автоматически, когда инкрементальный маппер (Q4) срабатывает детектором коллапса (зарегистрировано менее 60 % входных кадров или количество точек на камеру ниже 13). Принудительно вручную — только через CLI –sfm-mapper global. В Инспекторе глобальный метод недоступен через отдельный переключатель — приложение само решает, когда переключаться.
ТЕХНИЧЕСКИ
Глобальный вариант собственного конвейера. Сначала извлечение признаков + сопоставление как в Q4, затем оценка относительных поз для всех проверенных пар, после — усреднение поворотов (синхронизирует все повороты камер в мировой системе координат) и усреднение перемещений (на основе LSQR в matrix-free sparse-формулировке, чтобы избежать переполнения integer при большом числе камер). В принципе масштабируется до ~5 000 камер, на практике с потерей качества при числе свыше нескольких сотен камер — замер порога приёмки фазы 3.8 §5 на K-1351 дал finalLoss 0.07 вместо целевых 0.0115. Трактуется как «fallback-уровень»: вступает в действие, когда инкрементальный маппер вырождается, но сам по себе на качество повторно не проверяется.
Q6 — импорт рабочей области Metashape / текстового COLMAP (фаза Q7)
ГДЕ
Меню File → «Import COLMAP / Metashape Workspace…» (Cmd+⇧+I). Перетаскивание папки с sparse/0/cameras.{bin,txt} и images/.
ТЕХНИЧЕСКИ
Автоматически распознаёт, соответствует ли папка, выбранная перетаскиванием или через open-panel, одной из трёх схем размещения рабочей области COLMAP (sparse/0/, sparse/ или корень), и является ли реконструкция двоичной (cameras.bin) или текстовой (cameras.txt). Двоичный путь использует двоичный парсер COLMAP, текстовый — загрузчик ETH3D — оба порождают одну и ту же модель результата SfM, и остальной конвейер (импорт изображений, запуск тренировки MCMC) безразличен к источнику. Изображения открываются через систему bookmark песочницы приложения с security-scoped-доступом, так что импорт работает и в версии для App Store. Специально рассчитан на случай «экспорт из Metashape без перерасчёта реконструкции». Упомянутый в пункте меню File детектор предупреждает в журнале приложения, если выбранная папка не является распознаваемой рабочей областью.
Какой бэкенд когда?
| Сценарий | Рекомендуемый бэкенд |
|---|---|
| Скан объекта, 50–200 фотографий | Q1 Apple Photogrammetry |
| Крупная уличная съёмка / дрон / >500 изображений | Q6 Workspace Import (рассчитайте в Metashape или COLMAP, затем загрузите) |
| Имеется экспорт Metashape/RealityCapture | Q6 Import (SfM не нужен) |
| Набор ETH3D / академический текстовый COLMAP | Q3 текстовый импорт COLMAP |
| Строгая совместимость с App Store + орбитальная сцена | Q4 Native инкрементальный |
| Q4 не справляется | Q5 Native глобальный (автоматически) |
| Данные бенчмарка ETH3D | Q3 (autotest precomputed) |
Быстрое сравнение
| Бэкенд | App Store | Песочница | Внешний бинарный файл | Лучшее применение | Макс. ~камер |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Объект-орбита | ~300 |
| Q2 COLMAP двоичный | ❌ (только сборка для разработчиков) | — | colmap/glomap | Большие уличные | ~5 000 |
| Q3 текстовый импорт COLMAP | ✅ | ✅ | — | Бенч-наборы | ~1 500 |
| Q4 Native инкрементальный | ✅ | ✅ | — | Объект-орбита | ~200 |
| Q5 Native глобальный | ✅ | ✅ | — | Откат с Q4 | ~1 351 |
| Q6 Workspace Import | ✅ | ✅ | — | Повторное использование Metashape | по источнику |