Eine einheitliche API zum schnellen und einfachen Ausprobieren von 29 (und es werden immer mehr!) Bildanpassungsmodellen.
Wechseln zu: Installieren | Verwenden Sie | Modelle | Modell hinzufügen/Beitrag leisten | Danksagungen | Zitieren
Vergleichen Sie passende Modelle in verschiedenen Szenen. Wir zeigen beispielsweise SIFT-LightGlue
und LoFTR
Übereinstimmungen für Paare:
(1) im Freien, (2) im Innenbereich, (3) Satellitenfernerkundung, (4) Gemälde und (5) ein falsch positives Ergebnis.
Sie können auch Schlüsselpunkte und zugehörige Deskriptoren extrahieren.
Wenn Sie von der Quelle installieren möchten (am einfachsten zu bearbeiten, verwenden Sie benchmark.py
, demo.ipynb
),
git clone --recursive https://github.com/gmberton/image-matching-models
cd image-matching-models
pip install .
Einige Modelle ( omniglue
, LoFTR-Familie) erfordern einmalige Abhängigkeiten ( tensorflow
, pytorch-lightning
), die nicht in der Standardliste enthalten sind. Um diese zu installieren, verwenden Sie
pip install .[all]
Dadurch werden alle Abhängigkeiten installiert, die zum Ausführen aller Modelle erforderlich sind.
Sie können mit direkt in Ihr Paketverzeichnis installieren
pip install git+https://github.com/gmberton/image-matching-models.git
Um alle optionalen Abhängigkeiten abzurufen, verwenden Sie ähnlich wie oben den Zusatz [all]
:
pip install " image-matching-models[all] @ git+https://github.com/gmberton/image-matching-models.git "
Sie können jeden der Matcher mit verwenden
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' )
Sie können dies auch als eigenständiges Skript ausführen, das Rückschlüsse auf die Beispiele in ./assets
zieht. Sie können auch die Auflösung ( im_size
) und die Anzahl der Schlüsselpunkte ( n_kpts
) festlegen. Dies dauert auf der CPU eines Laptops einige Sekunden und erzeugt die gleichen Bilder wie oben.
python main_matcher.py --matcher sift-lg --device cpu --out_dir output_sift-lg
wobei sift-lg
SIFT + LightGlue
verwendet.
Das Skript generiert ein Bild mit den passenden Schlüsselpunkten für jedes Paar unter ./output_sift-lg
.
Zur Verwendung auf Ihren Bildern haben Sie drei Möglichkeiten:
./assets/example_pairs
. Dann verwenden Sie als python main_matcher.py --input path/to/dir
assets/example_pairs_paths.txt
. Dann verwenden Sie als python main_matcher.py --input path/to/file.txt
Um Schlüsselpunkte und Beschreibungen (sofern verfügbar) aus einem einzelnen Bild zu extrahieren, verwenden Sie die Methode 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 )
Wie beim Abgleich können Sie die Extraktion auch über die Befehlszeile ausführen
python main_extractor.py --matcher sift-lg --device cpu --out_dir output_sift-lg --n_kpts 2048
Sie können eine der folgenden Methoden auswählen (Eingabe in get_matcher()
):
Dicht : roma, tiny-roma, dust3r, mast3r
Halbdicht : 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
Tipp
Sie können eine Liste von Matchern übergeben, z. B. get_matcher([xfeat, tiny-roma])
um beide Matcher auszuführen und ihre Schlüsselpunkte zu verketten.
Alle Matcher können auf der GPU ausgeführt werden, und die meisten von ihnen können sowohl auf der GPU als auch auf der CPU ausgeführt werden. Einige können nicht auf der CPU ausgeführt werden.
Wichtig
Überprüfen Sie die LIZENZ jedes Modells/der Originalcodebasis, bevor Sie es in Ihrer Anwendung verwenden. Einige sind stark eingeschränkt.
Modell | Code | Papier | GPU-Laufzeit (s/img) | CPU-Laufzeit (s/img) |
---|---|---|---|---|
Keypt2Subpx* (ECCV '24) | Offiziell | arxiv | 0,055 / 0,164 / 0,033 / 0,291 | -- |
MASt3R (ArXiv '24) | Offiziell | arxiv | 0,699 | -- |
Efficient-LoFTR (CVPR '24) | Offiziell | 0,1026 | 2.117 | |
OmniGlue (CVPR '24) | Offiziell | arxiv | 6.351 | |
xFeat (CVPR '24) | Offiziell | arxiv | 0,027 | 0,048 |
GIM (ICLR '24) | Offiziell | arxiv | 0,077 (+LG) / 1,627 (+DKMv3) | 5,321 (+LG) / 20,301 (+DKMv3) |
RoMa / Tiny-RoMa (CVPR '24) | Offiziell | arxiv | 0,453 / 0,0456 | 18.950 |
DUSt3R (CVPR '24) | Offiziell | arxiv | 3.639 | 26.813 |
DeDoDe (3DV '24) | Offiziell | arxiv | 0,311 (+MNN)/ 0,218 (+LG) | |
Lenker (CVPR '24) | Offiziell | arxiv | 0,150 | |
LightGlue* (ICCV '23) | Offiziell | arxiv | 0,417 / 0,093 / 0,184 / 0,128 | 2,828 / 8,852 / 8,100 / 8,128 |
SE2-LoFTR (CVPRW '22) | Offiziell | arxiv | 0,133 | 2.378 |
Aspanformer (ECCV '22) | Offiziell | arxiv | 0,384 | 11.73 |
Matchformer (ACCV '22) | Offiziell | arxiv | 0,232 | 6.101 |
LoFTR (CVPR '21) | Offiziell / Kornia | arxiv | 0,722 | 2.36 |
Patch2Pix (CVPR '21) | Offiziell / IMT | arxiv | 0,145 | 4,97 |
Sekundenkleber (CVPR '20) | Offiziell / IMT | arxiv | 0,0894 | 2.178 |
R2D2 (NeurIPS '19) | Offiziell / IMT | arxiv | 0,429 | 6,79 |
D2Net (CVPR '19) | Offiziell / IMT | arxiv | 0,600 | 1.324 |
SIFT-NN (IJCV '04) | OpenCV | 0,124 | 0,117 | |
ORB-NN (ICCV '11) | OpenCV | ResearchGate | 0,088 | 0,092 |
DoGHardNet (NeurIPS '17) | IMT / Kornia | arxiv | 2,697 (+NN) / 0,526 (+LG) | 2,438(+NN) / 4,528 (+LG) |
Unsere Implementierung von Patch2Pix (+ Patch2PixSuperGlue), R2D2 und D2Net basiert auf der Image Matching Toolbox (IMT). LoFTR und DeDoDe-Lightglue stammen von Kornia. Andere Modelle basieren auf den oben genannten offiziellen Repos.
Der Laufzeit-Benchmark ist der Durchschnitt von 5 Iterationen über die 5 Beispielpaare im Ordner assets/example_pairs
bei der Bildgröße 512 x 512. Der Benchmark wird mit benchmark.py
auf einer NVIDIA RTX A4000 GPU durchgeführt. Ergebnisse auf die Hundertstelstelle gerundet.
* Die Laufzeiten des LightGlue
-Modells sind in der folgenden Reihenfolge aufgeführt: SIFT, SuperPoint, Disk, ALIKED
* Keypt2Subpx
-Modelllaufzeiten werden in der Reihenfolge aufgeführt: superpoint-lg, aliked-lg, xfeat, dedode
Weitere Informationen finden Sie unter CONTRIBUTING.md.
Notiz
Dieses Repo ist auf Benutzerfreundlichkeit optimiert, aber unbedingt auf Geschwindigkeit. Die Idee besteht darin, dieses Repo zu verwenden, um den Matcher zu finden, der Ihren Anforderungen am besten entspricht, und dann den Originalcode zu verwenden, um das Beste daraus zu machen.
Besonderer Dank geht an die Autoren der jeweiligen Werke, die in diesem Repo enthalten sind (siehe deren Aufsätze oben). Zusätzlicher Dank geht an @GrumpyZhou für die Entwicklung und Pflege der Image Matching Toolbox, die wir in diesem Repo zusammengefasst haben, und an die Betreuer von Kornia.
Dieses Repo wurde als Teil des EarthMatch-Papiers erstellt. Bitte erwägen Sie, die Arbeit von EarthMatch zu zitieren, wenn dieses Repo für Sie hilfreich ist!
@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},
}