Tutoriales
A continuación, encontrará instrucciones para algunos casos de uso comunes.
Creación de Ortofotos de Alta Calidad
Sin ningún ajuste de parámetros, ODM elije un buen balance entre calidad, velocidad y uso de memoria. Si quiere obtener resultados de mayor calidad, debe modificar algunos parámetros:
--orthophoto-resolution
es la resolución de la ortofoto en cm/pixel. Disminuya este valor para obtener un resultado de mayor resolución.
--texturing-data-term
debe establecerse en area para áreas forestales.
--mesh-size
debe incrementarse a300000-600000
y--mesh-octree-depth
debe incrementarse a10-11
en áreas urbanas para recrear mejor los edificios/techos.
Creación de modelos de elevación digitales
By default ODM does not create digital elevation models (DEMs). To create a digital terrain model, make sure to pass the --dtm
flag. To create a digital surface model, be sure to pass the --dsm
flag.
Para la generación del DTM, se utiliza un filtro morfológico simple (smrf) para clasificar los puntos terrestres frente a los no terrestres y solo se utilizan los puntos terrestres. El filtro smrf
se puede controlar mediante varios parámetros:
Valor de escala
--smrf-scalar
. Aumente este parámetro para terrenos con mucha variación de altura.Parámetro de pendiente
--smrf-slope
, que es una medida de la «tolerancia de pendiente». Aumente este parámetro para terrenos con mucha variación de altura. Debe establecerse en un valor superior a 0,1 y menor a 1,2.Umbral de elevación
--smrf-threshold
. Establezca este parámetro en la altura mínima (en metros) que espera que tengan los objetos que no corresponden al suelo.Parámetro de radio de ventana
--smrf-window
(en metros) que corresponde al tamaño de la característica más grande (edificio, árboles, etc.) que se eliminará. Debe establecerse en un valor superior a 10.
Cambiar estas opciones puede afectar significativamente el resultado de los DTM. La mejor fuente de lectura para comprender cómo los parámetros afectan la salida es leer el artículo original An improved simple morphological filter for the terrain classification of airborne LIDAR data (PDF disponible gratuitamente).
En general, la opción --smrf-threshold
tiene el mayor impacto en los resultados.
SMRF es bueno para evitar errores de Tipo I (un pequeño número de puntos de tierra clasificados erróneamente como no terrestres) pero solo es «aceptable» para evitar errores de Tipo II (gran número de puntos no terrestres clasificados erróneamente como terrestres). Esto debe tenerse en cuenta al generar DTM para ser usados visualmente, ya que los objetos que se confunden con el suelo parecen artefactos en el DTM final.
Otros dos parámetros importantes afectan la generación de DEM:
--dem-resolution
que establece la resolución de salida del ráster DEM (cm/píxel)
--dem-gapfill-steps
que determina el número de capas DEM progresivas que se utilizarán. Para escenas urbanas, aumentar este valor a «4-5» puede ayudar a producir mejores resultados de interpolación en las áreas que quedan vacías por el filtro SMRF.
Ejemplo de cómo generar un DTM:
docker run -ti --rm -v /my/project:/datasets/code <my_odm_image> --project-path /datasets --dtm --dem-resolution 2 --smrf-threshold 0.4 --smrf-window 24
Usar el módulo Potree de visualización 3D en WebODM
Cámaras
Active esta función para mostrar la posición de las cámaras
También puede hacer clic en el icono de la cámara para mostrar imágenes individuales en un marco en la esquina superior derecha. Un clic en el marco de la imagen cambia al modo de pantalla completa.
Dentro del marco de la imagen hay enlaces para descargar la imagen y el archivo de la cámara GeoJSON.
Modelo texturizado
Active esta función para mostrar cargar el modelo texturizado. Dependiendo del tamaño del archivo y la velocidad de la conexión, la carga puede tardar varios segundos.
Apariencia
Presupuesto de puntos
Tanto para fines de apariencia como de rendimiento, se puede administrar el presupuesto de puntos en la escena. Algunas máquinas antiguas y menos capaces se beneficiarían de un presupuesto de 500.000 puntos, mientras que la mayoría de las máquinas con especificaciones de rango medio son capaces de manejar un presupuesto de 1 a 2 millones de puntos.
Un presupuesto de 5 a 7 millones de puntos produce un modelo 3D de nube de puntos sin problemas, pero puede resultar en un proceso que demanda muchos recursos.
El valor de presupuesto de puntos predeterminado se establece en 1,000,000.
Campo de visión
Para controlar los elementos del modelo que se incluirán en la escena, se puede ajustar el campo de visión. El valor predeterminado se establece en 60 grados.
Iluminación de domo
El módulo de visor 3D Potree Point Cloud puede implementar la iluminación del domo, un modelo de iluminación que acentúa las formas de los objetos.
Los objetos de grupo de iluminación de domo, sombrean sus contornos y mejoran la percepción de profundidad en imágenes de visualización científica. Es útil para el reconocimiento y la medición de estructuras dentro de un modelo. Se puede modificar ajustando Radio, Fuerza y Opacidad.
De forma predeterminada, Eye Dome-Lighting está habilitado en el visor Potree 3D, pero se puede deshabilitar haciendo clic en la opción habilitar.
Fondo
El fondo del visualizador en 3D Potree se puede modificar. Las opciones disponibles son Skybox / Gradiente / Negro / Blanco / Ninguno
Otro
Calidad de splat = La calidad Splat se puede ajustar a calidad estándar o alta, para mejorar la apariencia del modelo.
Tamaño mínimo de nodo = La opción de tamaño mínimo de nodo impactará en la densidad de punto de los nodos representados.
Caja = Despliega las cajas de los nodos.
Bloqueo de vista = Bloquea la vista de la nube de puntos, para prevenir la carga o descarga de puntos en el modelo.
Herramientas
Medición
El módulo de visor 3D Potree proporciona varias herramientas para la medición. Este conjunto de herramientas consta de 12 elementos. También tiene controles para mostrar u ocultar las etiquetas de medición resultantes.
Las mediciones se realizan haciendo clic izquierdo en los puntos deseados y para algunas herramientas es necesario hacer clic derecho para finalizar el proceso.
Ángulo
Esta herramienta mide el ángulo tridimensional formado por las líneas que conectan 3 puntos. Para iniciar una medición, haga clic en el icono de ángulo, luego haga clic con el botón izquierdo en 3 puntos y el proceso finalizará automáticamente. También se puede obtener más información seleccionando este elemento en la sección de escena.
Punto
Esta herramienta resalta un punto seleccionado y muestra su coordenada XYZ. Para iniciar una medición, haga clic en el icono del punto, luego haga clic en el punto deseado y el proceso finalizará automáticamente. También se puede obtener más información seleccionando este elemento en la sección de escena.
Distancia
Esta herramienta mide la distancia tridimensional de las líneas que conectan una serie de puntos. Para iniciar una medición, haga clic en el icono de distancia y comience a hacer clic en los puntos deseados (dos o más). Haga clic derecho para finalizar la medición. También se puede obtener más información, como la longitud total, seleccionando este elemento en la sección de escena.
Altura
Esta herramienta mide la altura o la distancia vertical entre dos puntos. Para iniciar una medición, haga clic en el icono de altura y luego haga clic en los dos puntos deseados. El proceso finalizará automáticamente. También se puede obtener más información seleccionando este elemento en la sección de escena.
Círculo
Esta herramienta mide el radio de un círculo formado por tres puntos. Para iniciar una medición, haga clic en el icono del círculo y luego haga clic en los dos puntos deseados. El proceso finalizará automáticamente. También se puede obtener más información, como Circunferencia, seleccionando este elemento en la sección de escena.
Azimut
Esta herramienta mide el ángulo azimutal de una línea. Esta línea está formada por dos puntos seleccionados por el usuario, el ángulo se mide en grados, en sentido horario de 0 a 360 y partiendo del norte geográfico. Para iniciar una medición, haga clic en el icono de azimut y luego haga clic en los dos puntos deseados. El proceso finalizará automáticamente. También se puede obtener más información seleccionando este elemento en la sección de escena.
Área
Esta herramienta mide el área horizontal formada por un polígono. Para iniciar una medición, haga clic en el icono del área y comience a hacer clic en los puntos que forman el polígono deseado (tres o más). Haga clic derecho para finalizar la medición. También se puede obtener más información seleccionando este elemento en la sección de escena.
Volumen (cubo)
Esta herramienta mide el volumen formado por un cubo. Para iniciar una medición, haga clic en el icono de volumen (cubo) y haga clic en el modelo para colocar el cubo. Es posible reubicar, redimensionar y rotar el cubo usando los manejadores mostrados. Haga clic derecho para finalizar la medición. También se puede obtener más información seleccionando este elemento en la sección de escena.
Volumen (esfera)
Esta herramienta mide el volumen formado por una esfera. Para iniciar una medición, haga clic en el icono de volumen (esfera) y haga clic en el modelo para colocar la esfera. Es posible reubicar, redimensionar y rotar la esfera usando los manejadores mostrados. Haga clic derecho para finalizar la medición. También se puede obtener más información seleccionando este elemento en la sección de escena.
Perfil de altura
Esta herramienta crea un perfil de altura formado por una línea en el modelo. Para iniciar una medición, haga clic en el icono de perfil de altura y luego forme una línea en el modelo haciendo clic en los puntos deseados (dos o más). Haga clic derecho para finalizar la medición. También se puede obtener más información y opciones, como «Mostrar perfil 2d», seleccionando este elemento en la sección de escena.
Anotación
Esta herramienta crea una etiqueta de anotación en un punto resaltado del modelo. Para iniciar una medición, haga clic en el icono de anotación y luego haga clic en el punto deseado. El proceso finalizará automáticamente. Para editar la anotación, seleccione este elemento en la sección de la escena, luego edite el Título y la Descripción.
Remover mediciones
Esta herramienta elimina todas las medidas del modelo. Para eliminar todas las medidas, haga clic en el icono «Eliminar mediciones».
Recorte
La nube de puntos se puede recortar seleccionando un área. Las opciones de recorte incluyen ** Ninguno ** / ** Resaltado ** / ** Interior ** / ** Exterior **
Para recortar una nube de puntos, haga clic en el icono de recorte de volumen, coloque el cubo en el modelo y reubique, redimensione y gire para contener el área deseada. Resaltar está configurado de forma predeterminada como el método de recorte. Si se muestran solo los puntos contenidos dentro del cubo, haga clic en «Dentro», de lo contrario, haga clic en «Fuera».
Para eliminar el volumen de recorte o los polígonos, haga clic en el icono «Eliminar todas las mediciones».
Escena
La sección Escena muestra un árbol de archivos que contiene todos los elementos de la escena. Los elementos están organizados en seis grupos, que son ** Nubes de puntos ** / ** Medidas ** / ** Anotaciones ** / ** Otro ** / ** Vector ** / ** Imágenes **
Cada elemento de estos grupos se puede seleccionar para obtener más información o para controlar sus propiedades.
Por ejemplo, las propiedades de las nubes de puntos se pueden modificar para mostrar la elevación y también se puede personalizar la rampa de color.
Medir el volumen de pilas de materiales a granel
Planificación del trabajo de campo
Las condiciones climáticas modifican la iluminación y, por lo tanto, afectan los resultados de la fotografía. Los mejores resultados se obtienen con cielos nublados uniformemente o despejados. También busque velocidades de viento bajas que permitan que la cámara permanezca estable durante el proceso de recopilación de datos. Para evitar sombras que puedan obstruir la detección de características en un lado de la pila y disminuir el número de puntos resultantes, prefiera siempre los vuelos durante el mediodía, cuando el sol está en el nadir para que todo esté iluminado consistentemente. También asegúrese de que la distancia de visibilidad horizontal a simple vista sea congruente con las distancias de vuelo planificadas para el proyecto específico, de modo que la calidad de la imagen no se vea afectada negativamente por el polvo, niebla, humo, cenizas volcánicas o la contaminación.
Patrón de vuelo
La mayoría de los trabajos de medición de pilas no requieren un patrón de vuelo cruzado o la cámara en ángulo, ya que el ángulo de reposo de los materiales de las pilas permite que la cámara capture todos los lados. Solo algunos casos especiales en los que la erosión o las operaciones de maquinaria causan ángulos pronunciados en las caras de la pila se verán beneficiados del patrón de vuelo cruzado y la cámara en ángulo, pero considere que estas características adicionales tienen un costo (en mano de obra de campo y tiempo de procesamiento) y las mejoras resultantes son a veces insignificantes.
En la mayoría de los casos, un patrón de vuelo paralelo como una podadora, es capaz de producir modelos de pilas de alta precisión.
El traslape frontal recomendado debe estar entre 75% y 80%, con un traslape lateral en el orden de 65% y 70%. También se recomienda incrementar ligeramente el traslape lateral y frontal conforme se incremente la altura del vuelo.
Altura de vuelo
La altura de vuelo puede verse influenciada por diferentes modelos de cámara, pero de manera general y con el fin de garantizar un equilibrio entre la calidad de imagen y la optimización del vuelo, se recomienda ejecutarlo a alturas de 3 a 4 veces la altura de la pila más alta. Entonces, para una pila de 10 metros, las imágenes se pueden capturar a una altura de 40 metros. A medida que aumenta la altura de vuelo, también se recomienda aumentar la superposición, por lo que para un vuelo de 40 metros de altura puede usar una superposición lateral del 65% y una superposición frontal del 75%, pero para una altura planificada de 80 metros, una superposición lateral del 70% y una superposición del 80% permitiendo que las estructuras sean reconocidas y procesadas correctamente.
GCPs
Para lograr niveles de precisión superiores al 3%, se recomienda el uso de GCP. Normalmente, 5 GCP distribuidos son suficientes para garantizar resultados precisos. Al colocar o medir los GCP, la precisión del equipo debe ser mayor que el GSD. Las estaciones totales y los GNSS de grado topográfico están diseñadas para proporcionar la precisión milimétrica requerida.
For further information on the use of GCPs, please refer to the Ground Control Points section.
Parámetros de procesamiento
Se puede lograr un modelo de alta precisión usando los parámetros predefinidos para alta resolución en WebODM. Luego puede ajustar aún más algunos parámetros según sea necesario.
Si utiliza ODM, estos valores de referencia pueden ayudarle a configurar los parámetros de proceso.
–dsm: true
–dem-resolution 2.0
–orthophoto-resolution 1.0
–feature-quality high
–pc-quality high
Medición
Como casi el 50% del material se encuentra en el primer 20% de la altura de la pila, se debe tener especial cuidado en definir adecuadamente el plano de la base.
En el tablero de WebODM, haga clic en «ver mapa» para iniciar una vista 2D de su proyecto.
Una vez en la vista de mapa 2D, haga clic en el botón «Medir volumen, área y distancia».
luego haga clic en «Crear una nueva medición»
Empiece a colocar los puntos para definir el plano de la base de la pila
Haga clic en «Finalizar medición» para finalizar el proceso.
El cuadro de diálogo muestra el mensaje «Calculando…» por algunos segundos, y después de que el cálculo esté terminado la medición de volumen será desplegada.
Si utiliza OpenDroneMap en la línea de comandos, puede usar los archivos DSM para medir el volumen de las pilas usando otros programas.
También considere que una vez que los límites de la pila están definidos en un software como QGis, encontrará que existen varias maneras de determinar el plano de la base. Así que para pilas aisladas, cuyos límites son mayormente visibles, se puede usar un enfoque linear. Mientras que para pilas ubicadas en pendientes o en contenedores, el plano de la base es mejor definido el punto mas bajo. Se recomienda la creación de una superficie tridimensional triangulada para definir el plano de la base de pilas grandes. Esto también es válido para pilas sobre superficies irregulares.
Precisión esperada
Para proyectos cuidadosamente planificados y ejecutados, y especialmente cuando el GSD es menor de 1 cm, la precisión esperada debe estar en el rango de 1% a 2%. La precisión resultante es comparable a la del software de fotogrametría disponible comercialmente y la obtenida utilizando equipo GNSS de grado topográfico.
Usando Docker
Dado que muchos usuarios emplean Docker para implementar OpenDroneMap, puede ser útil comprender algunos comandos básicos para consultar a las instancias de Docker cuando las cosas van mal o si tenemos curiosidad por ver lo que está sucediendo. Docker es un entorno en contenedores destinado, entre otras cosas, a facilitar la implementación de software independientemente del entorno local. De esta forma, es similar a las máquinas virtuales.
Unos pocos comandos de Docker pueden mejorar mucho nuestra experiencia.
Listado de máquinas Docker
Podemos comenzar enumerando las máquinas Docker disponibles en la máquina actual que estamos ejecutando de la siguiente manera:
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2518817537ce opendronemap/odm "bash" 36 hours ago Up 36 hours zen_wright
1cdc7fadf688 opendronemap/nodeodm "/usr/bin/nodejs /va…" 37 hours ago Up 37 hours 0.0.0.0:3000->3000/tcp flamboyant_dhawan
Si queremos ver máquinas que pueden no estar ejecutándose pero que aún existen, podemos agregar la bandera -a:
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2518817537ce opendronemap/odm "bash" 36 hours ago Up 36 hours zen_wright
1cdc7fadf688 opendronemap/nodeodm "/usr/bin/nodejs /va…" 37 hours ago Up 37 hours 0.0.0.0:3000->3000/tcp flamboyant_dhawan
cd7b9585b8f6 opendronemap/odm "bash" 3 days ago Exited (1) 37 hours ago nostalgic_lederberg
e31010c00b9a opendronemap/odm "python /code/run.py…" 3 days ago Exited (2) 3 days ago suspicious_kepler
c44e0d0b8448 opendronemap/nodeodm "/usr/bin/nodejs /va…" 3 days ago Exited (0) 37 hours ago wonderful_burnell
Accediendo a los registros en la instancia
Usando el CONTAINER ID o el nombre, podemos acceder a cualquier registro disponible en la máquina de la siguiente manera:
> docker logs 2518817537ce
Es probable que sea difícil de manejar, pero podemos usar un carácter de barra vertical | y otras herramientas para extraer exactamente lo que necesitamos de los registros. Por ejemplo, podemos movernos lentamente por el registro usando el comando more:
> docker logs 2518817537ce | more
[INFO] DTM is turned on, automatically turning on point cloud classification
[INFO] Initializing OpenDroneMap app - Mon Sep 23 01:30:33 2019
[INFO] ==============
[INFO] build_overviews: False
[INFO] camera_lens: auto
[INFO] crop: 3
[INFO] debug: False
[INFO] dem_decimation: 1
[INFO] dem_euclidean_map: False
...
Presionar «Enter» o «Espacio», las teclas de flecha o las teclas «Page Up» o «Page Down» ahora nos ayudará a navegar por los registros. La letra minúscula «Q» nos permitirá volver a la línea de comandos.
We can also extract just the end of the logs using the tail command as follows:
> docker logs 2518817537ce | tail -5
[INFO] Cropping /datasets/code/odm_orthophoto/odm_orthophoto.tif
[INFO] running gdalwarp -cutline /datasets/code/odm_georeferencing/odm_georeferenced_model.bounds.gpkg -crop_to_cutline -co NUM_THREADS=8 -co BIGTIFF=IF_SAFER -co BLOCKYSIZE=512 -co COMPRESS=DEFLATE -co BLOCKXSIZE=512 -co TILED=YES -co PREDICTOR=2 /datasets/code/odm_orthophoto/odm_orthophoto.original.tif /datasets/code/odm_orthophoto/odm_orthophoto.tif --config GDAL_CACHEMAX 48.95%
Using band 4 of source image as alpha.
Creating output file that is 111567P x 137473L.
Processing input file /datasets/code/odm_orthophoto/odm_orthophoto.original.tif.
El valor -5 le dice al comando tail que nos dé solo las últimas 5 líneas de los registros.
Acceso de línea de comando a las instancias
A veces necesitamos profundizar un poco más en nuestra exploración del proceso de OpenDroneMap. Para ello, podemos obtener acceso directo a la línea de comandos de las máquinas. Para esto, podemos usar docker exec para ejecutar un shell de línea de comando` bash` en la máquina de interés de la siguiente manera:
> docker exec -ti 2518817537ce bash
root@2518817537ce:/code#
Ahora estamos conectados a nuestra instancia de Docker y podemos explorar la máquina.
Limpieza de Docker
Docker tiene un uso lamentable del espacio y, de forma predeterminada, no limpia el exceso de datos y máquinas cuando los procesos están completos. Esto puede ser ventajoso si necesitamos acceder a un proceso que ya ha terminado, pero que lleva la carga de usar cantidades crecientes de almacenamiento a lo largo del tiempo. Maciej Łebkowski tiene una ʻexcelente descripción general de cómo administrar el uso excesivo del disco en la ventana acoplable <https://lebkowski.name/docker-volumes/>`_.
Usando ODM desde una ubicación de ancho de banda bajo
¿Qué es esto y para quién es?
A través del repositorio de ʻIvan Gayton <https://github.com/ivangayton/GDAL_scripts/>`_.
ʻOpenDroneMap <https://www.opendronemap.org/>`__ no siempre se puede configurar localmente de forma efectiva; se necesita una máquina bastante poderosa para procesar conjuntos de datos grandes, por lo que una máquina en la nube a veces puede ser la respuesta para las personas en el campo. Sin embargo, el ancho de banda es un problema en muchos entornos de bajos ingresos. Esta restricción no se puede resolver por completo, pero el siguiente método hace un trabajo razonable al reducir el ancho de banda necesario para procesar conjuntos de datos de imágenes de drones en la nube desde ubicaciones africanas.
Aquí presentamos un proceso complicado pero factible para crear una máquina en la nube OpenDroneMap (* no * CloudODM, eso sí, solo una instancia de ODM basada en la nube que se ejecuta desde la línea de comandos) y usarla para procesar de forma remota conjuntos de fotos grandes. Requiere familiaridad con el uso de la línea de comandos de Unix, ssh, una cuenta de Digital Ocean (Amazon AWS también funcionaría, posiblemente con ligeras diferencias en la configuración) y un nivel moderado de conocimientos informáticos generales. Si no es un experto en informática y está dispuesto a preocuparse por una configuración un poco complicada, CloudODM is what you should be looking at.
Todo el proceso está dirigido principalmente a alguien que vuela misiones sustanciales en África o un lugar similar, y que busca procesar datos lo antes posible mientras aún se encuentra en un entorno de campo. Por lo tanto, enfatiza un flujo de trabajo destinado a reducir el ancho de banda/transferencia de datos, en lugar de solo la forma más simple de ejecutar ODM.
Pasos
Instalación
Cree una Droplet de Digital Ocean con al menos 4 GB de RAM. Eso costará alrededor de $ 20 USD al mes. Menos de 4 GB de RAM y la instalación probablemente fallará. Cuando realmente ejecutemos el proceso ODM, lo redimensionaremos a una máquina en la nube mucho más grande y más cara, pero entre ejecuciones puede reducirlo al segundo Droplet más barato que cuesta solo $10 USD (el Droplet mas barato a $5 USD por mes, viene con una unidad tan pequeña que no puede volver a reducirla).
Debe ser una instancia de Ubuntu 18.04 para asegurar la compatibilidad de las dependencias.
Cree un usuario con privilegios de sudo. La documentación increíblemente buena de Digital Ocean puede ayudarte a resolver esto. En nuestro caso, configuramos un usuario llamado
odm
, por lo que conectarse a él es a través del comando``ssh odm@xxx.xxx.xxx.xxx`` (donde las x representan la dirección IPv4 de su servidor) . Si desea seguir este ejemplo de cerca, utilice el nombre de usuarioodm
; entonces su ruta de instalación será/home/odm/ODM/
y coincidirá con todos los ejemplos de este documento.Continúe y ejecute
sudo apt update
ysudo apt upgrade
para asegurarse de que su servidor no esté peligrosamente sin actualizaciones. Asegúrese de permanecer con Ubuntu 18.04.
Descargue e instale ODM en él desde el ʻODM Github <https://github.com/OpenDroneMap/ODM>`__ (normal, no WebODM) con los siguientes comandos:
git pull https://github.com/OpenDroneMap/ODM.git
cd ODM
bash configure.sh install
Si hace esto desde la carpeta de inicio predeterminada de su usuario (es decir,
odm
), la ruta a la instalación será/home/odm/ODM
(abreviado como~/ODM/
).Hay algunas variables ambientales que deben configurarse. Abra el archivo ~/.bashrc en su máquina y agregue las siguientes 3 líneas al final (De the ODM github). El archivo se puede abrir con
nano~/.bashrc
(o cualquier editor de texto que use en lugar de nano). Asegúrese de reemplazar/home/odm/
con la ruta correcta a la ubicación donde extrajo OpenDroneMap si no hizo todo exactamente como en nuestro ejemplo (por ejemplo, si usó un nombre de usuario diferente en la configuración de su servidor):
export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/SuperBuild/install/lib/python2.7/dist-packages
export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/SuperBuild/src/opensfm
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/odm/ODM/SuperBuild/install/lib
Tenga en cuenta que el archivo Léame de ODM github contiene un pequeño error, el nombre del directorio de instalación será ODM, no OpenDroneMap (lo verá si compara las instrucciones anteriores con las del ODM GitHub).
Para evitar un bloqueo en el que el proceso de split-merge no localice su propio ejecutable, agregamos las siguientes líneas a
~/.bashrc
(ajuste las rutas si ha configurado las cosas de manera diferente a nuestro ejemplo):
export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/
export PATH=$PATH:/home/odm/ODM/
Ahora necesitará un segundo disco duro en la nube (un «Volumen» en la jerga de Digital Ocean) lo suficientemente grande para administrar su proyecto. La regla de oro parece ser 10 veces el tamaño de su conjunto de imágenes sin procesar; tenemos un conjunto de imágenes de 100 GB y configuramos un volumen de 1000 GB (una vez que la ejecución haya terminado, debería poder deshacerse de la mayor parte de esta costosa capacidad de disco, pero es necesaria para completar el proceso). Configure el volumen, adjúntelo a su Droplet y configure su punto de montaje (en este ejemplo lo estamos configurando a
/mnt/odmdata/
).
Datos de preparación y proyecto
Ahora envíe sus imágenes al servidor. Puede usar Secure Copy (scp) así:
scp -r /path/to/my/imagefolder odm@xxx.xxx.xxx. xxx: /mnt/odmdata/
.
Estructura del directorio
ODM requiere que los directorios de la máquina se configuren exactamente así. Los bits críticos son la carpeta de instalación (si instaló como antes, es /home/odm/ODM/
) y la carpeta del proyecto (es decir, /mnt/odmdata/myproject/
)
El archivo settings.yaml de ODM especifica un único directorio principal que contiene todos los proyectos. Esto es lo que va en la línea de ruta del proyecto del archivo settings.yaml (un poco confuso, este es en realidad el directorio principal de los directorios del proyecto individual, que se especifican mediante el parámetro de nombre del proyecto al llamar a ODM). Edite settings.yaml y establezca el parámetro project_path en (según nuestra configuración de ejemplo)
/mnt/odmdata/
, que en este caso apunta al Volumen que creamos. Dentro de eso se crean directorios de proyectos individuales.Individual project directories, i.e.
/mnt/odmdata/myproject/
contain the gcp_list.txt file, the image_groups.txt file, and the images folder for each project.La carpeta de imágenes, es decir,
/mnt/odmdata/myproject/images/
contiene todas las imágenes. Si lo configura así, las imágenes no se vuelven a copiar porque ya están en el directorio en el que ODM las quiere.Modifique settings.yaml para especificar el directorio principal de la carpeta del proyecto (en este caso, el Volumen que creamos,
/mnt/odmdata/
). Asegúrese de que las imágenes estén en el lugar correcto, es decir,/mnt/odmdata/myproject/images
y los otros archivos auxiliares (gcp_list.txt e image_groups.txt) están en la carpeta raíz/mnt/odmdata/myproject/
Si tiene las imágenes en carpetas separadas para bloques AOI o vuelos individuales (lo que hará si su gestión de vuelos fue organizada), puede crear un archivo image_groups.txt con los encantamientos
for i in *; do cd $i; for j in *; do echo "$j $i" >> ../$i.txt; done; cd ../; done;
ycd ../
,for i in myproject/*.txt; do cat $i >> image_groups.txt; done;
. Eso debería crear un archivo con la estructura correcta: una lista de todos los archivos de imagen y un «nombre de grupo» después de cada uno (que en este caso será simplemente el nombre de la carpeta de la que proviene). Luego mueva todos los archivos de imagen a un solo directorio llamado imágenes en el directorio raíz del proyecto (por lo tanto,/mnt/odmdata/myproject/images/
). El archivo image_groups.txt permitirá que ODM realice un seguimiento de las imágenes que pertenecen al mismo lote, aunque estén todas en un solo directorio.
Cambie el tamaño del Droplet, quite el seguro, huya
Apague y cambie el tamaño de su máquina a una cantidad monstruosa de CPU y memoria. Utilizo la máquina con memoria optimizada con 24 vCPU dedicadas y 192 GB de RAM (que cuesta alrededor de $ 1,60 / hora, lo que se suma rápido y supera los $ 1000/mes). Reinicie y comience a trabajar rápidamente para no perder el costoso tiempo de los Droplets grandes.
Inicie el proceso ODM a través de ssh usando nohup (de modo que, si se corta, el procesamiento continuará)
Alternativamente, puede usar la pantalla GNU para iniciar el proceso desde una sesión de pantalla que no se detendrá si se interrumpe su conexión, inicie
screen
y use<ctrl> a <ctrl> d
para separar,screen -r
para volver a juntar. Pero al usar la pantalla no obtendrá un archivo de registro de toda la salida de la consola a menos que haga algo específico para capturar eso, mientras que nohup le brinda un archivo con toda la salida de la consola, incluidos los mensajes de error, de forma gratuita.Nota: a partir de 2020-03, el encantamiento normal
python run.py -i /path/to/image/folder project_name
parece no funcionar; el parámetro-i
o--image
causa un error extraño. Entonces introducimos el parámetro -i y y confiamos en la línea del directorio del proyecto en el archivo settings.yaml para dirigir ODM al lugar correcto. Ahora usando (incluyendo split-merge):
nohup python run.py myproject --split 1 --split-overlap 0 --depthmap-resolution 1000 --orthophoto-resolution 5 --dem-resolution 15 --pc-las --dsm
Esto apunta a ODM a la carpeta (en este ejemplo)
/mnt/odmdata/myproject/
. Siempre que image_groups.txt y gcp_list.txt estén en esta carpeta, las imágenes están en/mnt/odmdata/myproject/images/
, y la ruta del proyecto en settings.yaml es/mnt/odmdata/
no perderá tiempo ni espacio copiando imágenes.Tenga en cuenta que esto supone que tiene un archivo image_groups.txt. Si no es así, este
-split-overlap 0
probablemente arruinará las cosas, y el--split 1
es literalmente un número aleatorio que se ignorará despues de que se cargue el archivo image_groups.txt (creo que normalmente controla en cuántos grupos divide un conjunto de imágenes, pero en nuestro caso asumimos que las imágenes ya están agrupadas de manera sensata). Si no tiene un conjunto de datos grande (> 1000 imágenes), omita las opciones--split
y--split-overlap
.Siga el progreso usando tail (para que sepa cuando está hecho)
tail -f nohup.out
Es posible que desee estar atento a htop (para tener una idea del uso de recursos para que en el futuro solo pueda hacer girar una máquina tan grande como sea necesario)
Después de que termine (suponiendo que sobrevivas tanto tiempo)
Tan pronto como termine el procesamiento, apague la máquina y cambie su tamaño a la capacidad mínima económica.
Inicie la copia de seguridad de la máquina e inicie sesión a través de ssh.
Si desea ahorrar ancho de banda de descarga, puede comprimir la ortofoto usando GDAL. No agregue descripciones generales, hágalo en su máquina local para evitar agrandar el archivo antes de descargarlo.
gdal_translate -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -co TILED=YES -b 1 -b 2 -b 3 -mask 4 --config GDAL_TIFF_INTERNAL_MASK YES /path/to/original/filename.extension /path/to/output.tif
Descargue usando scp:
scp odm@xxx.xxx.xxx.xxx:/mnt/odmdata/myproject/odm_orthophoto/odm_orthophoto.tif
(o tome la versión comprimida que creó en el último paso)Una vez que obtenga el archivo en su computadora local, puede usar QGIS para agregar descripciones generales (“pyramids”) o usar el comando GDAL
gdaladdo -r average /path/to/image.tif 2 4 8 16 32 64 128 256 512 1024
.Puede archivar las carpetas odm_texturing, odm_georeferencing y odm-dem usando tar para que sea más fácil descargarlas en una sola pieza (y tal vez más pequeñas).
tar -zcvf archivename /path/to/folder
Advanced
Calibrar la cámara
La calibración de la cámara es un desafío especial con las cámaras básicas. Los cambios de temperatura, las vibraciones, el enfoque y otros factores pueden afectar los parámetros derivados con efectos sustanciales en los datos resultantes. La calibración automática o la autocalibración es posible y deseable para los vuelos de drones, pero dependiendo del patrón de vuelo, la calibración automática puede no eliminar toda la distorsión de los productos resultantes. James y Robson (2014) en su artículo Mitigating systematic error in topographic models derived from UAV and ground‐based image networks abordan cómo para minimizar la distorsión de la autocalibración.
Efecto de tazón en la nube de puntos de un juego de datos de mas de 13,000 imágenes colectadas por el Banco mundial de Tanzania sobre la cuenca propensa a inundaciones de Msimbasi, Dar es Salaam, Tanzania.
Para mitigar este efecto, hay algunas opciones, pero las más simples son las siguientes: vuele dos patrones separados por 20 °, y en lugar de tener una cámara nadir (apuntando hacia abajo), use una que se incline hacia adelante en 5 °.
As this approach takes longer than traditional imaging, pilots and teams may apply this technique to a smaller area and use the collected data to optimize future flights. OpenDroneMap can generate a calibration file called cameras.json from a small sample flight. The calibration file can be used for future flights, mitigating the bowling effect without sacrificing efficiency.
Alternativamente, se puede aplicar el siguiente método experimental: volar con una superposición mucho menor, pero dos vuelos de rejilla cruzada (a veces llamados rayados cruzados) separados por 20 ° con una cámara de 5 ° orientada hacia adelante.
Los porcentajes de superposición de rejillas cruzadas pueden ser más bajos que los vuelos paralelos. Para obtener buenos resultados en 3D, necesitará un 68% de superposición y superposición lateral para una superposición y superposición lateral equivalente del 83%.
Para obtener buenos resultados en 2D y 2.5D (modelo de elevación digital), necesitará un 42% de superposición y superposición lateral para una superposición y superposición lateral equivalente del 70%.
Las líneas de vuelo separadas verticalmente también mejoran la precisión, pero menos que una cámara que mira hacia adelante en 5 °.
De James and Robson (2014), CC BY 4.0
Using Image Masks
Starting from ODM 2.0
people can supply image masks to inform the software to skip reconstruction over certain areas. This is useful for cases where the sky was accidentally included in the input photos from oblique shots, or simply to limit the reconstruction of a single subject.
To add a mask, simply create a new black and white image of the same dimension as the target image you want to mask (you can use a program such as GIMP to do this). Color in black the areas to exclude from the reconstruction.
Name your file:
<filename>_mask.JPG
For example, DJI_0018.JPG
can have a mask by creating a DJI_0018_mask.JPG
file and include that in the list of images. You can use .JPG
, .PNG
, .BMP
and .TIF
formats for image masks.
Using Singularity
Singularity is another container platform able to run Docker images. Singularity can be run both on local machins and in instances where the user does not have root access. Instances where a user may not have root privlidges include HPC clusters and cloud cluster resources. A container is a single file without anything else to install.
Build Singularity image from Docker image
Singularity can use Docker image to build SIF image.
For latest ODM Docker image (Recommended) :
singularity build --disable-cache -f odm_latest.sif docker://opendronemap/odm:latest
For latest ODM GPU Docker image :
singularity build --disable-cache -f odm_gpu.sif docker://opendronemap/odm:gpu
Using Singularity SIF image
Once you have used one of the above commands to download and create the odm_latest.sif image, it can be ran using singularity. Place your images in a directory named “images” (for example /my/project/images) , then simply run :
singularity run --bind /my/project:/datasets/code odm_latest.sif --project-path /datasets
Like with docker, additional Options and Flags can be added to the command :
singularity run --bind /my/project:/datasets/code \
--writable-tmpfs odm_latest.sif \
--orthophoto-png --mesh-octree-depth 12 --dtm \
--smrf-threshold 0.4 --smrf-window 24 --dsm --pc-csv --pc-las --orthophoto-kmz \
--matcher-type flann --feature-quality ultra --max-concurrency 16 \
--use-hybrid-bundle-adjustment --build-overviews --time --min-num-features 10000 \
--project-path /datasets
ClusterODM, NodeODM, SLURM, with Singularity on HPC
You can write a SLURM script to schedule and set up available nodes with NodeODM for the ClusterODM to be wired to if you are on the HPC. Using SLURM will decrease the amount of time and processes needed to set up nodes for ClusterODM each time. This provides an easier way for user to use ODM on the HPC.
To setup HPC with SLURM, you must make sure SLURM is installed.
SLURM script will be different from cluster to cluster, depending on which nodes in the cluster that you have. However, the main idea is we want to run NodeODM on each node once, and by default, each NodeODM will be running on port 3000. Apptainer will be taking available ports starting from port 3000, so if your node’s port 3000 is open, by default NodeODM will be run on that node. After that, we want to run ClusterODM on the head node and connect the running NodeODMs to the ClusterODM. With that, we will have a functional ClusterODM running on HPC.
Here is an example of SLURM script assigning nodes 48, 50, 51 to run NodeODM. You can freely change and use it depending on your system:
#!/usr/bin/bash
#source. bashrc
#SBATCH --partition=8core
#SBATCH --nodelist-node [48,50, 51]
#SBATCH --time 20:00:00
cd SHOME
cd ODM/NodeODM/
#Launch on Node 48
srun --nodes-1 apptainer run --writable node/ &
#Launch on node 50
srun --nodes-1 apptainer run --writable node/ &
#Launch on node 51
srun --nodes=1 apptainer run --writable node/ &
wait
You can check for available nodes using sinfo:
sinfo
Run the following command to schedule using the SLURM script:
sbatch sample.slurm
You can also check for currently running jobs using squeue:
squeue -u $USER
Unfortunately, SLURM does not handle assigning jobs to the head node. Hence, if we want to run ClusterODM on the head node, we have to run it locally. After that, you can connect to the CLI and wire the NodeODMs to the ClusterODMs. Here is an example following the sample SLURM script:
telnet localhost 8080
> NODE ADD node48 3000
> NODE ADD node50 3000
> NODE ADD node51 3000
> NODE LIST
You should always check to make sure which ports are being used to run NodeODM if ClusterODM is not wired correctly.
It is also possible to pre-populate nodes using JSON. If starting ClusterODM from apptainer or docker, the relevant JSON is available at docker/data/nodes.json. Contents might look similar to the following:
[
{"hostname":"node48","port":"3000","token":""},
{"hostname":"node50","port":"3000","token":""},
{"hostname":"node51","port":"3000","token":""}
]
After finish hosting ClusterODM on the head node and finish wiring it to the NodeODM, you can try tunneling to see if ClusterODM works as expected. Open another shell window in your local machine and tunnel them to the HPC using the following command:
ssh -L localhost:10000:localhost:10000 user@hostname
Replace user and hostname with your appropriate username and the hpc address. Basically, this command will tunnel the port of the hpc to your local port. After this, open a browser in your local machine and connect to http://localhost:10000. Port 10000 is where ClusterODM’s administrative web interface is hosted at. This is what it looks like:
Here you can check the NodeODMs status and even add or delete working nodes.
After that, do tunneling for port 3000 of the HPC to your local machine:
ssh -L localhost:3000:localhost:3000 user@hostname
Port 3000 is ClusterODM’s proxy. This is the place we assign tasks to ClusterODM. Once again, connect to http://localhost:3000 with your browser after tunneling. Here, you can Assign Tasks and observe the tasks” processes.
After adding images in this browser, you can press Start Task and see ClusterODM assigning tasks to the nodes you have wired to. Go for a walk and check the progress.
Development and testing of ODM
Development and testing of code changes can be difficult. The simplest way to do so is modify the code and rebuild docker images from source, much as documented in the README for the ODM repository.
However, having to do a full docker rebuild for each change is time consuming and wasteful. What might be better is to have a dedicated, long running node that allows us to test out changes in near real time.
Fork and clone repository
Set up local NodeODM docker instance
Modify code
Connect to NodeODM instance
Install and use changes
Fork and clone repository
First, let’s fork the ODM repo, and checkout a new branch locally that will function as our development branch.
git checkout -b my_clever_new_change
# Switched to a new branch 'my_clever_new_change'
Set up local NodeODM docker instance
Next, we will set up a NodeODM instance with a locally mounted volume that points to our development branch of ODM
docker run -d --restart unless-stopped -p 3000:3000 -v /path/to/cloned/ODM/repository/data:/code opendronemap/nodeodm
Modify code
For our test today, we will attempt to upgrade Ceres Solver to version 2.2.0. Most external libraries like Ceres can be found in the Superbuild directory. In this case we edit SuperBuild/cmake/External-Ceres.cmake, and set it to use version 2.2.0
Now that we’ve made that small, but substantive change, we need to rebuild Ceres on the docker image for testing.
Connect to NodeODM instance
Let us find out our container name, in case we forgot:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c997a4c5611b opendronemap/nodeodm "/usr/bin/node /var/…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp affectionate_yalow
Now that we know the container name, we will connect to that instance using docker exec as follows:
docker exec -it affectionate_yalow bash
Install and use changes
Let us get the environment prepared for our testing:
root@c997a4c5611b:/var/www# cd /code
./configure.sh install
mkdir /code/SuperBuild/build
cd /code/SuperBuild/build
Next we can rebuild Ceres.
cmake ../.
make -j$(nproc) ceres
...
-- Up-to-date: /code/SuperBuild/install/include/ceres
-- Up-to-date: /code/SuperBuild/install/include/ceres/internal
-- Installing: /code/SuperBuild/install/include/ceres/internal/config.h
-- Installing: /code/SuperBuild/install/include/ceres/internal/export.h
-- Installing: /code/SuperBuild/install/include/ceres/internal/miniglog/glog/logging.h
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets-release.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfig.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfigVersion.cmake
[100%] Completed 'ceres'
[100%] Built target ceres
Success! Now we can either run ODM directly inside this container, use the NodeODM interface to process data, or connect in with WebODM for additional testing.
Aprende a editar y ayuda a mejorar esta página!