Capítulo 9 — Backends de SfM


O seletor Camera Alignment no Inspetor é um segmented control com duas opções — Apple Photogrammetry (padrão para builds da App Store, totalmente compatível com sandbox) e Native (Beta) (o backend de pipeline próprio do RadianceKit baseado em FAST+BRIEF+GLOMAP, desenvolvido nas Fases 3.8/3.9, stand 2026-05). Native (Beta) está validado apenas para orbit e é mais rápido com ≥1 000 frames que Apple Photogrammetry, mas ainda não atinge o gate de qualidade Phase-3-§5 (finalLoss ≤ 0.0115) — daí a tag Beta. Resultados externos de SfM do Metashape, COLMAP ou de outro software de fotogrametria podem ser importados adicionalmente pelo menu File (Q3 formato texto COLMAP, Q6 import de workspace) — o seletor não muda, mas as poses importadas substituem o resultado do SfM.
SfM significa Structure from Motion. A partir de um conjunto de fotos sobrepostas, o software reconstrói para cada imagem a posição e a direção de visão da câmera em um sistema de coordenadas 3D comum. Para isso é gerada uma nuvem grosseira de pontos 3D, que inicializa o treinamento por Gaussian Splatting. O resultado de SfM é a entrada do treinamento propriamente dito e determina decisivamente a qualidade de imagem posterior.
O RadianceKit oferece cinco caminhos de SfM: dois backends embutidos no app (Q1 Apple Photogrammetry, Q4/Q5 Native), dois caminhos de import de ferramentas externas (Q3 formato texto COLMAP, Q6 import binário de workspace) e ainda Q2 COLMAP-Binary, disponível apenas em builds de desenvolvimento fora da App Store. Qual é o certo depende do tipo de cena (orbit em torno de um objeto, ambiente interno, voo de drone) e se um software externo já entrega uma reconstrução.
Q1 — Apple Photogrammetry
ONDE
Expert View → Inspetor → Configuração de Treinamento → seletor Camera Alignment, entrada „Apple Photogrammetry".
TÉCNICO
Encapsula o framework Photogrammetry embutido da Apple, originalmente desenvolvido para Object Capture. A Apple extrai internamente features com um pipeline proprietário (os passos não são documentados publicamente), os verifica via multi-view matching e resolve bundle adjustment na Neural Engine + GPU do Apple Silicon. O backend é totalmente compatível com a App Store (sem binário externo, Sandbox=true, on-device), mas entrega apenas poses de câmera mais uma nuvem grosseira de pontos — sem métricas de diagnóstico como comprimento de track ou erro de reprojeção. Escala, segundo recomendação da Apple, até algumas centenas de imagens. Acima de ~500 frames em voos lineares de drone ou grandes cenas externas, foram observados de forma reprodutível travamentos ou descarte silencioso de câmeras individuais.
Q3 — Formato texto COLMAP (Metashape / ETH3D)
ONDE
Menu „File → Import COLMAP / Metashape Workspace…" (Cmd+⇧+I) OU arrastar e soltar uma pasta com sparse/0/cameras.txt.
TÉCNICO
Lê a exportação padronizada em texto do COLMAP — três arquivos de texto cameras.txt, images.txt, points3D.txt na subpasta sparse/0/ — e converte para o modelo interno de resultado de SfM. Mesma definição de formato que a exportação binária do COLMAP, só que em ASCII em vez de binário. É gerada por Agisoft Metashape, RealityCapture, PolyCam e pelo benchmark ETH3D exatamente nesse layout. O parser compartilha a detecção de modelo de câmera com o parser binário (todos os modelos usuais: SIMPLE_PINHOLE, PINHOLE, OPENCV, OPENCV_FISHEYE, FULL_OPENCV). Robusto a linhas de comentário e linhas vazias. Em testes escala até ~1 400 câmeras (ETH3D Tunnel) sem problemas.
Q4 — SfM Nativo (incremental)
ONDE
Expert View → Inspetor → Configuração de Treinamento → seletor Camera Alignment, entrada „Native (Beta)". Incremental é o modo padrão desse backend — não há seletor de mapper separado no Inspetor. Pela CLI, o modo pode ser definido explicitamente com –native-sfm ou –sfm-mapper incremental.
TÉCNICO
Implementação própria com aceleração de GPU de todo o pipeline de SfM: features FAST+BRIEF OU SuperPoint+LightGlue via CoreML (com –coreml-features), seguido de matching Hamming-KNN, RANSAC com matriz fundamental, track building, seleção de par inicial, two-view bootstrap (F→E mais DLT), mapper incremental greedy com registro PnP e triangulação multi-view e bundle adjustment final via Levenberg-Marquardt reduzido por Schur com loss de Huber e jacobianos analíticos via Cholesky solve. Totalmente compatível com a App Store: sem binário externo, Sandbox=true. Com o detector de R2-collapse entregue na Fase 3.10: se o app registra menos de 60 % dos frames de entrada ou se a taxa de pontos por câmera cai abaixo de 13, automaticamente se desvia para o mapper global (Q5). Empiricamente limpo em cenas orbit/turntable; em movimentos mais gerais (voo de drone, ambientes internos com geometria complexa) a taxa de sucesso é mais baixa — o detector pega esses casos. Escala até ~200 câmeras de forma confiável, mais com tempo de execução bem maior.
Q5 — SfM Nativo (global)
ONDE
É chamado automaticamente quando o mapper incremental (Q4) dispara o detector de collapse (menos de 60 % dos frames de entrada registrados ou taxa de pontos por câmera abaixo de 13). Forçável manualmente apenas via CLI –sfm-mapper global. No Inspetor, o método global não está acessível por nenhum seletor separado — o app decide sozinho quando trocar.
TÉCNICO
Variante global do pipeline nativo. Primeiro extração de features + matching como em Q4, depois estimativa de pose relativa para todos os pares verificados, em seguida rotation averaging (sincroniza todas as rotações de câmera no sistema mundial) e translation averaging (baseado em LSQR sobre uma formulação esparsa sem matriz, para evitar overflow de inteiro em grandes conjuntos de câmeras). Em princípio escala para ~5 000 câmeras; na prática a qualidade degrada acima de algumas centenas de câmeras — a medição do gate de aceitação Phase-3.8-§5 em K-1351 deu finalLoss 0.07 em vez do objetivo 0.0115. É tratado como „tier fallback": entra em ação quando o mapper incremental degenera, mas não é ele próprio reavaliado em qualidade.
Q6 — Import de Workspace Metashape / COLMAP-Text (Fase Q7)
ONDE
Menu File → „Import COLMAP / Metashape Workspace…" (Cmd+⇧+I). Arrastar e soltar uma pasta com sparse/0/cameras.{bin,txt} e images/.
TÉCNICO
Detecta automaticamente se uma pasta escolhida por arrastar/soltar ou pelo open panel corresponde a um dos três layouts de workspace COLMAP (sparse/0/, sparse/ ou raiz) e se a reconstruction está em binário (cameras.bin) ou texto (cameras.txt). O caminho binário usa o parser binário COLMAP, o caminho texto usa o loader ETH3D — ambos produzem o mesmo modelo de resultado de SfM e o restante do pipeline (importar imagens, iniciar treinamento MCMC) é agnóstico em relação à origem. As imagens são abertas com security-scope via o sistema de bookmarks do sandbox do app, de modo que o import funciona também na versão da App Store. Pensado especificamente para o caso „exportação de Metashape sem recalcular a reconstrução". A detecção mencionada na entrada do menu File avisa no log do app caso a pasta escolhida não seja um workspace reconhecível.
Qual backend, quando?
| Cenário | Backend recomendado |
|---|---|
| Scan de objeto, 50–200 fotos | Q1 Apple Photogrammetry |
| Outdoor grande / drone / >500 imagens | Q6 import de workspace (calcular no Metashape ou COLMAP e depois carregar) |
| Já existe export do Metashape/RealityCapture | Q6 import (sem SfM necessário) |
| Conjunto acadêmico em texto COLMAP / ETH3D | Q3 import texto COLMAP |
| Estritamente compatível com App Store + cena orbit | Q4 Native incremental |
| Q4 falha | Q5 Native global (automático) |
| Dados de benchmark ETH3D | Q3 (autotest precomputed) |
Comparação rápida
| Backend | App Store | Sandbox | Binário externo | Melhor uso | Máx ~câmeras |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Objeto-orbit | ~300 |
| Q2 COLMAP Binary | ❌ (só build de dev) | — | colmap/glomap | Outdoor grande | ~5 000 |
| Q3 Import texto COLMAP | ✅ | ✅ | — | Bench rigs | ~1 500 |
| Q4 Native incremental | ✅ | ✅ | — | Objeto-orbit | ~200 |
| Q5 Native global | ✅ | ✅ | — | Fallback do Q4 | ~1 351 |
| Q6 Import de workspace | ✅ | ✅ | — | Reuso de Metashape | pela fonte |