Una API unificada para probar rápida y fácilmente 29 (¡y en aumento!) modelos de coincidencia de imágenes.
Saltar a: Instalar | Uso | Modelos | Agregar un modelo/Contribuir | Agradecimientos | Citar
Compare modelos coincidentes en varias escenas. Por ejemplo, mostramos coincidencias SIFT-LightGlue
y LoFTR
en pares:
(1) exterior, (2) interior, (3) teledetección satelital, (4) pinturas y (5) un falso positivo.
También puede extraer puntos clave y descriptores asociados.
Si desea realizar la instalación desde el código fuente (lo más fácil de editar es utilizar benchmark.py
, demo.ipynb
),
git clone --recursive https://github.com/gmberton/image-matching-models
cd image-matching-models
pip install .
Algunos modelos ( omniglue
, familia LoFTR) requieren dependencias únicas ( tensorflow
, pytorch-lightning
), que no están incluidas en la lista predeterminada. Para instalarlos, utilice
pip install .[all]
Esto instalará todas las dependencias necesarias para ejecutar todos los modelos.
Puede instalarlo directamente en el directorio de su paquete con
pip install git+https://github.com/gmberton/image-matching-models.git
De manera similar a lo anterior, para obtener todas las dependencias opcionales, use el apéndice [all]
:
pip install " image-matching-models[all] @ git+https://github.com/gmberton/image-matching-models.git "
Puedes usar cualquiera de los emparejadores con
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' )
También puede ejecutar esto como un script independiente, que realizará inferencias en los ejemplos dentro de ./assets
. También puede resolver ( im_size
) y número de puntos clave ( n_kpts
). Esto tomará unos segundos en la CPU de una computadora portátil y producirá las mismas imágenes que ve arriba.
python main_matcher.py --matcher sift-lg --device cpu --out_dir output_sift-lg
donde sift-lg
usará SIFT + LightGlue
.
El script generará una imagen con los puntos clave coincidentes para cada par, en ./output_sift-lg
.
Para usar en tus imágenes tienes tres opciones:
./assets/example_pairs
. Luego use como python main_matcher.py --input path/to/dir
assets/example_pairs_paths.txt
. Luego utilícelo como python main_matcher.py --input path/to/file.txt
Para extraer puntos clave y descripciones (cuando estén disponibles) de una sola imagen, utilice el 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 )
Al igual que con la coincidencia, también puedes ejecutar la extracción desde la línea de comando.
python main_extractor.py --matcher sift-lg --device cpu --out_dir output_sift-lg --n_kpts 2048
Puede elegir cualquiera de los siguientes métodos (entrada en get_matcher()
):
Denso : roma, tiny-roma, dust3r, mast3r
Semidenso : loftr, eloftr, se2loftr, aspanformer, matchformer, xfeat-star
Escaso : [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
Consejo
Puede pasar una lista de comparadores, es decir get_matcher([xfeat, tiny-roma])
para ejecutar ambos comparadores y concatenar sus puntos clave.
Todos los emparejadores pueden ejecutarse en GPU y la mayoría de ellos pueden ejecutarse tanto en GPU como en CPU. Algunos no pueden ejecutarse en la CPU.
Importante
Verifique la LICENCIA de cada modelo/base de código original antes de usarla en su aplicación. Algunas están muy restringidas.
Modelo | Código | Papel | Tiempo de ejecución de GPU (s/img) | Tiempo de ejecución de la 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) | |
Timones (CVPR '24) | Oficial | arxiv | 0.150 | |
Pegamento ligero* (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 partidos (ACCV '22) | Oficial | arxiv | 0,232 | 6.101 |
LoFTR (CVPR '21) | Oficial / Kornia | arxiv | 0,722 | 2.36 |
Parche2Pix (CVPR '21) | Oficial / IMT | arxiv | 0.145 | 4,97 |
Superpegamento (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 | Puerta de investigación | 0,088 | 0,092 |
DoGHardNet (NeurIPS '17) | IMT/Kornia | arxiv | 2,697 (+NN) / 0,526 (+LG) | 2,438(+NN) / 4,528 (+LG) |
Nuestra implementación de Patch2Pix (+ Patch2PixSuperGlue), R2D2 y D2Net se basan en Image Matching Toolbox (IMT). LoFTR y DeDoDe-Lightglue son de Kornia. Otros modelos se basan en los repositorios oficiales anteriores.
El punto de referencia en tiempo de ejecución es el promedio de 5 iteraciones sobre los 5 pares de ejemplos en la carpeta assets/example_pairs
con un tamaño de imagen de 512x512. La evaluación comparativa se realiza utilizando benchmark.py
en una GPU NVIDIA RTX A4000. Resultados redondeados al lugar de las centésimas.
* Los tiempos de ejecución del modelo LightGlue
se enumeran en el orden: SIFT, SuperPoint, Disk, ALIKED
* Los tiempos de ejecución del modelo Keypt2Subpx
se enumeran en el orden: superpoint-lg, aliked-lg, xfeat, dedode
Consulte CONTRIBUTING.md para obtener más detalles.
Nota
Este repositorio tiene una usabilidad optimizada, pero necesariamente para la velocidad. La idea es utilizar este repositorio para encontrar el comparador que mejor se adapte a sus necesidades y luego utilizar el código original para aprovecharlo al máximo.
Un agradecimiento especial a los autores de los respectivos trabajos que se incluyen en este repositorio (consulte sus artículos arriba). Gracias adicionales a @GrumpyZhou por desarrollar y mantener Image Matching Toolbox, que hemos incluido en este repositorio, y a los mantenedores de Kornia.
Este repositorio se creó como parte del documento EarthMatch. ¡Considere citar el trabajo de EarthMatch si este repositorio le resulta útil!
@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},
}