AliceVision: fotogrametria da linha de comando

Você precisa automatizar um grande número de digitalizações fotogramétricas? Então eu tenho boas notícias para você.


O vídeo mostra o programa de fotogrametria de código aberto Meshroom . Este projeto existe de várias formas há algum tempo, mas recentemente os desenvolvedores lançaram arquivos binários, para que você possa simplesmente fazer o download e usá-los. O vídeo demonstra o uso da GUI para carregar imagens, processá-las, alterar parâmetros etc. Eu recomendo que você tente este programa em ação.

Mas estou interessado em automação total. Se você possui uma instalação de digitalização na qual realiza 100 ou mais verificações por dia, precisa de uma solução totalmente automatizada para o processamento em lote desses arquivos. Este post é um guia e / ou tutorial para resolver esse problema.

Para iniciantes, é importante entender que o Meshroom não é um projeto gigantesco e monolítico. De fato, o próprio processamento é realizado por programas C ++ separados, executados a partir da linha de comando, e o Meshroom é um programa de codificação Python fino que faz as chamadas apropriadas. Portanto, em vez de usar o Meshroom, usaremos esses programas diretamente. Observe que fontes completas estão disponíveis, para que você possa vincular bibliotecas diretamente.

O Meshroom possui outro recurso conveniente: durante cada operação, seu comando é exibido no terminal. Portanto, para criar as etapas desse processo, trabalhei com o Meshroom e olhei para as equipes. Então eu olhei no código para alterar alguns parâmetros. Além disso, ao iniciar o Meshroom, você pode solicitar que ele colete um conjunto de imagens na linha de comando, mas prefiro não conectar essas etapas.

Preparação e instalação


0: Requisitos

O Meshroom / AliceVision não será executado em todas as plataformas. O CUDA é necessário para algumas etapas; portanto, para criar mapas de profundidade, você precisará de uma GPU NVIDIA. Infelizmente, é impossível usar o fallback da CPU (transferindo a execução das funções da GPU para a CPU), caso contrário, o programa funcionaria perfeitamente no Windows e Linux. As instruções neste artigo são para Windows, mas com alterações mínimas, elas podem ser ajustadas para Linux.

1: Faça o download da versão do Meshroom

Meshroom 2018.1.0

A primeira coisa a fazer é instalar o Meshroom . Selecione a pasta da qual você deseja fazer o trabalho e faça o download da versão mais recente. O arquivo zip contém binários de todas as dependências.

Se você é atraído por aventuras, pode tentar montar o programa você mesmo. As bibliotecas de vínculo dinâmico de lançamento funcionam bem (/ MD), mas tive que invadir os arquivos cmake para criar compilações de depuração e / ou compilações estáticas de link. Se você criar o programa no Windows, EXTREMAMENTE recomende usar o VCPKG.

2: Baixar dados

alicevision / dataset_monstree

Obviamente, o objetivo principal do software de fotogrametria é processar suas próprias imagens, mas primeiro sugiro o uso de imagens que são garantidas como adequadas. Eles permitirão que você encontre as fontes de problemas se algo der errado. Felizmente, os desenvolvedores lançaram um conjunto de imagens para sua árvore de teste.

3: Faça o download do script run_alicevision.py

run_alicevision.zip

Este é o script que vamos usar. Basta baixar o arquivo zip e descompactá-lo na sua pasta de trabalho.

4: Instale o Python

https://www.python.org/download/releases/2.7/

Instale o Python se você ainda não o fez. Sim, ainda estou escrevendo código para o Python 2.7.0. A maneira mais fácil de instalar o Windows X86-64 MSI Installer a partir de versões.

5: Instale o Meshlab (opcional)

MeshLab

Como uma etapa opcional, você também deve instalar o MeshLab . De fato, não será necessário para o processamento, mas em vários estágios os dados são exibidos nos arquivos de ponto PLY. Eles não podem ser baixados no Maya , então eu uso o MeshLab para visualizá-los.

Após descompactar todos os arquivos, a pasta deve ficar assim (com exceção da pasta build_files , gerada pelos scripts):



Aqui está o seguinte:

  • build_files: os arquivos que compilamos.
  • dataset_monstree-master: imagens de origem
  • Meshroom-2018.1.0: Binários Meshroom / AliceVision .
  • Tudo o resto: scripts para executá-los, extraídos de run_alicevision.zip .

Iniciar o AliceVision


Agora é hora de dar uma olhada em run_alicevision.py

O arquivo Python recebe 5 argumentos:

python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>

  1. baseDir : a pasta na qual você deseja colocar arquivos temporários.
  2. imgDir : pasta que contém imagens de origem. No nosso caso, IMG_1024.JPG (e outros).
  3. binDir : uma pasta que contém os executáveis ​​do AliceVision , por exemplo, aliceVision_cameraInit.exe .
  4. numImages : o número de imagens no imgDir , no nosso caso 6. É claro que você pode reconhecer esse número automaticamente, mas o objetivo era criar o script python mais simples possível, portanto, você mesmo deve especificar esse número.
  5. runStep : a operação a ser executada.

Para resumir: começamos com 6 imagens parecidas com esta:


Usando o script python run_alicevision.py, criaremos a seguinte estrutura de pastas:


E na pasta 11_Texturing, haverá um modelo pronto que será aberto no Meshlab :


Cada uma dessas pastas é uma das etapas. Podemos executá-los alternadamente, usando os arquivos run_monstree_runXX.bat , ou use run_monstree_all.bat para coletá-los todos de uma vez.

Isso é tudo. Agora você pode executar o arquivo run_monstree_all.bat ou executar uma etapa de cada vez. Você pode olhar o script para entender seu trabalho. Para aqueles que desejam personalizar o pipeline de processamento, preparei uma introdução às etapas individuais.

00_CameraInit

A primeira etapa irá gerar um arquivo SFM. Arquivos SFM são arquivos JSON que armazenam o tamanho da câmera, informações do sensor, pontos 3d encontrados (observações), fatores de distorção e outras informações. O arquivo SFM inicial nesta pasta conterá apenas informações sobre o sensor e selecionará valores padrão no banco de dados de sensores locais. As etapas subseqüentes criarão arquivos SFM contendo toda a matriz de parâmetros, pontos, etc. externos da câmera

Pode ser necessário configurar esta etapa. Se você usar uma configuração com 4 câmeras, mas tirar 10 fotos de um objeto girando em uma plataforma giratória, precisará de um arquivo SFM com 40 imagens, mas com apenas 4 calibrações diferentes do sensor. Esta é a principal razão pela qual eu gosto da estrutura do AliceVision . É fácil configurar operações em lote (por exemplo, gerar seu próprio arquivo SFM) sem a necessidade de configurar outros elementos de software que devem ser mantidos intactos.

01_FeatureExtraction

A próxima etapa extrai os recursos característicos das imagens, bem como os descritores desses recursos. Isso mudará a extensão do arquivo, dependendo do tipo de recurso que está sendo extraído.

02_ImageMatching

02_ImageMatching é uma etapa de pós-processamento que determina qual das imagens é lógico mapear uma para a outra. Se você tiver um conjunto de 1000 imagens, para uma pesquisa aproximada de todas as 1000 imagens para corresponder a todas as 1000 imagens, você precisará de 1 milhão de pares. Isso pode levar muito tempo (na verdade, a metade, mas você entende o princípio). O estágio 02_ImageMatching corta esses pares.

03_FeatureMatching

03_FeatureMatching corresponde a imagens usando descritores de recursos. Os arquivos txt gerados não precisam ser explicados.

04_StructureFromMotion

Então, este é o primeiro estágio sério. Com base nas correspondências 04_StructureFromMotion , calcula as posições das câmeras, bem como os parâmetros internos das câmeras. Deve-se notar que o termo "Estrutura do movimento" é usado como um termo geral para calcular as posições da câmera. Se você tem uma configuração para fotogrametria de 10 câmeras sincronizadas, a opção "Estrutura do movimento" é usada para encaixá-las, mesmo que nada realmente se mova.

Por padrão, o Meshroom armazena todos os dados calculados como um arquivo Alembic , mas eu prefiro armazená-los em um arquivo SFM. Esse estágio cria dados intermediários para garantir que as câmeras estejam corretamente conectadas. Na saída, o script cria arquivos PLY que podem ser visualizados no Meshlab . Os seguintes arquivos são importantes:

  • bundle.sfm: arquivo SFM com todas as observações.
  • cameras.fm: um arquivo SFM com dados apenas para câmeras conectadas.
  • cloud_and_poses.ply: pontos e câmeras encontrados.


Aqui está o arquivo cloud_and_poses.ply . Pontos verdes são câmeras. Acredito que esse formato seja mais adequado para verificar a ausência de erros grosseiros na ligação de câmeras. Se ocorrer um erro em algum lugar, você poderá voltar e alterar os recursos, correspondências ou parâmetros SFM.



05_PrepareDenseScene

A principal tarefa do 05_PrepareDenseScene é eliminar a distorção da imagem. Ele gera imagens EXR sem distorção, para que as etapas subseqüentes no cálculo de profundidades e projeções não precisem realizar conversões de ida e volta a partir da função de distorção. As imagens têm esta aparência:



Note-se que você verá áreas pretas. As etapas subsequentes do AliceVision não usam a matriz de câmera real. Em vez disso, fingimos que a câmera possui uma nova matriz sem distorção, e 05_PrepareDenseScene deforma a imagem original nessa matriz fictícia. Como esse novo sensor virtual é maior que o sensor real, algumas áreas aparecerão vazias (pretas).

06_CameraConnection

A rigor, esse estágio viola o princípio de nosso processo de trabalho. Todas as etapas foram projetadas para que cada pasta se tornasse uma etapa separada completamente única. No entanto, 06_CameraConnection cria o arquivo camsPairsMatrixFromSeeds.bin na pasta 05_PrepareDenseScene , porque esse arquivo deve estar na mesma pasta que as imagens sem distorção.

07_DepthMap

Essa é a fase mais longa do AliceVision : gerar mapas de profundidade. Ele cria um mapa de profundidade para cada imagem como um arquivo EXR. Eu o configurei para facilitar a observação. Você pode ver uma pequena “língua” saindo da árvore.


Como esse estágio leva muito tempo, existe um parâmetro que permite executar grupos de câmeras diferentes como diferentes comandos separados. Portanto, se você tiver 1000 câmeras, poderá criar mapas de profundidade para grupos de câmeras em diferentes máquinas agrícolas. Ou você pode dividir o trabalho em pequenos grupos para que, se uma máquina travar, não seja necessário repetir todo o processo novamente.

08_DepthMapFilter

Os mapas de profundidade da fonte não serão totalmente consistentes. Alguns mapas de profundidade precisarão ver áreas sobrepostas por outros mapas de profundidade. O estágio 08_DepthMapFilter isola essas áreas e reforça a consistência da profundidade.


09_Meshing

Este é o primeiro passo no qual a malha é gerada diretamente. Pode haver pequenos problemas com a malha que podem ser resolvidos com ...


10_MeshFiltering

O estágio 10_MeshFiltering recebe a malha 09_Meshing e a refina . Ele executa as seguintes operações:

  • Suaviza a malha.
  • Elimina triângulos grandes.
  • Salva a maior malha, mas exclui o restante.


Algumas dessas operações nem sempre são desejáveis ​​em certos casos, portanto, os parâmetros podem ser ajustados, se necessário.

11_Texturização

A última etapa. 11_Texturing cria UV e projeta texturas. E nesta fase tudo acaba!


O último truque que você pode fazer com o Meshlab : você pode arrastar e soltar diferentes arquivos OBJ e PLY como camadas.


No meu exemplo, há uma camada para a malha acabada e para os pontos / câmeras SFM. Às vezes, a etapa de suavização de uma malha pode ser um pouco mais agressiva do que o necessário, por isso é útil comparar as malhas originais e de suavização. Se a malha parecer quebrada, para rastrear problemas no pipeline, é conveniente usar dados sfm do PLY e malhas do OBJ.

Agradecimentos

Este post não seria completo sem muito obrigado às equipes de desenvolvimento do AliceVision e OpenMVG . A fonte de inspiração foi o projeto libmv . Este projeto foi o precursor do OpenMVG , um repositório de engenheiros / pesquisadores de visão computacional para o desenvolvimento de novos algoritmos. O AliceVision é um fork do OpenMVG , criado especificamente para transformar esses algoritmos em uma solução autônoma na forma de um produto acabado.

O AliceVision / Meshroom é um projeto de código aberto grande e ambicioso. Sua principal conquista é a conquista de um projeto final por um projeto tão sério, e devemos muito a ele. Também somos obrigados a agradecer à equipe do OpenMVG (e libmv ), cujo trabalho fundamental permitiu a criação do AliceVision .

Por fim, quero agradecer especialmente à Microsoft pelo VCPKG . O VCPKG é um gerenciador de pacotes que simplificou bastante a montagem de grandes projetos de código aberto para Windows. Alguns anos atrás, tentei criar o OpenMVG no Windows. Não terminou muito bem. Então, quando ouvi falar do AliceVision há alguns meses, tentei compilá-lo, mas falhei mesmo com coisas mais simples. Então eu tentei o VCPKG e tudo funcionou imediatamente. É difícil quantificar a vantagem de usar um projeto como o VCPKG , mas realmente ajudou o ecossistema de código aberto para Windows.

github.com/alicevision

github.com/openMVG/openMVG

github.com/libmv/libmv

github.com/Microsoft/vcpkg

Source: https://habr.com/ru/post/pt422807/


All Articles