Une API unifiée pour essayer rapidement et facilement 29 modèles de correspondance d'images (et de plus en plus !).
Aller à : Installer | Utiliser | Modèles | Ajouter un modèle/contribuer | Remerciements | Citer
Comparez les modèles correspondants dans différentes scènes. Par exemple, nous affichons les correspondances SIFT-LightGlue
et LoFTR
sur des paires :
(1) extérieur, (2) intérieur, (3) télédétection par satellite, (4) peintures et (5) un faux positif.
Vous pouvez également extraire des points clés et des descripteurs associés.
Si vous souhaitez installer à partir des sources (le plus simple à modifier, utilisez benchmark.py
, demo.ipynb
),
git clone --recursive https://github.com/gmberton/image-matching-models
cd image-matching-models
pip install .
Certains modèles ( omniglue
, famille LoFTR) nécessitent des dépendances ponctuelles ( tensorflow
, pytorch-lightning
), qui ne sont pas incluses dans la liste par défaut. Pour les installer, utilisez
pip install .[all]
Cela installera toutes les dépendances nécessaires pour exécuter tous les modèles.
Vous pouvez installer directement dans le répertoire de votre package avec
pip install git+https://github.com/gmberton/image-matching-models.git
Semblable à ce qui précède, pour obtenir toutes les dépendances facultatives, utilisez l'addendum [all]
:
pip install " image-matching-models[all] @ git+https://github.com/gmberton/image-matching-models.git "
Vous pouvez utiliser n'importe lequel des matchers avec
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' )
Vous pouvez également l'exécuter en tant que script autonome, qui effectuera une inférence sur les exemples contenus dans ./assets
. Vous pouvez également la résolution ( im_size
) et le nombre de points clés ( n_kpts
). Cela prendra quelques secondes sur le processeur d'un ordinateur portable et produira les mêmes images que celles que vous voyez ci-dessus.
python main_matcher.py --matcher sift-lg --device cpu --out_dir output_sift-lg
où sift-lg
utilisera SIFT + LightGlue
.
Le script générera une image avec les points clés correspondants pour chaque paire, sous ./output_sift-lg
.
Pour utiliser sur vos images, vous avez trois options :
./assets/example_pairs
. Utilisez ensuite comme python main_matcher.py --input path/to/dir
assets/example_pairs_paths.txt
. Utilisez ensuite comme python main_matcher.py --input path/to/file.txt
Pour extraire les points clés et les descriptions (le cas échéant) d'une seule image, utilisez la méthode 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 )
Comme pour la correspondance, vous pouvez également exécuter l'extraction à partir de la ligne de commande
python main_extractor.py --matcher sift-lg --device cpu --out_dir output_sift-lg --n_kpts 2048
Vous pouvez choisir l’une des méthodes suivantes (entrée dans get_matcher()
) :
Dense : roma, tiny-roma, dust3r, mast3r
Semi-dense : loftr, eloftr, se2loftr, aspanformer, matchformer, xfeat-star
Sparse : [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
Conseil
Vous pouvez transmettre une liste de correspondants, c'est-à-dire get_matcher([xfeat, tiny-roma])
pour exécuter les deux correspondants et concaténer leurs points clés.
Tous les matchers peuvent fonctionner sur GPU, et la plupart d'entre eux peuvent fonctionner à la fois sur GPU ou CPU. Quelques-uns ne peuvent pas fonctionner sur CPU.
Important
Vérifiez la LICENCE de chaque modèle/base de code original avant utilisation dans votre application. Certains sont fortement restreints.
Modèle | Code | Papier | Temps d'exécution du GPU (s/img) | Temps d'exécution du processeur (s/img) |
---|---|---|---|---|
Keypt2Subpx* (ECCV '24) | Officiel | arxiv | 0,055 /0,164 / 0,033 / 0,291 | -- |
MASt3R (ArXiv '24) | Officiel | arxiv | 0,699 | -- |
Efficace-LoFTR (CVPR '24) | Officiel | 0,1026 | 2.117 | |
OmniGlue (CVPR '24) | Officiel | arxiv | 6.351 | |
xFeat (CVPR'24) | Officiel | arxiv | 0,027 | 0,048 |
GIM (ICLR'24) | Officiel | arxiv | 0,077 (+LG) / 1,627 (+DKMv3) | 5,321 (+LG) / 20,301 (+DKMv3) |
Rome / Tiny-RoMa (CVPR '24) | Officiel | arxiv | 0,453 / 0,0456 | 18.950 |
DUSt3R (CVPR '24) | Officiel | arxiv | 3.639 | 26.813 |
DeDoDe (3DV '24) | Officiel | arxiv | 0,311 (+MNN)/ 0,218 (+LG) | |
Directions (CVPR '24) | Officiel | arxiv | 0,150 | |
LightGlue* (ICCV '23) | Officiel | arxiv | 0,417 / 0,093 / 0,184 / 0,128 | 2,828 / 8,852 / 8,100 / 8,128 |
SE2-LoFTR (CVPRW '22) | Officiel | arxiv | 0,133 | 2.378 |
Aspanformer (ECCV '22) | Officiel | arxiv | 0,384 | 11.73 |
Matchformer (ACCV '22) | Officiel | arxiv | 0,232 | 6.101 |
LoFTR (CVPR '21) | Officiel / Kornia | arxiv | 0,722 | 2.36 |
Patch2Pix (CVPR'21) | Officiel / IMT | arxiv | 0,145 | 4,97 |
SuperGlue (CVPR '20) | Officiel / IMT | arxiv | 0,0894 | 2.178 |
R2D2 (NeurIPS '19) | Officiel / IMT | arxiv | 0,429 | 6,79 |
D2Net (CVPR'19) | Officiel / IMT | arxiv | 0,600 | 1.324 |
SIFT-NN (IJCV '04) | OuvrirCV | 0,124 | 0,117 | |
ORB-NN (ICCV '11) | OuvrirCV | Porte de recherche | 0,088 | 0,092 |
DoGHardNet (NeurIPS '17) | IMT / Kornia | arxiv | 2,697 (+NN) / 0,526 (+LG) | 2,438(+NN) / 4,528 (+LG) |
Notre implémentation de Patch2Pix (+ Patch2PixSuperGlue), R2D2 et D2Net est basée sur Image Matching Toolbox (IMT). LoFTR et DeDoDe-Lightglue proviennent de Kornia. D'autres modèles sont basés sur les dépôts officiels ci-dessus.
Le test de référence d'exécution est la moyenne de 5 itérations sur les 5 paires d'exemples dans le dossier assets/example_pairs
à une taille d'image de 512 x 512. Le benchmark est effectué à l'aide de benchmark.py
sur un GPU NVIDIA RTX A4000. Résultats arrondis au centième.
* Les environnements d'exécution du modèle LightGlue
sont répertoriés dans l'ordre : SIFT, SuperPoint, Disk, ALIKED
* Les environnements d'exécution des modèles Keypt2Subpx
sont répertoriés dans l'ordre : superpoint-lg, aliked-lg, xfeat, dedode
Voir CONTRIBUTING.md pour plus de détails.
Note
Ce dépôt est optimisé pour la convivialité, mais nécessairement pour la vitesse. L'idée est d'utiliser ce référentiel pour trouver le matcher qui correspond le mieux à vos besoins, puis d'utiliser le code d'origine pour en tirer le meilleur parti.
Un merci spécial aux auteurs des œuvres respectives incluses dans ce référentiel (voir leurs articles ci-dessus). Merci supplémentaire à @GrumpyZhou pour le développement et la maintenance de la boîte à outils de correspondance d'images, que nous avons enveloppée dans ce référentiel, ainsi qu'aux responsables de Kornia.
Ce dépôt a été créé dans le cadre du document EarthMatch. Veuillez envisager de citer le travail d'EarthMatch si ce dépôt vous est utile !
@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},
}