¿Necesita automatizar una gran cantidad de escaneos fotogramétricos? Entonces tengo buenas noticias para ti.
El video muestra el programa de fotogrametría
Meshroom de código abierto. Este proyecto ha existido en varias formas durante bastante tiempo, pero recientemente los desarrolladores han lanzado archivos binarios, por lo que simplemente puede descargarlos y usarlos. El video muestra el uso de la GUI para cargar imágenes, procesarlas, cambiar parámetros, etc. Te recomiendo que pruebes este programa en acción.
Pero estoy interesado en la automatización completa. Si tiene una instalación de escaneo en la que realiza 100 o más escaneos por día, entonces necesita una solución totalmente automatizada para el procesamiento por lotes de estos archivos. Esta publicación es una guía y / o tutorial sobre cómo resolver este problema.
Para empezar, es importante comprender que
Meshroom no es un proyecto gigantesco y monolítico. De hecho, el procesamiento en sí se realiza mediante programas separados de C ++ que se ejecutan desde la línea de comandos, y
Meshroom es un programa de codificación Python delgado que realiza las llamadas apropiadas. Por lo tanto, en lugar de usar
Meshroom, usaremos estos programas directamente. Tenga en cuenta que las fuentes completas están disponibles, por lo que puede vincular bibliotecas directamente.
Meshroom tiene otra característica conveniente: durante cada operación, su comando se muestra en el terminal. Por lo tanto, para crear las etapas de este proceso, simplemente trabajé con
Meshroom y miré a los equipos. Luego busqué en el código para cambiar algunos parámetros. Además, parece que cuando inicia Meshroom, puede ordenar que recopile un conjunto de imágenes desde la línea de comandos, pero prefiero no conectar estos pasos.
Preparación e instalación
0: requisitosMeshroom /
AliceVision no se ejecutará en todas las plataformas. CUDA es necesario para algunos pasos, por lo que para construir mapas de profundidad necesitará una GPU NVIDIA. Desafortunadamente, es imposible usar el respaldo de la CPU (transferir la ejecución de las funciones de la GPU a la CPU). De lo contrario, el programa funcionaría perfectamente en Windows y Linux. Las instrucciones en este artículo son para Windows, pero con cambios mínimos se pueden ajustar para Linux.
1: Descargue la versión MeshroomMeshroom 2018.1.0Lo primero que debe hacer es instalar
Meshroom . Seleccione la carpeta desde la que desea hacer el trabajo y luego descargue la última versión. El archivo zip contiene binarios de todas las dependencias.
Si te atraen las aventuras, puedes intentar armar el programa tú mismo. Las bibliotecas de enlaces dinámicos de lanzamiento funcionan bien (/ MD), pero tuve que hackear archivos cmake para crear compilaciones de depuración y / o compilaciones de enlaces estáticos. Si va a compilar el programa en Windows, le recomendamos
EXTREMADAMENTE usar VCPKG.
2: descargar datosalicevision / dataset_monstreeObviamente, el objetivo principal del software de fotogrametría es procesar sus propias imágenes, pero primero sugiero usar imágenes que garanticen que sean adecuadas. Le permitirán encontrar la fuente de los problemas si algo sale mal. Afortunadamente, los desarrolladores lanzaron un conjunto de imágenes para su árbol de prueba.
3: descargue el script run_alicevision.pyrun_alicevision.zipEste es el script que usaremos. Simplemente descargue el archivo zip y descomprímalo en su carpeta de trabajo.
4: Instalar Pythonhttps://www.python.org/download/releases/2.7/Instale Python si aún no lo ha hecho. Sí, todavía estoy escribiendo código para Python 2.7.0. La forma más fácil de instalar
Windows X86-64 MSI Installer desde las versiones.
5: Instalar Meshlab (opcional)MeshLabComo paso opcional, también debe instalar
MeshLab . De hecho, no será necesario para el procesamiento, pero en varias etapas los datos se muestran en los archivos de puntos PLY. No se pueden descargar a
Maya , así que uso
MeshLab para verlos.
Después de descomprimir todos los archivos, la carpeta debería verse así (con la excepción de la carpeta
build_files , que se genera mediante scripts):
Aquí está lo siguiente:
- build_files: los archivos que hemos compilado.
- dataset_monstree-master: imágenes de origen
- Meshroom-2018.1.0: Meshroom / AliceVision binarios .
- Todo lo demás: scripts para ejecutarlos, que se toman de run_alicevision.zip .
Lanzar AliceVision
Ahora es el momento de
echar un vistazo más de cerca a
run_alicevision.pyEl archivo Python recibe 5 argumentos:
python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>
- baseDir : la carpeta en la que desea colocar archivos temporales.
- imgDir : carpeta que contiene imágenes de origen. En nuestro caso, IMG_1024.JPG (y otros).
- binDir : una carpeta que contiene los ejecutables de AliceVision , por ejemplo aliceVision_cameraInit.exe .
- numImages : el número de imágenes en imgDir , en nuestro caso 6. Por supuesto, puede reconocer este número automáticamente, pero el objetivo era crear el script de Python más simple posible, por lo que debe especificar este número usted mismo.
- runStep : la operación a realizar.
Para resumir: comenzamos con 6 imágenes que se ven así:
Usando el script
run_alicevision.py python
, vamos a crear la siguiente estructura de carpetas:
Y en la carpeta
11_Texturing habrá un modelo listo para usar que se abre en
Meshlab :
Cada una de estas carpetas es uno de los pasos. Podemos ejecutarlos a su vez utilizando los archivos
run_monstree_runXX.bat , o utilizar
run_monstree_all.bat para recopilarlos todos a la vez.
Eso es todo Ahora puede ejecutar el archivo
run_monstree_all.bat o realizar un paso a la vez. Puede mirar el guión para comprender su trabajo. Para aquellos que desean poder personalizar la canalización de procesamiento, preparé una introducción a los pasos individuales.
00_CameraInitEl primer paso generará un archivo SFM. Los archivos SFM son archivos JSON que almacenan el tamaño de la cámara, la información del sensor, los puntos 3D encontrados (observaciones), los factores de distorsión y otra información. El archivo SFM inicial en esta carpeta contendrá solo información sobre el sensor y seleccionará valores predeterminados de la base de datos local de sensores. Los pasos posteriores crearán archivos SFM que contienen la matriz completa de parámetros, puntos, etc. de la cámara externa.
Es posible que deba configurar este paso. Si usa una configuración con 4 cámaras, pero toma 10 fotos de un objeto que gira en un plato giratorio, entonces necesita un archivo SFM con 40 imágenes, pero con solo 4 calibraciones de sensor diferentes. Esta es la razón principal por la que me gusta la estructura de
AliceVision . Es fácil configurar operaciones por lotes en él (por ejemplo, generar su propio archivo SFM) sin la molestia de configurar otros elementos de software que es mejor no tocar.
01_FeatureExtractionLa siguiente etapa extrae los rasgos característicos de las imágenes, así como los descriptores de estos rasgos. Cambiará la extensión del archivo según el tipo de característica que se extraiga.
02_ImageMatching02_ImageMatching es un paso de procesamiento posterior que determina cuál de las imágenes es lógico
mapearse entre sí. Si tiene un conjunto de 1000 imágenes, entonces para una búsqueda aproximada de las 1000 imágenes para que coincida con las 1000 imágenes, necesita 1 millón de pares. Esto puede llevar mucho tiempo (en realidad la mitad, pero entiendes el principio). La etapa
02_ImageMatching corta estos pares.
03_FeatureMatching03_FeatureMatching coincide con las imágenes mediante descriptores de características. No es necesario explicar los archivos txt que genera.
04_StructureFromMotionEntonces, esta es la primera etapa seria. Basado en las correspondencias
04_StructureFromMotion , calcula las posiciones de la cámara, así como los parámetros internos de la cámara. Cabe señalar que el término "Estructura del movimiento" se utiliza como un término general para calcular las posiciones de la cámara. Si tiene una configuración para la fotogrametría de 10 cámaras sincronizadas, se utiliza "Estructura desde movimiento" para ajustarlas, incluso si nada se mueve realmente.
Por defecto,
Meshroom almacena todos los datos calculados como un archivo
Alembic , pero prefiero almacenarlo en un archivo SFM. Esta etapa crea datos intermedios para garantizar que las cámaras estén correctamente vinculadas. En la salida, el script crea archivos PLY que se pueden ver en
Meshlab . Los siguientes archivos son importantes:
- bundle.sfm: archivo SFM con todas las observaciones.
- cameras.fm: un archivo SFM con datos solo para cámaras conectadas.
- cloud_and_poses.ply: puntos y cámaras encontrados.
Aquí está el archivo
cloud_and_poses.ply . Los puntos verdes son cámaras. Creo que este formato es el más adecuado para verificar la ausencia de errores graves en la unión de las cámaras. Si se produce un error en algún lugar, puede regresar y cambiar las características, correspondencias o parámetros SFM.
05_PrepareDenseSceneLa tarea principal de
05_PrepareDenseScene es eliminar la distorsión de la imagen. Genera imágenes EXR sin distorsión, por lo que los pasos posteriores en el cálculo de profundidades y proyecciones no necesitan realizar conversiones de ida y vuelta desde la función de distorsión. Las imágenes se ven así:
Cabe señalar que verá áreas negras. Los pasos posteriores de
AliceVision no usan la matriz de cámara real. En su lugar, pretendemos que la cámara tenga una nueva matriz sin distorsión, y
05_PrepareDenseScene deforma la imagen original a esta matriz ficticia. Dado que este nuevo sensor virtual es más grande que el sensor real, algunas áreas aparecerán vacías (negras).
06_CameraConnectionHablando estrictamente, esta etapa viola el principio de nuestro proceso de trabajo. Todas las etapas fueron diseñadas para que cada carpeta se convirtiera en una etapa separada completamente única. Sin embargo,
06_CameraConnection crea el archivo
camsPairsMatrixFromSeeds.bin en la carpeta
05_PrepareDenseScene , porque este archivo debe estar en la misma carpeta que las imágenes sin distorsión.
07_DepthMapEsta es la fase más larga de
AliceVision : generar mapas de profundidad. Crea un mapa de profundidad para cada imagen como un archivo EXR. Lo configuré para que sea más fácil notarlo. Puedes ver una pequeña "lengua" que sobresale del árbol.
Dado que esta etapa lleva mucho tiempo, hay un parámetro que nos permite ejecutar grupos de diferentes cámaras como diferentes comandos separados. Por lo tanto, si tiene 1000 cámaras, puede crear mapas de profundidad para grupos de cámaras en diferentes máquinas agrícolas. O puede dividir el trabajo en pequeños grupos para que si una máquina falla, no tenga que repetir todo el proceso nuevamente.
08_DepthMapFilterLos mapas de profundidad de la fuente no serán completamente consistentes. Algunos mapas de profundidad necesitarán ver áreas superpuestas por otros mapas de profundidad. La etapa
08_DepthMapFilter aísla dichas áreas y aplica consistencia de profundidad.
09_MeshingEste es el primer paso en el que la malla se genera directamente. Puede haber pequeños problemas con la malla que se pueden resolver con ...
10_MeshFilteringLa etapa
10_MeshFiltering recibe la malla
09_Meshing y la
refina . Realiza las siguientes operaciones:
- Alisa la malla.
- Elimina triángulos grandes.
- Guarda la malla más grande, pero elimina el resto.
Algunas de estas operaciones no siempre son deseables en ciertos casos, por lo que los parámetros se pueden ajustar si es necesario.
11_TexturaLa ultima etapa.
11_Texturing crea UV y proyecta texturas. ¡Y en esta etapa todo termina!
El último truco que puedes hacer con
Meshlab : puedes arrastrar y soltar diferentes archivos OBJ y PLY como capas.
En mi ejemplo, hay una capa para la malla terminada y para los puntos / cámaras SFM. A veces, el paso de suavizado de una malla puede ser un poco más agresivo de lo necesario, por lo que es útil comparar las mallas originales y de suavizado. Si la malla se ve rota, entonces para rastrear problemas en la tubería, es conveniente usar datos sfm de PLY y mallas de OBJ.
AgradecimientosEsta publicación no estaría completa sin mucho gracias a los equipos de desarrollo de
AliceVision y
OpenMVG . La fuente de inspiración fue el proyecto
libmv . Este proyecto fue el precursor de
OpenMVG , que es un repositorio de ingenieros / investigadores de visión por computadora para desarrollar nuevos algoritmos.
AliceVision es una bifurcación de
OpenMVG , creada específicamente para convertir estos algoritmos en una solución independiente en forma de un producto terminado.
AliceVision / Meshroom es un gran y ambicioso proyecto de código abierto. Su principal logro es el logro de un proyecto tan final por un proyecto tan serio, y le debemos mucho a él. También estamos obligados a agradecer al equipo de
OpenMVG (y
libmv ), cuyo trabajo fundamental permitió la
creación de
AliceVision .
Finalmente, quiero agradecer especialmente a Microsoft por
VCPKG .
VCPKG es un administrador de paquetes que simplificó enormemente el ensamblaje de grandes proyectos de código abierto para Windows. Hace unos años intenté construir
OpenMVG en Windows. No terminó muy bien. Entonces, cuando escuché sobre
AliceVision hace unos meses, intenté compilarlo, pero fallé incluso con cosas más simples. Luego probé
VCPKG , y todo funcionó de inmediato. Es difícil cuantificar la ventaja de usar un proyecto como
VCPKG , pero realmente ayudó al ecosistema de código abierto para Windows.
github.com/alicevisiongithub.com/openMVG/openMVGgithub.com/libmv/libmvgithub.com/Microsoft/vcpkg