OpenStreetMap

OSM любить Mapillary

Posted by Blackbird27 on 20 May 2016 in Ukrainian (Українська). Last updated on 21 May 2016.

Переглядаючи сторінки спільноти Open Street Map в Google+ наткнувся на статтю про співпрацю Open Street Map та Mapillary. Mapillary – це сервіс обміну фото з геотегами заснований Швецькою компанією Mapillary AB з Мальме. Мета компанії – представити весь світ (а не тільки вулиці) фотографіями за допомогою краудсорсингу. Мене зацікавило те, що геотеговані фотографії можна використовувати для створення даних в OSM, так як вони розповсюджуються по ліцензії CC-BY-SA та наявність втулка для популярного редактора JOSM і можливість підключення шару Mapillary у веб-редакторі iD. Сервіс Mapillary аналог сервісів Google Street View та Yandex Панорами, за виключенням того що користувачі самі наповнюють даний сервіс фото. Сервіс має додатки для телефонів на базі ОС Android, Windows Phone, iOS, BlackBerry OS. Проте зйомка з допомогою телефону серії знімків під час ходьби чи їзди на велосипеді не досить зручна і батарея телефону швидко розряджається, кріплення для телефону може бути не надійне і т.д.. Тому в даній статті я опишу те, як створювати панорами для сервісу з допомогою екшн камери. При використанні додатка Mapillary на телефоні, exif-теги необхідні для геолокації знімка (координати та напрям зйомки), записуються автоматично, так як телефон має вбудований компас та GPS. Екшн камери зазвичай не мають вбудованого GPS приймача (як наприклад Sony Action Cam HDR-AS30v), тому нам знадобиться GPS трек для ручної геолокації знімків.

Що нам знадобиться:

  1. Екшен камера з кріпленням (присоскою) для автомобіля або велосипеда, з можливістю зйомки фото з інтервалами (time-lapse). Я використовував дешеву та сердиту Xiaomi Yi Action Camera.
  2. Пристрій з можливістю запису GPS треку. Це може бути або GPS логгер, або телефон з GPS, або зв’язка двох пристроїв. Я використовую GPS логгер HOLUX RCV-3000 з’єднаний з телефоном по блютузу та встановлений на телефон OSMTracker (Android) для запису GPX трека. При “правильному” розміщенні супутників HOLUX RCV-3000 здатен видавати GPS дані з точністю до 1,7 метра.
  3. Трохи танців з бубном навколо Пітона (Python), широкосмуговий доступ до мережі інтернет для ручного завантаження знімків на Mapillary.

Тепер детальніше:

Запускаєм GPS пристрій, залишаємо його на місці до фіксації супутників (для кращої точності), після фіксації GPS починаємо запис GPS треку, запускаємо камеру на зйомку в режимі time-lapse і рухаємось по вулицях/місцях, для яких хочемо створити панораму, після завершення експортуємо дані з OSMTracker в .gpx-файл. Для велосипеду я вибрав інтервал зйомки 2с, для автомобіля який рухається швидше, є сенс вибрати менший інтервал, вищезгадана камера підтримує інтервал до 0,5 секунди. В моєму випадку я переконуюся, що годинник моєї камери синхронізовано з телефоном, а в налаштуваннях OSMTracker вибрана опція ігнорувати час GPS та використовувати час телефону для часових міток. скріншот OSMTracker Таким чином знімки з камери та часові мітки в .gpx-файлі будуть в однаковому часовому поясі та уже синхронізовані, якщо цього не зробити, то кореляцію можна провести пізніше при синхронізації знімків з GPS треком. Як результат отримали послідовність знімків та .gpx-файл записаного треку. Для зручності створюємо теку з поточною датою куди копіюємо наші знімки та .gpx-файл. В даній теці бажано створити теку “backup” куди також скопіювати наші знімки, як резервну копію, якщо щось піде не так. # Прив’язка знімків до GPS координат Існує багато способів прив’язати знімки до GPS координат, від використання Windows-програм до використання Python-скриптів чи бібліотек Ruby Gems на Linux-системах. Я опишу два найпростіших: ## Прив’язка за допомогою старого доброго JOSM: Я використовую даний спосіб, простий і швидкий.

  1. Для запису координат до exif-даних знімків після їх синхронізації з gpx-треком у JOSM нам спочатку потрібно встановити втулок Photo Geotagging. Для цього заходимо в Налаштування JOSM (F12)» вкладка Втулки» Вводимо в рядок пошуку “ geotag ” та обираємо втулок, після встановлення втулка бажано перезапустити JOSM. photo_geotagging

  2. Запускаємо JOSM»Відкриваємо наш .gpx-файл та додаємо наші зображення до GPS-треку, задаємо зміщення 0, так як наш gpx-трек записаний за місцевим часом (часом телефону), якщо ж трек записаний без попередньої корекції (GPS-час в UTC 0:00), то необхідно підібрати зміщення місцевого часового поясу відносно Гринвіча. open_gpx_and_photos

  3. Далі просто правою клавішею викликаємо меню на шарі “Зображення з геотегами” та обираємо пункт “Записати координати в заголовок зображення”, тиснемо так. Додатково можна поставити галочку на пункті “зберегти резервні копії”, якщо знімки не було зарезервовано раніше. Збереження змін дуже швидке. save_photos

  4. Після даних операцій кожен знімок повинен містити координати та висоту над рівнем моря, якщо даний параметр наявний в .gpx-файлі. Перевірити можна з допомогою простого додатка ExifTool просто перетягнувши файл знімку на іконку програми. file_check

Альтернативний спосіб з допомогою freeware-програми GeoSetter

  1. Запускаємо GeoSetter та в рядку вибору каталогів вибираємо каталог зі знімками, які ми хочемо прив’язати до координат. open_photos_geosetter

  2. Виділяємо всі знімки в каталозі (Ctrl+A) та натискаємо на іконку “Синхронізувати геодані вибраних знімків з геоданими GSP-файлів” (Ctrl+G), після чого з’явиться діалогове вікно для вибору GPS-треку, та налаштування параметрів синхронізації. select_img_and_syncronize

  3. Обираємо .gpx-файл для синхронізації (якщо трек в тому ж каталозі, що і зображення, обирати не потрібно), якщо необхідно обираємо параметри зміщення та натискаємо Ok. Якщо часові мітки знімків та .gpx-файлу знаходяться в одному часовому поясі, то програма повідомить нам, що GPS-дані були знайдені для певної кількості знімків. Якщо не було знайдено знімків, які відповідають часовим міткам .gpx-файлу, то необхідно встановити зміщення часового поясу. Після синхронізації не забуваємо зберегти геотеги до знімків, натиснувши на іконку дискети або комбінацію (Ctrl+S). Збереження проходить значно довше ніж в JOSM. img_syncronized

  4. Після даних операцій кожен знімок повинен містити координати та висоту над рівнем моря, якщо даний параметр наявний в .gpx-файлі. Перевірити можна з допомогою простого додатка ExifTool просто перетягнувши файл знімку на іконку програми.

Попереднє стиснення зображень

Даний крок можна пропустити при наявності якісного широкосмугового доступу до інтернет з високою швидкістю відвантаження. Даний крок потрібно виконати до розрахунку напряму зображення, так як в моєму випадку Adobe Lightroom видалив тег GPS Img Direction з шапки файлу зображення, незважаючи на те, що при збережені був вибраний пункт збереження всіх метаданих. Після імпорту в Adobe Lightroom було виконано автоматичну корекцію одного зображення, після чого дані корекції скопійовані на інші зображення, далі зображення експортовано зі стисненням розміру до 700 кБ без зміни роздільної здатності та збільшення чіткості для екрану. Команда Mapillary в своїх інструкціях рекомендує використання freeware редактора IrfanView для масової обробки файлів. # Налаштування середовища Python для роботи зі скриптами Mapillary Tools Передумовою даного кроку є установлене та правильно налаштоване середовище програмування Python, в нашому випадку нам потрібен Python версії 2, крайній реліз можна завантажити тут. Як правильно налаштувати Python можна прочитати тут англійською. Далі нам будуть потрібні скрипти Mapillary Tools, завантажити їх можна з GitHub тут. Архів бажано розпакувати на диску С в теку Документи користувача, так як диск С є робочим середовищем для Python. Не зовсім повна та коректна стаття про те як запускати скрипти на Python для Mapillary знаходиться тут. Далі для правильної роботи скриптів Mapillary Tools, попередньо доведеться встановити декілька бібліотек/пакунків через pip (Менеджер встановлення пакунків), а саме:

  • exifread – встановлюється через pip.
  • gpxpy – встановлюється через pip.
  • PIL – встановлюється через pip.
  • pyexiv2 – встановлюється через встановлювач Windows в залежності від версії системи x32 або x64.

Далі детальніше:

Запускаємо командний рядок, через команду Виконати (Win+R), в поле вводимо “cmd” run_cmd Перевіряємо чи працює середовище Python, вводимо в командному рядку “python”, якщо все налаштовано згідно інструкцій в посиланні вище, то повинен запуститися інтерпретатор Python. Про запуск інтерпретатора Python свідчить поява »> в командному рядку, тепер можна виконувати прості команди такі як “print (“Слава OSM”)” та прості математичні операції. check_if_python_set_up_properly simple_operations Коли впевнилися, що середовище Python налаштоване правильно закриваємо дане вікно та повторно запускаємо командний рядок. Далі встановлюємо пакунки необхідні для запуску скриптів Mapillary Tools, а саме: exifread, gpxpy, Pillow, бібліотеку pyexiv2 встановлюємо вручну за посиланнями наданими вище. Python (поточна версія 2.7.11) за замовчуванням встановлюється за таким шляхом C:\Python27\python.exe. Разом з Python інсталюється Менеджер встановлення пакунків “pip”, в моєму випадку його було встановлено в C:\Python27\Scripts\pip.exe. В командному рядку переходимо в теку C:\Python27\Scripts\, щоб задіяти можливості “pip.exe”, для цього набираємо в командному рядку “cd C:\Python27\Scripts\ (шлях можна просто скопіювати та вставити в командний рядок натисканням правої клавіші миші): change_directory_to_pip Далі вводимо послідовно та спостерігаємо за процесом встановлення пакунків: pip install exifread pip install gpxpy pip install Pillow Так як дані пакунки уже встановлені в моєму середовищі Python, то з’являється тільки пропозиція оновити дані пакунки: install_packages Якщо все пройшло без помилок то середовище Python тепер готове до роботи зі скриптами Mapillary Tools.

Розрахунок напрямку зйомки зображення з допомогою скриптів Python

Спочатку хочу сказати, що Mapillary Tools містить багато скриптів для обробки зображень та для завантаження на сервіс Mapillary, в тому числі і скрипт для прив’язки зображень до GPS координат, проте деякі з них не працюють або працюють неправильно, про що автор скриптів і написав у коментарях даних скриптів. Так наприклад мені не вдалося прив’язати зображення до GPS координат, тому я і описав два простіших способи раніше у статті. Але скрипт для визначення напряму зйомки шляхом інтерполяції в моєму випадку працює і швидко задає напрям зйомки фото у градусах базуючись на координатах наступного знімка в серії time-lapse. Отже, перейдемо до встановлення напрямку зйомки. На даному етапі у нас є тека зі знімками, які уже мають координати та часові мітки, тому все що нам потрібно це вказати шлях до скрипта, шлях до теки зі знімками та зміщення камери відносно напряму руху. Якщо камера напрямлена в напрямку руху, то зміщення буде “0” Скрипти знаходяться в папці python завантаженого раніше архіву Mapillary Tools. В моєму випадку шлях до скрипта “interpolate_direction.py”, який нам потрібен наступний: “C:\Users\vfedo\Documents\Mapillary\mapillary_tools-master\python\interpolate_direction.py” Шлях до теки зі знімками наступний: “D:\Mapillary\19.05.2016\backup” Далі запускаємо командний рядок та вводимо наступне: python “C:\Users\vfedo\Documents\Mapillary\mapillary_tools-master\python\interpolate_direction.py” “D:\Mapillary\19.05.2016\backup” 0 interpolate_direction_script Після закінчення роботи скрипта отримали знімки з прив’язкою до GPS координат та напрямом зйомки, які готові до завантаження на сервіс Mapillary. Наглядно напрям знімків можна перевірити в програмі GeoSetter, просто обравши каталог зі знімками та переходячи між файлами стрілками клавіатури, це дозволить знайти знімки, які були оброблені не коректно скриптом interpolate_direction.py, наприклад при простої перед світлофором точки GPS-треку будуть “танцювати” навколо вашої реальної позиції, тому і напрям знімків буде визначено помилково. Дану операцію можна виконати і через сервіс Mapillary, і це стосується саме послідовності знімків зроблених при русі на велосипеді/пішки/автомобілем, але обробка займає багато часу і мої знімки хоч і мають правильний кут в редакторі Mapillary, при перегляді все-одно напрямлені на північ (за замовчуванням) те ж саме при перегляді в JOSM, тому краще завантажувати повністю підготовлені знімки (з необхідними тегами: “GPSLongitude”, “GPSLatitude”, “DateTimeOriginal” та “GPSImgDirection”. Якщо ж зображення все-таки були завантажені без тега “GPSImgDirection”, це можна виправити. Для цього потрібно зайти в редактор зображень Mapillary та вибрати опції послідовності зображень, щоб кожне зображення орієнтувалося в напрямку позиції наступного зображення та виставити кут відхилення від напрямку руху, якщо камера була направлена не за напрямком руху. Відлік кута відхилення іде за часовою стрілкою в системі Північ-Схід в діапазоні від 0 до 359 градусів. Наприклад коли камера була напрямлена в ліве вікно автомобіля, то зміщення камери відносно напряму руху буде 270 градусів (або -90). При тестуванні три моїх послідовності знімків (1, 2, 3) були завантажені без належного тегу “GPSImgDirection” і хоча й була вибрана вищезгадана опція, знімки все-одно направлені на північ, як на сервісі так і в JOSM. Для завантаження на сервіс також є скрипти, але в даній статті буде розглянуто ручне завантаження через веб-браузер, так як буде видно чи правильно оброблені знімки.

Завантаження на Mapillary

Для завантаження на Mapillary спочатку потрібно створити обліковий запис на даному сервісі. Після успішної реєстрації заходимо на сторінку Mapillary та у правому верхньому кутку буде ім’я користувача вибране при реєстрації. Натиснувши на ім’я користувача можна налаштувати профіль користувача, перейти до профілю користувача та перейти до Ручних Завантажень. mapillary_user_profile Переходимо в розділ ручних завантажень, та натискаємо Вибір файлів (Choose Files), вибираємо зображення для завантаження після чого Mapillary перевіряє зображення: upload_dialog Якщо всі необхідні теги присутні, то ви побачите послідовність знімків з’єднаних лінією, кожне зображення матиме стрілочку яка вказує напрям: check_before_upload Далі тиснемо Відвантажити і чекаємо доки знімки передадуться на сервер Mapillary. press_upload Якщо під час відвантаження не змінюється відсоток відвантажених знімків, або ж обірвалося з’єднання з мережею інтернет, завантаження можна продовжити, натиснувши на посилання “Upload hung up? Click here.” upload_hung_up Сторінка оновиться і буде показано знімки, які уже відвантажені на сервер при цьому потрібно знову вибрати усі знімки, сервіс перевірить їх та відкине усі знімки, які уже відвантажено, та запропонує відвантажити знімки які лишилися, показавши їх положення на міні-карті оранжевими прапорцями. upload_more_photos_to_this_sequence Після завантаження всіх знімків, кількість у відвантаженій послідовності бажано звірити з кількістю файлів у каталозі зі знімками. Все правильно 646 знімків завантажено. Тепер можна натискати на кнопку Опублікувати послідовність (Publish Sequence) і отримуємо віртуальний “Дай п’ять” за гарну роботу. Тепер розберемося як використовувати дані з Mapillary для картографії OSM. publish_sequence

Використання сервісу Mapillary для картографії в OSM.

Так як дані з Mapillary можна використовувати для нанесення об’єктів OSM, то розглянемо як це можна зробити у двох найпопулярніших редакторах даних OSM, а саме JOSM та iD Editor. ## Використання Mapillary в JOSM: Для використання сервісу Mapillary в JOSM з можливістю відображення геотегованих зображень як шару, спочатку потрібно встановити однойменний втулок. Для цього заходимо в Налаштування JOSM (F12)»вкладка Втулки»в рядок пошуку вводимо Mapillary. Після встановлення втулка перезавантажте JOSM. install_mapillary_plugin Після запуску JOSM завантажуємо дані мапи з сервера OSM для ділянки де є покриття Mapillary. Покриття можна перевірити на веб-сторінці сервісу Mapillary, через пошук на інтерактивній карті, зеленим кольором зображені послідовності знімків. На жаль, на даний момент покриття є для частини обласних центрів України. mapillary_map_coverage Я завантажу область рідного смт, для якої я відвантажував геотеговані послідовності знімків. Після завантаження шару даних мапи OSM, шар знімків Mapillary можна завантажити з меню Фон»Mapillary (або комбінацією клавіш Shift+comma). mapillary_in_josm ## Використання Mapillary в iD Editor: Для підключення шару Mapillary в iD Editor потрібно просто зайти в режим редагування обраної ділянки та натиснути на іконку меню Дані мапи (комбінація клавіш F) та обрати Фото-шар (Mapillary). Після цього з’явиться шар знімків Mapilary з напрямом та можливістю натискати на прапорець для фіксації зображення. mapillary_in_id_editor

Висновок

Співпраця Mapillary та OSM має велике значення для обох проектів. Дане керівництво створювалось з метою надихнути спільноту OSM Україна на збільшення покриття Mapillary на території України, для заповнення прогалини Yandex Панорам, що доступні тільки для обласних центрів та міжнародних трас і дозвіл на використання яких для OSM, завжди може бути припиненим.

Посилання на мій профіль Mapillary та першу вдало створену послідовність фото.

Чудова gif-анімація була створена за допомогою open-source програми ScreenToGif.

Якщо помітили помилку в статті прошу повідомити.

Всім веселого та продуктивного мапінгу.

Discussion

Comment from dudka on 21 May 2016 at 14:54

Чудова інструкція, дякую!

Якось дивно, що поміж Python і різний Open Source проникнув Adobe Lightroom :) В кількох місцях Mapillery треба замінити на Mapillary.

Comment from Blackbird27 on 21 May 2016 at 15:03

Дякую, поправив, ну він тихенько проник ))), але я дав посилання на альтернативу, з нашим ADSL від відомого монополіста, скоріше посивієш, чим відвантажиш щось великого розміру, тому користуюся тим, що було під рукою.

Comment from Blackbird27 on 21 May 2016 at 16:34

До речі після закінчення випробувального періоду Adobe Lightroom, він все одно продовжує працювати з обмеженою функціональністю (Develop та Map стають недоступні), проте Опція Quick Develop на вкладці Library залишається доступна, тому користуючись стандартними пресетами балансу білого та автотону можна значно покращити зображення, і відправити зображення на експорт, чим я і користуюсь. Можна сказати що Adobe “дарує” полегшену версію програми після закінчення дії ліцензії пробної версії програми. Так що, як казав колись Ющенко: “ці руки нічого не крали”)))).

Comment from zaharchenkoyurka on 21 May 2016 at 19:09

Отличная и нужная статья! Её бы мне пару месяцев назад, когда сам мучился с запуском тех скриптов ) Могу дать несколько дополнений 1) Если камера не умеет синхронизироваться со временем телефона (например, у меня SJ4000 без wi-fi), то есть смысл в начале сессии сфотографировать экран мобильника с текущим его временем с точностью до секунд, а то и долей секунд на экшн-камеру. Тогда, загрузив в JOSM трек и снимки, можно будет выставить правильное смещение времени для этой фотографии (она будет первой в серии). А после привязки, это фото можно удалить - она свое сделала. 2) Во время съемки поворачиваю камеру вправо на 45 градусов. При этом дорога не занимает бОльшую часть снимка и хорошо видны объекты справа. Соответственно, каждую улицу нужно проехать дважды - в разных направлениях, и у Вас будет почти Яндекс.Панорама ) При использовании же скрипта interpolate_direction нужно указать смещение в градусах по часовой стрелке сразу после адреса папки с фотографиями python interpolate_direction.py d:\Mapillary\ 45 3) Если в серии больше 100 фотографий, грузить их через веб-интерфейс проблемно. Лучше использовать скрипт upload_with_authentication Только вначале его нужно исправить: 3.1) Переходим на страницу загрузки Mapillary. Там внизу под надписью “Upload from script” будут два набора кракозяблов - “Permission Hash” и “Signature Hash”, нам они нужны 3.2) С помощью “Блокнота” или чего-то подобного открываем скрипт upload_with_authentication.py и находим там строку, что начинается с MAPILLARY_USERNAME = вставляем туда в кавычках ваш юзернейм: MAPILLARY_USERNAME = “z-yurets” 3.3) Следующая строка MAPILLARY_PERMISSION_HASH = Точно так же вставляем туда в кавычках Ваш хеш со страницы загрузки 3.4) И еще одна следующая MAPILLARY_SIGNATURE_HASH = ну Вы поняли ;) 3.5) Запускаем скрипт из командной строки и идем пить чай - процесс не быстрый. У меня так: python upload_with_authentication.py d:\Mapillary\ Если в процессе возникнут проблемы с интернетом, загрузку не прерывайте, просто устраните/дождитесь устранения проблем, скрипт сам продолжит загрузку. 4) Чтобы каждый раз не писать в командную строку много заграничных букв, есть смысл сделать два bat-файла с этими командными строками и поместить их в папку к скриптам. Фотографии же для обработки и загрузки сваливать тоже всегда в одну папку, упомянутую в тех батниках. Надеюсь, был полезен )

Comment from Blackbird27 on 21 May 2016 at 19:42

Дякую за відгук, все що ви описали знаю і користуюся, стаття орієнтована на середньостатистичного користувача, тому постарався обмежити взаємодію з Python до одного скрипта)))), так як альтернативи не знайшов. Але поки для мене працюють не всі скрипти з набору Mapillary Tools, або працюють не зовсім коректно, наприклад geotag_from_gpx.py не хоче проставляти координати та upload_with_preprocessing.py який в процесі підготовки знімків задіює скрипт interpolate_direction.py починає просто завантажувати послідовності знімків, але кут напряму зйомки все-одно залишається 0. Керівництво від автора Mapillary Tools на GitHub не зовсім детальне і описує використання скриптів на Unix-подібних операційних системах, що дещо відрізняється від середовища Python встановленого на Windows.

Щодо значень змінного середовища (MAPILLARY_USERNAME, MAPILLARY_EMAIL, MAPILLARY_PASSWORD, MAPILLARY_PERMISSION_HASH, MAPILLARY_SIGNATURE_HASH), то їх також можна прописати у виконуваний файл .cmd, а не в сам скрипт, в цілях безпеки облікового запису Mapillary))). Як тільки весь процес запрацює до автоматизму, я напишу ще одну статтю з використанням тільки скриптів і все детально опишу.

А щодо панорам, то на форумі Mapillary можна почитати цікаві обговорення з ілюстраціями, де люди прилаштовують 4!!! камери Xiaomi Yi в різних напрямках до велосипеду для зйомки повних панорам)))).

Comment from ConsEbt on 22 May 2016 at 06:00

Thank you This looks like a good how to for adding GPS information to photos taken with action camera (e.g. GoPro). Unfortunately not the language I speak. I will use the google translation for now.

Comment from Blackbird27 on 22 May 2016 at 06:03

Thank you, if I will have time, I will translate it into English as well, and publish it here.

Comment from velmyshanovnyi on 30 June 2016 at 07:44

привіт народ, пиляю 360 камеру на базі распбері www.open360.pro - тут презенташка

вже вміє синхнронно фоткати, скоро буде В ФОТКУ писати GPS-координати…. ….і тоді я вийду надвір

знаходжусь в Києві, зможу відзняти що треба… планую зробити по якості не гірше ніж у Гугла :) поки що 8 камер по 1,3Мп, буде 13 по 8Мп

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

ось мій профіль https://www.mapillary.com/profile/velmyshanovnyi стукайте коли що…

Log in to leave a comment