Обработка данных аэрофотосъемки средствами открытого пакета OpenDroneMap: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 28 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Опубликована|opendronemap-intro}}


{{Аннотация|Установка OpenDroneMap на виртуальную машину и расчёт базовых продуктов (ортофотоплан, ЦММ, 3D-модель) по данным аэрофотосъемки с использованием планово-высотного обоснования и без него}}
{{Аннотация|Установка OpenDroneMap на виртуальную машину и расчёт базовых продуктов (ортофотоплан, ЦММ, 3D-модель) по данным аэрофотосъемки с использованием планово-высотного обоснования и без него}}
''' ПРО ПАМЯТЬ > 4Гб '''


В связи с бурным развитием как фотограмметрических технологий, так и индустрии простых в освоении БПЛА оснащенных фото/видео-аппаратурой, у специалистов самых разных профилей стал расти интерес к возможностям организации аэрофотосъемки и обработки получаемых данных для дальнейшей работы с географическими продуктами, такими как ортофотопланы, цифровые модели местности, трёхмерные модели. На рынке представлено большое количество решений как аппаратных (преимущественно БПЛА), так и программных. Программные продукты для фотограмметрической обработки данных стали разрабатывать практически все крупные вендоры (Autodesk, Trimble, ...), также появилось множество новых компаний, продвигающих собственные пакеты (Agisoft, Pix4D, DroneDeploy, ...). Параллельно начали развиваться и проекты с открытым исходным кодом. Установка и использование одного из наиболее удачных - [http://opendronemap.org/ OpenDroneMap] - рассмотрено в представленной статье.
В связи с бурным развитием как фотограмметрических технологий, так и индустрии простых в освоении БПЛА оснащенных фото/видео-аппаратурой, у специалистов самых разных профилей стал расти интерес к возможностям организации аэрофотосъемки и обработки получаемых данных для дальнейшей работы с географическими продуктами, такими как ортофотопланы, цифровые модели местности, трёхмерные модели. На рынке представлено большое количество решений как аппаратных (преимущественно БПЛА), так и программных. Программные продукты для фотограмметрической обработки данных стали разрабатывать практически все крупные вендоры (Autodesk, Trimble, ...), также появилось множество новых компаний, продвигающих собственные пакеты (Agisoft, Pix4D, DroneDeploy, ...). Параллельно начали развиваться и проекты с открытым исходным кодом. Установка и использование одного из наиболее удачных - [http://opendronemap.org/ OpenDroneMap] - рассмотрено в представленной статье.
Строка 10: Строка 8:


OpenDroneMap - технически сложное программное обеспечение, относительно просто которое можно развернуть только в среде Linux Ubuntu. Для того, чтобы доступ к нему мог получить любой пользователь вне зависимости от используемой им операционной системы, в статье подробно описан процесс установки и настройки Ubuntu в виртуальной среде средствами продукта Oracle VirtualBox, использовать который можно на любой современной ОС. Использование виртуальной машины рекомендуется также и тем, кто использует в качестве основной ОС Ubuntu, в целях изоляции пакета с большим количеством зависимостей от основной рабочей среды.
OpenDroneMap - технически сложное программное обеспечение, относительно просто которое можно развернуть только в среде Linux Ubuntu. Для того, чтобы доступ к нему мог получить любой пользователь вне зависимости от используемой им операционной системы, в статье подробно описан процесс установки и настройки Ubuntu в виртуальной среде средствами продукта Oracle VirtualBox, использовать который можно на любой современной ОС. Использование виртуальной машины рекомендуется также и тем, кто использует в качестве основной ОС Ubuntu, в целях изоляции пакета с большим количеством зависимостей от основной рабочей среды.
Дополнительно в статье описывается упрощенный доступ к функциональности ODM - с помощью Docker или с помощью LiveCD ODM (рекомендуется для начала работы).


==Подготовка среды==
==Подготовка среды==
Строка 17: Строка 17:
Oracle VirtualBox - самый популярный в мире открытый настольный гипервизор виртуальных машин, то есть специальное программное обеспечение, предназначенное для создания и запуска виртуальных машин, полноценных операционных систем, работающих внутри вашего основного окружения. С помощью него вы можете работать, к примеру, одновременно с Windows, Linux и MacOS в трёх отдельных окнах, при этом каждая из операционных систем будет считать, что она запущена на отдельном полноценном компьютере. Каждой из виртуальных машин вы можете полноценно управлять, выделять ей строго определенный ресурс и так далее. Большим преимуществом работы с виртуальной машиной является изоляция рабочих сред, так, если при работе с виртуальной системой что-то пошло не так, вы можете просто остановить её, и это никак не отразится на вашей основной системе (которая в терминологии виртуализации называется хостом).
Oracle VirtualBox - самый популярный в мире открытый настольный гипервизор виртуальных машин, то есть специальное программное обеспечение, предназначенное для создания и запуска виртуальных машин, полноценных операционных систем, работающих внутри вашего основного окружения. С помощью него вы можете работать, к примеру, одновременно с Windows, Linux и MacOS в трёх отдельных окнах, при этом каждая из операционных систем будет считать, что она запущена на отдельном полноценном компьютере. Каждой из виртуальных машин вы можете полноценно управлять, выделять ей строго определенный ресурс и так далее. Большим преимуществом работы с виртуальной машиной является изоляция рабочих сред, так, если при работе с виртуальной системой что-то пошло не так, вы можете просто остановить её, и это никак не отразится на вашей основной системе (которая в терминологии виртуализации называется хостом).


Для начала нужно загрузить на свой компьютер дистрибутив операционной системы, которую необходимо установить как виртуальную машину. В нашем случае это Linux Ubuntu 16.04 LTS - один из наиболее распространненных дистрибутивов Linux, последняя стабильная версия. Дистрибутив доступен на сайте [http://ubuntu.ru/get ubuntu.ru/get]. Если вы работаете в Windows, с большой долей вероятности вы сможете установить только 32-х разрядную версию Ubuntu, что связано с особенностями виртуализации на системах Microsoft. При работе с Linux-хостом таких проблем обычно не бывает. Для унификации в описываемом примере загрузим именно 32-х разрядную версию.
Для начала нужно загрузить на свой компьютер дистрибутив операционной системы, которую необходимо установить как виртуальную машину. В нашем случае это '''Linux Ubuntu 16.04 LTS''' - один из наиболее распространненных дистрибутивов Linux, последняя стабильная версия. Дистрибутив доступен на сайте [http://ubuntu.ru/get ubuntu.ru/get]. Если вы работаете в Windows, с большой долей вероятности вы сможете установить только 32-х разрядную версию Ubuntu, что связано с особенностями виртуализации на системах Microsoft. При работе с Linux-хостом таких проблем обычно не бывает. Для унификации в описываемом примере загрузим именно 32-х разрядную версию.


[[Файл:Opendronemap_1.png|center|thumb|600px|Сайт с ссылками на дистрибутивы Linux Ubuntu]]
[[Файл:Opendronemap_1.png|center|thumb|600px|Сайт с ссылками на дистрибутивы Linux Ubuntu]]
Строка 37: Строка 37:
После установки, если вы не сняли флаг на последнем шаге, гипервизор запустится автоматически. Также его в любое время можно запустить стандартными средствами операционной системы.
После установки, если вы не сняли флаг на последнем шаге, гипервизор запустится автоматически. Также его в любое время можно запустить стандартными средствами операционной системы.


===Установка Ubuntu 14.04 LTS на VirtualBox===
===Установка Ubuntu 16.04 LTS на VirtualBox===


Приступаем к созданию виртуальной машины. Нажимаем кнопку "Создать" на главной панели VirtualBox:
Приступаем к созданию виртуальной машины. Нажимаем кнопку "Создать" на главной панели VirtualBox:
Строка 263: Строка 263:
Посмотрим на запуск подробнее на конкретном примере. Самый распространненный среди любителей, занимающихся аэрофотосъёмкой с около-топографическими целями, вариант - имеется просто набор фотографий с заданным перекрытием, сделанных с какого-нибудь коптера в надир или почти в надир. Никакого наземного планово-высотного обоснования не обеспечивалось.
Посмотрим на запуск подробнее на конкретном примере. Самый распространненный среди любителей, занимающихся аэрофотосъёмкой с около-топографическими целями, вариант - имеется просто набор фотографий с заданным перекрытием, сделанных с какого-нибудь коптера в надир или почти в надир. Никакого наземного планово-высотного обоснования не обеспечивалось.


ЗАГРУЗИТЬ ПРИМЕР ДАННЫХ
[https://drive.google.com/file/d/0BztNh0nXzyjbVE1ETWMxczJUX2c/view?usp=sharing ЗАГРУЗИТЬ ПРИМЕР ДАННЫХ (1)]


Пример простой и содержит 33 фотографии, выполненных аппаратом DJI Phantom 3 Advanced с высоты 150 метров в августе 2016 года, камера работала в автоматическом режиме.
Пример простой и содержит 33 фотографии, выполненных аппаратом DJI Phantom 3 Advanced с высоты 150 метров в августе 2016 года, камера работала в автоматическом режиме.
Строка 293: Строка 293:


<pre>
<pre>
python run.py odm_non_gcp --project-path /home/ekazakov/odm_projects
python run.py odm_non_gcp --project-path /home/ekazakov/odm_projects --dtm
</pre>
</pre>


Здесь происходит следующее: запускается обработка с настройками по умолчанию для данных из набора odm_non_gcp, при этом ключом --project-path указывается расположение наборов данных. То есть в директории указанной после --project-path будет искаться директирия odm_non_gcp, в ней images, и уже там - исходные фотографии. Ключ --dtm указан для того, чтобы в сгенерировать цифровую модель местности. Более подробно о возможных ключах - в разделе "Список настроек для запуска ODM".
Здесь происходит следующее: запускается обработка с настройками по умолчанию для данных из набора odm_non_gcp, при этом ключом --project-path указывается расположение наборов данных. То есть в директории указанной после --project-path будет искаться директирия odm_non_gcp, в ней images, и уже там - исходные фотографии. Ключ --dtm указан для того, чтобы в сгенерировать цифровую модель местности (в данном случае только поверхности, см. также параметры --dem и --dsm). Более подробно о возможных ключах - в разделе "Список настроек для запуска ODM".


После запуска в консоли вы сможете наблюдать ход выполнения всех операций, начиная с загрузки и масштабирования фотографий, заканчивая построением моделей.
После запуска в консоли вы сможете наблюдать ход выполнения всех операций, начиная с загрузки и масштабирования фотографий, заканчивая построением моделей. По окончанию работы вы получите сообщение
<pre>
[INFO]    OpenDroneMap app finished
</pre>


Будем смотреть, что же получилось! Если заглянуть в директорую с проектом, заметим, что добавлось много всего
 
[[Файл:Opendronemap_37.png|center|thumb|600px|Директория с проектом]]
 
Здесь вы сможете найти все промежуточные расчеты, преобразованные исходные фотографии, текструры и многое другое. Особый интерес представляют следующие файлы:
* /odm_orthophoto/odm_orthophoto.tif - ортофотоплан, сразу в GeoTiff, если ваши фотографии имели координаты в exif. Собственно, один из основных результатов, можно сразу открывать в любой ГИС и работать.
* /odm_orthophoto/odm_orthophoto.png - ортофотоплан в PNG. Открывается любым штатным просмотрщиком фотографий.
 
 
[[Файл:Opendronemap_39.png|center|thumb|600px|Ортофотоплан открытый в QGIS]]
 
 
* /odm_dem/dtm.tif - цифровая модель местности (только поверхность), также в GeoTiff
 
 
[[Файл:Opendronemap_40.png|center|thumb|600px|Цифровая модель местности открытая в QGIS]]
 
 
* /odm_texturing/odm_textured_model_geo.obj - трёхмерная текстурированная модель. Можно сразу открыть и покрутить в meshlab, который мы установили ранее. Всё очень просто, запускаете meshlab из окна поиска приложений (как запускался терминал в начале), и стандартной кнопкой "Import mesh" открываете файл odm_textured_model_geo.obj
 
[[Файл:Opendronemap_38.png|center|thumb|600px|Крутим трёхмерную текстурированную модель в meshlab]]


===Подготовка данных для расчёта с опорными точками===
===Подготовка данных для расчёта с опорными точками===
Обычно при проведении аэрофотосъемки также проводятся геодезические работы по созданию планово-высотного обоснования (ПВО), чтобы фотограмметрические модели уравнивались с учётом реальных координат отдельных точек. Это позволяет получать модели более строгие с топографической точки зрения, и в нужной системе координат. Обычно ПВО представляет собой размещение на местности заметных объектов (в моём случае белых тарелочек, важно, чтобы объекты были однозначно идентифицируемы на фотоснимках) и вычисление их координат с высокой точностью геодезическими методами (в моём случае статические ГНСС-наблюдения от местной геодезической сети или полигонометрия). Разберёмся, как в OpenDroneMap строить модели с учётом опорных точек.
Решение этой задачи несложное технически, но потребует некоторых временных затрат. Необходимо создать текстовый файл следующего содержания:
<pre>
Информация о системе координат
"Координата X точки в указанной системе координат" "Координата Y точки в указанной системе координат" "Высота точки" "Координата X точки в системе координат фотографии" "Координата Y точки в системе координат фотографии" "Имя файла с фотографией, для которого указывались данные"
...
"Координата X точки в указанной системе координат" "Координата Y точки в указанной системе координат" "Высота точки" "Координата X точки в системе координат фотографии" "Координата Y точки в системе координат фотографии" "Имя файла с фотографией, для которого указывались данные"
</pre>
Важные моменты. Система координат описывается строкой вида "WGS84 UTM 36N" или "EPSG:4326"
Первые три координаты в строке - те самые, полученные геодезическими методами. Координаты же в системе координат фотоснимка представляют собой следующее. Единица - один пиксель. Начало системы координат в левом верхнем углу фотографии, направление X - вправо, направление Y - вверх. Так, например, пиксель в семнадцатой строке и двадцатом столбце фотографии будет иметь координаты (20, 17).
Задача заключается в том, чтобы описать все появления опорных точек на всех фотографиях. Так, если у вас пять опорных точек и пять фотографий, на каждую из которых попадают все пять точек, то записей в файле будет 25 штук. Для удобства описания можно использовать такую структуру файла:
<pre>
Информация о системе координат
x1 y1 z1 photo_x1 photo_y1 photo_name1
x1 y1 z1 photo_x2 photo_y2 photo_name2
x1 y1 z1 photo_x3 photo_y3 photo_name3
x2 y2 z2 photo_x1 photo_y1 photo_name1
x2 y2 z2 photo_x2 photo_y2 photo_name2
x2 y2 z2 photo_x3 photo_y3 photo_name3
...
</pre>
Решение задачи предполагает следующие шаги:
* Выбор фотографии
* Визуальная идентификация на фотографии опорных точек, на неё попавших
* Вычисление координат этих точек в системе координат фотоснимка
* Запись соответствующих строк в файл
* Переход к следующей фотографии
При этом критически важным оказывается количество и пространственное распределение опорных точек (точки должны быть равномерно распределены по всей площади съемки, точками должны быть обеспечены границы съемки).
[https://drive.google.com/file/d/0BztNh0nXzyjbb3J6YlRudzJjVHM/view?usp=sharing ЗАГРУЗИТЬ ПРИМЕР ДАННЫХ (2)]
Итак, для примера возьмём фотографию из тестового набора (2) с именем DJI_0256.JPG. На ней видно две опорные точки из трёх.
[[Файл:Opendronemap_41.png|center|thumb|600px|Опорные точки на фотоснимке]]
Координаты точки у реки:
<pre>
X:  406085.553
Y: 6170547.408
Z:    118.076
</pre>
Координаты точки у кустов:
<pre>
X:  406161.126
Y: 6170444.479
Z:    117.515
</pre>
Теперь нужно вычислить координаты точек в системе координат фотоснимка. Для этого можно открыть фотографию в любом адекватном растровом редакторе, который умеет показывать координаты курсора мыши в пикселях. Используйте любой, например, Pinta, простой растровый редактор для linux, похожий на Paint.NET в windows. Можем тут же установить этот пакет через терминал
<pre>
sudo apt-get install pinta
</pre>
Если открыть изображение в Pinta, координаты курсора мыши вы увидите на верхней панели. Приближаемся к опорной точке, наводим курсор в её центр, переписываем координаты пикселя.
[[Файл:Opendronemap_42.png|center|thumb|600px|Извлечение координат точки на фотоснимке]]
Существует множество других способов извлечь координаты точки, но этот самый бесхитростный. Удобно, к примеру, измерять координаты пикселей в QGIS, добавляя нужные фотографии в проект с выбором системы координат проекта - тогда QGIS их нарисует с началом в 0;0 и условием 1 пиксель - 1 единица системы координат.
Для рассмотренных снимка и точки формируется такая строка:
<pre>
406161.126 6170444.479 117.515 2422 821 DJI_0256.JPG
</pre>
Обращаем внимание на то, что имя фотографии приводится без пути.
Таким образом обрабатываются точки на всех фотографиях. Для тестового набора данных (2) содержимое текстового привязочного файла такое:
<pre>
WGS84 UTM 36N
406085.553 6170547.408 118.076 1909 662 DJI_0310.JPG
406085.553 6170547.408 118.076 1953 1131 DJI_0311.JPG
406085.553 6170547.408 118.076 2001 1600 DJI_0312.JPG
406085.553 6170547.408 118.076 2057 2057 DJI_0313.JPG
406085.553 6170547.408 118.076 2111 2512 DJI_0314.JPG
406085.553 6170547.408 118.076 2429 2571 DJI_0280.JPG
406085.553 6170547.408 118.076 2443 2237 DJI_0279.JPG
406085.553 6170547.408 118.076 928 1694 DJI_0255.JPG
406085.553 6170547.408 118.076 886 1236 DJI_0254.JPG
406085.553 6170547.408 118.076 840 758 DJI_0253.JPG
406085.553 6170547.408 118.076 795 293 DJI_0252.JPG
406085.553 6170547.408 118.076 3472 2215 DJI_0221.JPG
406085.553 6170547.408 118.076 3497 1862 DJI_0220.JPG
406085.553 6170547.408 118.076 3523 1456 DJI_0219.JPG
406085.553 6170547.408 118.076 3549 1062 DJI_0218.JPG
406085.553 6170547.408 118.076 3578 685 DJI_0217.JPG
406085.553 6170547.408 118.076 3615 300 DJI_0216.JPG
406219.544 6170487.534 117.541 2757 327 DJI_0314.JPG
406219.544 6170487.534 117.541 2804 799 DJI_0315.JPG
406219.544 6170487.534 117.541 2856 1264 DJI_0316.JPG
406219.544 6170487.534 117.541 1590 2719 DJI_0275.JPG
406219.544 6170487.534 117.541 1599 2323 DJI_0274.JPG
406219.544 6170487.534 117.541 1613 1913 DJI_0273.JPG
406219.544 6170487.534 117.541 1623 1477 DJI_0272.JPG
406161.126 6170444.479 117.515 3459 197 DJI_0312.JPG
406161.126 6170444.479 117.515 3497 672 DJI_0313.JPG
406161.126 6170444.479 117.515 3538 1146 DJI_0314.JPG
406161.126 6170444.479 117.515 3580 1606 DJI_0315.JPG
406161.126 6170444.479 117.515 3629 2060 DJI_0316.JPG
406161.126 6170444.479 117.515 2575 2191 DJI_0259.JPG
406161.126 6170444.479 117.515 1955 2205 DJI_0218.JPG
406161.126 6170444.479 117.515 1969 1835 DJI_0217.JPG
406161.126 6170444.479 117.515 1986 1463 DJI_0216.JPG
406161.126 6170444.479 117.515 2004 1115 DJI_0215.JPG
406043.604,6170505.052,117.40,2908,421,DJI_0218.JPG
406043.604,6170505.052,117.40,2890,826,DJI_0219.JPG
406043.604,6170505.052,117.40,2871,1245,DJI_0220.JPG
406043.604,6170505.052,117.40,2850,1609,DJI_0221.JPG
406199.778,6170539.616,117.35,2037,1200,DJI_0315.JPG
406199.778,6170539.616,117.35,1992,716,DJI_0314.JPG
406199.778,6170539.616,117.35,1937,237,DJI_0313.JPG
406199.778,6170539.616,117.35,1042,1778,DJI_0259.JPG
406198.261,6170377.141,117.82,931,2036,DJI_0216.JPG
406198.261,6170377.141,117.82,924,2408,DJI_0217.JPG
406198.261,6170377.141,117.82,3484,1048,DJI_0258.JPG
406198.261,6170377.141,117.82,3535,1475,DJI_0259.JPG
406081.978,6170388.068,117.61,1064,1786,DJI_0220.JPG
406081.978,6170388.068,117.61,1074,1369,DJI_0219.JPG
406081.978,6170388.068,117.61,1081,964,DJI_0218.JPG
406081.978,6170388.068,117.61,1091,568,DJI_0217.JPG
406100.288,6170641.896,117.80,510,1559,DJI_0312.JPG
406100.288,6170641.896,117.80,577,2015,DJI_0313.JPG
406100.288,6170641.896,117.80,644,2473,DJI_0314.JPG
406100.288,6170641.896,117.80,699,2913,DJI_0315.JPG
406012.886,6170449.777,116.78,2415,1261,DJI_0252.JPG
406012.886,6170449.777,116.78,2446,1723,DJI_0253.JPG
406012.886,6170449.777,116.78,2035,1091,DJI_0221.JPG
406012.886,6170449.777,116.78,2048,722,DJI_0220.JPG
406012.886,6170449.777,116.78,2483,2182,DJI_0254.JPG
405995.006,6170599.982,117.75,1259,2151,DJI_0310.JPG
405995.006,6170599.982,117.75,1314,2610,DJI_0311.JPG
405995.006,6170599.982,117.75,3258,1214,DJI_0280.JPG
405995.006,6170599.982,117.75,3282,861,DJI_0279.JPG
405995.006,6170599.982,117.75,3307,453,DJI_0278.JPG
</pre>
Не обязательно отмечать все появления всех точек на всех фотографиях, это, очевидно, займёт очень много времени. По окончанию создания файла он аккуратно сохраняется и кладётся куда-нибудь рядом с исходными фотографиями. В архиве с примером точки описаны в файле GCP_list.txt


===Расчёт базовых продутов с опорными точками===
===Расчёт базовых продутов с опорными точками===


===Список настроек для запуска ODM===
Запуск расчётов с опорными точками производится полностью аналогично запуску без оных, с одним дополнением: ключом --gcp и путём до соответствующего файла.
 
Создадим в папке odm_projects новую директорию odm_gcp, в ней images, куда скопируем фотографии из нового набора. В odm_gcp также скопируем файл GCP_list.txt. В терминале возвращаемся в исходное положение, то есть переходим в директорию odm
 
<pre>
cd odm
</pre>
 
И запускаем расчёты, не забыв сослаться на файл с опорными точками и заменить ekazakov на ваше имя пользователя. И на этот раз воспользуемся ключом dsm, чтобы построить более честную, не фильтрованную модель местности.
 
<pre>
python run.py odm_gcp --project-path /home/ekazakov/odm_projects --gcp /home/ekazakov/odm_projects/odm_gcp/GCP_list.txt --dsm
</pre>
 
По окончанию расчётов изучаем результаты в директории /home/ekazakov/odm_projects/odm_gcp, в тех же подпапках, что и ранее. Обратите внимание на файл odm_georeferencing.txt, который сгенерировался в папке odm_georeferencing, там вы найдёте приведенные оценки точности.
 
===Список основных настроек для запуска ODM===
Здесь приведен список основых опций, доступных при запуске OpenDroneMap.
Полный список (на англ.) доступен в [https://github.com/OpenDroneMap/OpenDroneMap/wiki/Run-Time-Parameters официальной документации] или по команде run.py -h
 
<pre>
<pre>
   -h или --help        вывести в консоль сообщение с информацией о возможных
   -h или --help        вывести в консоль сообщение с информацией о возможных
Строка 327: Строка 519:
                         Аналогично, какой операцией закончить:resize | opensfm | slam | cmvs | pmvs |
                         Аналогично, какой операцией закончить:resize | opensfm | slam | cmvs | pmvs |
                         odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
                         odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
   --rerun <параметр> или -r <параметр>
   --rerun <параметр>
                         Перезапустить конкретную операцию.  
                         Перезапустить конкретную операцию.  
                         Параметр может быть:resize | opensfm | slam | cmvs | pmvs |
                         Параметр может быть:resize | opensfm | slam | cmvs | pmvs |
Строка 371: Строка 563:
                         (чем больше, тем быстрее, но интенсивнее задействуются компьютерные ресурсы)
                         (чем больше, тем быстрее, но интенсивнее задействуются компьютерные ресурсы)
                         Значение по умолчанию: 1
                         Значение по умолчанию: 1
   --use-25dmesh        Экспериментальная опция. Использовать 2.5D сетку для построения ортофотоплана.
   --use-25dmesh        Экспериментальная опция. Использовать 2.5-мерную пространственную триангуляцию
                        для построения ортофотоплана.
                         Использование этой опции может обеспечить лучшие результаты для плоских поверхностей.
                         Использование этой опции может обеспечить лучшие результаты для плоских поверхностей.
   --use-pmvs            Использовать pmvs для расчёта облака точек
   --use-pmvs            Использовать pmvs для расчёта облака точек
   --cmvs-maxImages <целое число>
   --cmvs-maxImages <целое число>
                         Максимальное количество изображений в кластере. Значение по умолчанию: 500
                         Максимальное количество изображений в кластере. Значение по умолчанию: 500
  --pmvs-level <целое положительное число>
                        Уровень пирамид изображения для расчёта (для pmvs). Для подробностей:
                        http://www.di.ens.fr/pmvs/documentation.html
                        Значение по умолчанию: 1
  --pmvs-csize <целое положительное число>
                        Размер ячейки для управления плотностью реконструкции. Значение по умолчанию: 2
  --pmvs-threshold <Вещественное число от -1 до 1>
                        Реконструкция блока признаётся удачной и сохраняется если
                        связанное с ней значение photometric consistency measure в
                        пределах указанного значения. Значение по умолчанию: 0.7
  --pmvs-wsize <целое положительное число>
                        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 <целое положительное число>
                        Each 3D point must be visible in at least minImageNum
                        images for being reconstructed. 3 is suggested in
                        general. Default: 3
  --pmvs-num-cores <целое положительное число>
                        The maximum number of cores to use in dense
                        reconstruction. Default: 6
   --mesh-size <целое положительное число>
   --mesh-size <целое положительное число>
                         The maximum vertex count of the output mesh Default:
                         Максимальное количество вершин в выходной пространственной триангуляции
                         100000
                         Значение по умолчанию: 100000
  --mesh-octree-depth <целое положительное число>
                        Oct-tree depth used in the mesh reconstruction,
                        increase to get more vertices, recommended values are
                        8-12. Default: 9
  --mesh-samples <вещественное число большее или равное 1.0>
                        Number of points per octree node, recommended and
                        default value: 1.0
  --mesh-solver-divide <целое положительное число>
                        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 <целое положительное число>
   --mesh-wlop-iterations <целое положительное число>
                         Iterations of the Weighted Locally Optimal Projection
                         Количество итераций процедуры WLOP. Чем больше значения, тем более сглаженной
                        (WLOP) simplification algorithm. Higher values take
                         получается пространственная триангуляция. Применяется к 2.5-мерной триангуляции.
                         longer but produce a smoother mesh. Applies to 2.5D
                         Значение по умолчанию: 35
                        mesh only. Default: 35
   --texturing-tone-mapping <параметр>
  --texturing-data-term <string>
                         Использовать тоновую коррекцию, если параметр указан gamma, не использовать,
                        Data term: [area, gmi]. Default: gmi
                         если none. Значение по умолчанию: none
  --texturing-outlier-removal-type <string>
   --gcp <path string>  Путь до файла с информацией о ПВО. См. соответствующий раздел статьи.
                         Type of photometric outlier removal method: [none,
                         По умолчанию не используется.
                        gauss_damping, gauss_clamping]. Default:
   --use-exif            Использовать данные из exif вместо GCP, даже если файл с ними существует
                        gauss_clamping
   --dem                Построить Цифромую модель рельефа используя морфологической фильтер PDAL
  --texturing-skip-visibility-test
   --dtm                Построить Цифровую модель территории (только поверхность земли) с использованием
                        Skip geometric visibility test. Default: False
                         прогрессивного морфометрического фильтра.
  --texturing-skip-global-seam-leveling
   --dsm                Построить Цифровую модель местности (поверхность + объекты)  
                        Skip global seam leveling. Useful for IR data.Default:
   --dem-approximate    Использовать прогрессивный морфологический фильтр для ЦМР.
                        False
                         Расчёты с ним быстрее, но менее точные.
  --texturing-skip-local-seam-leveling
   --orthophoto-resolution <вещественное число большее 0>
                        Skip local seam blending. Default: False
                         Пространственное разрешение ортофотоплана в пикселях на метр
  --texturing-skip-hole-filling
                         Значение по умолчанию: 20.0 (то есть пять сантиметров на пиксель)
                        Skip filling of holes in the mesh. Default: False
   --orthophoto-compression <параметр>
  --texturing-keep-unseen-faces
                         Вид сжатия для ортофотоплана.
                        Keep faces in the mesh that are not seen in any
                         Возможные значения: JPEG, LZW, PACKBITS, DEFLATE, LZMA, NONE.
                        camera. Default: False
                         Значение по умолчанию: DEFLATE
   --texturing-tone-mapping <string>
   --orthophoto-bigtiff <параметр>
                         Turn on gamma tone mapping or none for no tone
                         Управление созданием ортофотоплана в формате BigTIFF или
                         mapping. Choices are 'gamma' or 'none'. Default: none
                         классический TIFF. BigTIFF - вариант для файлов больших
   --gcp <path string>  path to the file containing the ground control points
                         чем 4 ГБ. Возможные значения параметра: YES, NO, IF_NEEDED,
                        used for georeferencing. Default: None. The file needs
                         IF_SAFER. Для деталей см. спецификацию GDAL:
                         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.
                         https://www.gdal.org/frmt_gtiff.html for more info.
                         Default: IF_SAFER
                         Значение по умолчанию: IF_SAFER
   --build-overviews    Создать обзорные файлы для ортофотопланы с помощью утилиты gdaladdo.
   --build-overviews    Создать обзорные файлы для ортофотопланы с помощью утилиты gdaladdo.
   --zip-results        сжать результаты с помощью gunzip
   --zip-results        сжать результаты с помощью gunzip
Строка 519: Строка 608:
   --version            Вывести в консоль номер версии OpenDroneMap
   --version            Вывести в консоль номер версии OpenDroneMap
</pre>
</pre>
==Альтернативные (упрощенные) способы запустить ODM==
Стандартная полноценная установка OpenDroneMap в Ubuntu часто не увенчивается успехом. Отклонение от необходимой версии операционной системы приводит к конфликтам пакетов и разным другим неприятностям, не всегда получается установить ODM с первого раза даже если строго выдержать все условия и последовательность действий. Однако существуют альтернативные способы получить доступ к функциональности ODM, требующие гораздо меньших усилий. Разберёмся с двумя основными: запуском ODM через систему контейниризации Docker, а также работу с ODM LiveCD - специально подготовленным разработчиками образом операционной системы, где всё уже предустановлено. Тестировать будем на маленьком наборе данных без опорных точек ([https://drive.google.com/file/d/1fNCTG0Sp5DwMu0-AGz44nTHmG3tisx6m/view?usp=sharing скачать]).
===Запуск обработки через Docker в Linux===
[https://www.docker.com/ Docker] — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Упрощая, docker это способ создавать изолированные самодостаточные программные инфраструктуры, к которым обеспечен универсальный доступ. Также docker это большой каталог уже созданных контейнеров, которые можно загружать и использовать на своё усмотрение. Программное обеспечение OpenDroneMap также распространяется как docker-контейнер. Посмотрим, как получить к нему доступ в среде Linux (это может быть виртуальная машина, развёрнутая аналогично пунктам 1.1 - 1.3, либо полноценная операционная система на вашем компьютере).
Для начала нужно установить в ОС инфраструктуру docker. Сделать это не сложно, так как docker включен в список стандартных репозиториев:
<pre>
sudo apt-get install docker.io
</pre>
Перезагрузитесь. Теперь ваш компьютер готов к использованию контейнеров. Удобная особенность распространения контейнеров docker заключается в том, что вы можете выполнить обработку данных средствами контейнера при первом же запросе на его получение. Подготовьте простую инфраструктуру папок для ваших данных. Например, я создал в домашней директории /home/ekazakov папку flight_1, в ней папку images, где разместил все фотографии, которые хотел бы использовать для обработки. Т.е. все фотографии находятся в расположении /home/ekazakov/flight_1/images/image1.jpg. Для тестирования можно использовать те же самые фотографии, которые предлагались ранее. Больше ничего готовить не нужно. Переходим в терминал и выполняем следующую команду:
<pre>
sudo docker run -it --rm -v "/home/ekazakov/flight_1/images:/code/images" -v "/home/ekazakov/flight_1/odm_orthophoto:/code/odm_orthophoto" -v "/home/ekazakov/flight_1/odm_georeferencing:/code/odm_georeferencing" -v "/home/ekazakov/flight_1/odm_dtm:/code/odm_dtm" opendronemap/odm --mesh-size 100000 --dtm
</pre>
Давайте разберёмся с каждым компонентом этой строки.
sudo docker run - основная команда. Передаём операционной системе, что нам необходимо использовать docker с опцией run, то есть мы хотим запустить контейнер.
Опция -it обеспечивает интерактивное взаимодействие со средой контейнера.
Опция --rm автоматически закроет контейнер после того, как он обработает введенную команду.
Далее мы видим четыре подряд идущих опции с ключом -v, они обеспечивают связь между внутренней файловой системой контейнера и файловой системой вашей операционной системы - то есть контейнер может брать файлы из ваших папок, и записывать результаты обработки в них. Например, команда -v "/home/ekazakov/flight_1/images:/code/images связала внутреннюю папку контейнера /code/images с моей директорией /home/ekazakov/flight_1/images. Таким образом мы связали четыре директории - одну с исходными фотографиями, и для три результирующих файлов: ЦММ (odm_dtm), ортофотоплана (odm_orthophoto) и отчётных материалов (odm_georeferencing).
Далее указывается собственно название нужного docker-контейнера: '''opendronemap/odm'''. Docker сначала попробует обнаружить его локально, в случае неудачи начнёт загрузку с онлайн-репозитория. В первый запуск вам придётся подождать загрузки, все дальнейшие запуски будут производиться уже с загруженной локальной копии. Обратите внимание, что на сайте ODM в примерах запуска допущена ошибка - правильное название контейнера '''opendronemap/odm''', а не opendronemap/opendronemap.
После названия контейнера задаются параметры обработки. Это ровно те же параметры, что в п. 2.5. В данном случае мы наклалываем ограничение на макс. количество вершин триангуляции ('''--mesh-size 10000''') и просим ODM посчитать ЦММ ('''--dtm'''). При необходимости вы можете задать опорные точки (ключ --gcp, путь до файла в одной из примонтированных с помощью -v директорий)
Начинается загрузка (если запустили контейнер впервые) и выполнение обработки. Ваше участие больше не требуется. Все происходящие события отражаются в терминале.
[[Файл:Opendronemap_ubuntu_docker_dwnld.png|center|thumb|600px|Так отображается загрузка контейнера]]
[[Файл:Opendronemap_ubuntu_docker_proc.png|center|thumb|600px|Обработка данных в разгаре]]
В результате, после того как в терминале вы увидите красивый сивольный логотип OpenDroneMap, в папках /home/ekazakov/flight_1/odm_orthophoto, /home/ekazakov/flight_1/odm_georeferencing и /home/ekazakov/flight_1/odm_dtm окажутся сохранены все результаты.
Открываем ортофотоплан в QGIS - всё отлично.
[[Файл:Opendronemap_ubuntu_docker_ortho.png|center|thumb|600px|Результирующий ортофотоплан]]
===Работа с LiveCD ODM и WebODM===
Ещё одна опция удобной работы с OpenDroneMap - LiveCD ODM. Это дистрибутив Linux Lubuntu, в который встроены программные модули ODM. Вы можете установить и использовать LiveCD ODM в четырёх сценариях:
* Как LiveCD (без установки) в гипервизоре виртуальных машин
* Как полноценную виртуальную машину по аналогии с описанным выше механизмом
* Как LiveCD (без установки) на вашем основном компьютере
* Как полноценную операционную систему на вашем основном компьютере (как основную или дополнительную ОС)
[https://drive.google.com/file/d/1ZSQRfhHmiEWnazlJRy6UEzKaYElDFv4l/edit Скачать образ в формате .iso]
Установка образа в гипервизоре виртуальных машин или в качестве полноценной ОС почти ничем не отличается от описанного в п. 1, так как Linux Lubuntu основана на Linux Ubuntu и имеет точно такие же интерфейсы установки. Если вы хотите использовать образ не в гипервизоре виртуальных машин, а полноценно, сначала запишите его на USB, это можно сделать [https://www.google.com/search?q=write+iso+to+usb&oq=write+iso+to+usb множеством способов]. Самый простой способ начать работу с LiveCD ODM - записать образ на usb-носитель, перезагрузить компьютер выбрав этот usb-носитель в качестве устройства для загрузки, и выбрать режим Try Lubuntu without installing. Таким образом вы быстро попадёте в интерфейс, пригодный для работы с данными аэрофотосъёмки.
Итак, после запуска LiveCD вы увидите следующий интерфейс:
[[Файл:Opendronemap_live_overview.png|center|thumb|600px|Внешний вид интерфейса LiveODM]]
На рабочем столе доступно два ярлыка: OpenDroneMap CLI и WebODM. Запустив OpenDroneMap CLI вы получите терминал, готовый к немедленному запуску python run.py, тому самому, описанному в разделе 2. Более интересный для нас вариант - WebODM, это замечательно сделанный веб-интерфейс, позволяющий быстро и удобно обработать данные. С ним и разберёмся. Запустив WevODM, вам будет предложено создать пользователя - выбирайте имя пользователя и пароль. После этого вы попадёте в основной интерфейс WebODM, главное меню расположено слева.
[[Файл:Opendronemap_live_start.png|center|thumb|600px|Первый экран WebODM]]
Начать работу очень просто, выберите опцию "Add Project" в правой части интерфейса, определите его название и описание в открывшемся окне.
[[Файл:Opendronemap_live_new_project.png|center|thumb|600px|Создание нового проекта]]
Для нового проекта выберите опцию Select Images and GCP, при этом откроется диалоговое окно выбора фотографий. Выбирайте всё, что хотите обработать. Если у вас есть файл с опорными точками (GCP), выбирайте также и его. После выбора раскроется меню настроек, в нём вы увидите количество выбранных файлов, сможете задать название для задачи обработки, выбрать узел обработки (в нашем случае это только наш компьютер), можем сконфигурировать все опции). Для начала обработки нужно нажать Review, а затем Start - процесс начнётся.
[[Файл:Opendronemap_live_new_review.png|center|thumb|600px|Выбор файлов и review опций]]
Процесс пошёл! Если вы переключите опцию Task Output с Off на On, то увидите вывод, точно такой же, как при запуске через run.py или через docker. Также в наличии индикатор прогресса.
[[Файл:Opendronemap_live_new_progress.png|center|thumb|600px|Процесс обработки с выводом текущего состояния]]
По окончанию обработки вы будете уведомлены.
[[Файл:Opendronemap_live_finish.png|center|thumb|600px|Обработка окончена]]
Собственно, вся работа сделана, теперь вы можете загрузить все результаты обработки, для этого раскройте выпадающий список Download Assets. Для загрузки доступны:
* Ортофотоплан в GeoTiff/MBTiles/обычных тайлах
* Модель поверхности в GeoTiff/тайлах
* Облако точек в LAZ
* Текстурированная модель
* Параметры камеры
[[Файл:Opendronemap_live_assets.png|center|thumb|600px|Загрузка результатов]]
Результаты загружаются как обычные файлы браузером. Просто скачайте их и положите на usb-носитель или доступный из LiveCD основной диск вашего компьютера. Выходите из LiveCD и используйте полученные данные.
[[Файл:Opendronemap_live_dwnld.png|center|thumb|600px|Загрузка результатов]]
Помимо возможности скачать данные, WebODM предоставляет возможность их изучить непосредственно в веб-интерфейсе. К вашим услугам картографический обзорщик, доступный по кнопке View Map.
[[Файл:Opendronemap_live_map.png|center|thumb|600px|Загрузка результатов]]
И обзорщик трёхмерной модели, доступный по кнопке View 3D Model.
[[Файл:Opendronemap_live_3d.png|center|thumb|600px|Загрузка результатов]]
В обоих инструментах просмотра доступны разнообразные инструменты для измерений, весьма полезно.
Ещё одна крайне полезная функциональность WebODM это конструктор файла опорных точек. Посмотрите ещё раз, каким трудом нам давался этот процесс в основной части статьи! Пункт главного меню GCP Interface может значительно облагчить вашу судьбу, но только если вы можете привязать ваши данные к одной из базовых карт (OSM или спутниковая подложка).
[[Файл:Opendronemap_live_gcp_start.png|center|thumb|600px|Интерфейс GCP]]
Работает инструмент так - выбираете пункт "Choose images / drag here" и выбираете фотографии, на которых хотите поставить GCP. Затем двойным кликом переходите к фотографии для текущей работы. Она раскроется в левой части интерфейса. В правой части интерфейса у вас интерактивная веб-карта, где можно менять подложки и даже использовать свою. Нажимайте на иконку + над панелью с фотографией. Размещайте опорную точку на фотографии. Нажимайте + ещё раз, теперь размещайте точку на базовой карте. Щелкните на той и на другой точках левой кнопкой мыши - они свяжутся и подсветятся зелёным цветом. Повторяйте, пока есть силы.
[[Файл:Opendronemap_live_gcp_edit.png|center|thumb|600px|Добавление GCP]]
После этого используйте опцию Export File (над базовой картой). Так вы получите результат, аналогичный ручному созданию файла в основной части статьи. Такой способ не подойдёт, если вы готовили опорные точки специально геодезическими методами на временных метках (на базовой карте вы эти точки не обнаружите).
WebODM очень удобный и приятный инструмент, к тому же не требующий работы с командной строкой. Конечно, запустить его можно не только в LiveCD, но и установить на собственный компьютер/сервер, виртуальную машину. Можно собрать WebODM из [https://github.com/OpenDroneMap/WebODM/ исходников] или [https://www.opendronemap.org/webodm/download/#installer купить готовый инсталлятор].

Текущая версия от 09:16, 29 сентября 2019

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/opendronemap-intro.html


Установка OpenDroneMap на виртуальную машину и расчёт базовых продуктов (ортофотоплан, ЦММ, 3D-модель) по данным аэрофотосъемки с использованием планово-высотного обоснования и без него

В связи с бурным развитием как фотограмметрических технологий, так и индустрии простых в освоении БПЛА оснащенных фото/видео-аппаратурой, у специалистов самых разных профилей стал расти интерес к возможностям организации аэрофотосъемки и обработки получаемых данных для дальнейшей работы с географическими продуктами, такими как ортофотопланы, цифровые модели местности, трёхмерные модели. На рынке представлено большое количество решений как аппаратных (преимущественно БПЛА), так и программных. Программные продукты для фотограмметрической обработки данных стали разрабатывать практически все крупные вендоры (Autodesk, Trimble, ...), также появилось множество новых компаний, продвигающих собственные пакеты (Agisoft, Pix4D, DroneDeploy, ...). Параллельно начали развиваться и проекты с открытым исходным кодом. Установка и использование одного из наиболее удачных - OpenDroneMap - рассмотрено в представленной статье.

С учётом доступности дешевых, простых в освоении и эффективных для многих задач БПЛА (см. статью), наличие достаточно мощного бесплатного пакета для обработки данных оказывается очень важным, т.к. позволяет начать работу с фотограмметрическими технологиями с минимальными финансовыми вложениями, что актуально для большого количество людей, работающих или почти бесплатно, или имеющих крайне ограниченное финансирование (добровольные пожарные, археологи, независимые исследователи, научные сотрудники географических институтов...).

OpenDroneMap - технически сложное программное обеспечение, относительно просто которое можно развернуть только в среде Linux Ubuntu. Для того, чтобы доступ к нему мог получить любой пользователь вне зависимости от используемой им операционной системы, в статье подробно описан процесс установки и настройки Ubuntu в виртуальной среде средствами продукта Oracle VirtualBox, использовать который можно на любой современной ОС. Использование виртуальной машины рекомендуется также и тем, кто использует в качестве основной ОС Ubuntu, в целях изоляции пакета с большим количеством зависимостей от основной рабочей среды.

Дополнительно в статье описывается упрощенный доступ к функциональности ODM - с помощью Docker или с помощью LiveCD ODM (рекомендуется для начала работы).

Подготовка среды

Установка Oracle VirtualBox

Oracle VirtualBox - самый популярный в мире открытый настольный гипервизор виртуальных машин, то есть специальное программное обеспечение, предназначенное для создания и запуска виртуальных машин, полноценных операционных систем, работающих внутри вашего основного окружения. С помощью него вы можете работать, к примеру, одновременно с Windows, Linux и MacOS в трёх отдельных окнах, при этом каждая из операционных систем будет считать, что она запущена на отдельном полноценном компьютере. Каждой из виртуальных машин вы можете полноценно управлять, выделять ей строго определенный ресурс и так далее. Большим преимуществом работы с виртуальной машиной является изоляция рабочих сред, так, если при работе с виртуальной системой что-то пошло не так, вы можете просто остановить её, и это никак не отразится на вашей основной системе (которая в терминологии виртуализации называется хостом).

Для начала нужно загрузить на свой компьютер дистрибутив операционной системы, которую необходимо установить как виртуальную машину. В нашем случае это Linux Ubuntu 16.04 LTS - один из наиболее распространненных дистрибутивов Linux, последняя стабильная версия. Дистрибутив доступен на сайте ubuntu.ru/get. Если вы работаете в Windows, с большой долей вероятности вы сможете установить только 32-х разрядную версию Ubuntu, что связано с особенностями виртуализации на системах Microsoft. При работе с Linux-хостом таких проблем обычно не бывает. Для унификации в описываемом примере загрузим именно 32-х разрядную версию.

Сайт с ссылками на дистрибутивы Linux Ubuntu

Теперь загрузим установочный файл Oracle VirtualBox с сайта https://www.virtualbox.org/wiki/Downloads в соответствии с вашей основной операционной системой.

Сайт с ссылками на дистрибутивы Oracle VirtualBox

Если вы работаете в Linux, VirtualBox устанавливается через пакетный менеджер, например

sudo apt-get install virtualbox

В Windows нужно пройти стандартный мастер установки, оставляя все опции по умолчанию:

Установка VirtualBox в Windows (нажмите на изображение, чтобы увеличить)

После установки, если вы не сняли флаг на последнем шаге, гипервизор запустится автоматически. Также его в любое время можно запустить стандартными средствами операционной системы.

Установка Ubuntu 16.04 LTS на VirtualBox

Приступаем к созданию виртуальной машины. Нажимаем кнопку "Создать" на главной панели VirtualBox:

Создание новой виртуальной машины

На первом этапе необходимо задать имя новой виртуальной машины и её тип. Примем название Ubuntu ODM (от OpenDroneMap) и выберем в списке Linux - Ubuntu (32-bit)"

Настройки новой виртуальной машины

На следующем этапе задаётся объем оперативной памяти, которое виртуальная машина сможет занимать от доступного хосту объема. Рекомендуется предоставить ей больше 4-х гигабайт оперативной памяти, например, 6. Это имеет смысл даже при работе с 32-х разрядной версией ОС, т.к. Ubuntu умеет использовать память свыше лимита, привычного в Windows. Если вы решили установить 64-х разрядную версию Ubuntu, тем более можете указать любой объем (не рекомендуется выделять виртуальной машине >65% всей доступной памяти, но если не сильно нагружать хост при работе с виртуальной машиной, то ничего катастрофического не произойдёт). При недостатке оперативной памяти на виртуальной машине (<= 4 ГБ) некоторые компоненты OpenDroneMap, возможно, не смогут быть установлены.

Настройки новой виртуальной машины

Далее следуют настройки виртуального жесткого диска. Последовательно выбираем "Создать новый жесткий диск", VDI, "Динамический жесткий виртуальный диск":

Настройки новой виртуальной машины
Настройки новой виртуальной машины
Настройки новой виртуальной машины

На следующем этапе нужно определить максимальное физическое место на жестком диске, которое будет позволено занять виртуальной машине, а также расположение файла виртуального жесткого диска. Обратите внимание, что по умолчанию виртуальный жесткий диск будет сохранен в моих документах (для windows) или директории home (для Linux). Часто это неподходящий вариант, особенно если у вас под систему выделен небольшой SSD, и домашние директории расположены на нём. Для хранения виртуального диска можно выбрать любое другое расположение.

Настройки новой виртуальной машины

Виртуальная машина создана, теперь нужно инициализировать её, собственно установив Linux Ubuntu. В основном окне VirualBox в списке слева появилась Ubuntu ODM. В контекстном меню, вызываемом нажатием правой кнопки мыши, доступны все инструменты управления. Перед инициализацией зайдём в меню "Настроить".

Контекстное меню виртуальной машины

На различных вкладках меню настроек вы можете изменить выделенное количество оперативной памяти, ядер процессора, видеопамяти и так далее. Нас сейчас интересует вкладка "Общие папки": необходимо настроить какое-то общее файловое хранилище, чтобы из виртуальной среды мы могли осуществлять доступ к собственным файлам на хосте. Переходим к "Общие папки" и нажимаем кнопку "Добавить новую общую папку".

Добавление новой общей папки

В открывшемся меню выбираем путь до папки на хосте, к которой открывается доступ, и её название в виртуальной среде. Обязательно отмечаем галочку "авто-подключение".

Настройки новой общей папки

В списке общих папок теперь видим добавленную:

Добавление новой общей папки

Теперь возвращаемся в главное меню VirtualBox и активируем опцию "Запустить" для нашей виртуальной машины:

Запуск виртуальной машины

В первом диалоге необходимо выбрать дистрибутив, загруженный ранее, из которого будет производиться установка операционной системы. Выбираем загруженный файл формата .iso

Выбор дистрибутива для установки
Выбор дистрибутива для установки
Выбор дистрибутива для установки

Загружается установочный мастер Ubuntu. На первом шаге выбираем слева язык и, затем, "Установить Ubuntu":

Установка Ubuntu

На следующем шаге устанавливаем оба флага:

Установка Ubuntu

Затем указываем "Стереть диск и установить Ubuntu". Не беспокойтесь, речь идёт о виртуальном диске, созданном несколько шагов назад. Ваша основная система и файлы на ней не могут пострадать.

Установка Ubuntu

Соглашаемся с предупреждением:

Установка Ubuntu

Выбираем часовой пояс и раскладку клавиатуры:

Установка Ubuntu
Установка Ubuntu

Задаём имя пользователя и пароль. Пароль вам понадобится для установки приложений, так что его следует запомнить.

Установка Ubuntu

Дальше установка будет произведена автоматически.

Установка Ubuntu

По окончанию установки нужно будет перезагрузиться, нажав Enter:

Установка Ubuntu
Установка Ubuntu

После этого вы сразу попадёте в интерфейс операционной системы. Поздравляю, вы развернули Ubuntu на виртуальной машине!

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. Управление выключением и перезагрузкой осуществляется с помощью меню в правом верхнем углу, справа от часов.

Меню с выключением и перезагрузкой

После перезагрузки в файловом менеджере вам будет доступна общая папка в меню слева (в моём случае пункт silent_sf). Система готова к дальнейшим приключениям.

Файловый менеджер

Установка 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

Вообще говоря, лучше добавить строчки управления переменными средами в файл .bashrc, чтобы они выполнялись каждый раз автоматически при запуске системы. Это не обязательно, если у вас одноразовая задача или вам не лень выполнять модернизацию переменных сред при каждом входе в систему. Для этого возвращаемся в домашнюю папку:

cd ..

И открываем файл .bashrc в текстовом редакторе

gedit .bashrc

У вас откроется обыкновенный блокнот с кодом на языке bash. В самый конец документа поместите поместите две строки, заменив ekazakov на своё имя пользователя:

export PYTHONPATH=$PYTHONPATH:/home/ekazakov/odm/SuperBuild/install/lib/python2.7/dist-packages:/home/ekazakov/odm/SuperBuild/src/opensfm
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ekazakov/odm/SuperBuild/install/lib

Сохраняемся, закрываем блокнот. Возвращаемся обратно в директорию, в которую загрузили OpenDroneMap:

cd odm

И, наконец, запустим настройку и конфигурирование OpenDroneMap

./configure.sh install

На этом этапе будет происходить очень много всего, но без вашего участия. Запаситесь терпением минут на 15-20-30. Установка завершена!


OpenDroneMap

Собственно обработка данных и расчёт производных продуктов осуществляется запуском одной единственной команды. В терминале из директории размещения OpenDroneMap (в моём случае /home/ekazakov/odm) вызывается модуль run.py:

python run.py <имя проекта>

Все настройки, режимы, ссылки на исходные данные и так далее указываются в виде ключей к этой команде. Всё просто и удобно.

Подготовка данных для расчёта без опорных точек

Посмотрим на запуск подробнее на конкретном примере. Самый распространненный среди любителей, занимающихся аэрофотосъёмкой с около-топографическими целями, вариант - имеется просто набор фотографий с заданным перекрытием, сделанных с какого-нибудь коптера в надир или почти в надир. Никакого наземного планово-высотного обоснования не обеспечивалось.

ЗАГРУЗИТЬ ПРИМЕР ДАННЫХ (1)

Пример простой и содержит 33 фотографии, выполненных аппаратом DJI Phantom 3 Advanced с высоты 150 метров в августе 2016 года, камера работала в автоматическом режиме.

Для того, чтобы приступить к обработке, нужно подготовить папку для данных OpenDroneMap, в которой будут размещаться наборы данных. Используя визуальный файловый менеджер, создадим в домашней папке новую директрию, например odm_projects, в которой создадим ещё одну директорию odm_non_gcp, а в ней - images (в моём случае получается /home/ekazakov/odm_projects/odm_non_gcp/images). У проектов OpenDroneMap строгая организация директорий, исходные снимки он будет искать именно в папке images в корневой папке конкретного проекта. Схема из оригинальной документации:

|-- /path/to/project/
    |-- images/
        |-- img-1234.jpg
        |-- ...

Используя общую папку с хостом, на котором и лежат ваши фотографии (если вы работаете с примером, можно загрузить тестовый набор через браузер прямо внутри виртуальной машины и обойтись без общей папки), копируем их в images. Вот как результат выглядит у меня (обратите внимание на пути):

Организация файлов и директорий

В общем-то, организация данных для этого простого варианта завершена, ведь больше никаких исходных данных у нас нет. Но и этого достаточно, чтобы получить приятные результаты.

Расчёт базовых продуктов без опорных точек

Открываем терминал и переходим в директорию OpenDroneMap

cd odm

Запускаем расчёты командой, заменив ekazakov на своё имя пользователя:

python run.py odm_non_gcp --project-path /home/ekazakov/odm_projects --dtm

Здесь происходит следующее: запускается обработка с настройками по умолчанию для данных из набора odm_non_gcp, при этом ключом --project-path указывается расположение наборов данных. То есть в директории указанной после --project-path будет искаться директирия odm_non_gcp, в ней images, и уже там - исходные фотографии. Ключ --dtm указан для того, чтобы в сгенерировать цифровую модель местности (в данном случае только поверхности, см. также параметры --dem и --dsm). Более подробно о возможных ключах - в разделе "Список настроек для запуска ODM".

После запуска в консоли вы сможете наблюдать ход выполнения всех операций, начиная с загрузки и масштабирования фотографий, заканчивая построением моделей. По окончанию работы вы получите сообщение

[INFO]     OpenDroneMap app finished

Будем смотреть, что же получилось! Если заглянуть в директорую с проектом, заметим, что добавлось много всего

Директория с проектом

Здесь вы сможете найти все промежуточные расчеты, преобразованные исходные фотографии, текструры и многое другое. Особый интерес представляют следующие файлы:

  • /odm_orthophoto/odm_orthophoto.tif - ортофотоплан, сразу в GeoTiff, если ваши фотографии имели координаты в exif. Собственно, один из основных результатов, можно сразу открывать в любой ГИС и работать.
  • /odm_orthophoto/odm_orthophoto.png - ортофотоплан в PNG. Открывается любым штатным просмотрщиком фотографий.


Ортофотоплан открытый в QGIS


  • /odm_dem/dtm.tif - цифровая модель местности (только поверхность), также в GeoTiff


Цифровая модель местности открытая в QGIS


  • /odm_texturing/odm_textured_model_geo.obj - трёхмерная текстурированная модель. Можно сразу открыть и покрутить в meshlab, который мы установили ранее. Всё очень просто, запускаете meshlab из окна поиска приложений (как запускался терминал в начале), и стандартной кнопкой "Import mesh" открываете файл odm_textured_model_geo.obj
Крутим трёхмерную текстурированную модель в meshlab

Подготовка данных для расчёта с опорными точками

Обычно при проведении аэрофотосъемки также проводятся геодезические работы по созданию планово-высотного обоснования (ПВО), чтобы фотограмметрические модели уравнивались с учётом реальных координат отдельных точек. Это позволяет получать модели более строгие с топографической точки зрения, и в нужной системе координат. Обычно ПВО представляет собой размещение на местности заметных объектов (в моём случае белых тарелочек, важно, чтобы объекты были однозначно идентифицируемы на фотоснимках) и вычисление их координат с высокой точностью геодезическими методами (в моём случае статические ГНСС-наблюдения от местной геодезической сети или полигонометрия). Разберёмся, как в OpenDroneMap строить модели с учётом опорных точек.

Решение этой задачи несложное технически, но потребует некоторых временных затрат. Необходимо создать текстовый файл следующего содержания:

Информация о системе координат
"Координата X точки в указанной системе координат" "Координата Y точки в указанной системе координат" "Высота точки" "Координата X точки в системе координат фотографии" "Координата Y точки в системе координат фотографии" "Имя файла с фотографией, для которого указывались данные"
...
"Координата X точки в указанной системе координат" "Координата Y точки в указанной системе координат" "Высота точки" "Координата X точки в системе координат фотографии" "Координата Y точки в системе координат фотографии" "Имя файла с фотографией, для которого указывались данные"

Важные моменты. Система координат описывается строкой вида "WGS84 UTM 36N" или "EPSG:4326" Первые три координаты в строке - те самые, полученные геодезическими методами. Координаты же в системе координат фотоснимка представляют собой следующее. Единица - один пиксель. Начало системы координат в левом верхнем углу фотографии, направление X - вправо, направление Y - вверх. Так, например, пиксель в семнадцатой строке и двадцатом столбце фотографии будет иметь координаты (20, 17).

Задача заключается в том, чтобы описать все появления опорных точек на всех фотографиях. Так, если у вас пять опорных точек и пять фотографий, на каждую из которых попадают все пять точек, то записей в файле будет 25 штук. Для удобства описания можно использовать такую структуру файла:

Информация о системе координат
x1 y1 z1 photo_x1 photo_y1 photo_name1
x1 y1 z1 photo_x2 photo_y2 photo_name2
x1 y1 z1 photo_x3 photo_y3 photo_name3
x2 y2 z2 photo_x1 photo_y1 photo_name1
x2 y2 z2 photo_x2 photo_y2 photo_name2
x2 y2 z2 photo_x3 photo_y3 photo_name3

...

Решение задачи предполагает следующие шаги:

  • Выбор фотографии
  • Визуальная идентификация на фотографии опорных точек, на неё попавших
  • Вычисление координат этих точек в системе координат фотоснимка
  • Запись соответствующих строк в файл
  • Переход к следующей фотографии

При этом критически важным оказывается количество и пространственное распределение опорных точек (точки должны быть равномерно распределены по всей площади съемки, точками должны быть обеспечены границы съемки).

ЗАГРУЗИТЬ ПРИМЕР ДАННЫХ (2)

Итак, для примера возьмём фотографию из тестового набора (2) с именем DJI_0256.JPG. На ней видно две опорные точки из трёх.


Опорные точки на фотоснимке


Координаты точки у реки:

X:  406085.553
Y: 6170547.408
Z:     118.076

Координаты точки у кустов:

X:  406161.126
Y: 6170444.479
Z:     117.515

Теперь нужно вычислить координаты точек в системе координат фотоснимка. Для этого можно открыть фотографию в любом адекватном растровом редакторе, который умеет показывать координаты курсора мыши в пикселях. Используйте любой, например, Pinta, простой растровый редактор для linux, похожий на Paint.NET в windows. Можем тут же установить этот пакет через терминал

sudo apt-get install pinta

Если открыть изображение в Pinta, координаты курсора мыши вы увидите на верхней панели. Приближаемся к опорной точке, наводим курсор в её центр, переписываем координаты пикселя.

Извлечение координат точки на фотоснимке

Существует множество других способов извлечь координаты точки, но этот самый бесхитростный. Удобно, к примеру, измерять координаты пикселей в QGIS, добавляя нужные фотографии в проект с выбором системы координат проекта - тогда QGIS их нарисует с началом в 0;0 и условием 1 пиксель - 1 единица системы координат.

Для рассмотренных снимка и точки формируется такая строка:

406161.126 6170444.479 117.515 2422 821 DJI_0256.JPG

Обращаем внимание на то, что имя фотографии приводится без пути.

Таким образом обрабатываются точки на всех фотографиях. Для тестового набора данных (2) содержимое текстового привязочного файла такое:

WGS84 UTM 36N
406085.553 6170547.408 118.076 1909 662 DJI_0310.JPG
406085.553 6170547.408 118.076 1953 1131 DJI_0311.JPG
406085.553 6170547.408 118.076 2001 1600 DJI_0312.JPG
406085.553 6170547.408 118.076 2057 2057 DJI_0313.JPG
406085.553 6170547.408 118.076 2111 2512 DJI_0314.JPG
406085.553 6170547.408 118.076 2429 2571 DJI_0280.JPG
406085.553 6170547.408 118.076 2443 2237 DJI_0279.JPG
406085.553 6170547.408 118.076 928 1694 DJI_0255.JPG
406085.553 6170547.408 118.076 886 1236 DJI_0254.JPG
406085.553 6170547.408 118.076 840 758 DJI_0253.JPG
406085.553 6170547.408 118.076 795 293 DJI_0252.JPG
406085.553 6170547.408 118.076 3472 2215 DJI_0221.JPG
406085.553 6170547.408 118.076 3497 1862 DJI_0220.JPG
406085.553 6170547.408 118.076 3523 1456 DJI_0219.JPG
406085.553 6170547.408 118.076 3549 1062 DJI_0218.JPG
406085.553 6170547.408 118.076 3578 685 DJI_0217.JPG
406085.553 6170547.408 118.076 3615 300 DJI_0216.JPG
406219.544 6170487.534 117.541 2757 327 DJI_0314.JPG
406219.544 6170487.534 117.541 2804 799 DJI_0315.JPG
406219.544 6170487.534 117.541 2856 1264 DJI_0316.JPG
406219.544 6170487.534 117.541 1590 2719 DJI_0275.JPG
406219.544 6170487.534 117.541 1599 2323 DJI_0274.JPG
406219.544 6170487.534 117.541 1613 1913 DJI_0273.JPG
406219.544 6170487.534 117.541 1623 1477 DJI_0272.JPG
406161.126 6170444.479 117.515 3459 197 DJI_0312.JPG
406161.126 6170444.479 117.515 3497 672 DJI_0313.JPG
406161.126 6170444.479 117.515 3538 1146 DJI_0314.JPG
406161.126 6170444.479 117.515 3580 1606 DJI_0315.JPG
406161.126 6170444.479 117.515 3629 2060 DJI_0316.JPG
406161.126 6170444.479 117.515 2575 2191 DJI_0259.JPG
406161.126 6170444.479 117.515 1955 2205 DJI_0218.JPG
406161.126 6170444.479 117.515 1969 1835 DJI_0217.JPG
406161.126 6170444.479 117.515 1986 1463 DJI_0216.JPG
406161.126 6170444.479 117.515 2004 1115 DJI_0215.JPG
406043.604,6170505.052,117.40,2908,421,DJI_0218.JPG
406043.604,6170505.052,117.40,2890,826,DJI_0219.JPG
406043.604,6170505.052,117.40,2871,1245,DJI_0220.JPG
406043.604,6170505.052,117.40,2850,1609,DJI_0221.JPG
406199.778,6170539.616,117.35,2037,1200,DJI_0315.JPG
406199.778,6170539.616,117.35,1992,716,DJI_0314.JPG
406199.778,6170539.616,117.35,1937,237,DJI_0313.JPG
406199.778,6170539.616,117.35,1042,1778,DJI_0259.JPG
406198.261,6170377.141,117.82,931,2036,DJI_0216.JPG
406198.261,6170377.141,117.82,924,2408,DJI_0217.JPG
406198.261,6170377.141,117.82,3484,1048,DJI_0258.JPG
406198.261,6170377.141,117.82,3535,1475,DJI_0259.JPG
406081.978,6170388.068,117.61,1064,1786,DJI_0220.JPG
406081.978,6170388.068,117.61,1074,1369,DJI_0219.JPG
406081.978,6170388.068,117.61,1081,964,DJI_0218.JPG
406081.978,6170388.068,117.61,1091,568,DJI_0217.JPG
406100.288,6170641.896,117.80,510,1559,DJI_0312.JPG
406100.288,6170641.896,117.80,577,2015,DJI_0313.JPG
406100.288,6170641.896,117.80,644,2473,DJI_0314.JPG
406100.288,6170641.896,117.80,699,2913,DJI_0315.JPG
406012.886,6170449.777,116.78,2415,1261,DJI_0252.JPG
406012.886,6170449.777,116.78,2446,1723,DJI_0253.JPG
406012.886,6170449.777,116.78,2035,1091,DJI_0221.JPG
406012.886,6170449.777,116.78,2048,722,DJI_0220.JPG
406012.886,6170449.777,116.78,2483,2182,DJI_0254.JPG
405995.006,6170599.982,117.75,1259,2151,DJI_0310.JPG
405995.006,6170599.982,117.75,1314,2610,DJI_0311.JPG
405995.006,6170599.982,117.75,3258,1214,DJI_0280.JPG
405995.006,6170599.982,117.75,3282,861,DJI_0279.JPG
405995.006,6170599.982,117.75,3307,453,DJI_0278.JPG

Не обязательно отмечать все появления всех точек на всех фотографиях, это, очевидно, займёт очень много времени. По окончанию создания файла он аккуратно сохраняется и кладётся куда-нибудь рядом с исходными фотографиями. В архиве с примером точки описаны в файле GCP_list.txt

Расчёт базовых продутов с опорными точками

Запуск расчётов с опорными точками производится полностью аналогично запуску без оных, с одним дополнением: ключом --gcp и путём до соответствующего файла.

Создадим в папке odm_projects новую директорию odm_gcp, в ней images, куда скопируем фотографии из нового набора. В odm_gcp также скопируем файл GCP_list.txt. В терминале возвращаемся в исходное положение, то есть переходим в директорию odm

cd odm

И запускаем расчёты, не забыв сослаться на файл с опорными точками и заменить ekazakov на ваше имя пользователя. И на этот раз воспользуемся ключом dsm, чтобы построить более честную, не фильтрованную модель местности.

python run.py odm_gcp --project-path /home/ekazakov/odm_projects --gcp /home/ekazakov/odm_projects/odm_gcp/GCP_list.txt --dsm

По окончанию расчётов изучаем результаты в директории /home/ekazakov/odm_projects/odm_gcp, в тех же подпапках, что и ранее. Обратите внимание на файл odm_georeferencing.txt, который сгенерировался в папке odm_georeferencing, там вы найдёте приведенные оценки точности.

Список основных настроек для запуска ODM

Здесь приведен список основых опций, доступных при запуске OpenDroneMap. Полный список (на англ.) доступен в официальной документации или по команде run.py -h

  -h или --help         вывести в консоль сообщение с информацией о возможных
                        опциях запуска команды run.py.
  --images <путь> или -i <путь>
                        путь до папки с исходными изображениями
  --project-path <путь>
                        путь до папки с проектом
  --resize-to <целое число>
                        масштабирование изображения (по большей стороне)
  --skip-resize
                        пропустить шаг масштабирования изображений. Вместо масштабированных изображений 
                        будут использованы оригинальныеthe resized folder
  --start-with <параметр> или -s <параметр>
                        С помощью параметра указать, с какой операции начать обработку. Может быть
                        полезно, если нужно быстро получить частный результат, не дожидаясь полной
                        обработки. Параметр может быть: resize | opensfm | slam | cmvs | pmvs |
                        odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
  --end-with <параметр> или -e <параметр>
                        Аналогично, какой операцией закончить:resize | opensfm | slam | cmvs | pmvs |
                        odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
  --rerun <параметр>
                        Перезапустить конкретную операцию. 
                        Параметр может быть:resize | opensfm | slam | cmvs | pmvs |
                        odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
  --rerun-all           Перезапуск всех операций
  --rerun-from <параметр>
                        С помощью параметра указать, с какой операции начать перезапуск.
                        Параметр может быть:resize | opensfm | slam | cmvs | pmvs |
                        odm_meshing | odm_25dmeshing | mvs_texturing | odm_georeferencing | odm_orthophoto
  --video <путь>        Путь до видео файла для обработки
  --slam-config <путь>
                        Путь до конфигурационного файла orb-slam
  --force-focal <вещественное число>
                        Перезаписать информацию о фокусном расстоянии (число вместо взятого из изображений)
  --force-ccd <вешщественное число>
                        Перезаписать информацию о ширине матрицы ПЗС (число вместо взятого из изображений)
  --min-num-features <целое число>
                        Минимальное количество особых точек, извлекаемых из
                        отдельного изображения. Чем больше - тем лучше результат,
                        но медленнее обработка.
                        Значение по умолчанию: 4000
  --matcher-threshold <процент>
                        Игнорировать сопоставленные ключевые точки, если перекрывающиеся изображения делят
                        менее указанного количества процентов ключевых точек.
                        Значение по умолчанию: 2.0
  --matcher-ratio <вещественное число>
                        Отношение расстояния до следующей наиболее подходящей ключевой точки
                        Значение по умолчанию: 0.6
  --matcher-neighbors <целое число>
                        Количество ближайших изображений для предварительного
                        сопоставления основанного на данных GPS, извлеченных
                        из exif фотографий. Установить на 0 для того, чтобы
                        пропустить предварительное сопоставление. Значение по
                        умолчанию: 8
  --matcher-distance <целое число>
                        Порог расстояния (в метрах) для поиска изображений для
                        предварительного сопоставления, основанного на данных GPS,
                        извлеченных из exif фотографий. Установить на 0 вместе с
                        matcher-neighbors для того, чтобы пропустить предварительное
                        сопоставление. Значение по умолчанию: 0
  --opensfm-processes <целое положительное число>
                        Максимальное количество процессов для рекострукции плотного облака
                        (чем больше, тем быстрее, но интенсивнее задействуются компьютерные ресурсы)
                        Значение по умолчанию: 1
  --use-25dmesh         Экспериментальная опция. Использовать 2.5-мерную пространственную триангуляцию
                        для построения ортофотоплана.
                        Использование этой опции может обеспечить лучшие результаты для плоских поверхностей.
  --use-pmvs            Использовать pmvs для расчёта облака точек
  --cmvs-maxImages <целое число>
                        Максимальное количество изображений в кластере. Значение по умолчанию: 500
  --mesh-size <целое положительное число>
                        Максимальное количество вершин в выходной пространственной триангуляции
                        Значение по умолчанию: 100000
  --mesh-wlop-iterations <целое положительное число>
                        Количество итераций процедуры WLOP. Чем больше значения, тем более сглаженной
                        получается пространственная триангуляция. Применяется к 2.5-мерной триангуляции.
                        Значение по умолчанию: 35
  --texturing-tone-mapping <параметр>
                        Использовать тоновую коррекцию, если параметр указан gamma, не использовать,
                        если none. Значение по умолчанию: none
  --gcp <path string>   Путь до файла с информацией о ПВО. См. соответствующий раздел статьи.
                        По умолчанию не используется. 
  --use-exif            Использовать данные из exif вместо GCP, даже если файл с ними существует
  --dem                 Построить Цифромую модель рельефа используя морфологической фильтер PDAL
  --dtm                 Построить Цифровую модель территории (только поверхность земли) с использованием
                        прогрессивного морфометрического фильтра.
  --dsm                 Построить Цифровую модель местности (поверхность + объекты) 
  --dem-approximate     Использовать прогрессивный морфологический фильтр для ЦМР.
                        Расчёты с ним быстрее, но менее точные.
  --orthophoto-resolution <вещественное число большее 0>
                        Пространственное разрешение ортофотоплана в пикселях на метр
                        Значение по умолчанию: 20.0 (то есть пять сантиметров на пиксель)
  --orthophoto-compression <параметр>
                        Вид сжатия для ортофотоплана.
                        Возможные значения: JPEG, LZW, PACKBITS, DEFLATE, LZMA, NONE.
                        Значение по умолчанию: DEFLATE
  --orthophoto-bigtiff <параметр>
                        Управление созданием ортофотоплана в формате BigTIFF или
                        классический TIFF. BigTIFF - вариант для файлов больших
                        чем 4 ГБ. Возможные значения параметра: YES, NO, IF_NEEDED,
                        IF_SAFER. Для деталей см. спецификацию GDAL:
                        https://www.gdal.org/frmt_gtiff.html for more info.
                        Значение по умолчанию: IF_SAFER
  --build-overviews     Создать обзорные файлы для ортофотопланы с помощью утилиты gdaladdo.
  --zip-results         сжать результаты с помощью gunzip
  --verbose или -v      Выводить в консоль дополнительную информацию о ходе обработки
  --time                Создать файл с информацией о затраченном на обработку времени
  --version             Вывести в консоль номер версии OpenDroneMap

Альтернативные (упрощенные) способы запустить ODM

Стандартная полноценная установка OpenDroneMap в Ubuntu часто не увенчивается успехом. Отклонение от необходимой версии операционной системы приводит к конфликтам пакетов и разным другим неприятностям, не всегда получается установить ODM с первого раза даже если строго выдержать все условия и последовательность действий. Однако существуют альтернативные способы получить доступ к функциональности ODM, требующие гораздо меньших усилий. Разберёмся с двумя основными: запуском ODM через систему контейниризации Docker, а также работу с ODM LiveCD - специально подготовленным разработчиками образом операционной системы, где всё уже предустановлено. Тестировать будем на маленьком наборе данных без опорных точек (скачать).

Запуск обработки через Docker в Linux

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Упрощая, docker это способ создавать изолированные самодостаточные программные инфраструктуры, к которым обеспечен универсальный доступ. Также docker это большой каталог уже созданных контейнеров, которые можно загружать и использовать на своё усмотрение. Программное обеспечение OpenDroneMap также распространяется как docker-контейнер. Посмотрим, как получить к нему доступ в среде Linux (это может быть виртуальная машина, развёрнутая аналогично пунктам 1.1 - 1.3, либо полноценная операционная система на вашем компьютере).

Для начала нужно установить в ОС инфраструктуру docker. Сделать это не сложно, так как docker включен в список стандартных репозиториев:

sudo apt-get install docker.io

Перезагрузитесь. Теперь ваш компьютер готов к использованию контейнеров. Удобная особенность распространения контейнеров docker заключается в том, что вы можете выполнить обработку данных средствами контейнера при первом же запросе на его получение. Подготовьте простую инфраструктуру папок для ваших данных. Например, я создал в домашней директории /home/ekazakov папку flight_1, в ней папку images, где разместил все фотографии, которые хотел бы использовать для обработки. Т.е. все фотографии находятся в расположении /home/ekazakov/flight_1/images/image1.jpg. Для тестирования можно использовать те же самые фотографии, которые предлагались ранее. Больше ничего готовить не нужно. Переходим в терминал и выполняем следующую команду:

sudo docker run -it --rm -v "/home/ekazakov/flight_1/images:/code/images" -v "/home/ekazakov/flight_1/odm_orthophoto:/code/odm_orthophoto" -v "/home/ekazakov/flight_1/odm_georeferencing:/code/odm_georeferencing" -v "/home/ekazakov/flight_1/odm_dtm:/code/odm_dtm" opendronemap/odm --mesh-size 100000 --dtm

Давайте разберёмся с каждым компонентом этой строки.

sudo docker run - основная команда. Передаём операционной системе, что нам необходимо использовать docker с опцией run, то есть мы хотим запустить контейнер.

Опция -it обеспечивает интерактивное взаимодействие со средой контейнера.

Опция --rm автоматически закроет контейнер после того, как он обработает введенную команду.

Далее мы видим четыре подряд идущих опции с ключом -v, они обеспечивают связь между внутренней файловой системой контейнера и файловой системой вашей операционной системы - то есть контейнер может брать файлы из ваших папок, и записывать результаты обработки в них. Например, команда -v "/home/ekazakov/flight_1/images:/code/images связала внутреннюю папку контейнера /code/images с моей директорией /home/ekazakov/flight_1/images. Таким образом мы связали четыре директории - одну с исходными фотографиями, и для три результирующих файлов: ЦММ (odm_dtm), ортофотоплана (odm_orthophoto) и отчётных материалов (odm_georeferencing).

Далее указывается собственно название нужного docker-контейнера: opendronemap/odm. Docker сначала попробует обнаружить его локально, в случае неудачи начнёт загрузку с онлайн-репозитория. В первый запуск вам придётся подождать загрузки, все дальнейшие запуски будут производиться уже с загруженной локальной копии. Обратите внимание, что на сайте ODM в примерах запуска допущена ошибка - правильное название контейнера opendronemap/odm, а не opendronemap/opendronemap.

После названия контейнера задаются параметры обработки. Это ровно те же параметры, что в п. 2.5. В данном случае мы наклалываем ограничение на макс. количество вершин триангуляции (--mesh-size 10000) и просим ODM посчитать ЦММ (--dtm). При необходимости вы можете задать опорные точки (ключ --gcp, путь до файла в одной из примонтированных с помощью -v директорий)

Начинается загрузка (если запустили контейнер впервые) и выполнение обработки. Ваше участие больше не требуется. Все происходящие события отражаются в терминале.

Так отображается загрузка контейнера


Обработка данных в разгаре


В результате, после того как в терминале вы увидите красивый сивольный логотип OpenDroneMap, в папках /home/ekazakov/flight_1/odm_orthophoto, /home/ekazakov/flight_1/odm_georeferencing и /home/ekazakov/flight_1/odm_dtm окажутся сохранены все результаты.

Открываем ортофотоплан в QGIS - всё отлично.

Результирующий ортофотоплан

Работа с LiveCD ODM и WebODM

Ещё одна опция удобной работы с OpenDroneMap - LiveCD ODM. Это дистрибутив Linux Lubuntu, в который встроены программные модули ODM. Вы можете установить и использовать LiveCD ODM в четырёх сценариях:

  • Как LiveCD (без установки) в гипервизоре виртуальных машин
  • Как полноценную виртуальную машину по аналогии с описанным выше механизмом
  • Как LiveCD (без установки) на вашем основном компьютере
  • Как полноценную операционную систему на вашем основном компьютере (как основную или дополнительную ОС)

Скачать образ в формате .iso

Установка образа в гипервизоре виртуальных машин или в качестве полноценной ОС почти ничем не отличается от описанного в п. 1, так как Linux Lubuntu основана на Linux Ubuntu и имеет точно такие же интерфейсы установки. Если вы хотите использовать образ не в гипервизоре виртуальных машин, а полноценно, сначала запишите его на USB, это можно сделать множеством способов. Самый простой способ начать работу с LiveCD ODM - записать образ на usb-носитель, перезагрузить компьютер выбрав этот usb-носитель в качестве устройства для загрузки, и выбрать режим Try Lubuntu without installing. Таким образом вы быстро попадёте в интерфейс, пригодный для работы с данными аэрофотосъёмки.

Итак, после запуска LiveCD вы увидите следующий интерфейс:

Внешний вид интерфейса LiveODM

На рабочем столе доступно два ярлыка: OpenDroneMap CLI и WebODM. Запустив OpenDroneMap CLI вы получите терминал, готовый к немедленному запуску python run.py, тому самому, описанному в разделе 2. Более интересный для нас вариант - WebODM, это замечательно сделанный веб-интерфейс, позволяющий быстро и удобно обработать данные. С ним и разберёмся. Запустив WevODM, вам будет предложено создать пользователя - выбирайте имя пользователя и пароль. После этого вы попадёте в основной интерфейс WebODM, главное меню расположено слева.

Первый экран WebODM

Начать работу очень просто, выберите опцию "Add Project" в правой части интерфейса, определите его название и описание в открывшемся окне.


Создание нового проекта

Для нового проекта выберите опцию Select Images and GCP, при этом откроется диалоговое окно выбора фотографий. Выбирайте всё, что хотите обработать. Если у вас есть файл с опорными точками (GCP), выбирайте также и его. После выбора раскроется меню настроек, в нём вы увидите количество выбранных файлов, сможете задать название для задачи обработки, выбрать узел обработки (в нашем случае это только наш компьютер), можем сконфигурировать все опции). Для начала обработки нужно нажать Review, а затем Start - процесс начнётся.

Выбор файлов и review опций

Процесс пошёл! Если вы переключите опцию Task Output с Off на On, то увидите вывод, точно такой же, как при запуске через run.py или через docker. Также в наличии индикатор прогресса.

Процесс обработки с выводом текущего состояния

По окончанию обработки вы будете уведомлены.

Обработка окончена

Собственно, вся работа сделана, теперь вы можете загрузить все результаты обработки, для этого раскройте выпадающий список Download Assets. Для загрузки доступны:

  • Ортофотоплан в GeoTiff/MBTiles/обычных тайлах
  • Модель поверхности в GeoTiff/тайлах
  • Облако точек в LAZ
  • Текстурированная модель
  • Параметры камеры
Загрузка результатов

Результаты загружаются как обычные файлы браузером. Просто скачайте их и положите на usb-носитель или доступный из LiveCD основной диск вашего компьютера. Выходите из LiveCD и используйте полученные данные.

Загрузка результатов

Помимо возможности скачать данные, WebODM предоставляет возможность их изучить непосредственно в веб-интерфейсе. К вашим услугам картографический обзорщик, доступный по кнопке View Map.

Загрузка результатов

И обзорщик трёхмерной модели, доступный по кнопке View 3D Model.

Загрузка результатов

В обоих инструментах просмотра доступны разнообразные инструменты для измерений, весьма полезно.

Ещё одна крайне полезная функциональность WebODM это конструктор файла опорных точек. Посмотрите ещё раз, каким трудом нам давался этот процесс в основной части статьи! Пункт главного меню GCP Interface может значительно облагчить вашу судьбу, но только если вы можете привязать ваши данные к одной из базовых карт (OSM или спутниковая подложка).

Интерфейс GCP

Работает инструмент так - выбираете пункт "Choose images / drag here" и выбираете фотографии, на которых хотите поставить GCP. Затем двойным кликом переходите к фотографии для текущей работы. Она раскроется в левой части интерфейса. В правой части интерфейса у вас интерактивная веб-карта, где можно менять подложки и даже использовать свою. Нажимайте на иконку + над панелью с фотографией. Размещайте опорную точку на фотографии. Нажимайте + ещё раз, теперь размещайте точку на базовой карте. Щелкните на той и на другой точках левой кнопкой мыши - они свяжутся и подсветятся зелёным цветом. Повторяйте, пока есть силы.

Добавление GCP

После этого используйте опцию Export File (над базовой картой). Так вы получите результат, аналогичный ручному созданию файла в основной части статьи. Такой способ не подойдёт, если вы готовили опорные точки специально геодезическими методами на временных метках (на базовой карте вы эти точки не обнаружите).

WebODM очень удобный и приятный инструмент, к тому же не требующий работы с командной строкой. Конечно, запустить его можно не только в LiveCD, но и установить на собственный компьютер/сервер, виртуальную машину. Можно собрать WebODM из исходников или купить готовый инсталлятор.