一个统一的 API,可用于快速轻松地尝试 29 种(并且还在不断增加!)图像匹配模型。
跳转至:安装 |使用|型号|添加模型/贡献 |致谢 |引用
比较不同场景的匹配模型。例如,我们显示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 系列)需要一次性依赖项( 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
下生成每对具有匹配关键点的图像。
要在图像上使用,您有以下三个选项:
./assets/example_pairs
一样。然后用作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 运行时 (s/img) | CPU 运行时间 (s/img) |
---|---|---|---|---|
Keypt2Subpx* (ECCV '24) | 官方的 | arxiv | 0.055 /0.164 / 0.033 / 0.291 | -- |
MASt3R (ArXiv '24) | 官方的 | arxiv | 0.699 | -- |
高效 LoFTR (CVPR '24) | 官方的 | 0.1026 | 2.117 | |
OmniGlue (CVPR '24) | 官方的 | arxiv | 6.351 | |
xFeat (CVPR '24) | 官方的 | arxiv | 0.027 | 0.048 |
GIM(ICLR '24) | 官方的 | arxiv | 0.077 (+LG) / 1.627 (+DKMv3) | 5.321 (+LG) / 20.301 (+DKMv3) |
罗马 / 小罗马 (CVPR '24) | 官方的 | arxiv | 0.453 / 0.0456 | 18.950 |
DUSt3R (CVPR '24) | 官方的 | arxiv | 3.639 | 26.813 |
德多德 (3DV '24) | 官方的 | arxiv | 0.311(+MNN)/ 0.218(+LG) | |
舵手 (CVPR '24) | 官方的 | arxiv | 0.150 | |
LightGlue* (ICCV '23) | 官方的 | arxiv | 0.417 / 0.093 / 0.184 / 0.128 | 2.828 / 8.852 / 8.100 / 8.128 |
SE2-LoFTR (CVPRW '22) | 官方的 | arxiv | 0.133 | 2.378 |
Aspanformer (ECCV '22) | 官方的 | arxiv | 0.384 | 11.73 |
火柴人(ACCV '22) | 官方的 | arxiv | 0.232 | 6.101 |
LoFTR(CVPR '21) | 官方/科尔尼亚 | arxiv | 0.722 | 2.36 |
Patch2Pix(CVPR '21) | 官方/IMT | arxiv | 0.145 | 4.97 |
超级胶水 (CVPR '20) | 官方/IMT | arxiv | 0.0894 | 2.178 |
R2D2(NeurIPS '19) | 官方/IMT | arxiv | 0.429 | 6.79 |
D2Net(CVPR '19) | 官方/IMT | arxiv | 0.600 | 1.324 |
SIFT-NN (IJCV '04) | 开放式计算机视觉 | 0.124 | 0.117 | |
ORB-NN (ICCV '11) | 开放式计算机视觉 | 研究之门 | 0.088 | 0.092 |
DoGHardNet (NeurIPS '17) | IMT/科尔尼亚 | arxiv | 2.697(+NN)/0.526(+LG) | 2.438(+NN)/4.528(+LG) |
我们的 Patch2Pix (+ Patch2PixSuperGlue)、R2D2 和 D2Net 的实现基于图像匹配工具箱 (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。
笔记
该存储库优化了可用性,但必然是为了速度。我们的想法是使用这个存储库来找到最适合您需求的匹配器,然后使用原始代码来充分利用它。
特别感谢本存储库中包含的各个作品的作者(请参阅上面的论文)。另外感谢@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},
}