3DMatch é um descritor de características geométricas locais baseado em ConvNet que opera em dados 3D (ou seja, nuvens de pontos, mapas de profundidade, malhas, etc.). Esta caixa de ferramentas fornece código para usar 3DMatch para registro geométrico e correspondência de pontos-chave, bem como código para treinar 3DMatch a partir de reconstruções RGB-D existentes. Esta é a implementação de referência do nosso artigo:
PDF | Página da Web, benchmarks e conjuntos de dados | Vídeo
Andy Zeng, Shuran Song, Matthias Nießner, Matthew Fisher, Jianxiong Xiao e Thomas Funkhouser
Conferência IEEE sobre Visão Computacional e Reconhecimento de Padrões (CVPR) 2017 Apresentação Oral
Combinar características geométricas locais em imagens de profundidade do mundo real é uma tarefa desafiadora devido à natureza barulhenta, de baixa resolução e incompleta dos dados de digitalização 3D. Estas dificuldades limitam o desempenho dos métodos atuais de última geração, que normalmente são baseados em histogramas sobre propriedades geométricas. Neste artigo, apresentamos o 3DMatch, um modelo baseado em dados que aprende um descritor de patch volumétrico local para estabelecer correspondências entre dados 3D parciais. Para acumular dados de treinamento para nosso modelo, propomos um método de aprendizado de recursos não supervisionado que aproveita os milhões de rótulos de correspondência encontrados nas reconstruções RGB-D existentes. Experimentos mostram que nosso descritor não só é capaz de combinar geometria local em novas cenas para reconstrução, mas também generalizar para diferentes tarefas e escalas espaciais (por exemplo, alinhamento de modelo de objeto em nível de instância para o Amazon Picking Challenge e correspondência de superfície de malha). Os resultados mostram que o 3DMatch supera consistentemente outras abordagens de última geração por uma margem significativa.
Se você achar este código útil em seu trabalho, 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 é lançado sob a Licença BSD Simplificada (consulte o arquivo LICENSE para obter detalhes).
Todas as informações relevantes e downloads podem ser encontrados aqui.
Se você tiver alguma dúvida ou encontrar algum bug, por favor me avise: Andy Zeng andyz[at]princeton[dot]edu
#include <random>
ao utils.hpp no código de demonstração.Nossa implementação de referência do 3DMatch, bem como outros componentes nesta caixa de ferramentas, requerem as seguintes dependências. Testado no Ubuntu 14.04.
CUDA 7.5 e cuDNN 5.1. Pode ser necessário registrar-se na NVIDIA. Abaixo estão algumas etapas adicionais para configurar o cuDNN 5.1. NOTA É altamente recomendável que você instale versões diferentes do cuDNN em diretórios diferentes (por exemplo, /usr/local/cudnn/vXX
) porque diferentes pacotes de software podem exigir versões diferentes.
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 (testado com OpenCV 2.4.11)
Esta demonstração alinha duas nuvens de pontos 3D (projetadas a partir de mapas de profundidade de visualização única) usando nosso descritor 3DMatch pré-treinado (com Marvin) e RANSAC padrão.
Confira a caixa de ferramentas 3DMatch, compile o código de demonstração C++/CUDA e Marvin
git clone https://github.com/andyzeng/3dmatch-toolbox.git 3dmatch-toolbox
cd 3dmatch-toolbox/core
./compile.sh
Baixe nossos pesos pré-treinados 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Carregue os dois exemplos de nuvens de pontos 3D, calcule seus volumes de grade de voxel TDF e calcule pontos-chave de superfície aleatórios e seus descritores 3DMatch (salvos em arquivos binários no disco). Aviso: esta demonstração lê apenas nuvens de pontos 3D salvas em um formato binário simples. Se você deseja executar o código de demonstração 3DMatch em seu próprio formato de nuvem de pontos, modifique demo.cu adequadamente.
# 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
Execute o seguinte script no 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 ;
Instruções sobre como converter várias representações de dados 3D em uma grade voxel de valores de Função de Distância Truncada (TDF).
Instruções sobre como instalar o GAPS e converter uma malha de amostra (arquivo .off) em uma grade voxel (arquivo binário .raw de floats):
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
Execute o script de visualização no Matlab
% Visualize TDF voxel grid of mesh
showTDF ;
Veja a pasta 3dmatch-toolbox/training
Código para treinar 3DMatch com Marvin, uma estrutura de rede neural leve somente para GPU. Inclui o arquivo .json da arquitetura de rede siamesa training/net.json
e uma camada de dados CUDA/C++ Marvin em training/match.hpp
que faz amostras aleatórias de correspondências de conjuntos de dados de reconstrução RGB-D (que podem ser baixados da página do nosso projeto).
Compilar Marvin
cd 3dmatch-toolbox/training
./compile.sh
Baixe várias cenas de treinamento e teste de conjuntos de dados de reconstrução RGB-D (baixe mais cenas aqui)
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
Treine um modelo 3DMatch do zero sobre correspondências das cenas RGB-D salvas em data/train
./marvin train net.json
(Opcional) Treine 3DMatch usando pesos pré-treinados de um arquivo tensor Marvin
./marvin train net.json your-pre-trained-weights.marvin
Você pode baixar mais cenas de conjuntos de dados de reconstrução RGB-D na página do projeto. Esses conjuntos de dados foram convertidos em um formato unificado, compatível com nossa camada de dados Marvin usada para treinar o 3DMatch. Salve pelo menos uma cena em data/train
e outra cena em data/test
de forma que a hierarquia de pastas se pareça com isto:
| ——— 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
| ——— ...
Veja a pasta 3dmatch-toolbox/depth-fusion
Código CUDA/C++ para fundir vários mapas de profundidade registrados em um volume voxel TSDF (Curless e Levoy 1996), que pode então ser usado para criar malhas de superfície e nuvens de pontos.
Esta demonstração funde 50 mapas de profundidade registrados do diretório data/sample/depth-fusion-demo/rgbd-frames
em um volume voxel TSDF e cria uma nuvem de pontos de superfície tsdf.ply
cd 3dmatch-toolbox/depth-fusion
./compile.sh
./demo # output saved to tsdf.ply
Veja a pasta 3dmatch-toolbox/evaluation
Código de avaliação para Keypoint Matching Benchmark e Geometric Registration Benchmark, bem como uma implementação de referência para os experimentos em nosso artigo.
Veja a pasta 3dmatch-toolbox/evaluation/keypoint-matching
A descrição do benchmark e a tabela de classificação podem ser encontradas aqui.
Navegue até 3dmatch-toolbox/evaluation/keypoint-matching
e execute o seguinte no Matlab:
% Evaluate 3DMatch (3dmatch.log) on the validation set (validation-set-gt.log)
getError ;
Compilar código C++/CUDA para calcular descritores 3DMatch com Marvin
cd 3dmatch-toolbox/evaluation/keypoint-matching
./compile.sh
Baixe nossos pesos pré-treinados 3DMatch
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
Baixe o conjunto de validação e o conjunto de teste
./download-validation.sh # validation-set.mat
./download-test.sh # test-set.mat
Modifique e execute o seguinte script no Matlab:
% Runs 3DMatch on the validation set and generates 3dmatch.log
test3DMatch ;
Baixe uma ou mais cenas de conjuntos de dados de reconstrução RGB-D na página do nosso projeto. Organize a hierarquia de pastas conforme acima.
Modifique e execute o seguinte script no Matlab:
makeCorresDataset ;
Veja a pasta 3dmatch-toolbox/evaluation/geometric-registration
Inclui código Matlab para executar a avaliação nos benchmarks de registro geométrico descritos aqui. Visão geral:
getKeyptsAndDesc.m
- gera dados intermediários (volumes de voxel TDF, pontos-chave e descritores 3DMatch) para os fragmentos de cena. Você também pode baixar nossos dados pré-computados aqui.runFragmentRegistration.m
- lê dados intermediários e executa o registro baseado em RANSAC para cada par de fragmentos.writeLog
- lê os resultados do registro de cada par de fragmentos e cria um arquivo .logevaluate.m
- calcula precisão e recuperação de arquivos .log para avaliação Execute o seguinte no Matlab:
% Evaluate 3DMatch on the geometric registration benchmark
evaluate ;
Nota: as grades de voxel TDF dos fragmentos de cena do benchmark sintético foram calculadas usando o código obsoleto para TDF preciso (consulte deprecated/pointCloud2AccTDF.m
). Pesos pré-treinados 3DMatch ajustados em fragmentos de treinamento podem ser baixados aqui.
Veja a pasta 3dmatch-toolbox/evaluation/model-fitting-apc
Inclui código e modelos pré-treinados para avaliar o 3DMatch para ajuste de modelo no conjunto de dados Shelf & Tote. Você pode baixar nossos dados pré-computados (volumes de grade de voxel TDF para objetos e varreduras, pontos-chave de superfície, descritores e previsões de pose) aqui. Para um exemplo de avaliação, execute o script Matlab getError.m
Veja a pasta 3dmatch-toolbox/evaluation/mesh-correspondence-shape2pose
Inclui código para gerar visualizações de correspondência de malha nas malhas do conjunto de dados Shape2Pose usando 3DMatch. Você também pode baixar nossos dados pré-computados (volumes de grade de voxel TDF das malhas, pontos-chave de superfície, descritores 3DMatch) aqui. Para uma visualização rápida, execute o script Matlab keypointRetrieval.m
.