Avez-vous besoin d'automatiser un grand nombre de numérisations photogrammétriques? Alors j'ai de bonnes nouvelles pour toi.
La vidéo montre le programme de photogrammétrie open source
Meshroom . Ce projet existe sous diverses formes depuis un certain temps, mais récemment les développeurs ont publié des fichiers binaires, vous pouvez donc simplement les télécharger et les utiliser. La vidéo montre l'utilisation de l'interface graphique pour charger des images, les traiter, modifier des paramètres, etc. Je vous recommande d'essayer ce programme en action.
Mais je suis intéressé par une automatisation complète. Si vous disposez d'une installation d'analyse sur laquelle vous effectuez 100 analyses ou plus par jour, vous avez besoin d'une solution entièrement automatisée pour le traitement par lots de ces fichiers. Ce message est un guide et / ou un tutoriel sur la résolution de ce problème.
Pour commencer, il est important de comprendre que
Meshroom n'est pas un projet monolithique gigantesque. En fait, le traitement lui-même est effectué par des programmes C ++ distincts qui s'exécutent à partir de la ligne de commande, et
Meshroom est un programme de codage Python fin qui effectue les appels appropriés. Par conséquent, au lieu d'utiliser
Meshroom, nous utiliserons ces programmes directement. Notez que des sources complètes sont disponibles, vous pouvez donc lier directement des bibliothèques.
Meshroom a une autre fonctionnalité pratique: lors de chaque opération, sa commande est affichée dans le terminal. Par conséquent, pour créer les étapes de ce processus, je viens de travailler avec
Meshroom et j'ai regardé les équipes. Ensuite, j'ai regardé le code pour changer certains paramètres. De plus, il semble que lorsque vous démarrez Meshroom, vous pouvez le commander pour collecter un ensemble d'images à partir de la ligne de commande, mais je préfère ne pas connecter ces étapes.
Préparation et installation
0: ExigencesMeshroom /
AliceVision ne fonctionnera pas sur toutes les plateformes. CUDA est nécessaire pour certaines étapes, donc pour construire des cartes de profondeur, vous aurez besoin d'un GPU NVIDIA. Malheureusement, il est impossible d'utiliser le repli du CPU (transfert de l'exécution des fonctions GPU vers le CPU), sinon le programme fonctionnerait parfaitement sous Windows et Linux. Les instructions de cet article concernent Windows, mais avec des modifications minimes, elles peuvent être affinées pour Linux.
1: Téléchargez la version MeshroomMeshroom 2018.1.0La première chose à faire est d'installer
Meshroom . Sélectionnez le dossier à partir duquel vous souhaitez effectuer le travail, puis téléchargez la dernière version. Le fichier zip contient des binaires de toutes les dépendances.
Si vous êtes attiré par les aventures, vous pouvez essayer d'assembler le programme vous-même. Les bibliothèques de liens dynamiques de publication fonctionnent correctement (/ MD), mais j'ai dû pirater des fichiers cmake pour créer des versions de débogage et / ou des versions de liens statiques. Si vous construisez le programme sous Windows, alors
EXTRÊMEMENT vous recommandons d'utiliser VCPKG.
2: Télécharger les donnéesalicevision / dataset_monstreeÉvidemment, le but du logiciel de photogrammétrie est de traiter vos propres images, mais je suggère d'abord d'utiliser des images qui sont garanties pour être appropriées. Ils vous permettront de trouver les sources de problèmes en cas de problème. Heureusement, les développeurs ont publié un ensemble d'images pour leur arbre de test.
3: Téléchargez le script run_alicevision.pyrun_alicevision.zipC'est le script que nous utiliserons. Téléchargez simplement le fichier zip et décompressez-le dans votre dossier de travail.
4: Installer Pythonhttps://www.python.org/download/releases/2.7/Installez Python si vous ne l'avez pas déjà fait. Oui, j'écris toujours du code pour Python 2.7.0. Le moyen le plus simple d'installer le programme d'installation de
Windows X86-64 MSI à partir des versions.
5: Installer Meshlab (facultatif)MeshLabComme étape facultative, vous devez également installer
MeshLab . En fait, il ne sera pas nécessaire pour le traitement, mais à plusieurs étapes, les données sont affichées dans les fichiers de points PLY. Ils ne peuvent pas être téléchargés sur
Maya , donc j'utilise
MeshLab pour les voir.
Après avoir déballé tous les fichiers, le dossier devrait ressembler à ceci (à l'exception du dossier
build_files , qui est généré par des scripts):
Voici ce qui suit:
- build_files: les fichiers que nous avons compilés.
- dataset_monstree-master: images source
- Meshroom-2018.1.0: binaires Meshroom / AliceVision .
- Tout le reste: des scripts pour les exécuter, qui sont tirés de run_alicevision.zip .
Lancez AliceVision
Il est maintenant temps de regarder de plus près
run_alicevision.pyLe fichier Python reçoit 5 arguments:
python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>
- baseDir : le dossier dans lequel vous souhaitez placer les fichiers temporaires.
- imgDir : dossier contenant les images sources. Dans notre cas, IMG_1024.JPG (et autres).
- binDir : dossier contenant les exécutables AliceVision , par exemple aliceVision_cameraInit.exe .
- numImages : le nombre d'images dans imgDir , dans notre cas 6. Bien sûr, vous pouvez reconnaître ce nombre automatiquement, mais l'objectif était de créer le script python le plus simple possible, vous devez donc spécifier ce nombre vous-même.
- runStep : l'opération à effectuer.
Pour résumer: on commence par 6 images qui ressemblent à ceci:
En utilisant le
script python
run_alicevision.py, nous allons créer la structure de dossiers suivante:
Et dans le dossier
11_Texturing ,
il y aura un modèle prêt à l'emploi qui s'ouvre dans
Meshlab :
Chacun de ces dossiers est l'une des étapes. Nous pouvons soit les exécuter tour à tour en utilisant les fichiers
run_monstree_runXX.bat , soit utiliser
run_monstree_all.bat pour les collecter tous en même temps.
C’est tout. Vous pouvez maintenant exécuter le fichier
run_monstree_all.bat ou effectuer une étape à la fois. Vous pouvez regarder le script pour comprendre son travail. Pour ceux qui souhaitent pouvoir personnaliser le pipeline de traitement, j'ai préparé une introduction aux différentes étapes.
00_CameraInitLa première étape va générer un fichier SFM. Les fichiers SFM sont des fichiers JSON qui stockent la taille de la caméra, les informations du capteur, les points 3d trouvés (observations), les facteurs de distorsion et d'autres informations. Le fichier SFM initial dans ce dossier ne contiendra que des informations sur le capteur et sélectionnera les valeurs par défaut dans la base de données des capteurs locaux. Les étapes suivantes créeront des fichiers SFM contenant la matrice complète des paramètres, points, etc. de la caméra externe.
Vous devrez peut-être configurer cette étape. Si vous utilisez une configuration avec 4 caméras, mais prenez 10 photos d'un objet tournant sur une platine, alors vous avez besoin d'un fichier SFM avec 40 images, mais avec seulement 4 étalonnages de capteur différents. C'est la raison principale pour laquelle j'aime la structure d'
AliceVision . Il est facile d'y configurer des opérations par lots (par exemple, générer votre propre fichier SFM) sans avoir à configurer d'autres éléments logiciels qu'il vaut mieux ne pas toucher.
01_FeatureExtractionL'étape suivante extrait les traits caractéristiques des images, ainsi que les descripteurs de ces traits. Cela changera l'extension du fichier en fonction du type de fonctionnalité extraite.
02_ImageMatching02_ImageMatching est une étape de post-traitement qui détermine laquelle des images est logique à mapper les unes aux autres. Si vous avez un ensemble de 1000 images, alors pour une recherche approximative de toutes les 1000 images pour correspondre à toutes les 1000 images, vous avez besoin d'un million de paires. Cela peut prendre beaucoup de temps (en fait la moitié, mais vous comprenez le principe). L'étape
02_ImageMatching coupe ces paires.
03_FeatureMatching03_FeatureMatching correspond aux images à l'aide de descripteurs de fonctionnalités. Les fichiers txt qu'il génère n'ont pas besoin d'être expliqués.
04_StructureFromMotionC'est donc la première étape sérieuse. Sur la
base des correspondances
04_StructureFromMotion ,
il calcule les positions des caméras ainsi que les paramètres internes des caméras. Il convient de noter que le terme «Structure From Motion» est utilisé comme terme général pour calculer les positions des caméras. Si vous avez une configuration pour la photogrammétrie de 10 caméras synchronisées, alors "Structure From Motion" est utilisé pour les capturer, même si rien ne bouge vraiment.
Par défaut,
Meshroom stocke toutes les données calculées sous forme de fichier
Alembic , mais je préfère les stocker dans un fichier SFM. Cette étape crée des données intermédiaires pour garantir que les caméras sont correctement liées. En sortie, le script crée des fichiers PLY qui peuvent être visualisés dans
Meshlab . Les fichiers suivants sont importants:
- bundle.sfm: fichier SFM avec toutes les observations.
- cameras.fm: Un fichier SFM avec des données pour les caméras connectées uniquement.
- cloud_and_poses.ply: points trouvés et caméras.
Voici le fichier
cloud_and_poses.ply . Les points verts sont des caméras. Je crois que ce format est le plus approprié pour vérifier l'absence d'erreurs grossières dans la liaison des caméras. Si une erreur se produit quelque part, vous pouvez revenir en arrière et modifier les caractéristiques, les correspondances ou les paramètres SFM.
05_PrepareDenseSceneLa tâche principale de
05_PrepareDenseScene est d'éliminer la distorsion de l'image. Il génère des images EXR sans distorsion, de sorte que les étapes suivantes de calcul des profondeurs et des projections n'ont pas besoin d'effectuer des conversions aller-retour à partir de la fonction de distorsion. Les images ressemblent à ceci:
Il convient de noter que vous verrez des zones noires. Les étapes suivantes d'
AliceVision n'utilisent pas la matrice réelle de la caméra. Au lieu de cela, nous prétendons que la caméra a une nouvelle matrice sans distorsion, et
05_PrepareDenseScene déforme l'image d'origine en cette matrice fictive. Étant donné que ce nouveau capteur virtuel est plus grand que le capteur réel, certaines zones apparaissent vides (noires).
06_CameraConnectionÀ strictement parler, cette étape viole le principe de notre processus de travail. Toutes les étapes ont été conçues pour que chaque dossier devienne une étape distincte complètement unique. Cependant,
06_CameraConnection crée le fichier
camsPairsMatrixFromSeeds.bin dans le dossier
05_PrepareDenseScene , car ce fichier doit se trouver dans le même dossier que les images sans distorsion.
07_DepthMapIl s'agit de la phase la plus longue d'
AliceVision : générer des cartes de profondeur. Il crée une carte de profondeur pour chaque image sous forme de fichier EXR. Je l'ai installé pour le rendre plus facile à remarquer. Vous pouvez voir une petite «langue» qui sort de l'arbre.
Étant donné que cette étape prend beaucoup de temps, il existe un paramètre qui nous permet d'exécuter des groupes de caméras différentes sous différentes commandes distinctes. Par conséquent, si vous avez 1 000 caméras, vous pouvez créer des cartes de profondeur pour des groupes de caméras sur différentes machines de la ferme. Ou vous pouvez diviser le travail en petits groupes afin que si une machine tombe en panne, vous n'avez pas à répéter tout le processus.
08_DepthMapFilterLes cartes de profondeur source ne seront pas entièrement cohérentes. Certaines cartes de profondeur devront voir les zones chevauchées par d'autres cartes de profondeur. L'étape
08_DepthMapFilter isole ces zones et renforce la cohérence de la profondeur.
09_MeshingIl s'agit de la première étape dans laquelle le maillage est généré directement. Il peut y avoir de petits problèmes avec le maillage qui peuvent être résolus avec ...
10_MeshFilteringL'étape
10_MeshFiltering reçoit le maillage
09_Meshing et l'
affine . Il effectue les opérations suivantes:
- Lisse le maillage.
- Élimine les grands triangles.
- Enregistre le plus grand maillage, mais supprime le reste.
Certaines de ces opérations ne sont pas toujours souhaitables dans certains cas, de sorte que les paramètres peuvent être ajustés si nécessaire.
11_TexturationLa dernière étape.
11_Texturing crée des UV et projette des textures. Et à ce stade, tout se termine!
La dernière astuce que vous pouvez faire avec
Meshlab : vous pouvez faire glisser et déposer différents fichiers OBJ et PLY en tant que couches.
Dans mon exemple, il y a une couche pour le maillage fini et pour les points / caméras SFM. Parfois, l'étape de lissage d'un maillage peut être légèrement plus agressive que nécessaire, il est donc utile de comparer les maillages d'origine et de lissage. Si le maillage semble rompu, pour suivre les problèmes dans le pipeline, il est pratique d'utiliser les données sfm de PLY et les mailles de OBJ.
RemerciementsCe poste ne serait pas complet sans beaucoup grâce aux équipes de développement d'
AliceVision et d'
OpenMVG . La source d'inspiration était le projet
libmv . Ce projet a été le précurseur d'
OpenMVG , qui est un référentiel d'ingénieurs / chercheurs en vision par ordinateur pour développer de nouveaux algorithmes.
AliceVision est un fork d'
OpenMVG , créé spécifiquement pour transformer ces algorithmes en une solution autonome sous la forme d'un produit fini.
AliceVision / Meshroom est un grand projet open source ambitieux. Sa principale réalisation est la réalisation d'un projet aussi final par un projet aussi sérieux, et nous lui devons beaucoup. Nous sommes également tenus de remercier l'équipe
OpenMVG (et
libmv ), dont le travail fondamental a permis la
création d'
AliceVision .
Enfin, je tiens à remercier tout spécialement Microsoft pour
VCPKG .
VCPKG est un gestionnaire de packages qui a grandement simplifié l'assemblage de grands projets open source pour Windows. Il y a quelques années, j'ai essayé de construire
OpenMVG sous Windows. Ça ne s'est pas très bien terminé. Donc, quand j'ai entendu parler d'
AliceVision il y a quelques mois, j'ai essayé de le compiler, mais j'ai échoué même avec des choses plus simples. Ensuite, j'ai essayé
VCPKG , et tout a fonctionné immédiatement. Il est difficile de quantifier l'avantage d'utiliser un projet comme
VCPKG , mais cela a vraiment aidé l'écosystème open source pour Windows.
github.com/alicevisiongithub.com/openMVG/openMVGgithub.com/libmv/libmvgithub.com/Microsoft/vcpkg