Uma API unificada para testar de forma rápida e fácil 29 (e cada vez mais!) modelos de correspondência de imagens.
Vá para: Instalar | Usar | Modelos | Adicionar um modelo/contribuir | Agradecimentos | Citar
Compare modelos correspondentes em várias cenas. Por exemplo, mostramos correspondências SIFT-LightGlue
e LoFTR
em pares:
(1) exterior, (2) interior, (3) sensoriamento remoto por satélite, (4) pinturas e (5) um falso positivo.
Você também pode extrair pontos-chave e descritores associados.
Se você deseja instalar a partir do código-fonte (mais fácil de editar, use benchmark.py
, demo.ipynb
),
git clone --recursive https://github.com/gmberton/image-matching-models
cd image-matching-models
pip install .
Alguns modelos ( omniglue
, família LoFTR) requerem dependências únicas ( tensorflow
, pytorch-lightning
), que não estão incluídas na lista padrão. Para instalá-los, use
pip install .[all]
Isto instalará todas as dependências necessárias para executar todos os modelos.
Você pode instalar diretamente no diretório do seu pacote com
pip install git+https://github.com/gmberton/image-matching-models.git
Semelhante ao acima, para obter todas as dependências opcionais, use o adendo [all]
:
pip install " image-matching-models[all] @ git+https://github.com/gmberton/image-matching-models.git "
Você pode usar qualquer um dos matchers com
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' )
Você também pode executar isso como um script independente, que realizará inferências nos exemplos dentro de ./assets
. Você também pode resolução ( im_size
) e número de pontos-chave ( n_kpts
). Isso levará alguns segundos na CPU de um laptop e produzirá as mesmas imagens que você vê acima.
python main_matcher.py --matcher sift-lg --device cpu --out_dir output_sift-lg
onde sift-lg
usará SIFT + LightGlue
.
O script irá gerar uma imagem com os pontos-chave correspondentes para cada par, em ./output_sift-lg
.
Para usar em suas imagens você tem três opções:
./assets/example_pairs
. Em seguida, use como python main_matcher.py --input path/to/dir
assets/example_pairs_paths.txt
. Em seguida, use como python main_matcher.py --input path/to/file.txt
Para extrair pontos-chave e descrições (quando disponíveis) de uma única imagem, use o método 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 )
Tal como acontece com a correspondência, você também pode executar a extração na linha de comando
python main_extractor.py --matcher sift-lg --device cpu --out_dir output_sift-lg --n_kpts 2048
Você pode escolher qualquer um dos seguintes métodos (entrada para get_matcher()
):
Denso : roma, tiny-roma, dust3r, mast3r
Semidenso : loftr, eloftr, se2loftr, aspanformer, matchformer, xfeat-star
Esparso : [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
Dica
Você pode passar uma lista de matchers, ou seja get_matcher([xfeat, tiny-roma])
para executar ambos os matchers e concatenar seus pontos-chave.
Todos os matchers podem rodar em GPU, e a maioria deles pode rodar em GPU ou CPU. Alguns não podem ser executados na CPU.
Importante
Verifique a LICENÇA de cada modelo/código base original antes de usar em sua aplicação. Alguns são fortemente restritos.
Modelo | Código | Papel | Tempo de execução da GPU (s/img) | Tempo de execução da CPU (s/img) |
---|---|---|---|---|
Keypt2Subpx* (ECCV '24) | Oficial | arxiv | 0,055/0,164/0,033/0,291 | -- |
MASt3R (ArXiv '24) | Oficial | arxiv | 0,699 | -- |
LoFTR eficiente (CVPR '24) | Oficial | 0,1026 | 2.117 | |
OmniGlue (CVPR '24) | Oficial | arxiv | 6.351 | |
xFeat (CVPR '24) | Oficial | arxiv | 0,027 | 0,048 |
GIM (ICLR '24) | Oficial | arxiv | 0,077 (+LG) / 1,627 (+DKMv3) | 5.321 (+LG) / 20.301 (+DKMv3) |
Roma / Tiny-RoMa (CVPR '24) | Oficial | arxiv | 0,453/0,0456 | 18.950 |
DUST3R (CVPR '24) | Oficial | arxiv | 3.639 | 26.813 |
DeDoDe (3DV '24) | Oficial | arxiv | 0,311 (+MNN)/ 0,218 (+LG) | |
Dirigentes (CVPR '24) | Oficial | arxiv | 0,150 | |
LightGlue* (ICCV '23) | Oficial | arxiv | 0,417/0,093/0,184/0,128 | 2.828/8.852/8.100/8.128 |
SE2-LoFTR (CVPRW '22) | Oficial | arxiv | 0,133 | 2.378 |
Aspanformer (ECCV '22) | Oficial | arxiv | 0,384 | 11.73 |
Formador de partida (ACCV '22) | Oficial | arxiv | 0,232 | 6.101 |
LoFTR (CVPR '21) | Oficial / Kornia | arxiv | 0,722 | 2,36 |
Patch2Pix (CVPR '21) | Oficial/IMT | arxiv | 0,145 | 4,97 |
SuperCola (CVPR '20) | Oficial/IMT | arxiv | 0,0894 | 2.178 |
R2D2 (NeurIPS '19) | Oficial/IMT | arxiv | 0,429 | 6,79 |
D2Net (CVPR '19) | Oficial/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) |
Nossa implementação de Patch2Pix (+ Patch2PixSuperGlue), R2D2 e D2Net é baseada no Image Matching Toolbox (IMT). LoFTR e DeDoDe-Lightglue são da Kornia. Outros modelos são baseados nos repositórios oficiais acima.
O benchmark de tempo de execução é a média de 5 iterações nos 5 pares de exemplos na pasta assets/example_pairs
no tamanho de imagem 512x512. O benchmark é feito usando benchmark.py
em uma GPU NVIDIA RTX A4000. Resultados arredondados às centésimas.
* Os tempos de execução do modelo LightGlue
estão listados na ordem: SIFT, SuperPoint, Disk, ALIKED
* Os tempos de execução do modelo Keypt2Subpx
estão listados na ordem: superpoint-lg, aliked-lg, xfeat, dedode
Consulte CONTRIBUTING.md para obter detalhes.
Observação
Este repositório tem usabilidade otimizada, mas necessariamente para velocidade. A ideia é usar este repositório para encontrar o matcher que melhor atende às suas necessidades e, em seguida, usar o código original para tirar o melhor proveito dele.
Agradecimentos especiais aos autores dos respectivos trabalhos incluídos neste repositório (veja seus artigos acima). Agradecimentos adicionais a @GrumpyZhou por desenvolver e manter o Image Matching Toolbox, que incluímos neste repositório, e aos mantenedores do Kornia.
Este repositório foi criado como parte do artigo EarthMatch. Considere citar o trabalho do EarthMatch se este repositório for útil para você!
@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},
}