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
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
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) | เป็นทางการ | อาร์ซิฟ | 0.055 /0.164 / 0.033 / 0.291 | - |
MASt3R (ArXiv '24) | เป็นทางการ | อาร์ซิฟ | 0.699 | - |
มีประสิทธิภาพ-LoFTR (CVPR '24) | เป็นทางการ | 0.1026 | 2.117 | |
OmniGlue (CVPR '24) | เป็นทางการ | อาร์ซิฟ | 6.351 | |
xFeat (CVPR '24) | เป็นทางการ | อาร์ซิฟ | 0.027 | 0.048 |
GIM (ICLR '24) | เป็นทางการ | อาร์ซิฟ | 0.077 (+แอลจี) / 1.627 (+DKMv3) | 5.321 (+แอลจี) / 20.301 (+DKMv3) |
RoMa / Tiny-RoMa (CVPR '24) | เป็นทางการ | อาร์ซิฟ | 0.453 / 0.0456 | 18.950 |
ฝุ่น3R (CVPR '24) | เป็นทางการ | อาร์ซิฟ | 3.639 | 26.813 |
ดีโดดี (3DV '24) | เป็นทางการ | อาร์ซิฟ | 0.311 (+MNN)/ 0.218 (+LG) | |
พวงมาลัย (CVPR '24) | เป็นทางการ | อาร์ซิฟ | 0.150 | |
กาวเบา* (ICCV '23) | เป็นทางการ | อาร์ซิฟ | 0.417 / 0.093 / 0.184 / 0.128 | 2.828 / 8.852 / 8.100 / 8.128 |
SE2-LoFTR (CVPRW '22) | เป็นทางการ | อาร์ซิฟ | 0.133 | 2.378 |
แอสแปนฟอร์เมอร์ (ECCV '22) | เป็นทางการ | อาร์ซิฟ | 0.384 | 11.73 |
ผู้จับคู่ (ACCV '22) | เป็นทางการ | อาร์ซิฟ | 0.232 | 6.101 |
LoFTR (CVPR '21) | เป็นทางการ / คอร์เนีย | อาร์ซิฟ | 0.722 | 2.36 |
Patch2Pix (CVPR '21) | เป็นทางการ / ไอเอ็มที | อาร์ซิฟ | 0.145 | 4.97 |
ซุปเปอร์กาว (CVPR '20) | เป็นทางการ / ไอเอ็มที | อาร์ซิฟ | 0.0894 | 2.178 |
R2D2 (NeurIPS '19) | เป็นทางการ / ไอเอ็มที | อาร์ซิฟ | 0.429 | 6.79 |
ดีทูเน็ต (CVPR '19) | เป็นทางการ / ไอเอ็มที | อาร์ซิฟ | 0.600 | 1.324 |
ร่อน-NN (IJCV '04) | OpenCV | 0.124 | 0.117 | |
ORB-NN (ICCV '11) | OpenCV | รีเสิร์ชเกท | 0.088 | 0.092 |
DoGHardNet (NeurIPS '17) | ไอเอ็มที/คอร์เนีย | อาร์ซิฟ | 2.697 (+NN) / 0.526 (+LG) | 2.438(+NN) / 4.528 (+แอลจี) |
การใช้งาน Patch2Pix (+ Patch2PixSuperGlue), R2D2 และ D2Net ของเรานั้นใช้ Image Matching Toolbox (IMT) LoFTR และ DeDoDe-Lightglue มาจาก Kornia รุ่นอื่นๆ อิงตาม repos อย่างเป็นทางการข้างต้น
การวัดประสิทธิภาพรันไทม์คือค่าเฉลี่ยของการวนซ้ำ 5 ครั้งในตัวอย่าง 5 คู่ในโฟลเดอร์ assets/example_pairs
ที่ขนาดรูปภาพ 512x512 การวัดประสิทธิภาพทำได้โดยใช้ benchmark.py
บน NVIDIA RTX A4000 GPU ผลลัพธ์ปัดเศษขึ้นเป็นอันดับที่ร้อย
* รันไทม์ของโมเดล LightGlue
จะแสดงตามลำดับ: SIFT, SuperPoint, Disk, ALIKED
* รันไทม์ของโมเดล Keypt2Subpx
แสดงรายการตามลำดับ: superpoint-lg, aliked-lg, xfeat, dedode
ดู CONTRIBUTING.md สำหรับรายละเอียด
บันทึก
repo นี้ได้รับการปรับปรุงการใช้งาน แต่จำเป็นสำหรับความเร็ว แนวคิดก็คือการใช้ repo นี้เพื่อค้นหาตัวจับคู่ที่ตรงกับความต้องการของคุณมากที่สุด จากนั้นใช้โค้ดต้นฉบับเพื่อให้ได้ประโยชน์สูงสุด
ขอขอบคุณเป็นพิเศษสำหรับผู้เขียนผลงานที่เกี่ยวข้องซึ่งรวมอยู่ใน repo นี้ (ดูเอกสารของพวกเขาด้านบน) ขอขอบคุณ @GrumpyZhou เพิ่มเติมสำหรับการพัฒนาและดูแลรักษา Image Matching Toolbox ซึ่งเราได้รวมไว้ใน repo นี้และผู้ดูแล Kornia
repo นี้ถูกสร้างขึ้นโดยเป็นส่วนหนึ่งของรายงาน EarthMatch โปรดพิจารณาอ้างอิงงานของ EarthMatch หาก repo นี้เป็นประโยชน์กับคุณ!
@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},
}