Обработка данных аэрофотосъемки средствами открытого пакета OpenDroneMap
Установка OpenDroneMap на виртуальную машину и расчёт базовых продуктов (ортофотоплан, ЦММ, 3D-модель) по данным аэрофотосъемки с использованием планово-высотного обоснования и без него
В связи с бурным развитием как фотограмметрических технологий, так и индустрии простых в освоении БПЛА оснащенных фото/видео-аппаратурой, у специалистов самых разных профилей стал расти интерес к возможностям организации аэрофотосъемки и обработки получаемых данных для дальнейшей работы с географическими продуктами, такими как ортофотопланы, цифровые модели местности, трёхмерные модели. На рынке представлено большое количество решений как аппаратных (преимущественно БПЛА), так и программных. Программные продукты для фотограмметрической обработки данных стали разрабатывать практически все крупные вендоры (Autodesk, Trimble, ...), также появилось множество новых компаний, продвигающих собственные пакеты (Agisoft, Pix4D, DroneDeploy, ...). Параллельно начали развиваться и проекты с открытым исходным кодом. Установка и использование одного из наиболее удачных - OpenDroneMap - рассмотрено в представленной статье.
С учётом доступности дешевых, простых в освоении и эффективных для многих задач БПЛА (см. статью), наличие достаточно мощного бесплатного пакета для обработки данных оказывается очень важным, т.к. позволяет начать работу с фотограмметрическими технологиями с минимальными финансовыми вложениями, что актуально для большого количество людей, работающих или почти бесплатно, или имеющих крайне ограниченное финансирование (добровольные пожарные, археологи, независимые исследователи, научные сотрудники географических институтов...).
OpenDroneMap - технически сложное программное обеспечение, относительно просто которое можно развернуть только в среде Linux Ubuntu. Для того, чтобы доступ к нему мог получить любой пользователь вне зависимости от используемой им операционной системы, в статье подробно описан процесс установки и настройки Ubuntu в виртуальной среде средствами продукта Oracle VirtualBox, использовать который можно на любой современной ОС. Использование виртуальной машины рекомендуется также и тем, кто использует в качестве основной ОС Ubuntu, в целях изоляции пакета с большим количеством зависимостей от основной рабочей среды.
Подготовка среды
Установка Oracle VirtualBox
Oracle VirtualBox - самый популярный в мире открытый настольный гипервизор виртуальных машин, то есть специальное программное обеспечение, предназначенное для создания и запуска виртуальных машин, полноценных операционных систем, работающих внутри вашего основного окружения. С помощью него вы можете работать, к примеру, одновременно с Windows, Linux и MacOS в трёх отдельных окнах, при этом каждая из операционных систем будет считать, что она запущена на отдельном полноценном компьютере. Каждой из виртуальных машин вы можете полноценно управлять, выделять ей строго определенный ресурс и так далее. Большим преимуществом работы с виртуальной машиной является изоляция рабочих сред, так, если при работе с виртуальной системой что-то пошло не так, вы можете просто остановить её, и это никак не отразится на вашей основной системе (которая в терминологии виртуализации называется хостом).
Для начала нужно загрузить на свой компьютер дистрибутив операционной системы, которую необходимо установить как виртуальную машину. В нашем случае это Linux Ubuntu 16.04 LTS - один из наиболее распространненных дистрибутивов Linux, последняя стабильная версия. Дистрибутив доступен на сайте ubuntu.ru/get. Если вы работаете в Windows, с большой долей вероятности вы сможете установить только 32-х разрядную версию Ubuntu, что связано с особенностями виртуализации на системах Microsoft. При работе с Linux-хостом таких проблем обычно не бывает. Для унификации в описываемом примере загрузим именно 32-х разрядную версию.
Теперь загрузим установочный файл Oracle VirtualBox с сайта https://www.virtualbox.org/wiki/Downloads в соответствии с вашей основной операционной системой.
Если вы работаете в Linux, VirtualBox устанавливается через пакетный менеджер, например
sudo apt-get install virtualbox
В Windows нужно пройти стандартный мастер установки, оставляя все опции по умолчанию:
После установки, если вы не сняли флаг на последнем шаге, гипервизор запустится автоматически. Также его в любое время можно запустить стандартными средствами операционной системы.
Установка Ubuntu 14.04 LTS на VirtualBox
Приступаем к созданию виртуальной машины. Нажимаем кнопку "Создать" на главной панели VirtualBox:
На первом этапе необходимо задать имя новой виртуальной машины и её тип. Примем название Ubuntu ODM (от OpenDroneMap) и выберем в списке Linux - Ubuntu (32-bit)"
На следующем этапе задаётся объем оперативной памяти, которое виртуальная машина сможет занимать от доступного хосту объема. Для 32-х разрядных систем не имеет смысла указывать более 4-х гигабайт. Если вы решили установить 64-х разрядную версию Ubuntu, можете указать любой объем (не рекомендуется выделять виртуальной машине >65% всей доступной памяти).
Далее следуют настройки виртуального жесткого диска. Последовательно выбираем "Создать новый жесткий диск", VDI, "Динамический жесткий виртуальный диск":
На следующем этапе нужно определить максимальное физическое место на жестком диске, которое будет позволено занять виртуальной машине, а также расположение файла виртуального жесткого диска. Обратите внимание, что по умолчанию виртуальный жесткий диск будет сохранен в моих документах (для windows) или директории home (для Linux). Часто это неподходящий вариант, особенно если у вас под систему выделен небольшой SSD, и домашние директории расположены на нём. Для хранения виртуального диска можно выбрать любое другое расположение.
Виртуальная машина создана, теперь нужно инициализировать её, собственно установив Linux Ubuntu. В основном окне VirualBox в списке слева появилась Ubuntu ODM. В контекстном меню, вызываемом нажатием правой кнопки мыши, доступны все инструменты управления. Перед инициализацией зайдём в меню "Настроить".
На различных вкладках меню настроек вы можете изменить выделенное количество оперативной памяти, ядер процессора, видеопамяти и так далее. Нас сейчас интересует вкладка "Общие папки": необходимо настроить какое-то общее файловое хранилище, чтобы из виртуальной среды мы могли осуществлять доступ к собственным файлам на хосте. Переходим к "Общие папки" и нажимаем кнопку "Добавить новую общую папку".
В открывшемся меню выбираем путь до папки на хосте, к которой открывается доступ, и её название в виртуальной среде. Обязательно отмечаем галочку "авто-подключение".
В списке общих папок теперь видим добавленную:
Теперь возвращаемся в главное меню VirtualBox и активируем опцию "Запустить" для нашей виртуальной машины:
В первом диалоге необходимо выбрать дистрибутив, загруженный ранее, из которого будет производиться установка операционной системы. Выбираем загруженный файл формата .iso
Загружается установочный мастер Ubuntu. На первом шаге выбираем слева язык и, затем, "Установить Ubuntu":
На следующем шаге устанавливаем оба флага:
Затем указываем "Стереть диск и установить Ubuntu". Не беспокойтесь, речь идёт о виртуальном диске, созданном несколько шагов назад. Ваша основная система и файлы на ней не могут пострадать.
Соглашаемся с предупреждением:
Выбираем часовой пояс и раскладку клавиатуры:
Задаём имя пользователя и пароль. Пароль вам понадобится для установки приложений, так что его следует запомнить.
Дальше установка будет произведена автоматически.
По окончанию установки нужно будет перезагрузиться, нажав Enter:
После этого вы сразу попадёте в интерфейс операционной системы. Поздравляю, вы развернули Ubuntu на виртуальной машине!
Важные сочетания клавиш при работе с virtual-box:
- Правый Ctrl возвращает курсор мыши в хост
- Правый Ctrl+F: развернуть окно с виртуальной машиной в полноэкранный режим.
Настройка Ubuntu 16.04
Пришло время подготовить нашу свежеиспеченную систему к работе. Очень важно освоить базовые навыки работы с терминалом (командной строкой). Вызвать его можно, набрав в строке поиске Terminal (строка поиска вызывается нажатием на логотип Ubuntu в левом верхнем углу или по нажатию кнопки Windows на клавиатуре), либо воспользовавшись горячими клавишами: Ctrl+Alt+T.
Терминал - основное средство взаимодействия с системой. Выглядит так:
Осмотритесь в системе. В правом меню вы можете вызвать оконный файловый менеджер, и управлять файлами как в Windows. Однако вернёмся в терминал. Начнём готовить систему с помощью последовательности команд. Сначала обновим списки в репозиториях с программным обеспечением для пакетного менеджера. Понадобится ввести пароль.
sudo apt-get update
Затем установим программу git
sudo apt-get install git
Здесь пакетный менеджер спросит у вас разрешения на установку. Соглашайтесь! Принимается и "Д", и "Y" (без кавычек).
Также установим пакет meshlab, он нам понадобится для работы с результатами обработки.
sudo apt-get install meshlab
Немного технических вещей. Чтобы мы имели доступ к настроенной ранее общей папке, нужно добавить нашего пользователя в группу vboxsf. Вместо ekazakov используйте своё имя пользователя, введенное на этапе установки.
sudo usermod -G vboxsf -a ekazakov
Также нужно установить пакет улучшений работы VirtualBox с Ubuntu. Для этого выходим из полноэкранного режима виртуальной машины (правый Ctrl+F), если вы были в нём, в окне виртуальной машины сверху находим пункт меню "Devices" и выбираем там опцию "Install Guest Additions CD Image". Если у вас русифицированы эти пункты меню, можно ожидать, что это будет "Устройства" - "Установить дополнение гостевой ОС".
Сразу при активации этой опции вы получите предложение запустить установку дополнений. Соглашаемся и смотрим на процесс установки.
Перезагружаем Ubuntu. Управление выключением и перезагрузкой осуществляется с помощью меню в правом верхнем углу, справа от часов.
После перезагрузки в файловом менеджере вам будет доступна общая папка в меню слева. Система готова к дальнейшим приключениям.
Установка OpenDroneMap на Ubuntu 16.04 LTS
Снова откроем терминал. Создадим папку для размещения OpenDroneMap, назовём её odm:
mkdir odm
Перейдем во вновь созданную папку
cd odm
И склонируем в неё все файлы OpenDroneMap с помощью git (точка в конце команды имеет смысл, не забудьте её скопировать тоже)
git clone https://github.com/OpenDroneMap/OpenDroneMap.git .
Размер загружаемого пакета весьма велик, несколько больше 1 гигабайта.
После окончания загрузки настроим переменные среды:
export PYTHONPATH=$PYTHONPATH:`pwd`/SuperBuild/install/lib/python2.7/dist-packages:`pwd`/SuperBuild/src/opensfm export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/SuperBuild/install/lib
И, наконец, запустим настройку и конфигурирование OpenDroneMap
./configure.sh install
На этом этапе будет происходить очень много всего, но без вашего участия. Запаситесь терпением минут на 15-20.
Некоторые типичные проблемы при установке
OpenDroneMap
Собственно обработка данных и расчёт производных продуктов осуществляется запуском одной единственной команды. В терминале из директории размещения OpenDroneMap (в моём случае /home/ekazakov/odm) вызывается модуль run.py:
python run.py <имя проекта>
Все настройки, режимы, ссылки на исходные данные и так далее указываются в виде ключей к этой команде. Всё просто и удобно.
Список настроек для запуска ODM
-h, --help show this help message and exit --images <path>, -i <path> Path to input images --project-path <path> Path to the project folder --resize-to <integer> resizes images by the largest side --skip-resize skips the resize step altogether and instead just copies the images into the resized folder --start-with <string>, -s <string> Can be one of: resize | opensfm | slam | cmvs | pmvs | odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto --end-with <string>, -e <string> Can be one of:resize | opensfm | slam | cmvs | pmvs | odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto --rerun <string>, -r <string> Can be one of:resize | opensfm | slam | cmvs | pmvs | odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto --rerun-all force rerun of all tasks --rerun-from <string> Can be one of:resize | opensfm | slam | cmvs | pmvs | odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto --video <string> Path to the video file to process --slam-config <string> Path to config file for orb-slam --force-focal <positive float> Override the focal length information for the images --force-ccd <positive float> Override the ccd width information for the images --min-num-features <integer> Minimum number of features to extract per image. More features leads to better results but slower execution. Default: 4000 --matcher-threshold <percent> Ignore matched keypoints if the two images share less than <float> percent of keypoints. Default: 2.0 --matcher-ratio <float> Ratio of the distance to the next best matched keypoint. Default: 0.6 --matcher-neighbors <integer> Number of nearest images to pre-match based on GPS exif data. Set to 0 to skip pre-matching. Neighbors works together with Distance parameter, set both to 0 to not use pre-matching. OpenSFM uses both parameters at the same time, Bundler uses only one which has value, prefering the Neighbors parameter. Default: 8 --matcher-distance <integer> Distance threshold in meters to find pre-matching images based on GPS exif data. Set both matcher- neighbors and this to 0 to skip pre-matching. Default: 0 --opensfm-processes <positive integer> The maximum number of processes to use in dense reconstruction. Default: 1 --use-25dmesh Use a 2.5D mesh to compute the orthophoto. This option tends to provide better results for planar surfaces. Experimental. --use-pmvs Use pmvs to compute point cloud alternatively --cmvs-maxImages <integer> The maximum number of images per cluster. Default: 500 --pmvs-level <positive integer> The level in the image pyramid that is used for the computation. see http://www.di.ens.fr/pmvs/documentation.html for more pmvs documentation. Default: 1 --pmvs-csize <positive integer> Cell size controls the density of reconstructionsDefault: 2 --pmvs-threshold <float: -1.0 <= x <= 1.0> A patch reconstruction is accepted as a success and kept if its associated photometric consistency measure is above this threshold. Default: 0.7 --pmvs-wsize <positive integer> pmvs samples wsize x wsize pixel colors from each image to compute photometric consistency score. For example, when wsize=7, 7x7=49 pixel colors are sampled in each image. Increasing the value leads to more stable reconstructions, but the program becomes slower. Default: 7 --pmvs-min-images <positive integer> Each 3D point must be visible in at least minImageNum images for being reconstructed. 3 is suggested in general. Default: 3 --pmvs-num-cores <positive integer> The maximum number of cores to use in dense reconstruction. Default: 6 --mesh-size <positive integer> The maximum vertex count of the output mesh Default: 100000 --mesh-octree-depth <positive integer> Oct-tree depth used in the mesh reconstruction, increase to get more vertices, recommended values are 8-12. Default: 9 --mesh-samples <float >= 1.0> Number of points per octree node, recommended and default value: 1.0 --mesh-solver-divide <positive integer> Oct-tree depth at which the Laplacian equation is solved in the surface reconstruction step. Increasing this value increases computation times slightly but helps reduce memory usage. Default: 9 --mesh-remove-outliers <percent> Percentage of outliers to remove from the point set. Set to 0 to disable. Applies to 2.5D mesh only. Default: 2 --mesh-wlop-iterations <positive integer> Iterations of the Weighted Locally Optimal Projection (WLOP) simplification algorithm. Higher values take longer but produce a smoother mesh. Applies to 2.5D mesh only. Default: 35 --texturing-data-term <string> Data term: [area, gmi]. Default: gmi --texturing-outlier-removal-type <string> Type of photometric outlier removal method: [none, gauss_damping, gauss_clamping]. Default: gauss_clamping --texturing-skip-visibility-test Skip geometric visibility test. Default: False --texturing-skip-global-seam-leveling Skip global seam leveling. Useful for IR data.Default: False --texturing-skip-local-seam-leveling Skip local seam blending. Default: False --texturing-skip-hole-filling Skip filling of holes in the mesh. Default: False --texturing-keep-unseen-faces Keep faces in the mesh that are not seen in any camera. Default: False --texturing-tone-mapping <string> Turn on gamma tone mapping or none for no tone mapping. Choices are 'gamma' or 'none'. Default: none --gcp <path string> path to the file containing the ground control points used for georeferencing. Default: None. The file needs to be on the following line format: easting northing height pixelrow pixelcol imagename --use-exif Use this tag if you have a gcp_list.txt but want to use the exif geotags instead --dem Use this tag to build a DEM using a progressive morphological filter in PDAL. --dtm Use this tag to build a DTM (Digital Terrain Model, ground only) using a progressive morphological filter. Check the --dem* parameters for fine tuning. --dsm Use this tag to build a DSM (Digital Surface Model, ground + objects) using a progressive morphological filter. Check the --dem* parameters for fine tuning. --dem-gapfill-steps <positive integer> Number of steps used to fill areas with gaps. Set to 0 to disable gap filling. Starting with a radius equal to the output resolution, N different DEMs are generated with progressively bigger radius using the inverse distance weighted (IDW) algorithm and merged together. Remaining gaps are then merged using nearest neighbor interpolation. generation. Default=4 --dem-resolution <float> Length of raster cell edges in X/Y units. Default: 0.1 --dem-maxangle <positive float> Points that are more than maxangle degrees off-nadir are discarded. Default: 20 --dem-maxsd <positive float> Points that deviate more than maxsd standard deviations from the local mean are discarded. Default: 2.5 --dem-approximate Use this tag use the approximate progressive morphological filter, which computes DEMs faster but is not as accurate. --dem-decimation <positive integer> Decimate the points before generating the DEM. 1 is no decimation (full quality). 100 decimates ~99% of the points. Useful for speeding up generation. Default=1 --dem-terrain-type <string> One of: FlatNonForest, FlatForest, ComplexNonForest, ComplexForest. Specifies the type of terrain. This mainly helps reduce processing time. FlatNonForest: Relatively flat region with little to no vegetation FlatForest: Relatively flat region that is forested ComplexNonForest: Varied terrain with little to no vegetation ComplexForest: Varied terrain that is forested Default=ComplexForest --orthophoto-resolution <float > 0.0> Orthophoto ground resolution in pixels/meterDefault: 20.0 --orthophoto-target-srs <EPSG:XXXX> Target spatial reference for orthophoto creation. Not implemented yet. Default: None --orthophoto-no-tiled Set this parameter if you want a stripped geoTIFF. Default: False --orthophoto-compression <string> Set the compression to use. Note that this could break gdal_translate if you don't know what you are doing. Options: JPEG, LZW, PACKBITS, DEFLATE, LZMA, NONE. Default: DEFLATE --orthophoto-bigtiff {YES,NO,IF_NEEDED,IF_SAFER} Control whether the created orthophoto is a BigTIFF or classic TIFF. BigTIFF is a variant for files larger than 4GiB of data. Options are YES, NO, IF_NEEDED, IF_SAFER. See GDAL specs: https://www.gdal.org/frmt_gtiff.html for more info. Default: IF_SAFER --build-overviews Build orthophoto overviews using gdaladdo. --zip-results compress the results using gunzip --verbose, -v Print additional messages to the console Default: False --time Generates a benchmark file with runtime info Default: False --version Displays version number and exits.