Capítulo 9 — Backends de SfM


O seletor de Camera Alignment fica na seção „Cameras & Capture" do Inspector e é um menu suspenso, não um Segmented-Control (os nomes dos backends são longos demais para segmentos e estourariam a coluna estreita do Inspector). Quantas entradas ele tem depende do build: a versão da App Store mostra exatamente duas — Apple Photogrammetry (padrão) e Native. COLMAP não existe ali como backend de forma alguma e só aparece em builds de Developer/DMG como terceira entrada (veja Q2). A entrada nativa se chama simplesmente „Native"; o antigo adendo „(experimental)" ou „(Beta)" foi removido — Native não é mais um caminho experimental, e sim o caminho de qualidade. Ele é forte em cenas de órbita e fotos rentes ao solo, mas atualmente fraco em mapeamento aéreo/drone (nuvem de pontos rala demais); Apple Photogrammetry continua sendo a opção padrão segura. Se for escolhido um conjunto de fotos desordenado como tipo de captura, o app sempre alinha com Native, não importa o que o seletor mostre — uma linha de aviso abaixo do seletor diz isso explicitamente, e o seletor continua operável, porque seu valor não está indisponível, apenas foi sobreposto. Resultados externos de SfM do Metashape, COLMAP ou outro software de fotogrametria também podem ser importados pelo menu File (Q3 formato de texto COLMAP, Q6 importação de workspace) — o seletor não muda, mas as poses importadas substituem o resultado do SfM. Essa importação não tem nada a ver com a questão do backend COLMAP e funciona em qualquer build.
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 da câmera em um sistema de coordenadas 3D comum. Para isso, é gerada uma nuvem de pontos 3D grosseira, que inicializa o treinamento com Gaussian Splatting. O resultado do SfM é a entrada para o treinamento propriamente dito e determina em grande parte a qualidade de imagem posterior.
RadianceKit oferece cinco caminhos de SfM: dois backends embutidos no app (Q1 Apple Photogrammetry, Q4/Q5 Native), dois caminhos de importação de ferramentas externas (Q3 formato de texto COLMAP, Q6 importação binária de workspace) e ainda Q2 COLMAP-Binary, disponível apenas em builds de Developer fora da App Store. Qual é o caminho certo depende do tipo de cena (órbita ao redor de um objeto, ambiente interno, voo de drone) e de se um software externo já fornece uma reconstrução.
Q1 — Apple Photogrammetry
ONDE
Expert View → Inspector → seção „Cameras & Capture" → seletor de Camera Alignment, entrada „Apple Photogrammetry". Padrão em qualquer build.
TÉCNICO
Encapsula o framework embutido Photogrammetry da Apple, originalmente desenvolvido para Object Capture. Internamente, a Apple extrai features com um pipeline proprietário (as etapas não são documentadas publicamente), verifica-as por meio de multi-view matching e resolve o 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 fornece apenas poses de câmera mais uma nuvem de pontos grosseira — 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. Com mais de ~500 quadros em voos de drone lineares ou cenas externas grandes, observou-se de forma reproduzível travamentos ou descarte silencioso de câmeras individuais.
Q3 — Formato de 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 da exportação binária do COLMAP, só que em ASCII em vez de binário. É produzida nesse mesmo layout pelo Agisoft Metashape, RealityCapture, PolyCam e pelo benchmark ETH3D. O parser compartilha a detecção de modelo de câmera com o parser binário e reconhece os onze modelos de câmera padrão do COLMAP — de SIMPLE_PINHOLE e PINHOLE até SIMPLE_RADIAL (o padrão do próprio COLMAP) e OPENCV, além das variantes fisheye. 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 → Inspector → seção „Cameras & Capture" → seletor de Camera Alignment, entrada „Native" (sem o antigo adendo „(experimental)"). Incremental é o modo padrão desse backend; para Native não há seleção de Mapper. A linha „Mapper" logo abaixo pertence exclusivamente ao COLMAP: em builds de Developer ela aparece visível, mas esmaecida enquanto Native estiver selecionado; na versão da App Store ela simplesmente não existe. As linhas realmente nativas — „FOV Override", „High-Quality" e „Native SfM Recipe" — não desaparecem mais em outros backends, mas permanecem esmaecidas e informam, em uma linha abaixo, o que você precisa mudar para liberá-las de novo. Você não pode alternar manualmente entre o método incremental e o global: o incremental é fixo por padrão, e o app só muda para o método global por conta própria (veja Q5).
TÉCNICO
Implementação própria acelerada por GPU de todo o pipeline de SfM: features FAST+BRIEF OU SuperPoint+LightGlue via CoreML (ativado pela chave „High-Quality"; já ativo por padrão em conjuntos de fotos desordenados), seguidos por matching Hamming-KNN, matriz fundamental via RANSAC, construção de tracks, seleção do par inicial, bootstrap de duas vistas (F→E mais DLT), mapper incremental guloso com registro via PnP e triangulação multi-view, e bundle adjustment final via Levenberg-Marquardt com redução de Schur, perda de Huber e jacobianos analíticos via resolução de Cholesky. Totalmente compatível com a App Store: sem binário externo, Sandbox=true. Com o detector de colapso embutido: ele classifica um resultado como degenerado se menos de 60% dos quadros de entrada foram registrados, se a taxa de pontos por câmera cai abaixo de 13 ou se a nuvem de pontos é quase plana. Isso não leva imediatamente à troca de método — o app primeiro repete a execução incremental (assume o primeiro resultado sem anomalias, ou o melhor entre as tentativas) e só então recorre ao mapper global (Q5) se mesmo a melhor tentativa continuar degenerada. Empiricamente limpo em cenas de órbita/turntable; em movimentos mais gerais (voo de drone, ambientes internos com geometria complexa), a taxa de sucesso é menor — mas o detector cobre esses casos. Escala com confiabilidade até ~200 câmeras, e além disso com tempo de execução bem mais longo.
Q5 — SfM nativo (global)
ONDE
É chamado automaticamente quando o mapper incremental (Q4) aciona o detector de colapso (menos de 60% dos quadros de entrada registrados, taxa de pontos por câmera abaixo de 13 ou nuvem de pontos quase plana) — e somente depois que a execução incremental foi repetida e mesmo a melhor tentativa permaneceu degenerada. Não pode ser solicitado manualmente: não há seletor no Inspector para isso, nem qualquer outra chave — 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 de coordenadas do mundo) e translation averaging (baseado em LSQR, sobre uma formulação esparsa livre de matriz, para evitar overflow de inteiro em grandes quantidades de câmeras). Escala, em princípio, até ~5.000 câmeras; na prática, a qualidade cai sensivelmente acima de algumas centenas de câmeras. É tratado como „camada de fallback": entra em ação quando o mapper incremental também degenera após a repetição, e não é ele mesmo submetido de novo ao detector de colapso — se seu resultado permanecer raro, entra em cena o aviso geral de qualidade do pipeline.
Q6 — Importação de workspace Metashape / texto COLMAP
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 selecionada por arrastar-e-soltar ou pelo painel Open corresponde a um dos três layouts de workspace do COLMAP (sparse/0/, sparse/, ou raiz) e se a reconstrução está em formato binário (cameras.bin) ou texto (cameras.txt). O caminho binário usa o parser binário do COLMAP, o caminho de texto usa o loader ETH3D — ambos produzem o mesmo modelo de resultado de SfM, e o resto do pipeline (importar imagens, iniciar o treinamento MCMC) é agnóstico quanto à origem. As imagens são abertas via o sistema de bookmarks security-scoped do sandbox do app, de modo que a importação também funciona na versão da App Store. Pensado especialmente para o caso „exportação do 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.
Q7 — Receitas nativas (Standard / Professional / E3 High-Accuracy)
ONDE
Expert View → Inspector → seção „Cameras & Capture" → linha „Native SfM Recipe". A linha só é operável quando „Native" está selecionado como Camera Alignment e um conjunto de fotos desordenado está definido como tipo de captura — caso contrário fica esmaecida e indica, logo abaixo, o que precisa ser ajustado (as regras de disponibilidade estão no Capítulo 2).
TÉCNICO
Três níveis do mesmo backend nativo. Eles não mudam o algoritmo, mas o quão minuciosamente ele trabalha:
Standard — a receita básica, sem etapas adicionais.
Professional — adiciona duas coisas: marcadores AprilTag detectados entram como corpos rígidos no mapping e no bundle adjustment, e as poses finalizadas passam por uma retriangulação densa (nuvem de pontos inicial mais densa). Se a captura não contiver marcadores, o detector não encontra nada e apenas a retriangulação densa permanece em efeito.
E3 High-Accuracy — constrói sobre Professional e ativa adicionalmente o frontend HQ (tiling SuperPoint 3×3, LightGlue com 4096 keypoints, pares de covisibilidade), além do refinamento conjunto de distância focal em todas as câmeras. Isso resulta nas poses de câmera mais nítidas e no tempo de matching mais longo.
Qual backend usar em cada situação?
| Cenário | Backend recomendado |
|---|---|
| Primeiro resultado, sem pensar muito | Q1 Apple Photogrammetry (padrão) |
| Escaneamento de objeto, 50–200 fotos | Q1 Apple Photogrammetry |
| Qualidade máxima na mesma cena | Preset „Maximum Quality (Native)" — Q4 Native + receita Q7 E3 |
| Captura com marcadores AprilTag impressos | Q4 Native + receita Q7 Professional |
| Grande área externa / drone / >500 imagens | Q6 Importação de Workspace (calcular no Metashape ou COLMAP e depois importar) |
| Já existe exportação do Metashape/RealityCapture | Q6 Importação (não é necessário SfM) |
| ETH3D / conjunto acadêmico em texto COLMAP | Importação de texto Q3 COLMAP |
| Q4 colapsa | Q5 Native global (alterna automaticamente) |
Comparação Rápida
| Backend | App-Store | Sandbox | Binário Externo | Melhor Uso | Máx ~Câms |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Orbit-Object | ~300 |
| Q2 COLMAP Binary | ❌ (apenas Developer-Build) | — | 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 | ✅ | ✅ | — | Reaproveitamento do Metashape | por fonte |