black and gray mining rig

Escaneado 3D sin tarjeta gráfica CUDA

En la entrada anterior he hablado de técnicas de escaneado 3D basadas en la fotogrametria. Todo ello, usando un software abierto, gratuito y multiplataforma, como es Meshroom, por tanto accesible para toda aquella persona que quiera iniciarse en este apasionante mundo.

No obstante, sí que comentaba que había una limitación en Meshroom: es necesario disponer de una tarjeta gráfica Nvidia «CUDA enabled» ya que algunas partes del proceso están implementadas mediante unidades de procesamiento gráfico CUDA y, por tanto, necesitan un hardware compatible con ellas.

Esto puede ser un impedimento, especialmente, teniendo en cuenta que, habitualmente, los ordenadores que se tienen en los centros educativos no disponen de hardware de acceleración 3D (GPU). ¿Qué hacemos en estos casos?

Personalmente, me he encontrado con esta situación y tras darle algunas vueltas (y buscar un poco por Internet), he dado con tres posibles soluciones, que paso a explicar a continuación.

Para ver las diferencias entre una y otra, voy a procesar el siguiente objeto en un ordenador sin tarjeta gráfica (un portátil con gráfica integrada):

Capitán vintage

La escena está compuesta por 82 fotografías desde diferentes ángulos.

Veamos las diferentes soluciones:

Solución #1: Evitar las partes del proceso que usan CUDA

Esta es la solución más fácil de implementar, pero también la que da peores resultados. Se trata de eliminar del proceso de Meshroom aquellos pasos en los que haga falta el uso de CUDA. Simplemente, esos pasos no se harán (y por tanto, el reconocimiento del objeto será peor).

En concreto, los únicos pasos que requieren de una tarjeta gráfica con acceleración 3D (GPU) son los relativos a la creación del mapa denso. Si no hacemos mapa denso, problema resuelto.

Para ello, basta con eliminar los nodos en el editor de grafo de flujo de Meshroom. Hay que eliminar los siguientes: PrepareDenseScene, DeepMap y DeepMapFilter.

Eliminando un nodo (paso) en Meshroom

Una vez eliminados, conectamos el output del nodo anterior (StructureFromMotion) al input del siguiente (Meshing):

Para unirlos, pinchamos en el circulito blanco de output y arrastramos hasta el de input

Con este pequeño cambio, haremos que Meshroom funcione hasta el final en cualquier ordenador sin tarjeta gráfica.

Los puntos fuertes de esta solución es que es muy fácil de hacer y no requiere de ningún software ni recurso adicional. Por contra, el resultado deja mucho que desear respecto de un procesado con mapa denso.

Resultado de procesar la escena con Meshroom eliminando esos nodos es esta:

Solución #2: Usar un software que no requiera CUDA

Si queremos obtener unos mejores resultados podemos prescindir de Meshroom que, al fín y al cabo, está diseñado para funcionar con una tarjeta gráfica 3D y probar otro software de fotogrametria que no tenga este requerimiento.

En mi caso, he hecho pruebas satisfactorias con MVE. Multi-View Environment , como Meshroom, es un programa libre, gratuito y multiplataforma que, desde la línea de comandos, permite realizar el proceso de reconstrucción de objetos desde fotografías. El paquete está compuesto por varios programas, cada uno de ellos se encarga de realizar una parte del proceso, por lo que es necesario ejecutarlos uno detrás de otro siguiendo el orden establecido.

En los siguientes enlaces, se pueden encontrar manuales para ponerlo en marcha en los diferentes sistemas operativos:

Lamentablemente, MVE no se distribuye como programa «al uso» y es necesario bajarse los ficheros fuentes y compilarlos, por lo que no es descargar y listo. En los enlaces anteriores se explica, paso a paso, como realizar esta compilación en los diferentes sistemas.

Una vez compilado, el programa se lanza desde el terminal. Hay un comando para cada paso del proceso, al que hay que pasarle la ruta que contiene los archivos que cogerá como fuente y la ruta en la que almacenará los resultados (que a su vez, será la entrada del siguiente comando).

Para simplificar el proceso, he creado un script que realiza de forma consecutiva todos los pasos, solo hay que ejecutarlo en la carpeta de MVE y pasarle la ruta de las imágenes y la ruta en la que ha de escribir el resultado:

Uso:

$ mve-pipeline.sh ruta-imagenes ruta-destino

El punto fuerte de esta solución es que obtiene unos resultados mucho más cercanos a la realidad. El principal inconveniente, la dificultad de instalación y puesta en marcha.

El resultado de procesar la escena con MVE es el siguiente:

Solución #3: Usar procesamiento en la nube

Esta solución tiene un enfoque diferente: en lugar de buscar como ejecutar Meshroom en un ordenador sin GPU, lo que vamos a hacer es ejecutar Meshroom en un ordenador con GPU desde un ordenador sin GPU.

Para ello haremos uso de la computación en la nube a través del servicio Google Colab. Este servicio, disponible a través de una cuenta personal de Google como una herramienta más, permite la ejecución remota e interactiva de comandos en un servidor en la nube (al que se le puede asignar una GPU).

Así, Google Colab nos permite usar durante 12h un ordenador (una máquna virtual) con las siguientes características:

  • GPU: Tesla K80 , con 2496 núcleos CUDA, versión 3.7, 12GB de GDDR5 VRA
  • CPU: Intel Xeon 2.3Ghz , 45MB Cache
  • RAM: ~12.6 GB
  • Disk: ~320 GB

Cada 12 horas, la máquina se elimina, siendo necesario volver a crearla y instalar todo. Si quieres más información, aquí hay un breve tutorial con ejemplos.

Para utilizarlo, basta con ir a https://colab.research.google.com e iniciar sesión con nuestra cuenta personal de Google.

Una vez dentro, seleccionamos Runtime > Change runtime type y seleccionamos GPU.

Activamos la GPU en colab

Ahora creamos dos carpetas input y output. En la carpeta input subimos las imágenes de nuestra escena.

En input se han subido todas las imágenes de la escena

Ahora instalamos Meshroom en colab. Para ello, creamos un fragmento de código y ponemos lo siguiente:

!mkdir temp
!mkdir meshroom
%cd temp!wget -N https://github.com/alicevision/meshroom/releases/download/v2019.2.0/Meshroom-2019.2.0-linux.tar.gz
!tar -xvf Meshroom-2019.2.0-linux.tar.gz -C ../meshroom

Pulsamos el botón de «play» para ejecutar la secuencia de comandos.

Así ejecutamos el fragmento

Ahora, ejecutamos Meshroom, reproduciendo el siguiente fragmento:

/content/meshroom/Meshroom-2019.2.0/meshroom_photogrammetry --input /content/input --output /content/output

El proceso será más lento, pero no tarda mucho más que la ejecución en local.

El comando en ejecución

Esperamos a que se complete el proceso. Una vez termine, en la carpeta output tendremos el resultado, que podemos descargar desde la carpeta output.

Hay que descargar los tres archivos: el png, el mtl y el obj

Si quisieramos procesar otra escena, sólo bastaria borrar las imágenes de input y la salida del output, subir las nuevas imágenes a input y volver a darle a ejecutar al fragmento de código que ejecuta meshroom (no hace falta volver a instalar Meshroom, a no ser que hayan pasado las 12h y se haya borrado la máquina virtual).

Para simplificar el proceso, comparto mi notebook con todos los pasos ya implementados y con comentarios:

Para importarlo a Google Colab, hay que ir a File > Upload Notebook

Importar Notebook

Aunque parezca un proceso complejo, lo cierto es que resulta sorprendentemente sencillo para lo que, en realidad, estamos haciendo. La interfaz de Google Colab hace que la ejecución de comandos sea muy sencilla y que, incluso, se pueda importar una plantilla con los pasos ya preparados. El punto negativo de esta solución es el hecho de que haga falta estar conectado a Internet para poder usarla.

El resultado de procesar la figura con Google Colab es el siguiente:

Conclusiones

Como podéis ver, es posible utilizar Meshroom en equipos sin tarjeta gráfica de diversas maneras. Sin embargo, las soluciones sencillas dan malos resultados y, para obtener mejores resultados hay que recurrir a soluciones más imaginativas o cambiar de programa. Lo bueno es que, una vez preparadas las soluciones, se puede reutilizar el entorno (ya sea en MVE o en Google Colab) para procesar varias escenas, con lo que el tiempo invertido se compensa con resultados que, en algunos casos, no tienen nada que envidiar de los obtenidos con una GPU.