4096 个点,实时匹配:XFeat + LighterGlue 轻量图像匹配 5 分钟跑通
【免费下载链接】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
XFeat 图像匹配(accelerated_features 仓库)是用 CVPR 2024 的特征提取器 XFeat 加上 LighterGlue 匹配器组成的轻量级图像匹配流水线,在笔记本 CPU 上就能实时跑,适合想把 SLAM、AR、三维重建里的配准环节先跑起来再深挖的人。两张照片,要在百毫秒量级找出几千对对应点、又不想部署重型模型,这个仓库就是干这个的。文章顺序:先让它动,再讲分工,最后聊调参。
🎬 先看到它在动:三条命令跑通实时匹配演示
体感最快的方式是仓库自带的摄像头演示。
git clone https://gitcode.com/GitHub_Trending/ac/accelerated_features cd accelerated_features pip install -r requirements.txt # 实时匹配:按 s 设参考帧,q 退出 python realtime_demo.py --method XFeat窗口上下两栏:上面是参考帧与当前帧,下面是对应点连线,旁边标注匹配数量和配准 FPS。把--method换成 ORB 或 SIFT,同一台相机下三种方法直接可比;--max_kpts(默认 3000)控制关键点预算。下面这两张是演示里很典型的一组输入:一张教堂素描特写,一张把装框的同一幅画挂上砖墙后的实拍——视角和尺度差都很大,匹配依然站得住。
提醒一句:演示用的是单应(homography)估计,只对平面场景和纯旋转相机成立,对着墙面平移时连线会乱,这是模型限制,不是 bug。
分工:XFeat 管提取,LighterGlue 管匹配
XFeat 是一个编码器分出三个头:
- 共享编码器:早期下采样到 H/8、全程 64 通道,用宽度换速度;
- 关键点头:把特征图拆成 8×8 小块,用 1×1 卷积直接出关键点热力图;
- 描述符头:上采样融合出 64 维稠密描述符图,再按关键点位置采样;
- 可靠性头:给每个点打分,
top_k按分数取最优。
检测和描述是解耦的,可以只跑其中一半。XFeat*(半稠密模式)在粗匹配之上多了一个亚像素精化模块。匹配端,LighterGlue 是作者为 XFeat 专门训练的 LightGlue 简化版:6 层、1 个注意力头,比原版 LightGlue 快约 3 倍。MegaDepth-1500 上 Fast 配置(最大边 640、1300 点)XFeat+LighterGlue 的 AUC(@5/10/20) 是 0.444/0.610/0.746,对比 SuperPoint+LightGlue 的 0.469/0.633/0.762——精度差一个身位,速度快三倍。
最小可跑 API:从图像到对应点
import torch from modules.xfeat import XFeat xfeat = XFeat() # 自动加载 weights/xfeat.pt,GPU/CPU 自动选 x = torch.randn(1, 3, 480, 640) # (B, C, H, W),灰度或 RGB 都行 out = xfeat.detectAndCompute(x, top_k=4096)[0] print(out['keypoints'].shape) # (N, 2) 像素坐标,已回投到原图 print(out['descriptors'].shape) # (N, 64) L2 归一化 print(out['scores'].shape) # (N,) 可靠性分数匹配一行一个:
# 稀疏:互近邻 + 余弦阈值,batch 为 1 mkpts_0, mkpts_1 = xfeat.match_xfeat(x1, x2) # 两个 (N, 2) 的 np 数组 # 半稠密:批量输入,先粗匹配再亚像素精化 matches = xfeat.match_xfeat_star(x1b, x2b) # 列表,每项 (N, 4) 即 (x1,y1,x2,y2)仓库根目录的 minimal_example.py 把这套接口走了一遍;带匹配和单应估计的完整流程见 notebooks/xfeat_matching.ipynb。
⚡ 提速与取舍:四个旋钮
- 批量:输入第一维就是 batch。README 报告 RTX 4090 上 VGA 稀疏批量推理约 1400 FPS,batch=1 也有 150+ FPS 且 GPU 还剩余量。
- GPU:minimal_example.py 里有
os.environ['CUDA_VISIBLE_DEVICES'] = ''强制 CPU,注释掉它,模型自动走 CUDA。CPU 实时稀疏只到 VGA 才舒服,更高分辨率就上 GPU。 - top_k:默认 4096,演示默认 3000。点多召回高但匹配更慢,点太少纹理少的场景会漏。
- 阈值与分辨率:
detection_threshold默认 0.05,调低多取弱响应点;输入分辨率内部自动对齐到 32 的倍数,不用自己裁,但分辨率上去计算量是平方级涨。
CPU 上的耗时分布见下图:稀疏 XFeat 的检测+描述+匹配合计约 130ms,其中检测本身只有几毫秒,大头花在匹配上;半稠密 XFeat* 多一个精化阶段,总量约 200ms。
数据说话:速度-精度折中
一句话解读:ScanNet VGA 下,XFeat 帧率比 SuperPoint、DISK 高数倍,姿态精度也明显更高;ORB 最快,但精度掉得厉害。XFeat 与 XFeat* 都待在第一象限,两者的取舍随数据集变化。大视角、大光照变化下的最终匹配效果如下:
🤔 先被问烂的三个问题
权重在哪?weights/xfeat.pt(提取器)和weights/xfeat-lighterglue.pt(匹配器)。XFeat()默认自动加载前者;调用 LighterGlue 时若缺后者会自动下载,见 modules/lighterglue.py。仓库里 hubconf.py 另提供 torch.hub 入口。
图像怎么喂?标准输入是(B, C, H, W)的 float 张量,灰度或 RGB 均可;传 numpy 的(H, W, C)会被parse_input自动转换并除以 255。分辨率不用预先对齐,内部会对齐到 32 的倍数,坐标回投回原图。
怎么集成到自己项目?在仓库里from modules.xfeat import XFeat直接用;XFeat+LighterGlue 的组合用法以 notebooks/xfeat+lg_torch_hub.ipynb 为最完整的参考。
接下来往哪走
XFeat 管"提得快而稳",LighterGlue 管"配得准而快",两者串起来在 CPU 上已经是实时。下一步自然是接进姿态估计或 SLAM 后端,拿它做视觉定位与多视图三维重建;要做端侧部署,也可以顺着 README 的 TODO 把提取器导出成 ONNX/TensorRT。
【免费下载链接】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),仅供参考