AliceVision: Befehlszeilenphotogrammetrie

Müssen Sie eine große Anzahl von photogrammetrischen Scans automatisieren? Dann habe ich gute Nachrichten für Sie.


Das Video zeigt das Open-Source- Fotogrammetrieprogramm Meshroom . Dieses Projekt gibt es schon seit einiger Zeit in verschiedenen Formen, aber kürzlich haben Entwickler Binärdateien veröffentlicht, sodass Sie sie einfach herunterladen und verwenden können. Das Video zeigt die Verwendung der GUI zum Laden, Verarbeiten, Ändern von Parametern usw. von Bildern. Ich empfehle Ihnen, dieses Programm in Aktion auszuprobieren.

Aber ich interessiere mich für Vollautomatisierung. Wenn Sie eine Scan-Installation haben, bei der Sie 100 oder mehr Scans pro Tag durchführen, benötigen Sie eine vollautomatische Lösung für die Stapelverarbeitung dieser Dateien. Dieser Beitrag ist eine Anleitung und / oder ein Tutorial zur Lösung dieses Problems.

Für den Anfang ist es wichtig zu verstehen, dass Meshroom kein gigantisches, monolithisches Projekt ist. Tatsächlich wird die Verarbeitung selbst von separaten C ++ - Programmen ausgeführt, die über die Befehlszeile ausgeführt werden, und Meshroom ist ein Thin Python-Codierungsprogramm, das die entsprechenden Aufrufe ausführt . Anstatt Meshroom zu verwenden, werden wir diese Programme daher direkt verwenden. Beachten Sie, dass vollständige Quellen verfügbar sind, sodass Sie Bibliotheken direkt verknüpfen können.

Meshroom verfügt über eine weitere praktische Funktion: Während jeder Operation wird der Befehl im Terminal angezeigt. Um die Phasen dieses Prozesses zu erstellen, habe ich nur mit Meshroom zusammengearbeitet und mir die Teams angesehen. Dann habe ich in den Code geschaut, um einige Parameter zu ändern. Außerdem können Sie Meshroom beim Starten möglicherweise so bestellen, dass eine Reihe von Bildern über die Befehlszeile erfasst werden. Ich ziehe es jedoch vor, diese Schritte nicht zu verbinden.

Vorbereitung und Installation


0: Anforderungen

Meshroom / AliceVision läuft nicht auf jeder Plattform. Für einige Schritte wird CUDA benötigt. Zum Erstellen von Tiefenkarten benötigen Sie eine NVIDIA-GPU. Leider ist es nicht möglich, den CPU-Fallback zu verwenden (Übertragung der Ausführung der GPU-Funktionen auf die CPU). Andernfalls würde das Programm unter Windows und Linux einwandfrei funktionieren. Die Anweisungen in diesem Artikel gelten für Windows, können jedoch mit minimalen Änderungen für Linux optimiert werden.

1: Laden Sie die Meshroom-Version herunter

Meshroom 2018.1.0

Als erstes müssen Sie Meshroom installieren. Wählen Sie den Ordner aus, aus dem Sie die Arbeit ausführen möchten, und laden Sie dann die neueste Version herunter. Die Zip-Datei enthält Binärdateien aller Abhängigkeiten.

Wenn Sie von Abenteuern angezogen werden, können Sie versuchen, das Programm selbst zusammenzustellen. Die Freigabe dynamischer Linkbibliotheken funktioniert einwandfrei (/ MD), aber ich musste cmake-Dateien hacken, um Debug-Builds und / oder statische Link-Builds zu erstellen. Wenn Sie das Programm unter Windows erstellen, empfehlen Sie EXTREM die Verwendung von VCPKG.

2: Daten herunterladen

alicevision / dataset_monstree

Natürlich besteht der Sinn der Photogrammetrie-Software darin, Ihre eigenen Bilder zu verarbeiten, aber zuerst schlage ich vor, Bilder zu verwenden, die garantiert geeignet sind. Sie ermöglichen es Ihnen, die Ursachen von Problemen zu finden, wenn etwas schief geht. Glücklicherweise haben die Entwickler eine Reihe von Bildern für ihren Testbaum veröffentlicht.

3: Laden Sie das Skript run_alicevision.py herunter

run_alicevision.zip

Dies ist das Skript, das wir verwenden werden. Laden Sie einfach die Zip-Datei herunter und entpacken Sie sie in Ihren Arbeitsordner.

4: Installieren Sie Python

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

Installieren Sie Python, falls Sie dies noch nicht getan haben. Ja, ich schreibe immer noch Code für Python 2.7.0. Der einfachste Weg, um Windows X86-64 MSI Installer aus Releases zu installieren.

5: Meshlab installieren (optional)

MeshLab

Optional müssen Sie auch MeshLab installieren. Tatsächlich wird es für die Verarbeitung nicht benötigt, aber in mehreren Phasen werden die Daten in den PLY-Punktdateien angezeigt. Sie können nicht auf Maya heruntergeladen werden, daher verwende ich MeshLab , um sie anzuzeigen.

Nach dem Entpacken aller Dateien sollte der Ordner folgendermaßen aussehen (mit Ausnahme des Ordners build_files , der von Skripten generiert wird):



Hier ist das Folgende:

  • build_files: die Dateien, die wir kompiliert haben.
  • Dataset_monstree-Master: Quellbilder
  • Meshroom-2018.1.0: Meshroom / AliceVision-Binärdateien .
  • Alles andere: Skripte zum Ausführen, die aus run_alicevision.zip stammen .

Starten Sie AliceVision


Jetzt ist es Zeit, sich run_alicevision.py genauer anzusehen

Die Python-Datei erhält 5 Argumente:

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

  1. baseDir : Der Ordner, in den Sie temporäre Dateien ablegen möchten.
  2. imgDir : Ordner mit Quellbildern . In unserem Fall IMG_1024.JPG (und andere).
  3. binDir : Ein Ordner mit ausführbaren AliceVision-Dateien , z. B. aliceVision_cameraInit.exe .
  4. numImages : Die Anzahl der Bilder in imgDir , in unserem Fall 6. Natürlich können Sie diese Nummer automatisch erkennen, aber das Ziel war es, ein möglichst einfaches Python-Skript zu erstellen. Daher müssen Sie diese Nummer selbst angeben.
  5. runStep : Die auszuführende Operation.

Zusammenfassend: Wir beginnen mit 6 Bildern, die so aussehen:


Mit dem Python-Skript run_alicevision.py erstellen wir die folgende Ordnerstruktur:


Und im Ordner 11_Texturing befindet sich ein fertiges Modell, das in Meshlab geöffnet wird :


Jeder dieser Ordner ist einer der Schritte. Wir können sie entweder nacheinander mit den Dateien run_monstree_runXX.bat ausführen oder mit run_monstree_all.bat alle gleichzeitig sammeln.

Das ist alles. Jetzt können Sie die Datei run_monstree_all.bat ausführen oder Schritt für Schritt ausführen. Sie können sich das Skript ansehen, um seine Arbeit zu verstehen. Für diejenigen, die die Verarbeitungspipeline anpassen möchten, habe ich eine Einführung in die einzelnen Schritte vorbereitet.

00_CameraInit

Im ersten Schritt wird eine SFM-Datei generiert. SFM-Dateien sind JSON-Dateien, in denen Kameragröße, Sensorinformationen, gefundene 3D-Punkte (Beobachtungen), Verzerrungsfaktoren und andere Informationen gespeichert sind. Die anfängliche SFM-Datei in diesem Ordner enthält nur Informationen zum Sensor und wählt Standardwerte aus der lokalen Sensordatenbank aus. In den folgenden Schritten werden SFM-Dateien erstellt, die die vollständige Matrix externer Kameraparameter, Punkte usw. enthalten.

Möglicherweise müssen Sie diesen Schritt konfigurieren. Wenn Sie ein Setup mit 4 Kameras verwenden, aber 10 Aufnahmen von einem Objekt machen, das sich auf einem Plattenteller dreht, benötigen Sie eine SFM-Datei mit 40 Bildern, aber nur mit 4 verschiedenen Sensorkalibrierungen. Dies ist der Hauptgrund, warum mir die Struktur von AliceVision gefällt . Es ist einfach, Stapeloperationen darin einzurichten (z. B. das Generieren einer eigenen SFM-Datei), ohne andere Softwareelemente einrichten zu müssen, die am besten unberührt bleiben.

01_FeatureExtraction

In der nächsten Stufe werden die charakteristischen Merkmale aus den Bildern sowie die Deskriptoren dieser Merkmale extrahiert. Die Dateierweiterung wird abhängig von der Art des zu extrahierenden Features geändert.

02_ImageMatching

02_ImageMatching ist ein Nachbearbeitungsschritt, der bestimmt, welches der Bilder logisch ist, um es einander zuzuordnen. Wenn Sie einen Satz von 1000 Bildern haben, benötigen Sie für eine grobe Suche aller 1000 Bilder, die mit allen 1000 Bildern übereinstimmen, 1 Million Paare. Dies kann viel Zeit in Anspruch nehmen (eigentlich halb so viel, aber Sie verstehen das Prinzip). Stufe 02_ImageMatching schneidet diese Paare ab.

03_FeatureMatching

03_FeatureMatching vergleicht Bilder mithilfe von Feature-Deskriptoren. Die generierten txt-Dateien müssen nicht erklärt werden.

04_StructureFromMotion

Dies ist also die erste ernsthafte Phase. Basierend auf den 04_StructureFromMotion- Entsprechungen werden die Positionen der Kameras sowie die internen Parameter der Kameras berechnet. Es ist zu beachten, dass der Begriff „Struktur aus Bewegung“ als allgemeiner Begriff für die Berechnung von Kamerapositionen verwendet wird. Wenn Sie ein Setup für die Photogrammetrie von 10 synchronisierten Kameras haben, werden diese mit „Structure From Motion“ aufgenommen, auch wenn sich nichts wirklich bewegt.

Standardmäßig speichert Meshroom alle berechneten Daten als Alembic- Datei, aber ich bevorzuge es, sie in einer SFM-Datei zu speichern. In dieser Phase werden Zwischendaten erstellt, um sicherzustellen, dass die Kameras korrekt verbunden sind. Bei der Ausgabe erstellt das Skript PLY-Dateien, die in Meshlab angezeigt werden können. Die folgenden Dateien sind wichtig:

  • bundle.sfm: SFM-Datei mit allen Beobachtungen.
  • camera.fm: Eine SFM-Datei mit Daten nur für angeschlossene Kameras.
  • cloud_and_poses.ply: Gefundene Punkte und Kameras.


Hier ist die Datei cloud_and_poses.ply . Grüne Punkte sind Kameras. Ich glaube, dass dieses Format am besten geeignet ist, um das Fehlen grober Fehler beim Binden von Kameras zu überprüfen. Wenn irgendwo ein Fehler auftritt, können Sie zurückgehen und die Funktionen, Entsprechungen oder SFM-Parameter ändern.



05_PrepareDenseScene

Die Hauptaufgabe von 05_PrepareDenseScene besteht darin, Bildverzerrungen zu beseitigen. Es werden EXR-Bilder ohne Verzerrung generiert, sodass für die nachfolgenden Schritte zur Berechnung von Tiefen und Projektionen keine Roundtrip-Konvertierungen aus der Verzerrungsfunktion durchgeführt werden müssen. Bilder sehen so aus:



Es ist zu beachten, dass Sie schwarze Bereiche sehen. Nachfolgende Schritte von AliceVision verwenden nicht die reale Kameramatrix. Stattdessen geben wir vor, dass die Kamera eine neue Matrix ohne Verzerrung hat, und 05_PrepareDenseScene verformt das Originalbild in diese fiktive Matrix. Da dieser neue virtuelle Sensor größer als der reale Sensor ist, erscheinen einige Bereiche leer (schwarz).

06_CameraConnection

Genau genommen verstößt diese Phase gegen das Prinzip unseres Arbeitsprozesses. Alle Stufen wurden so gestaltet, dass jeder Ordner zu einer völlig eigenen Stufe wurde. 06_CameraConnection erstellt jedoch die Datei camsPairsMatrixFromSeeds.bin im Ordner 05_PrepareDenseScene , da sich diese Datei ohne Verzerrung im selben Ordner wie die Bilder befinden muss.

07_DepthMap

Dies ist die längste Phase von AliceVision : das Generieren von Tiefenkarten. Es wird eine Tiefenkarte für jedes Bild als EXR-Datei erstellt. Ich habe es eingerichtet, damit es leichter zu bemerken ist. Sie können eine kleine „Zunge“ sehen, die aus dem Baum herausragt.


Da diese Phase viel Zeit in Anspruch nimmt, gibt es einen Parameter, mit dem wir Gruppen verschiedener Kameras als verschiedene separate Befehle ausführen können. Wenn Sie also über 1000 Kameras verfügen, können Sie Tiefenkarten für Gruppen von Kameras auf verschiedenen landwirtschaftlichen Maschinen erstellen. Oder Sie können die Arbeit in kleine Gruppen aufteilen, sodass Sie bei einem Absturz einer Maschine den gesamten Vorgang nicht erneut wiederholen müssen.

08_DepthMapFilter

Quellentiefenkarten sind nicht vollständig konsistent. Bei einigen Tiefenkarten müssen Bereiche angezeigt werden, die von anderen Tiefenkarten überlappt werden. Stufe 08_DepthMapFilter isoliert solche Bereiche und erzwingt Tiefenkonsistenz.


09_Meshing

Dies ist der erste Schritt, in dem das Netz direkt generiert wird. Es kann kleine Probleme mit dem Netz geben, die mit ...


10_MeshFiltering

Stufe 10_MeshFiltering empfängt das 09_Meshing- Netz und verfeinert es. Es führt die folgenden Operationen aus:

  • Glättet das Netz.
  • Beseitigt große Dreiecke.
  • Speichert das größte Netz, löscht aber den Rest.


Einige dieser Vorgänge sind in bestimmten Fällen nicht immer wünschenswert, sodass die Parameter bei Bedarf angepasst werden können.

11_Texturierung

Die letzte Etappe. 11_Texturing erzeugt UV und projiziert Texturen. Und zu diesem Zeitpunkt endet alles!


Der letzte Trick, den Sie mit Meshlab machen können : Sie können verschiedene OBJ- und PLY-Dateien als Ebenen ziehen und ablegen .


In meinem Beispiel gibt es eine Ebene für das fertige Netz und für die Punkte / Kameras SFM. Manchmal kann der Glättungsschritt eines Netzes etwas aggressiver als nötig sein. Daher ist es hilfreich, das Original und das geglättete Netz zu vergleichen. Wenn das Netz defekt aussieht, ist es zur Verfolgung von Problemen in der Pipeline praktisch, SFM-Daten von PLY und Netze von OBJ zu verwenden.

Danksagung

Dieser Beitrag wäre dank der Entwicklungsteams von AliceVision und OpenMVG ohne viel nicht vollständig. Die Inspirationsquelle war das libmv- Projekt. Dieses Projekt war der Vorläufer von OpenMVG , einem Repository von Computer Vision-Ingenieuren / Forschern zur Entwicklung neuer Algorithmen. AliceVision ist eine Verzweigung von OpenMVG , die speziell entwickelt wurde, um diese Algorithmen in eine eigenständige Lösung in Form eines fertigen Produkts umzuwandeln .

AliceVision / Meshroom ist ein großes, ehrgeiziges Open-Source-Projekt. Seine Hauptleistung ist die Erreichung eines solchen Abschlussprojekts durch ein so ernstes Projekt, und wir schulden ihm viel. Wir müssen uns auch beim OpenMVG- Team (und libmv ) bedanken , dessen grundlegende Arbeit die Erstellung von AliceVision ermöglichte.

Abschließend möchte ich mich ganz besonders bei Microsoft für VCPKG bedanken . VCPKG ist ein Paketmanager, der die Zusammenstellung großer Open-Source-Projekte für Windows erheblich vereinfacht hat. Vor einigen Jahren habe ich versucht, OpenMVG unter Windows zu erstellen . Es endete nicht sehr gut. Als ich vor einigen Monaten von AliceVision hörte, versuchte ich es zu kompilieren, scheiterte aber auch mit einfacheren Dingen. Dann habe ich VCPKG ausprobiert und alles hat sofort funktioniert. Es ist schwer, den Vorteil eines Projekts wie VCPKG zu quantifizieren, aber es hat dem Open-Source-Ökosystem für Windows wirklich geholfen.

github.com/alicevision

github.com/openMVG/openMVG

github.com/libmv/libmv

github.com/Microsoft/vcpkg

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


All Articles