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


Пикер Camera Alignment находится в разделе инспектора „Cameras & Capture" и представляет собой раскрывающееся меню, а не Segmented Control (названия бэкендов слишком длинные для сегментов и разорвали бы узкую колонку инспектора). Количество пунктов зависит от сборки: версия App Store показывает ровно два — Apple Photogrammetry (по умолчанию) и Native. COLMAP отсутствует там как бэкенд полностью и появляется только в Developer-/DMG-сборках как третий пункт (см. Q2). Пункт для нативного метода называется просто „Native"; прежняя пометка „(experimental)" или „(Beta)" убрана — Native больше не путь для проб, а путь к качеству. Он силён в наземных орбитальных и фотосъёмочных сценах, но пока слаб в воздушном картографировании с дронов (слишком разреженное облако точек); Apple Photogrammetry остаётся надёжной настройкой по умолчанию. Если в качестве типа съёмки выбран неупорядоченный набор фотографий, приложение всегда выравнивает через Native, независимо от того, что показывает пикер — строка подсказки под пикером сообщает об этом явно, и пикер остаётся доступным для взаимодействия, потому что его значение не недоступно, а лишь переопределено. Внешние результаты SfM из Metashape, COLMAP или другого фотограмметрического ПО можно дополнительно импортировать через меню File (Q3 текстовый формат COLMAP, Q6 импорт Workspace) — пикер при этом не переключается, но импортированные позы заменяют результат SfM. Этот импорт не имеет отношения к вопросу о бэкенде COLMAP и работает в любой сборке.
SfM означает Structure from Motion. Из набора перекрывающихся фотографий программа восстанавливает для каждого снимка положение и направление взгляда камеры в общей 3D-системе координат. Для этого создаётся грубое облако 3D-точек, которое инициализирует обучение с помощью Gaussian Splatting. Результат SfM — это входные данные для собственно обучения, и он в значительной мере определяет последующее качество изображения.
RadianceKit предлагает пять путей SfM: два встроенных в приложение бэкенда (Q1 Apple Photogrammetry, Q4/Q5 Native), два пути импорта из внешних инструментов (Q3 текстовый формат COLMAP, Q6 бинарный импорт Workspace), а также Q2 COLMAP-Binary, доступный только в Developer-сборках вне App Store. Какой из них правильный, зависит от типа сцены (орбита вокруг объекта, интерьер, полёт дрона) и от того, поставляет ли внешнее ПО уже готовую реконструкцию.
Q1 — Apple Photogrammetry
ГДЕ
Expert View → Inspector → раздел „Cameras & Capture" → пикер Camera Alignment, пункт „Apple Photogrammetry". Настройка по умолчанию в каждой сборке.
ТЕХНИЧЕСКИ
Оборачивает встроенный фреймворк Apple Photogrammetry, изначально разработанный для Object Capture. Apple внутренне извлекает признаки по проприетарному конвейеру (шаги не задокументированы публично), верифицирует их через сопоставление нескольких видов и решает Bundle-Adjustment на Neural Engine + GPU Apple Silicon. Бэкенд полностью соответствует требованиям App Store (нет внешней бинарной программы, Sandbox=true, на устройстве), но выдаёт только позы камер плюс грубое облако точек — без диагностических метрик вроде длины треков или ошибки репроекции. Масштабируется, по рекомендации 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 именно в этой раскладке. Парсер использует то же распознавание моделей камер, что и бинарный парсер, и знает все одиннадцать стандартных моделей камер COLMAP — от SIMPLE_PINHOLE и PINHOLE через SIMPLE_RADIAL (собственная настройка COLMAP по умолчанию) и OPENCV до вариантов «рыбий глаз». Устойчив к строкам-комментариям и пустым строкам. В тестах масштабируется до ~1 400 камер (ETH3D Tunnel) без проблем.
Q4 — Native SfM (инкрементальный)
ГДЕ
Expert View → Inspector → раздел „Cameras & Capture" → пикер Camera Alignment, пункт „Native" (без прежней пометки „(experimental)"). Инкрементальный режим является режимом по умолчанию для этого бэкенда; для Native выбора Mapper нет. Строка „Mapper" под ним относится исключительно к COLMAP: в Developer-сборках она видна, но затемнена, пока выбран Native, а в версии App Store отсутствует полностью. По-настоящему нативные строки — „FOV Override", „High-Quality" и „Native SfM Recipe" — при других бэкендах больше не исчезают, а остаются затемнёнными и сообщают в строке под собой, что нужно переключить, чтобы их снова разблокировать. Между инкрементальным и глобальным методом самостоятельно переключаться нельзя: инкрементальный жёстко задан по умолчанию, а на глобальный метод приложение переходит только само по себе (см. Q5).
ТЕХНИЧЕСКИ
Собственная GPU-ускоренная реализация всего конвейера SfM: признаки FAST+BRIEF ИЛИ SuperPoint+LightGlue через CoreML (включается переключателем „High-Quality"; при неупорядоченных фотонаборах активно в любом случае), за которым следуют сопоставление Hamming-KNN, фундаментальная матрица RANSAC, построение треков, выбор начальной пары, Two-View-Bootstrap (F→E плюс DLT), жадный инкрементальный Mapper с регистрацией PnP и триангуляцией по нескольким видам, и финальный Bundle-Adjustment через Levenberg-Marquardt со схур-редукцией с Huber-функцией потерь и аналитическими якобианами через решение Холецкого. Полностью соответствует требованиям App Store: нет внешней бинарной программы, Sandbox=true. Со встроенным детектором коллапса: он классифицирует результат как вырожденный, если менее 60 % входных кадров зарегистрировано, если частота точек на камеру падает ниже 13 или если облако точек почти плоское. За этим не следует немедленное переключение метода — приложение сначала повторяет инкрементальный прогон (оно принимает первый безупречный результат, иначе лучший из попыток) и переходит на глобальный Mapper (Q5) лишь тогда, когда даже лучшая попытка остаётся вырожденной. Эмпирически чисто работает на сценах орбиты/поворотного стола; на более общих движениях (полёт дрона, интерьеры со сложной геометрией) успешность ниже — но детектор эти случаи отлавливает. Надёжно масштабируется до ~200 камер, выше — со значительно большим временем работы.
Q5 — Native SfM (глобальный)
ГДЕ
Вызывается автоматически, когда инкрементальный Mapper (Q4) срабатывает детектором коллапса (менее 60 % входных кадров зарегистрировано, частота точек на камеру ниже 13 или почти плоское облако точек) — причём только после того, как инкрементальный прогон был повторён и даже лучшая попытка осталась вырожденной. Вручную запросить его нельзя: в инспекторе для этого нет пикера и вообще нет переключателя — приложение само решает, когда переключиться.
ТЕХНИЧЕСКИ
Глобальный вариант нативного конвейера. Сначала извлечение признаков + сопоставление, как в Q4, затем оценка относительной позы для всех верифицированных пар, далее усреднение вращений (синхронизирует все повороты камер в мировой системе координат) и усреднение переносов (на основе LSQR с матрично-свободной разреженной формулировкой, чтобы избежать переполнения целых чисел при больших наборах камер). Масштабируется до ~5 000 камер в принципе, на практике качество заметно снижается выше нескольких сотен камер. Обрабатывается как „уровень отката": применяется, когда инкрементальный Mapper вырождается даже после повторения, и сам повторно детектору коллапса не подвергается — если его результат остаётся разреженным, вместо этого срабатывает общее предупреждение о качестве конвейера.
Q6 — Импорт Workspace Metashape / COLMAP-текст
ГДЕ
Меню File → „Import COLMAP / Metashape Workspace…" (Cmd+⇧+I). Перетаскивание папки с sparse/0/cameras.{bin,txt} и images/.
ТЕХНИЧЕСКИ
Автоматически распознаёт, соответствует ли папка, выбранная перетаскиванием или через панель открытия, одной из трёх раскладок Workspace COLMAP (sparse/0/, sparse/ или корень) и представлена ли реконструкция в бинарном виде (cameras.bin) или текстовом (cameras.txt). Бинарный путь использует бинарный парсер COLMAP, текстовый путь — загрузчик ETH3D — оба производят одну и ту же модель результата SfM, а остальная часть конвейера (импорт изображений, запуск обучения MCMC) агностична к источнику. Изображения открываются через систему security-scoped закладок песочницы приложения, поэтому импорт работает и в версии App Store. Специально предназначен для случая «экспорт из Metashape без пересчёта реконструкции». Упомянутое в пункте меню File распознавание предупреждает в журнале приложения, если выбранная папка не является распознаваемым Workspace.
Q7 — Рецепты Native (Standard / Professional / E3 High-Accuracy)
ГДЕ
Expert View → Inspector → раздел „Cameras & Capture" → строка „Native SfM Recipe". Строка доступна для взаимодействия, только если в качестве Camera Alignment выбран „Native" и в качестве типа съёмки задан неупорядоченный набор фотографий — иначе она стоит затемнённой и указывает под собой, что нужно изменить (правила доступности описаны в Главе 2).
ТЕХНИЧЕСКИ
Три ступени одного и того же нативного бэкенда. Они меняют не алгоритм, а то, насколько тщательно он работает:
Standard — базовый рецепт без дополнительных ступеней.
Professional — дополнительно задействует две вещи: распознанные маркеры AprilTag входят как жёсткие тела в Mapping и Bundle-Adjustment, а на готовых позах выполняется плотная дотриангуляция (более плотное начальное облако точек). Если съёмка не содержит маркеров, детектор ничего не находит, и действует только плотная ре-триангуляция.
E3 High-Accuracy — строится на основе Professional и дополнительно подключает HQ-фронтенд (разбиение SuperPoint 3×3, LightGlue с 4096 ключевыми точками, пары Covisibility), а также совместное уточнение фокусного расстояния по всем камерам. Это даёт самые резкие позы камер и самое долгое время сопоставления.
Какой бэкенд когда использовать?
| Сценарий | Рекомендуемый бэкенд |
|---|---|
| Первый результат, не раздумывая | Q1 Apple Photogrammetry (по умолчанию) |
| Сканирование объекта, 50–200 фото | Q1 Apple Photogrammetry |
| Максимальное качество на той же сцене | Пресет „Maximum Quality (Native)" — Q4 Native + рецепт Q7 E3 |
| Съёмка с распечатанными маркерами AprilTag | Q4 Native + рецепт Q7 Professional |
| Большой открытый объект / дрон / >500 снимков | Импорт Q6 Workspace (посчитать в Metashape или COLMAP, затем загрузить) |
| Есть экспорт из Metashape/RealityCapture | Импорт Q6 (SfM не нужен) |
| ETH3D / академический набор COLMAP-Text | Импорт Q3 COLMAP-Text |
| Q4 сворачивается | Q5 Native global (переключается автоматически) |
Быстрое сравнение
| Backend | App Store | Sandbox | Внешний бинарник | Best Use | Макс. ~камер |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Orbit-Object | ~300 |
| Q2 COLMAP Binary | ❌ (только Developer-сборка) | — | colmap/glomap | Outdoor large | ~5 000 |
| Q3 COLMAP-Text-Import | ✅ | ✅ | — | Bench rigs | ~1 500 |
| Q4 Native incremental | ✅ | ✅ | — | Orbit-Object | ~200 |
| Q5 Native global | ✅ | ✅ | — | Q4-Fallback | ~5 000 |
| Q6 Workspace-Import | ✅ | ✅ | — | Metashape-Reuse | на источник |