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: RequisitosO 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 MeshroomMeshroom 2018.1.0A 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 dadosalicevision / dataset_monstreeObviamente, 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.pyrun_alicevision.zipEste é o script que vamos usar. Basta baixar o arquivo zip e descompactá-lo na sua pasta de trabalho.
4: Instale o Pythonhttps://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)MeshLabComo 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.pyO arquivo Python recebe 5 argumentos:
python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>
- baseDir : a pasta na qual você deseja colocar arquivos temporários.
- imgDir : pasta que contém imagens de origem. No nosso caso, IMG_1024.JPG (e outros).
- binDir : uma pasta que contém os executáveis do AliceVision , por exemplo, aliceVision_cameraInit.exe .
- 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.
- 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_CameraInitA 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_FeatureExtractionA 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_ImageMatching02_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_FeatureMatching03_FeatureMatching corresponde a imagens usando descritores de recursos. Os arquivos txt gerados não precisam ser explicados.
04_StructureFromMotionEntã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_PrepareDenseSceneA 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_CameraConnectionA 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_DepthMapEssa é 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_DepthMapFilterOs 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_MeshingEste é o primeiro passo no qual a malha é gerada diretamente. Pode haver pequenos problemas com a malha que podem ser resolvidos com ...
10_MeshFilteringO 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çãoA ú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.
AgradecimentosEste 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/alicevisiongithub.com/openMVG/openMVGgithub.com/libmv/libmvgithub.com/Microsoft/vcpkg