29 個の (そして増加中!) 画像マッチング モデルを迅速かつ簡単に試すための統合 API。
ジャンプ先: インストール |使用 |モデル |モデルの追加/貢献 |謝辞 |引用
さまざまなシーンで一致するモデルを比較します。たとえば、 SIFT-LightGlue
とLoFTR
ペアの一致を示します。
(1) 屋外、(2) 屋内、(3) 衛星リモートセンシング、(4) 絵画、(5) 誤検知。
キーポイントと関連する記述子を抽出することもできます。
ソースからインストールする場合 (最も編集しやすいのは、 benchmark.py
、 demo.ipynb
を使用します)、
git clone --recursive https://github.com/gmberton/image-matching-models
cd image-matching-models
pip install .
一部のモデル ( omniglue
、LoFTR ファミリ) には 1 回限りの依存関係 ( tensorflow
、 pytorch-lightning
) が必要ですが、これらはデフォルトのリストには含まれていません。これらをインストールするには、次を使用します
pip install .[all]
これにより、すべてのモデルを実行するために必要なすべての依存関係がインストールされます。
次のコマンドを使用して、パッケージ ディレクトリに直接インストールできます。
pip install git+https://github.com/gmberton/image-matching-models.git
上記と同様に、オプションの依存関係をすべて取得するには、 [all]
補遺を使用します。
pip install " image-matching-models[all] @ git+https://github.com/gmberton/image-matching-models.git "
任意のマッチャーを使用できます
from matching import get_matcher
from matching . viz import plot_matches
device = 'cuda' # 'cpu'
matcher = get_matcher ( 'superpoint-lg' , device = device ) # Choose any of our ~30+ matchers listed below
img_size = 512 # optional
img0 = matcher . load_image ( 'assets/example_pairs/outdoor/montmartre_close.jpg' , resize = img_size )
img1 = matcher . load_image ( 'assets/example_pairs/outdoor/montmartre_far.jpg' , resize = img_size )
result = matcher ( img0 , img1 )
num_inliers , H , inlier_kpts0 , inlier_kpts1 = result [ 'num_inliers' ], result [ 'H' ], result [ 'inlier_kpts0' ], result [ 'inlier_kpts1' ]
# result.keys() = ['num_inliers', 'H', 'all_kpts0', 'all_kpts1', 'all_desc0', 'all_desc1', 'matched_kpts0', 'matched_kpts1', 'inlier_kpts0', 'inlier_kpts1']
plot_matches ( img0 , img1 , result , save_path = 'plot_matches.png' )
これをスタンドアロン スクリプトとして実行することもでき、 ./assets
内の例に対して推論を実行します。解像度 ( im_size
) とキーポイントの数 ( n_kpts
) も指定できます。これにはラップトップの CPU で数秒かかり、上記と同じ画像が生成されます。
python main_matcher.py --matcher sift-lg --device cpu --out_dir output_sift-lg
ここで、 sift-lg
SIFT + LightGlue
を使用します。
スクリプトは、各ペアの一致するキーポイントを含む画像を./output_sift-lg
の下に生成します。
画像に使用するには、次の 3 つのオプションがあります。
./assets/example_pairs
のように、サブディレクトリを持つディレクトリを作成し、サブディレクトリごとに 2 つのイメージを含めます。次に、 python main_matcher.py --input path/to/dir
として使用します。assets/example_pairs_paths.txt
のように、パスのペアをスペースで区切ったファイルを作成します。次に、 python main_matcher.py --input path/to/file.txt
として使用します。単一の画像からキーポイントと説明 (利用可能な場合) を抽出するには、 extract()
メソッドを使用します。
from matching import get_matcher
device = 'cuda' # 'cpu'
matcher = get_matcher ( 'superglue' , device = device ) # Choose any of our ~30+ matchers listed below
img_size = 512 # optional
img = matcher . load_image ( 'assets/example_pairs/outdoor/montmartre_close.jpg' , resize = img_size )
result = matcher . extract ( img )
# result.keys() = ['all_kpts0', 'all_desc0']
plot_kpts ( img , result )
マッチングと同様に、コマンドラインから抽出を実行することもできます。
python main_extractor.py --matcher sift-lg --device cpu --out_dir output_sift-lg --n_kpts 2048
次のメソッドのいずれかを選択できます ( get_matcher()
への入力)。
密: roma, tiny-roma, dust3r, mast3r
セミデンス: loftr, eloftr, se2loftr, aspanformer, matchformer, xfeat-star
スパース: [sift, superpoint, disk, aliked, dedode, doghardnet, gim, xfeat]-lg, dedode, steerers, dedode-kornia, [sift, orb, doghardnet]-nn, patch2pix, superglue, r2d2, d2net, gim-dkm, xfeat, omniglue, [dedode, xfeat, aliked]-subpx
ヒント
マッチャーのリスト、つまりget_matcher([xfeat, tiny-roma])
を渡すと、両方のマッチャーを実行してキーポイントを連結できます。
すべてのマッチャーは GPU 上で実行でき、ほとんどのマッチャーは GPU または CPU の両方で実行できます。いくつかは CPU で実行できません。
重要
アプリケーションで使用する前に、各モデル/オリジナルのコードベースのライセンスを確認してください。一部は厳しく制限されています。
モデル | コード | 紙 | GPU ランタイム (秒/画像) | CPU ランタイム (秒/画像) |
---|---|---|---|---|
Keypt2Subpx* (ECCV '24) | 正式 | アークシヴ | 0.055 /0.164 / 0.033 / 0.291 | -- |
MASt3R (ArXiv '24) | 正式 | アークシヴ | 0.699 | -- |
Efficient-LoFTR (CVPR '24) | 正式 | 0.1026 | 2.117 | |
オムニグルー (CVPR '24) | 正式 | アークシヴ | 6.351 | |
xFeat (CVPR '24) | 正式 | アークシヴ | 0.027 | 0.048 |
GIM (ICLR '24) | 正式 | アークシヴ | 0.077 (+LG) / 1.627 (+DKMv3) | 5.321 (+LG) / 20.301 (+DKMv3) |
RoMa / Tiny-RoMa (CVPR '24) | 正式 | アークシヴ | 0.453 / 0.0456 | 18.950 |
DUSt3R (CVPR '24) | 正式 | アークシヴ | 3.639 | 26.813 |
デドデ (3DV '24) | 正式 | アークシヴ | 0.311 (+MNN)/0.218 (+LG) | |
ステアラー (CVPR '24) | 正式 | アークシヴ | 0.150 | |
LightGlue* (ICCV '23) | 正式 | アークシヴ | 0.417 / 0.093 / 0.184 / 0.128 | 2.828 / 8.852 / 8.100 / 8.128 |
SE2-LoFTR (CVPRW '22) | 正式 | アークシヴ | 0.133 | 2.378 |
アスパンフォーマー (ECCV '22) | 正式 | アークシヴ | 0.384 | 11.73 |
マッチフォーマー (ACCV '22) | 正式 | アークシヴ | 0.232 | 6.101 |
LoFTR (CVPR '21) | 公式 / コルニア | アークシヴ | 0.722 | 2.36 |
Patch2Pix (CVPR '21) | 公式/IMT | アークシヴ | 0.145 | 4.97 |
スーパーグルー (CVPR '20) | 公式/IMT | アークシヴ | 0.0894 | 2.178 |
R2D2 (NeurIPS '19) | 公式/IMT | アークシヴ | 0.429 | 6.79 |
D2Net (CVPR '19) | 公式/IMT | アークシヴ | 0.600 | 1.324 |
SIFT-NN (IJCV '04) | OpenCV | 0.124 | 0.117 | |
ORB-NN (ICCV '11) | OpenCV | リサーチゲート | 0.088 | 0.092 |
DoGHardNet (NeurIPS '17) | IMT / コルニア | アークシヴ | 2.697 (+NN) / 0.526 (+LG) | 2.438(+NN) / 4.528(+LG) |
Patch2Pix (+ Patch2PixSuperGlue)、R2D2、および D2Net の実装は、Image Matching Toolbox (IMT) に基づいています。 LoFTR と DeDoDe-Lightglue は Kornia から提供されています。他のモデルは上記の公式リポジトリに基づいています。
実行時ベンチマークは、 assets/example_pairs
フォルダー内の画像サイズ 512x512 のサンプルの 5 ペアに対する 5 回の反復の平均です。ベンチマークは、NVIDIA RTX A4000 GPU でbenchmark.py
を使用して実行されます。結果は百の位を四捨五入したものです。
* LightGlue
モデルのランタイムは、SIFT、SuperPoint、Disk、ALIKED の順にリストされています。
* Keypt2Subpx
モデルのランタイムは、superpoint-lg、aliked-lg、xfeat、dedode の順序でリストされています。
詳細については、CONTRIBUTING.md を参照してください。
注記
このリポジトリは使いやすさが最適化されていますが、必然的に速度が重視されます。このリポジトリを使用してニーズに最適なマッチャーを見つけ、元のコードを使用してその機能を最大限に活用することが目的です。
このリポジトリに含まれている各作品の著者に特に感謝します (上記の論文を参照)。このリポジトリにラップした Image Matching Toolbox を開発および保守してくれた @GrumpyZhou と、Kornia のメンテナーにさらに感謝します。
このリポジトリは、EarthMatch ペーパーの一部として作成されました。このリポジトリが役立つ場合は、EarthMatch の成果を引用することを検討してください。
@InProceedings{Berton_2024_EarthMatch,
author = {Berton, Gabriele and Goletto, Gabriele and Trivigno, Gabriele and Stoken, Alex and Caputo, Barbara and Masone, Carlo},
title = {EarthMatch: Iterative Coregistration for Fine-grained Localization of Astronaut Photography},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops},
month = {June},
year = {2024},
}