3DMatch は、3D データ (点群、深度マップ、メッシュなど) を操作する ConvNet ベースのローカル幾何学的特徴記述子です。このツールボックスは、幾何学的位置合わせとキーポイント マッチングに 3DMatch を使用するコードと、既存の RGB-D 再構築から 3DMatch をトレーニングするコードを提供します。これは私たちの論文のリファレンス実装です。
PDF |ウェブページ、ベンチマーク、データセット |ビデオ
アンディ・ゼン、シュラン・ソング、マティアス・ニースナー、マシュー・フィッシャー、ジャンション・シャオ、トーマス・ファンクハウザー
IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2017口頭発表
3D スキャン データにはノイズが多く、解像度が低く、不完全な性質があるため、現実世界の深度画像上で局所的な幾何学的特徴を一致させることは困難な作業です。これらの問題により、通常は幾何学的特性に対するヒストグラムに基づく現在の最先端の方法のパフォーマンスが制限されます。この論文では、部分的な 3D データ間の対応を確立するためにローカル ボリューム パッチ記述子を学習するデータ駆動型モデル 3DMatch を紹介します。モデルのトレーニング データを蓄積するために、既存の RGB-D 再構成で見つかった何百万もの対応ラベルを活用する教師なし特徴学習方法を提案します。実験の結果、私たちの記述子は、再構築のために新しいシーンのローカル ジオメトリを照合できるだけでなく、さまざまなタスクや空間スケール (Amazon Picking Challenge のインスタンス レベルのオブジェクト モデルの位置合わせやメッシュ サーフェスの対応など) にも一般化できることがわかりました。結果は、3Dmatch が他の最先端のアプローチを大幅に上回るパフォーマンスを一貫して示していることを示しています。
このコードが自分の仕事に役立つと思われる場合は、次のコードを引用することを検討してください。
@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}
}
このコードは、Simplified BSD License に基づいてリリースされています (詳細については、LICENSE ファイルを参照してください)。
すべての関連情報とダウンロードはここからご覧いただけます。
ご質問がある場合、またはバグを見つけた場合は、Andy Zeng までお知らせください。 andyz[at]princeton[dot]edu
#include <random>
デモ コードの utils.hpp に追加しました。3DMatch のリファレンス実装とこのツールボックスの他のコンポーネントには、次の依存関係が必要です。 Ubuntu 14.04でテストしました。
CUDA 7.5 および cuDNN 5.1。 NVIDIA への登録が必要な場合があります。以下は、cuDNN 5.1 をセットアップするための追加の手順です。注意ソフトウェア パッケージごとに必要なバージョンが異なる場合があるため、異なるバージョンの cuDNN を異なるディレクトリ ( /usr/local/cudnn/vXX
など) にインストールすることを強くお勧めします。
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 (OpenCV 2.4.11 でテスト済み)
このデモでは、事前にトレーニングされた 3DMatch 記述子 (Marvin を使用) と標準 RANSAC を使用して、2 つの 3D 点群 (単一ビューの深度マップから投影) を位置合わせします。
3DMatch ツールボックスをチェックアウトし、C++/CUDA デモ コードと Marvin をコンパイルします。
git clone https://github.com/andyzeng/3dmatch-toolbox.git 3dmatch-toolbox
cd 3dmatch-toolbox/core
./compile.sh
3DMatch 事前トレーニング済みウェイトをダウンロード
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
2 つのサンプル 3D 点群をロードし、それらの TDF ボクセル グリッド ボリュームを計算し、ランダムなサーフェス キーポイントとその 3DMatch 記述子 (ディスク上のバイナリ ファイルに保存) を計算します。警告: このデモは、単純なバイナリ形式で保存された 3D 点群のみを読み取ります。独自の点群形式で 3DMatch デモ コードを実行したい場合は、demo.cu をそれに応じて変更してください。
# 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
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 ;
さまざまな 3D データ表現を TDF (Truncated Distance Function) 値のボクセル グリッドに変換する方法についての説明。
GAPS をインストールし、サンプル メッシュ (.off ファイル) をボクセル グリッド (フロートのバイナリ .raw ファイル) に変換する手順:
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
Matlab で視覚化スクリプトを実行する
% Visualize TDF voxel grid of mesh
showTDF ;
フォルダー3dmatch-toolbox/training
参照してください。
軽量の GPU 専用ニューラル ネットワーク フレームワークである Marvin を使用して 3DMatch をトレーニングするためのコード。シャム ネットワーク アーキテクチャの .json ファイルtraining/net.json
と、RGB-D 再構成データセット (プロジェクト Web ページからダウンロード可能) からの対応をランダムにサンプリングするtraining/match.hpp
の CUDA/C++ Marvin データ レイヤーが含まれています。
マービンをコンパイルする
cd 3dmatch-toolbox/training
./compile.sh
RGB-D 再構成データセットからいくつかのトレーニング シーンとテスト シーンをダウンロードします (ここからさらにシーンをダウンロードします)
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
data/train
に保存された RGB-D シーンからの対応に基づいて 3Dmatch モデルを最初からトレーニングします。
./marvin train net.json
(オプション) Marvin テンソル ファイルからの事前トレーニング済みの重みを使用して 3Dmatch をトレーニングする
./marvin train net.json your-pre-trained-weights.marvin
プロジェクトの Web ページで、RGB-D 再構築データセットからさらに多くのシーンをダウンロードできます。これらのデータセットは、3DMatch のトレーニングに使用される Marvin データ レイヤーと互換性のある統一形式に変換されています。フォルダー階層が次のようになるように、少なくとも 1 つのシーンをdata/train
に保存し、別のシーンをdata/test
に保存します。
| ——— 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
| ——— ...
フォルダー3dmatch-toolbox/depth-fusion
参照してください。
複数の登録された深度マップを TSDF ボクセル ボリュームに融合する CUDA/C++ コード (Curless および Levoy 1996)。これを使用してサーフェス メッシュと点群を作成できます。
このデモでは、ディレクトリdata/sample/depth-fusion-demo/rgbd-frames
にある 50 の登録済み深度マップを TSDF ボクセル ボリュームに融合し、表面点群tsdf.ply
を作成します。
cd 3dmatch-toolbox/depth-fusion
./compile.sh
./demo # output saved to tsdf.ply
フォルダー3dmatch-toolbox/evaluation
参照してください。
Keypoint Matching Benchmark と Geometric Registration Benchmark の評価コード、および論文の実験のリファレンス実装。
フォルダー3dmatch-toolbox/evaluation/keypoint-matching
参照してください。
ベンチマークの説明とリーダーボードはここでご覧いただけます。
3dmatch-toolbox/evaluation/keypoint-matching
に移動し、Matlab で次のコマンドを実行します。
% Evaluate 3DMatch (3dmatch.log) on the validation set (validation-set-gt.log)
getError ;
Marvin を使用して C++/CUDA コードをコンパイルして 3DMatch 記述子を計算する
cd 3dmatch-toolbox/evaluation/keypoint-matching
./compile.sh
3DMatch 事前トレーニング済みウェイトをダウンロード
./download-weights.sh # 3dmatch-weights-snapshot-137000.marvin
検証セットとテストセットをダウンロードする
./download-validation.sh # validation-set.mat
./download-test.sh # test-set.mat
Matlab で次のスクリプトを変更して実行します。
% Runs 3DMatch on the validation set and generates 3dmatch.log
test3DMatch ;
プロジェクト Web ページで RGB-D 再構築データセットから 1 つ以上のシーンをダウンロードします。上記のようにフォルダー階層を整理します。
Matlab で次のスクリプトを変更して実行します。
makeCorresDataset ;
フォルダー3dmatch-toolbox/evaluation/geometric-registration
参照してください。
ここで説明する幾何学的登録ベンチマークで評価を実行する Matlab コードが含まれています。概要:
getKeyptsAndDesc.m
- シーン フラグメントの中間データ (TDF ボクセル ボリューム、キーポイント、および 3DMatch 記述子) を生成します。ここから事前に計算されたデータをダウンロードすることもできます。runFragmentRegistration.m
- 中間データを読み取り、フラグメントのすべてのペアに対して RANSAC ベースの登録を実行します。writeLog
- フラグメントのすべてのペアから登録結果を読み取り、.log ファイルを作成します。evaluate.m
- 評価のために .log ファイルから精度と再現率を計算します。 Matlab で次を実行します。
% Evaluate 3DMatch on the geometric registration benchmark
evaluate ;
注: 合成ベンチマークからのシーン フラグメントの TDF ボクセル グリッドは、正確な TDF を得るために非推奨のコードを使用して計算されました ( deprecated/pointCloud2AccTDF.m
を参照)。トレーニング フラグメントに基づいて微調整された 3DMatch 事前トレーニング済みの重みは、ここからダウンロードできます。
フォルダー3dmatch-toolbox/evaluation/model-fitting-apc
参照してください。
シェルフ & トート データセットに適合するモデルについて 3Dmatch を評価するためのコードと事前トレーニングされたモデルが含まれています。事前に計算されたデータ (オブジェクトとスキャンの TDF ボクセル グリッド ボリューム、サーフェス キーポイント、記述子、ポーズ予測) をここからダウンロードできます。評価例として、Matlab スクリプトgetError.m
を実行します。
フォルダー3dmatch-toolbox/evaluation/mesh-correspondence-shape2pose
を参照してください。
3DMatch を使用して Shape2Pose データセットからメッシュ上にメッシュ対応視覚化を生成するコードが含まれています。事前に計算されたデータ (メッシュの TDF ボクセル グリッド ボリューム、サーフェス キーポイント、3DMatch 記述子) をここからダウンロードすることもできます。簡単に視覚化するには、Matlab スクリプトkeypointRetrieval.m
を実行します。