AliceVision: фотограмметрія з командного рядка

Вам потрібно автоматизувати величезна кількість фотограмметричних сканів? Тоді у мене для вас гарні новини.

У відео показана програма для фотограмметрії Meshroom з відкритим вихідним кодом. Цей проект в різних формах існує вже досить давно, але нещодавно розробники випустили двійкові файли, тому їх можна просто завантажити і використовувати. У ролику продемонстровано використання GUI для завантаження зображень, їх обробки, зміни параметрів і т. д. Рекомендую вам спробувати цю програму в дії.

Але мене цікавить повна автоматизація. Якщо у вас є скануюча установка, на якій ви робите по 100 і більше сканів у день, то необхідно повністю автоматизоване рішення для пакетної обробки цих файлів. Даний пост є керівництвом і/або туториалом за рішенням цієї задачі.

Для початку важливо зрозуміти, що Meshroom — не гігантський, монолітний проект. Насправді, сама обробка виконується окремими програмами на C++, що працюють з командного рядка, а Meshroom — це тонка програма-прокладка на Python, що виконує відповідні виклики. Тому замість використання Meshroom ми будемо застосовувати ці програми напряму. Врахуйте, що доступні повні вихідні коди, тому ви можете прив’язати бібліотеки безпосередньо.

У Meshroom є ще одна корисна особливість: при виконанні кожної операції її команда відображається в терміналі. Тому щоб створити етапи цього процесу, я просто працював з Meshroom і дивився за командами. Потім я заглянув в код, щоб змінити деякі параметри. Крім того, здається, при запуску Meshroom можна наказати йому зібрати набір зображень з командного рядка, але я волію не з’єднувати ці етапи.

Підготовка і установка

0: Вимоги

Meshroom/AliceVision запустяться не на кожній платформі. Для деяких етапів необхідна CUDA, тому для побудови карт глибин вам знадобиться GPU компанії NVIDIA. На жаль використовувати CPU fallback (перенесення виконання функцій GPU на ЦП)., інакше програма б відмінно працювала і в Windows, в Linux. Інструкції в цій статті наведено для Windows, але з мінімальними змінами їх можна підлаштувати і під Linux.

1: Скачайте реліз Meshroom

Meshroom 2018.1.0

Перше, що треба зробити — встановити Meshroom. Виберіть папку, з якої ви хочете виконувати роботу, а потім скачайте останню версію. У zip-файлі є двійкові файли всіх залежностей.

Якщо вас тягне на пригоди, то можете спробувати зібрати програму самостійно. Релизные динамічно підключаються бібліотек працюють нормально (/MD), але мені довелося хакать файли cmake для створення налагоджувальних збірок та/або збірок зі статичним підключенням. Якщо ви будете збирати програму під Windows, то ВКРАЙ рекомендую використовувати VCPKG.

2: Скачайте дані

alicevision/dataset_monstree

Очевидно, що весь сенс фотограмметрії полягає в обробці ваших власних зображень, але для початку я пропоную використовувати зображення, які гарантовано підходять. Вони дозволять знайти джерела проблем, якщо щось піде не так. На щастя, розробники випустили набір зображень для свого тестового дерева.

3: Скачайте скрипт run_alicevision.py

run_alicevision.zip

Читайте також  Як влаштовані технічні індикатори на фондових ринках

Це скрипт, який ми будемо використовувати. Просто скачайте zip файл і розпакуйте його в робочу папку.

4: Встановіть Python

https://www.python.org/download/releases/2.7/

Встановіть Python, якщо ви ще цього не зробили. Так, я все ще пишу код для Python 2.7.0. Найпростіше встановити Windows X86-64 MSI Installer з релізів.

5: Встановіть Meshlab (необов’язково)

MeshLab

В якості додаткового кроку потрібно також встановити MeshLab. Насправді для обробки вона не знадобиться, але на декількох етапах дані виводяться у файлах точок PLY. Їх можна завантажити в Maya, тому для їх перегляду я користуюся MeshLab.

Після розпакування файлів папка повинна виглядати таким чином (за винятком папки build_files, яка генерується скриптами):

Тут є наступне:

  • build_files: файли, які ми зібрали.
  • dataset_monstree-master: вихідні зображення
  • Meshroom-2018.1.0: двійкові файли Meshroom/AliceVision.
  • Все інше: скрипти для їх запуску, які взяті з run_alicevision.zip.

 

Запуск AliceVision

Тепер настав час придивитися до run_alicevision.py

Файл Python отримує 5 аргументів:

python run_alicevision.py &ltbaseDir&gt &ltimgDir&gt &ltbinDir&gt &ltnumImages&gt &ltrunStep&gt

  1. baseDir: папка, в яку ви хочете розміщувати тимчасові файли.
  2. imgDir: папка, що містить вихідні зображення. У нашому випадку IMG_1024.JPG (і інші).
  3. binDir: папка, що містить виконувані файли AliceVision, наприклад aliceVision_cameraInit.exe.
  4. numImages: кількість зображень в imgDir, в нашому випадку 6. Зрозуміло, можна розпізнавати це кількість автоматично, але мета полягала в створенні як можна більш простого python-скрипта, тому потрібно вказувати це число самостійно.
  5. runStep: виконувана операція.

Підіб’ємо підсумок: ми починаємо з 6 зображень, виглядають наступним чином:


З допомогою python-скрипта run_alicevision.py ми збираємося створити таку структуру папок:


А в папці 11_Texturing буде знаходитися готова модель, що відкривається в Meshlab:


Кожна з цих папок є одним з етапів. Ми можемо або запускати їх по черзі з допомогою файлів run_monstree_runXX.bat, або скористатися run_monstree_all.bat, щоб зібрати їх всі відразу.

От і все. Тепер можна запустити файл run_monstree_all.bat, або виконувати по одному кроку за раз. Можете подивитися на скрипт, щоб розібратися в його роботі. Для тих, кому хочеться мати можливість налаштування конвеєра обробки я підготував введення в окремі етапи.

00_CameraInit

Перший етап згенерує файл SFM. Файли SFM — це файли у форматі JSON, в яких зберігаються розмір камери, інформація про сенсор, знайдені 3d-точки (спостереження), коефіцієнти спотворення та інша інформація. Первісний файл SFM у цій теці буде містити тільки інформацію про сенсорі і вибирати значення за замовчуванням з локальної бази даних сенсорів. Наступні етапи будуть створювати файли SFM, що містять повні матриці зовнішніх параметрів камер, точки і т. д.

Вам може знадобитися налаштування цього етапу. Якщо ви використовуєте установку з 4 камерами, але робите 10 знімків об’єкта, що обертається на поворотному столі, то вам знадобиться файл SFM з 40 зображеннями, але всього з 4 різними калібруваннями сенсорів. Це основна причина того, чому мені подобається структура AliceVision. У ній легко налаштовувати пакетні операції (наприклад генерацію власного файлу SFM) без мук з налаштуванням інших елементів, які краще не чіпати.

Читайте також  Робимо радіостанцію з GTA: San Andreas

01_FeatureExtraction

Наступний етап витягує з зображень характерні риси, а також дескриптори цих рис. Він буде змінювати розширення файлу в залежності від типу витягуваної характерні риси.

02_ImageMatching

02_ImageMatching — це етап постобробки, що визначає, які з зображень логічно зіставляти один з одним. Якщо у вас є набір з 1000 зображень, для грубого перебору всіх 1000 зображень на відповідність усім 1000 зображень потрібно 1 мільйон пар. На це може знадобитися багато часу (насправді в два рази менше, але ви зрозуміли принцип). Етап 02_ImageMatching відсікає ці пари.

03_FeatureMatching

03_FeatureMatching знаходить відповідності між зображеннями за допомогою дескрипторів характерних рис. Генеруються їм файли txt пояснення не потребують.

04_StructureFromMotion

Так, це перший серйозний етап. На підставі відповідностей 04_StructureFromMotion обчислює позиції камер, а також внутрішні параметри камер. Слід врахувати, що термін «Structure From Motion» використовується як загальний для обчислення позицій камер. Якщо у вас є установка для фотограмметрії з 10 синхронізованих камер, то «Structure From Motion» використовується для їх прив’язки, навіть якщо насправді нічого не рухається.

За замовчуванням Meshroom зберігає всі обчислені дані як файл Alembic, але я віддаю перевагу зберігати їх у файлі SFM. Цей етап створює проміжні дані, що дозволяють переконатися в правильній прив’язці камер. На виході скрипт створює файли PLY, які можна переглянути в Meshlab. Важливі наступні файли:

  • bundle.sfm: файл SFM зі всіма спостереженнями.
  • cameras.fm: файл SFM з даними тільки прив’язаних камер.
  • cloud_and_poses.ply: знайдені точки і камери.

Ось файл cloud_and_poses.ply. Зелені точки — це камери. Я вважаю, що цей формат найкраще підходить для перевірки відсутності грубих помилок в прив’язці камер. Якщо де-то виникне помилка, то ви можете повернутися назад і змінити характерні риси, відповідності або параметри SFM.

05_PrepareDenseScene

Основне завдання 05_PrepareDenseScene — усунення перекручувань зображення. Він генерує зображення EXR без спотворень, щоб наступним етапам обчислення глибин і проекцій не потрібно було виконувати перетворення туди-назад з функції спотворень. Зображення виглядають так:

Потрібно зауважити, що ви побачите чорні області. Наступні етапи AliceVision не використовують справжню матрицю камери. Замість цього ми вдаємо, що у камери є нова матриця без спотворень, а 05_PrepareDenseScene деформує початкове зображення під цю вигадану матрицю. Оскільки цей новий віртуальний сенсор більше цього сенсора, деякі області виявляться порожніми (чорними).

06_CameraConnection

Строго кажучи, цей етап порушує принцип нашого робочого процесу. Всі етапи були розроблені так, щоб кожна папка ставала абсолютно унікальним окремим етапом. Однак 06_CameraConnection створює в папці 05_PrepareDenseScene файл camsPairsMatrixFromSeeds.bin, тому що цей файл повинен знаходитися у тій же теці, що і зображення без спотворень.

07_DepthMap

Це найдовший етап AliceVision: генерування карт глибин. Він створює карту глибин для кожного зображення як файл EXR. Я налаштував його, щоб це було легше помітити. Ви можете побачити невелику «мову», що стирчить із дерева.

Читайте також  Виявлені елементарні дизайн-частинки


Оскільки цей етап займає багато часу, існує параметр, що дозволяє нам запускати групи різних камер як різні окремі команди. Тому якщо у вас є 1000 камер, то можна створювати карти глибин для груп камер на різних машинах ферми. Або ж можна розбити виконання роботи на дрібні групи, щоб при збої однієї машини не треба було повторювати заново весь процес.

08_DepthMapFilter

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


09_Meshing

Це перший етап, на якому безпосередньо генерується меш. З мешем можуть бути невеликі проблеми, які можна вирішити за допомогою…


10_MeshFiltering

Етап 10_MeshFiltering отримує меш 09_Meshing і вдосконалює його. Він виконує наступні операції:

  • Згладжує меш.
  • Усуває великі трикутники.
  • Зберігає найбільший меш, але видаляє всі інші.


Деякі з цих операцій в певних випадках не завжди бажані, тому при необхідності параметри можна налаштувати.

11_Texturing

Останній етап. 11_Texturing створює UV і проектує текстури. І на цьому етапі все закінчується!


Останній трюк, який можна зробити з Meshlab: ви можете перетягувати різні файли OBJ і PLY як шари.


В моєму прикладі є шар і для готового мешу, і для точок/камер SFM. Іноді етап згладжування меша може бути дещо агресивніше, ніж потрібно, тому корисно порівняти вихідний і згладжений меші. Якщо меш виглядає поламаним, то для відстеження проблем в конвеєрі зручно використовувати sfm-дані з PLY і меші з OBJ.

Подяки

Цей пост був би неповним без величезної подяки командам розробників AliceVision і OpenMVG. Джерелом натхнення послужив проект libmv. Цей проект був попередником OpenMVG, який є сховищем інженерів/дослідників комп’ютерного зору для розробки нових алгоритмів. AliceVision — це форк OpenMVG, створений спеціально для того, щоб перетворити ці алгоритми в окреме рішення у вигляді готового продукту.

AliceVision/Meshroom — великий, амбітний open-source-проект. Його основне досягнення — досягнення таким серйозним проектом фінальної риси, і ми зобов’язані йому дуже багатьом. Також ми зобов’язані подякувати команду OpenMVGlibmv), чия фундаментальна робота дозволила створити AliceVision.

Нарешті, я хочу сказати особливе спасибі Microsoft за VCPKG. VCPKG — це менеджер пакетів, сильно спростив складання великих open-source-проектів під Windows. Кілька років тому я намагався зібрати під Windows OpenMVG. Все закінчилося не дуже добре. Тому коли кілька місяців тому я почув про AliceVision, я спробував зібрати його, але зазнав невдачі навіть з більш простими речами. Потім я спробував VCPKG, і все відразу запрацювало. Складно виразити кількісно перевагу використання такого проекту, як VCPKG, але він дуже допоміг екосистемі open-source під Windows.

github.com/alicevision

github.com/openMVG/openMVG

github.com/libmv/libmv

github.com/Microsoft/vcpkg

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *