XFeat+LighterGlue 图像匹配实战:3分钟在 CPU 上跑通轻量级实时特征匹配
【免费下载链接】accelerated_featuresImplementation of XFeat (CVPR 2024). Do you need robust and fast local feature extraction? You are in the right place!项目地址: https://gitcode.com/GitHub_Trending/ac/accelerated_features
如果你也在为特征匹配发愁:SIFT/ORB 扛不住视角和光照变化,SuperPoint 这类深度学习方法在 CPU 上又慢得难以落地——XFeat 大概率就是你要的答案。它是 CVPR 2024 论文XFeat: Accelerated Features for Lightweight Image Matching的官方实现(仓库名accelerated_features):一个"加速型"学习式局部特征提取器,在 VGA 分辨率图像上能直接在 CPU 实时推理,再搭配更小的 LighterGlue 匹配器,几行代码就能搭起完整的图像匹配流水线。读完本文,你 3 分钟内会拿到第一组匹配结果,还能在自己的摄像头上跑起实时匹配演示。
3 分钟跑起来:克隆、装依赖、看到结果 🚀
最短路径只有 4 步,依赖核心只有 torch:
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ac/accelerated_features cd accelerated_features- 安装依赖(想跑实时 demo 才需要 OpenCV):
pip install torch opencv-contrib-python tqdm- 直接运行官方最小示例,终端会打印关键点、描述符和分数的 shape,并自动做压力测试:
python3 minimal_example.py- 在自己的代码里调用也只要三行:
import torch from modules.xfeat import XFeat xfeat = XFeat() # 自动加载 weights/xfeat.pt out = xfeat.detectAndCompute(torch.randn(1, 3, 480, 640), top_k=4096)[0]返回的 dict 里有三个东西:keypoints(N,2 坐标)、descriptors(N,64 已 L2 归一化)、scores(N, 可靠性分数)。
原理速览:XFeat 底层在跑什么
不用看源码也能理解它的思路,记住三点即可:
- 一个网络,三份输出:输入图像 → 先 8 倍降采样 + 浅层卷积保速度 → 输出关键点热力图、64 维稠密描述符图、可靠性热力图;再用 NMS 选出关键点位置,最后在关键点处"采样"出描述符。
- 检测与描述解耦:两个分支可以独立运行,所以既能做快的稀疏匹配,也能做稠密提取的半稠密匹配,两种模式按需切换。
- 匹配有三档:稀疏模式用 MNN(互近邻)硬匹配,最快;
match_xfeat_star是粗匹配 + 亚像素精化;LighterGlue 是轻量注意力匹配器,比原版 LightGlue 快约 3 倍。
场景实战:从单张图到实时匹配的 3 个任务
任务 1:给一张图提特征
灰度图或 RGB 都行,输入形状是 (B, C, H, W):
img = torch.randn(1, 3, 480, 640) out = xfeat.detectAndCompute(img, top_k=1000)[0] print(out['keypoints'].shape) # torch.Size([N, 2]) print(out['descriptors'].shape) # torch.Size([N, 64])top_k控制保留多少个最强关键点,默认 4096。
任务 2:匹配两张图,3 种模式任选
稀疏模式(MNN 匹配,最快,适合大多数场景):
img1 = torch.randn(1, 3, 480, 640) img2 = torch.randn(1, 3, 480, 640) mkpts_0, mkpts_1 = xfeat.match_xfeat(img1, img2)半稠密模式(支持批量,返回 (x1,y1,x2,y2) 四元组):
im1 = torch.randn(4, 3, 480, 640) im2 = torch.randn(4, 3, 480, 640) matches = xfeat.match_xfeat_star(im1, im2)LighterGlue 模式(注意力匹配,更稳,需要pip install kornia):
d0 = xfeat.detectAndCompute(img1, top_k=4096)[0] d1 = xfeat.detectAndCompute(img2, top_k=4096)[0] d0.update({'image_size': (img1.shape[3], img1.shape[2])}) # 注意是 (W, H) d1.update({'image_size': (img2.shape[3], img2.shape[2])}) mkpts_0, mkpts_1, _ = xfeat.match_lighterglue(d0, d1)LighterGlue 靠的是全局注意力而不是硬比对,跨视角、跨光照下召回更多正确匹配,官方在 MegaDepth-1500 上验证过这套组合与 SuperPoint+LightGlue 精度非常接近。
任务 3:跑一个实时匹配演示
python3 realtime_demo.py --method XFeat # 也可换成 SIFT / ORB 对比按s设置参考帧,q退出,窗口里会实时画出匹配线并显示 FPS,同时做单应注册。
性能与取舍:多快、多准、用在哪 📈
- 速度:普通 i5 笔记本 CPU 上,VGA(640×480)稀疏推理即可实时;GPU 单图 150+ FPS,RTX 4090 上批量推理可达约 1400 FPS。
- 精度:MegaDepth-1500 位姿误差 AUC@5/10/20,XFeat+LighterGlue(fast 档,640 分辨率)为 0.444 / 0.610 / 0.746,对比 SuperPoint+LightGlue 官方版 0.469 / 0.633 / 0.762,差距很小而速度快得多。
- 适合:移动机器人、AR、嵌入式设备(jetson、树莓派)、CPU-only 的匹配流水线、需要批量推理的场景。
- 不适合:超高分辨率单张处理(请上 GPU);实时 demo 基于单应模型,只对平面场景和纯旋转运动有效,别拿它测复杂三维场景。
常见报错与解法 + 下一步 ⚠️
四个新手最常踩的坑,现象 → 原因 → 一句话解法:
RuntimeError: Input tensor needs to be in (B,C,H,W) format:detectAndCompute只收 (B,C,H,W) 张量,你传了 (H,W,C) 的 numpy 图 → 用torch.tensor(img).permute(2,0,1)[None]包一层,或直接调match_xfeat(它内置转换)。- LighterGlue 报 kornia 缺失:LighterGlue 基于 kornia 实现 →
pip install kornia;同时记得给特征 dict 补image_size字段(W, H 顺序)。 - 实时 demo 匹配乱跳、稳不住:demo 用单应矩阵,只对平面场景成立 → 用海报、书本封面这类平面物体测试。
- CPU 上高分辨率太慢:示例代码默认强制 CPU(
os.environ['CUDA_VISIBLE_DEVICES'] = '')→ 注释掉该行启用 GPU,或调低top_k与输入分辨率。
下一步可以去哪:
- 官方示例笔记本都在 notebooks/ 目录:
xfeat_matching.ipynb(匹配与注册)、xfeat+lg_torch_hub.ipynb(XFeat+LighterGlue) - 提取/匹配/训练源码在 modules/ 目录,预训练权重在
weights/ - 想复现论文训练流程,看 minimal_example.py 和
modules/training/下的脚本
跑通之后,把top_k、min_cossim、detection_threshold这几个旋钮按自己的场景调一调,基本就能直接上线了。
【免费下载链接】accelerated_featuresImplementation of XFeat (CVPR 2024). Do you need robust and fast local feature extraction? You are in the right place!项目地址: https://gitcode.com/GitHub_Trending/ac/accelerated_features
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考