AliceVision: fotogrametri baris perintah

Apakah Anda perlu mengotomatiskan sejumlah besar pemindaian fotogrametri? Lalu aku punya kabar baik untukmu.


Video menunjukkan program fotogrametri ruang terbuka Meshroom . Proyek ini telah ada dalam berbagai bentuk selama beberapa waktu, tetapi baru-baru ini pengembang telah merilis file biner, sehingga Anda dapat mengunduh dan menggunakannya. Video menunjukkan penggunaan GUI untuk memuat gambar, memprosesnya, mengubah parameter, dll. Saya sarankan Anda mencoba program ini dalam tindakan.

Tapi saya tertarik dengan otomatisasi penuh. Jika Anda memiliki instalasi pemindaian tempat Anda membuat 100 atau lebih pemindaian per hari, maka Anda memerlukan solusi yang sepenuhnya otomatis untuk pemrosesan batch file-file ini. Posting ini adalah panduan dan / atau tutorial untuk menyelesaikan masalah ini.

Sebagai permulaan, penting untuk memahami bahwa Meshroom bukanlah proyek raksasa, monolitik. Bahkan, pemrosesan itu sendiri dilakukan oleh program C ++ terpisah yang dijalankan dari baris perintah, dan Meshroom adalah program pengkodean Python tipis yang membuat panggilan yang sesuai. Karenanya, alih-alih menggunakan Meshroom, kami akan menggunakan program ini secara langsung. Perhatikan bahwa sumber lengkap tersedia, sehingga Anda dapat menautkan perpustakaan secara langsung.

Meshroom memiliki fitur lain yang nyaman: selama setiap operasi, perintahnya ditampilkan di terminal. Oleh karena itu, untuk membuat tahapan proses ini, saya hanya bekerja dengan Meshroom dan melihat tim. Lalu saya melihat ke dalam kode untuk mengubah beberapa parameter. Selain itu, tampaknya ketika Anda memulai Meshroom, Anda dapat memesannya untuk mengumpulkan satu set gambar dari baris perintah, tetapi saya lebih suka untuk tidak menghubungkan langkah-langkah ini.

Persiapan dan instalasi


0: Persyaratan

Meshroom / AliceVision tidak akan berjalan di setiap platform. CUDA diperlukan untuk beberapa langkah, jadi untuk membangun peta mendalam Anda akan membutuhkan GPU NVIDIA. Sayangnya, tidak mungkin untuk menggunakan CPU fallback (mentransfer eksekusi fungsi GPU ke CPU). Jika tidak, program ini akan bekerja dengan sempurna di Windows dan Linux. Petunjuk dalam artikel ini adalah untuk Windows, tetapi dengan sedikit perubahan, mereka dapat disesuaikan untuk Linux.

1: Unduh rilis Meshroom

Meshroom 2018.1.0

Hal pertama yang harus dilakukan adalah menginstal Meshroom . Pilih folder tempat Anda ingin melakukan pekerjaan itu, lalu unduh versi terbaru. File zip berisi binari dari semua dependensi.

Jika Anda tertarik untuk berpetualang, maka Anda dapat mencoba menyusun program sendiri. Rilis pustaka tautan dinamis berfungsi dengan baik (/ MD), tapi saya harus meretas file cmake untuk membuat debug build dan / atau build tautan statis. Jika Anda akan membangun program di bawah Windows, maka SANGAT merekomendasikan menggunakan VCPKG.

2: Unduh data

alicevision / dataset_monstree

Jelas, inti dari perangkat lunak fotogrametri adalah untuk memproses gambar Anda sendiri, tetapi pertama-tama saya sarankan menggunakan gambar yang dijamin sesuai. Mereka akan memungkinkan Anda untuk menemukan sumber masalah jika terjadi kesalahan. Untungnya, para pengembang merilis serangkaian gambar untuk pohon tes mereka.

3: Unduh skrip run_alicevision.py

run_alicevision.zip

Ini adalah skrip yang akan kita gunakan. Cukup unduh file zip dan unzip ke folder kerja Anda.

4: Instal Python

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

Instal Python jika Anda belum melakukannya. Ya, saya masih menulis kode untuk Python 2.7.0. Cara termudah untuk menginstal Penginstal MSI Windows X86-64 dari rilis.

5: Instal Meshlab (opsional)

MeshLab

Sebagai langkah opsional, Anda juga harus menginstal MeshLab . Bahkan, itu tidak akan diperlukan untuk diproses, tetapi pada beberapa tahap data ditampilkan dalam file titik PLY. Mereka tidak dapat diunduh ke Maya , jadi saya menggunakan MeshLab untuk melihatnya.

Setelah membongkar semua file, folder akan terlihat seperti ini (dengan pengecualian folder build_files , yang dihasilkan oleh skrip):



Berikut ini adalah yang berikut:

  • build_files: file yang telah kami kompilasi.
  • dataset_monstree-master: sumber gambar
  • Meshroom-2018.1.0: Binari Meshroom / AliceVision .
  • Yang lainnya: skrip untuk menjalankannya, yang diambil dari run_alicevision.zip .

Luncurkan AliceVision


Sekarang saatnya untuk melihat lebih dekat pada run_alicevision.py

File Python menerima 5 argumen:

python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>

  1. baseDir : folder tempat Anda ingin meletakkan file sementara.
  2. imgDir : folder yang berisi gambar sumber. Dalam kasus kami, IMG_1024.JPG (dan lainnya).
  3. binDir : Folder yang berisi executable AliceVision , misalnya aliceVision_cameraInit.exe .
  4. numImages : jumlah gambar di imgDir , dalam kasus kami 6. Tentu saja, Anda dapat mengenali nomor ini secara otomatis, tetapi tujuannya adalah untuk membuat skrip python sesederhana mungkin, jadi Anda harus menentukan sendiri angka ini.
  5. runStep : operasi yang akan dilakukan.

Untuk meringkas: kita mulai dengan 6 gambar yang terlihat seperti ini:


Menggunakan skrip python run_alicevision.py, kita akan membuat struktur folder berikut:


Dan di folder 11_Texturing akan ada model siap pakai yang terbuka di Meshlab :


Masing-masing folder ini adalah salah satu langkahnya. Kita dapat menjalankannya secara bergantian menggunakan file run_monstree_runXX.bat , atau menggunakan run_monstree_all.bat untuk mengumpulkan semuanya sekaligus.

Itu saja. Sekarang Anda dapat menjalankan file run_monstree_all.bat , atau melakukan langkah demi langkah. Anda dapat melihat skrip untuk memahami kerjanya. Bagi mereka yang ingin dapat menyesuaikan pipa pemrosesan, saya menyiapkan pengantar untuk masing-masing langkah.

00_CameraInit

Langkah pertama akan menghasilkan file SFM. File SFM adalah file JSON yang menyimpan ukuran kamera, informasi sensor, titik 3d yang ditemukan (pengamatan), faktor distorsi, dan informasi lainnya. File SFM awal dalam folder ini hanya akan berisi informasi tentang sensor dan pilih nilai default dari database sensor lokal. Langkah selanjutnya akan membuat file SFM yang berisi matriks lengkap parameter kamera eksternal, titik, dll.

Anda mungkin perlu mengkonfigurasi langkah ini. Jika Anda menggunakan pengaturan dengan 4 kamera, tetapi mengambil 10 bidikan objek yang berputar pada meja putar, maka Anda memerlukan file SFM dengan 40 gambar, tetapi hanya dengan 4 kalibrasi sensor yang berbeda. Ini adalah alasan utama mengapa saya menyukai struktur AliceVision . Sangat mudah untuk mengatur operasi batch di dalamnya (misalnya, menghasilkan file SFM Anda sendiri) tanpa kesulitan menyiapkan elemen perangkat lunak lain yang sebaiknya tidak Anda sentuh.

01_FeatureExtraction

Tahap selanjutnya mengekstrak fitur karakteristik dari gambar, serta deskriptor fitur ini. Ini akan mengubah ekstensi file tergantung pada jenis fitur yang diekstraksi.

02_ImageMatching

02_ImageMatching adalah langkah pasca-pemrosesan yang menentukan gambar mana yang logis untuk dipetakan satu sama lain. Jika Anda memiliki satu set 1000 gambar, maka untuk pencarian kasar semua 1000 gambar untuk mencocokkan semua 1000 gambar, Anda memerlukan 1 juta pasangan. Ini bisa memakan banyak waktu (sebenarnya hanya setengah, tetapi Anda memahami prinsipnya). Tahap 02_ImageMatching memotong pasangan ini.

03_FeatureMatching

03_FeatureMatching mencocokkan gambar menggunakan deskriptor fitur. File txt yang dihasilkannya tidak perlu dijelaskan.

04_StrukturFromMotion

Jadi, ini adalah tahap serius pertama. Berdasarkan korespondensi 04_StructureFromMotion , ia menghitung posisi kamera serta parameter internal kamera. Perlu dicatat bahwa istilah "Struktur Dari Gerak" digunakan sebagai istilah umum untuk menghitung posisi kamera. Jika Anda memiliki pengaturan untuk fotogrametri dari 10 kamera yang disinkronkan, maka "Struktur Dari Gerak" digunakan untuk memotretnya, bahkan jika tidak ada yang benar-benar bergerak.

Secara default, Meshroom menyimpan semua data yang dihitung sebagai file Alembic , tapi saya lebih suka menyimpannya dalam file SFM. Tahap ini menciptakan data antara untuk memastikan bahwa kamera terhubung dengan benar. Pada output, skrip membuat file PLY yang dapat dilihat di Meshlab . File-file berikut ini penting:

  • bundle.sfm: file SFM dengan semua pengamatan.
  • cameras.fm: File SFM dengan data hanya untuk kamera yang terpasang.
  • cloud_and_poses.ply: poin dan kamera yang ditemukan.


Ini adalah file cloud_and_poses.ply . Titik hijau adalah kamera. Saya percaya bahwa format ini paling cocok untuk memeriksa tidak adanya kesalahan kotor dalam pengikatan kamera. Jika kesalahan terjadi di suatu tempat, maka Anda dapat kembali dan mengubah fitur, korespondensi, atau parameter SFM.



05_Siapkan DenseScene

Tugas utama 05_PrepareDenseScene adalah untuk menghilangkan distorsi gambar. Ini menghasilkan gambar EXR tanpa distorsi, sehingga langkah-langkah selanjutnya dalam menghitung kedalaman dan proyeksi tidak perlu melakukan konversi bolak-balik dari fungsi distorsi. Gambar terlihat seperti ini:



Perlu dicatat bahwa Anda akan melihat area hitam. Langkah-langkah selanjutnya dari AliceVision tidak menggunakan matriks kamera asli. Sebagai gantinya, kami berpura-pura bahwa kamera memiliki matriks baru tanpa distorsi, dan 05_PrepareDenseScene mengubah gambar asli ke matriks fiktif ini. Karena sensor virtual baru ini lebih besar dari sensor sebenarnya, beberapa area akan tampak kosong (hitam).

06_CameraConnection

Sebenarnya, tahap ini melanggar prinsip proses kerja kami. Semua tahap dirancang sehingga setiap folder menjadi tahap terpisah yang benar-benar unik. Namun, 06_CameraConnection membuat file camsPairsMatrixFromSeeds.bin dalam folder 05_PrepareDenseScene , karena file ini harus berada dalam folder yang sama dengan gambar tanpa distorsi.

07_DepthMap

Ini adalah fase terpanjang dari AliceVision : menghasilkan peta kedalaman. Ini menciptakan peta kedalaman untuk setiap gambar sebagai file EXR. Saya mengaturnya agar lebih mudah diperhatikan. Anda dapat melihat "lidah" ​​kecil mencuat dari pohon.


Karena tahap ini membutuhkan banyak waktu, ada parameter yang memungkinkan kita menjalankan kelompok kamera yang berbeda sebagai perintah terpisah yang berbeda. Oleh karena itu, jika Anda memiliki 1000 kamera, maka Anda dapat membuat peta mendalam untuk kelompok kamera pada mesin pertanian yang berbeda. Atau Anda dapat memecah pekerjaan menjadi kelompok-kelompok kecil sehingga jika satu mesin mogok, Anda tidak perlu mengulangi seluruh proses lagi.

08_DepthMapFilter

Peta kedalaman sumber tidak akan sepenuhnya konsisten. Beberapa peta kedalaman perlu melihat area yang tumpang tindih dengan peta kedalaman lainnya. Stage 08_DepthMapFilter mengisolasi area-area tersebut dan menegakkan konsistensi kedalaman.


09_Mengetahui

Ini adalah langkah pertama di mana mesh dihasilkan secara langsung. Mungkin ada masalah kecil dengan jala yang dapat dipecahkan dengan ...


10_MeshFiltering

Tahap 10_MeshFiltering menerima jala 09_Meshing dan memolesnya . Ia melakukan operasi berikut:

  • Menghaluskan mesh.
  • Menghilangkan segitiga besar.
  • Menghemat jala terbesar, tetapi menghapus sisanya.


Beberapa operasi ini tidak selalu diinginkan dalam kasus tertentu, sehingga parameter dapat disesuaikan jika perlu.

11_Tekstur

Tahap terakhir. 11_Tekstur membuat UV dan memproyeksikan tekstur. Dan pada tahap ini semuanya berakhir!


Trik terakhir yang dapat Anda lakukan dengan Meshlab : Anda dapat menarik dan melepas file OBJ dan PLY yang berbeda sebagai lapisan.


Dalam contoh saya, ada lapisan untuk jala jadi, dan untuk poin / kamera SFM. Terkadang langkah smoothing dari mesh dapat sedikit lebih agresif dari yang diperlukan, sehingga berguna untuk membandingkan mesh yang asli dan smoothing. Jika mesh terlihat rusak, maka untuk melacak masalah dalam pipa, lebih mudah untuk menggunakan data SFM dari PLY dan mesh dari OBJ.

Ucapan Terima Kasih

Posting ini tidak akan lengkap tanpa banyak terima kasih kepada tim pengembangan AliceVision dan OpenMVG . Sumber inspirasi adalah proyek libmv . Proyek ini adalah cikal bakal OpenMVG , yang merupakan gudang insinyur / peneliti penglihatan komputer untuk mengembangkan algoritma baru. AliceVision adalah fork dari OpenMVG , dibuat khusus untuk mengubah algoritma ini menjadi solusi mandiri dalam bentuk produk jadi.

AliceVision / Meshroom adalah proyek open-source yang ambisius dan besar. Prestasi utamanya adalah pencapaian dari proyek akhir seperti itu oleh proyek yang begitu serius, dan kami berutang banyak padanya. Kami juga wajib mengucapkan terima kasih kepada tim OpenMVG (dan libmv ), yang karya dasarnya memungkinkan AliceVision dibuat .

Akhirnya, saya ingin mengucapkan terima kasih khusus kepada Microsoft untuk VCPKG . VCPKG adalah manajer paket yang sangat menyederhanakan perakitan proyek sumber terbuka besar untuk Windows. Beberapa tahun yang lalu saya mencoba membangun OpenMVG di Windows. Itu tidak berakhir dengan baik. Jadi ketika saya mendengar tentang AliceVision beberapa bulan yang lalu, saya mencoba untuk mengkompilasinya, tetapi gagal bahkan dengan hal-hal yang lebih sederhana. Lalu saya mencoba VCPKG , dan semuanya langsung bekerja. Sulit untuk mengukur keuntungan menggunakan proyek seperti VCPKG , tetapi sangat membantu ekosistem open-source untuk Windows.

github.com/alicevision

github.com/openMVG/openMVG

github.com/libmv/libmv

github.com/Microsoft/vcpkg

Source: https://habr.com/ru/post/id422807/


All Articles