3DMatch es un descriptor de características geométricas locales basado en ConvNet que opera con datos 3D (es decir, nubes de puntos, mapas de profundidad, mallas, etc.). Esta caja de herramientas proporciona código para usar 3DMatch para el registro geométrico y la coincidencia de puntos clave, así como código para entrenar 3DMatch a partir de reconstrucciones RGB-D existentes. Esta es la implementación de referencia de nuestro artículo:
PDF | Página web, puntos de referencia y conjuntos de datos | Video
Andy Zeng, Shuran Song, Matthias Nießner, Matthew Fisher, Jianxiong Xiao y Thomas Funkhouser
Conferencia IEEE sobre visión por computadora y reconocimiento de patrones (CVPR) 2017 Presentación oral
Hacer coincidir características geométricas locales en imágenes de profundidad del mundo real es una tarea desafiante debido a la naturaleza ruidosa, de baja resolución e incompleta de los datos de escaneo 3D. Estas dificultades limitan el rendimiento de los métodos más modernos, que normalmente se basan en histogramas sobre propiedades geométricas. En este artículo, presentamos 3DMatch, un modelo basado en datos que aprende un descriptor de parche volumétrico local para establecer correspondencias entre datos 3D parciales. Para acumular datos de entrenamiento para nuestro modelo, proponemos un método de aprendizaje de características no supervisado que aprovecha los millones de etiquetas de correspondencia que se encuentran en las reconstrucciones RGB-D existentes. Los experimentos muestran que nuestro descriptor no solo es capaz de hacer coincidir la geometría local en nuevas escenas para la reconstrucción, sino que también se generaliza a diferentes tareas y escalas espaciales (por ejemplo, alineación del modelo de objetos a nivel de instancia para Amazon Picking Challenge y correspondencia de superficies de malla). Los resultados muestran que 3DMatch supera consistentemente a otros enfoques de última generación por un margen significativo.
Si encuentra este código útil en su trabajo, considere citar:
@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}
}
Este código se publica bajo la licencia BSD simplificada (consulte el archivo LICENCIA para obtener más detalles).
Toda la información relevante y las descargas se pueden encontrar aquí.
Si tiene alguna pregunta o encuentra algún error, hágamelo saber: Andy Zeng andyz[arroba]princeton[punto]edu
#include <random>
a utils.hpp en el código de demostración.Nuestra implementación de referencia de 3DMatch, así como otros componentes de esta caja de herramientas, requieren las siguientes dependencias. Probado en Ubuntu 14.04.
CUDA 7.5 y cuDNN 5.1. Es posible que tengas que registrarte en NVIDIA. A continuación se detallan algunos pasos adicionales para configurar cuDNN 5.1. NOTA Le recomendamos encarecidamente que instale diferentes versiones de cuDNN en diferentes directorios (por ejemplo, /usr/local/cudnn/vXX
) porque diferentes paquetes de software pueden requerir diferentes versiones.
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 (probado con OpenCV 2.4.11)
Esta demostración alinea dos nubes de puntos 3D (proyectadas desde mapas de profundidad de vista única) utilizando nuestro descriptor 3DMatch previamente entrenado (con Marvin) y RANSAC estándar.
Consulte la caja de herramientas 3DMatch, compile el código de demostración C++/CUDA y Marvin
git clone https://github.com/andyzeng/3dmatch-toolbox.git 3dmatch-toolbox
cd 3dmatch-toolbox/core
./compile.sh
Descargue nuestras pesas preentrenadas 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Cargue las dos nubes de puntos 3D de ejemplo, calcule sus volúmenes de cuadrícula de vóxeles TDF y calcule puntos clave de superficie aleatorios y sus descriptores 3DMatch (guardados en archivos binarios en el disco). Advertencia: esta demostración solo lee nubes de puntos 3D guardadas en un formato binario simple. Si desea ejecutar el código de demostración de 3DMatch en su propio formato de nube de puntos, modifique demo.cu en consecuencia.
# 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
Ejecute el siguiente script en 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 ;
Instrucciones sobre cómo convertir varias representaciones de datos 3D en una cuadrícula de vóxeles de valores de función de distancia truncada (TDF).
Instrucciones sobre cómo instalar GAPS y convertir una malla de muestra (archivo .off) en una cuadrícula de voxel (archivo binario .raw de flotadores):
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
Ejecute el script de visualización en Matlab
% Visualize TDF voxel grid of mesh
showTDF ;
Ver carpeta 3dmatch-toolbox/training
Código para entrenar 3DMatch con Marvin, un marco de red neuronal liviano solo para GPU. Incluye el archivo .json de arquitectura de red siamesa training/net.json
y una capa de datos CUDA/C++ Marvin en training/match.hpp
que muestrea aleatoriamente correspondencias de conjuntos de datos de reconstrucción RGB-D (que se pueden descargar desde la página web de nuestro proyecto).
compilar marvin
cd 3dmatch-toolbox/training
./compile.sh
Descargue varias escenas de entrenamiento y prueba de conjuntos de datos de reconstrucción RGB-D (descargue más escenas aquí)
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
Entrene un modelo 3DMatch desde cero sobre correspondencias de las escenas RGB-D guardadas en data/train
./marvin train net.json
(Opcional) Entrene 3DMatch usando pesos previamente entrenados de un archivo tensor de Marvin
./marvin train net.json your-pre-trained-weights.marvin
Puede descargar más escenas de conjuntos de datos de reconstrucción RGB-D en la página web de nuestro proyecto. Estos conjuntos de datos se han convertido a un formato unificado, que es compatible con nuestra capa de datos Marvin utilizada para entrenar 3DMatch. Guarde al menos una escena en data/train
y otra escena en data/test
de manera que la jerarquía de carpetas se vea así:
| ——— 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
| ——— ...
Ver carpeta 3dmatch-toolbox/depth-fusion
Código CUDA/C++ para fusionar múltiples mapas de profundidad registrados en un volumen de vóxel TSDF (Curless y Levoy 1996), que luego puede usarse para crear mallas de superficie y nubes de puntos.
Esta demostración fusiona 50 mapas de profundidad registrados del directorio data/sample/depth-fusion-demo/rgbd-frames
en un volumen de vóxel TSDF y crea una nube de puntos de superficie tsdf.ply
cd 3dmatch-toolbox/depth-fusion
./compile.sh
./demo # output saved to tsdf.ply
Ver carpeta 3dmatch-toolbox/evaluation
Código de evaluación para el punto de referencia de coincidencia de puntos clave y el punto de referencia de registro geométrico, así como una implementación de referencia para los experimentos de nuestro artículo.
Ver carpeta 3dmatch-toolbox/evaluation/keypoint-matching
La descripción del punto de referencia y la tabla de clasificación se pueden encontrar aquí.
Navegue hasta 3dmatch-toolbox/evaluation/keypoint-matching
y ejecute lo siguiente en Matlab:
% Evaluate 3DMatch (3dmatch.log) on the validation set (validation-set-gt.log)
getError ;
Compile código C++/CUDA para calcular descriptores 3DMatch con Marvin
cd 3dmatch-toolbox/evaluation/keypoint-matching
./compile.sh
Descargue nuestras pesas preentrenadas 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Descargue el conjunto de validación y el conjunto de pruebas
./download-validation.sh # validation-set.mat
./download-test.sh # test-set.mat
Modifique y ejecute el siguiente script en Matlab:
% Runs 3DMatch on the validation set and generates 3dmatch.log
test3DMatch ;
Descargue una o más escenas de conjuntos de datos de reconstrucción RGB-D en la página web de nuestro proyecto. Organice la jerarquía de carpetas como se indica arriba.
Modifique y ejecute el siguiente script en Matlab:
makeCorresDataset ;
Ver carpeta 3dmatch-toolbox/evaluation/geometric-registration
Incluye código Matlab para ejecutar la evaluación de los puntos de referencia de registro geométrico que se describen aquí. Descripción general:
getKeyptsAndDesc.m
: genera datos intermedios (volúmenes de vóxel TDF, puntos clave y descriptores 3DMatch) para los fragmentos de escena. También puede descargar nuestros datos precalculados aquí.runFragmentRegistration.m
: lee datos intermedios y ejecuta el registro basado en RANSAC para cada par de fragmentos.writeLog
: lee los resultados del registro de cada par de fragmentos y crea un archivo .logevaluate.m
: precisión de cálculo y recuperación de archivos .log para evaluación Ejecute lo siguiente en Matlab:
% Evaluate 3DMatch on the geometric registration benchmark
evaluate ;
Nota: las cuadrículas de vóxeles TDF de los fragmentos de escena del punto de referencia sintético se calcularon utilizando el código obsoleto para obtener un TDF preciso (consulte deprecated/pointCloud2AccTDF.m
). Los pesos preentrenados de 3DMatch ajustados en fragmentos de entrenamiento se pueden descargar aquí.
Ver carpeta 3dmatch-toolbox/evaluation/model-fitting-apc
Incluye código y modelos previamente entrenados para evaluar 3DMatch para el ajuste del modelo en el conjunto de datos Shelf & Tote. Puede descargar nuestros datos precalculados (volúmenes de cuadrícula de vóxeles TDF para objetos y escaneos, puntos clave de superficie, descriptores y predicciones de pose) aquí. Para ver un ejemplo de evaluación, ejecute el script Matlab getError.m
Ver carpeta 3dmatch-toolbox/evaluation/mesh-correspondence-shape2pose
Incluye código para generar visualizaciones de correspondencia de malla en las mallas del conjunto de datos Shape2Pose usando 3DMatch. También puede descargar nuestros datos precalculados (volumenes de cuadrícula de vóxeles TDF de las mallas, puntos clave de superficie, descriptores 3DMatch) aquí. Para una visualización rápida, ejecute el script de Matlab keypointRetrieval.m
.