3DMatch est un descripteur de caractéristiques géométriques locales basé sur ConvNet qui fonctionne sur des données 3D (c'est-à-dire des nuages de points, des cartes de profondeur, des maillages, etc.). Cette boîte à outils fournit du code pour utiliser 3DMatch pour l'enregistrement géométrique et la correspondance de points clés, ainsi que du code pour entraîner 3DMatch à partir de reconstructions RVB-D existantes. Voici l'implémentation de référence de notre article :
PDF | Page Web, benchmarks et ensembles de données | Vidéo
Andy Zeng, Shuran Song, Matthias Nießner, Matthew Fisher, Jianxiong Xiao et Thomas Funkhouser
Conférence IEEE sur la vision par ordinateur et la reconnaissance de formes (CVPR) 2017 Présentation orale
Faire correspondre les caractéristiques géométriques locales sur des images de profondeur du monde réel est une tâche difficile en raison de la nature bruyante, de faible résolution et incomplète des données numérisées 3D. Ces difficultés limitent les performances des méthodes actuelles, qui sont généralement basées sur des histogrammes sur des propriétés géométriques. Dans cet article, nous présentons 3DMatch, un modèle basé sur les données qui apprend un descripteur de patch volumétrique local pour établir des correspondances entre des données 3D partielles. Pour collecter des données de formation pour notre modèle, nous proposons une méthode d'apprentissage de fonctionnalités non supervisée qui exploite les millions d'étiquettes de correspondance trouvées dans les reconstructions RVB-D existantes. Les expériences montrent que notre descripteur est non seulement capable de faire correspondre la géométrie locale dans de nouvelles scènes à reconstruire, mais également de se généraliser à différentes tâches et échelles spatiales (par exemple, l'alignement du modèle objet au niveau de l'instance pour l'Amazon Picking Challenge et la correspondance des surfaces de maillage). Les résultats montrent que 3DMatch surpasse systématiquement et de manière significative les autres approches de pointe.
Si vous trouvez ce code utile dans votre travail, pensez à citer :
@inproceedings{zeng20163dmatch,
title={3DMatch: Learning Local Geometric Descriptors from RGB-D Reconstructions},
author={Zeng, Andy and Song, Shuran and Nie{ s s}ner, Matthias and Fisher, Matthew and Xiao, Jianxiong and Funkhouser, Thomas},
booktitle={CVPR},
year={2017}
}
Ce code est publié sous la licence BSD simplifiée (reportez-vous au fichier LICENSE pour plus de détails).
Toutes les informations pertinentes et les téléchargements peuvent être trouvés ici.
Si vous avez des questions ou trouvez des bugs, n'hésitez pas à me le faire savoir : Andy Zeng andyz[at]princeton[dot]edu
#include <random>
à utils.hpp dans le code de démonstration.Notre implémentation de référence de 3DMatch, ainsi que d'autres composants de cette boîte à outils, nécessitent les dépendances suivantes. Testé sur Ubuntu 14.04.
CUDA 7.5 et cuDNN 5.1. Vous devrez peut-être vous inscrire auprès de NVIDIA. Vous trouverez ci-dessous quelques étapes supplémentaires pour configurer cuDNN 5.1. REMARQUE Nous vous recommandons fortement d'installer différentes versions de cuDNN dans différents répertoires (par exemple, /usr/local/cudnn/vXX
) car différents progiciels peuvent nécessiter différentes versions.
LIB_DIR=lib $( [[ $( uname ) == " Linux " ]] && echo 64 )
CUDNN_LIB_DIR=/usr/local/cudnn/v5.1/ $LIB_DIR
echo LD_LIBRARY_PATH= $LD_LIBRARY_PATH : $CUDNN_LIB_DIR >> ~ /.profile && ~ /.profile
tar zxvf cudnn * .tgz
sudo cp cuda/ $LIB_DIR / * $CUDNN_LIB_DIR /
sudo cp cuda/include/ * /usr/local/cudnn/v5.1/include/
OpenCV (testé avec OpenCV 2.4.11)
Cette démo aligne deux nuages de points 3D (projetés à partir de cartes de profondeur à vue unique) à l'aide de notre descripteur 3DMatch pré-entraîné (avec Marvin) et du RANSAC standard.
Commander la boîte à outils 3DMatch, compiler le code de démonstration C++/CUDA et Marvin
git clone https://github.com/andyzeng/3dmatch-toolbox.git 3dmatch-toolbox
cd 3dmatch-toolbox/core
./compile.sh
Téléchargez nos poids pré-entraînés 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Chargez les deux exemples de nuages de points 3D, calculez leurs volumes de grille de voxels TDF et calculez les points clés de surface aléatoires et leurs descripteurs 3DMatch (enregistrés dans des fichiers binaires sur le disque). Attention : cette démo ne lit que les nuages de points 3D enregistrés dans un format binaire simple. Si vous souhaitez exécuter le code de démonstration 3DMatch sur votre propre format de nuage de points, veuillez modifier demo.cu en conséquence.
# Generate fragment-1.desc.3dmatch.bin and fragment-1.keypts.bin
./demo ../data/sample/3dmatch-demo/single-depth-1.ply fragment-1
# Generate fragment-2.desc.3dmatch.bin and fragment-2.keypts.bin
./demo ../data/sample/3dmatch-demo/single-depth-2.ply fragment-2
Exécutez le script suivant dans Matlab :
% Load keypoints and 3DMatch descriptors and use RANSAC to register the two
% point clouds. A visualization of the aligned point clouds is saved into
% the file `result.ply` which can be viewed with Meshlab or any other 3D
% viewer. Note: there is a chance that alignment may fail on the first try
% of this demo due to bad keypoints, which are selected randomly by default.
demo ;
Instructions sur la façon de convertir diverses représentations de données 3D en une grille de voxels de valeurs de fonction de distance tronquée (TDF).
Instructions pour installer GAPS et convertir un exemple de maillage (fichier .off) en une grille de voxels (fichier binaire .raw de flotteurs) :
cd 3dmatch-toolbox/gaps
# Install GAPS
make
# Run msh2df on example mesh file (see comments in msh2df.cpp for more instructions)
cd bin/x86_64
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/gaps/bicycle000002.off
./msh2df bicycle000002.off bicycle000002.raw -v # see comments in msh2df.cpp for more arguments
# Download visualization script
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/gaps/showTDF.m
Exécutez le script de visualisation dans Matlab
% Visualize TDF voxel grid of mesh
showTDF ;
Voir le dossier 3dmatch-toolbox/training
Code pour entraîner 3DMatch avec Marvin, un framework de réseau neuronal léger uniquement GPU. Comprend le fichier .json de l'architecture de réseau siamois training/net.json
et une couche de données CUDA/C++ Marvin dans training/match.hpp
qui échantillonne de manière aléatoire les correspondances à partir d'ensembles de données de reconstruction RVB-D (qui peuvent être téléchargés à partir de la page Web de notre projet).
Compiler Marvin
cd 3dmatch-toolbox/training
./compile.sh
Téléchargez plusieurs scènes de formation et de test à partir d'ensembles de données de reconstruction RVB-D (téléchargez plus de scènes ici)
cd ../data
mkdir train && mkdir test && mkdir backup
cd train
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/rgbd-datasets/sun3d-brown_cogsci_1-brown_cogsci_1.zip
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/rgbd-datasets/7-scenes-heads.zip
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/rgbd-datasets/sun3d-harvard_c11-hv_c11_2.zip
unzip sun3d-brown_cogsci_1-brown_cogsci_1.zip
unzip 7-scenes-heads.zip
unzip sun3d-harvard_c11-hv_c11_2.zip
mv * .zip ../backup
cd ../test
wget http://vision.princeton.edu/projects/2016/3DMatch/downloads/rgbd-datasets/sun3d-hotel_umd-maryland_hotel3.zip
unzip sun3d-hotel_umd-maryland_hotel3.zip
mv * .zip ../backup
cd ../../training
Entraînez un modèle 3DMatch à partir de zéro sur les correspondances des scènes RVB-D enregistrées dans data/train
./marvin train net.json
(Facultatif) Entraînez 3DMatch à l'aide de poids pré-entraînés à partir d'un fichier tenseur Marvin
./marvin train net.json your-pre-trained-weights.marvin
Vous pouvez télécharger plus de scènes à partir d'ensembles de données de reconstruction RVB-D sur la page Web de notre projet. Ces ensembles de données ont été convertis dans un format unifié, compatible avec notre couche de données Marvin utilisée pour entraîner 3DMatch. Enregistrez au moins une scène dans data/train
et une autre scène dans data/test
de telle sorte que la hiérarchie des dossiers ressemble à ceci :
| ——— training
| ——— core
| ——— marvin.hpp
| ——— ...
| ——— data
| ——— train
| ——— rgbd-dataset-scene-1
| ——— seq-01
| ——— seq-02
| ——— camera-intrinsics.txt
| ——— ...
| ——— ...
| ——— test
| ——— rgbd-dataset-scene-2
| ——— seq-01
| ——— camera-intrinsics.txt
| ——— ...
Voir le dossier 3dmatch-toolbox/depth-fusion
Code CUDA/C++ pour fusionner plusieurs cartes de profondeur enregistrées dans un volume de voxels TSDF (Curless et Levoy 1996), qui peut ensuite être utilisé pour créer des maillages de surface et des nuages de points.
Cette démo fusionne 50 cartes de profondeur enregistrées à partir du répertoire data/sample/depth-fusion-demo/rgbd-frames
dans un volume de voxel TSDF et crée un nuage de points de surface tsdf.ply
cd 3dmatch-toolbox/depth-fusion
./compile.sh
./demo # output saved to tsdf.ply
Voir le dossier 3dmatch-toolbox/evaluation
Code d'évaluation pour le test de correspondance de points clés et le test d'enregistrement géométrique, ainsi qu'une implémentation de référence pour les expériences présentées dans notre article.
Voir le dossier 3dmatch-toolbox/evaluation/keypoint-matching
La description du benchmark et le classement peuvent être trouvés ici.
Accédez à 3dmatch-toolbox/evaluation/keypoint-matching
et exécutez ce qui suit dans Matlab :
% Evaluate 3DMatch (3dmatch.log) on the validation set (validation-set-gt.log)
getError ;
Compiler du code C++/CUDA pour calculer les descripteurs 3DMatch avec Marvin
cd 3dmatch-toolbox/evaluation/keypoint-matching
./compile.sh
Téléchargez nos poids pré-entraînés 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Téléchargez l'ensemble de validation et l'ensemble de test
./download-validation.sh # validation-set.mat
./download-test.sh # test-set.mat
Modifiez et exécutez le script suivant dans Matlab :
% Runs 3DMatch on the validation set and generates 3dmatch.log
test3DMatch ;
Téléchargez une ou plusieurs scènes à partir des ensembles de données de reconstruction RVB-D sur la page Web de notre projet. Organisez la hiérarchie des dossiers comme ci-dessus.
Modifiez et exécutez le script suivant dans Matlab :
makeCorresDataset ;
Voir le dossier 3dmatch-toolbox/evaluation/geometric-registration
Inclut le code Matlab pour exécuter l'évaluation sur les références d'enregistrement géométrique décrites ici. Aperçu:
getKeyptsAndDesc.m
- génère des données intermédiaires (volumes de voxels TDF, points clés et descripteurs 3DMatch) pour les fragments de scène. Vous pouvez également télécharger nos données précalculées ici.runFragmentRegistration.m
- lit les données intermédiaires et exécute l'enregistrement basé sur RANSAC pour chaque paire de fragments.writeLog
- lit les résultats d'enregistrement de chaque paire de fragments et crée un fichier .logevaluate.m
- calcule la précision et le rappel à partir des fichiers .log pour évaluation Exécutez ce qui suit dans Matlab :
% Evaluate 3DMatch on the geometric registration benchmark
evaluate ;
Remarque : les grilles de voxels TDF des fragments de scène du benchmark synthétique ont été calculées à l'aide du code obsolète pour un TDF précis (voir deprecated/pointCloud2AccTDF.m
). Les poids pré-entraînés 3DMatch affinés sur les fragments d’entraînement peuvent être téléchargés ici.
Voir le dossier 3dmatch-toolbox/evaluation/model-fitting-apc
Comprend du code et des modèles pré-entraînés pour évaluer 3DMatch pour l'ajustement du modèle sur l'ensemble de données Shelf & Tote. Vous pouvez télécharger nos données précalculées (volumes de grille voxel TDF pour les objets et les scans, points clés de surface, descripteurs et prédictions de pose) ici. Pour un exemple d'évaluation, exécutez le script Matlab getError.m
Voir le dossier 3dmatch-toolbox/evaluation/mesh-correspondence-shape2pose
Inclut du code pour générer des visualisations de correspondance de maillage sur les maillages de l'ensemble de données Shape2Pose à l'aide de 3DMatch. Vous pouvez également télécharger nos données pré-calculées (volumes de grille voxel TDF des maillages, points clés de surface, descripteurs 3DMatch) ici. Pour une visualisation rapide, exécutez le script Matlab keypointRetrieval.m
.