3分钟跑通 XFeat 轻量级图像匹配: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
XFeat 是 CVPR 2024 论文提出的轻量级局部特征提取与匹配方案:一个紧凑的 CNN 同时输出关键点、64 维描述符和可靠性分数,搭配更小的匹配器 LighterGlue,整套流水线在普通笔记本 CPU 上就能实时跑动。
什么时候你会需要它
- 做 AR 或视觉定位,但设备很有限:手机、Jetson、树莓派这类算力紧张的环境,跑不动重型深度特征网络,而传统 SIFT/ORB 又扛不住视角和光照变化。
- 需要同时支持稀疏与半稠密匹配:视觉导航偏爱稀疏点快,姿态估计又希望点多一些——XFeat 用一个模型覆盖两种模式,不用维护两套代码。
克隆仓库并安装依赖
依赖只有torch加几个轻量库(kornia、opencv等),装完即可用:
# 克隆仓库并进入目录 git clone https://gitcode.com/GitHub_Trending/ac/accelerated_features cd accelerated_features # 安装 requirements.txt 里的全部依赖 pip install -r requirements.txt仓库根目录已经自带预训练权重(weights/xfeat.pt),不需要额外下载。
三行代码完成一次特征提取
最小可运行脚本只有下面几行,输入是一个(B, 3, H, W)的张量:
import torch from modules.xfeat import XFeat # 实例化模型(自动加载 weights/xfeat.pt 预训练权重) xfeat = XFeat() # 随机生成一张 480x640 的 RGB 图像作为输入 x = torch.randn(1, 3, 480, 640) # 提取前 top_k=4096 个最可靠的特征点 out = xfeat.detectAndCompute(x, top_k=4096)[0] print(out['keypoints'].shape) # 关键点坐标 (N, 2) print(out['descriptors'].shape) # 描述符 (N, 64) print(out['scores'].shape) # 可靠性分数 (N,)也可以直接运行仓库现成的 minimal_example.py,它会额外演示批量推理和两种匹配模式:
python3 minimal_example.py输出里的三个 shape 各是什么
keypoints (N, 2):图像中坐标系的像素坐标(x, y),数量 N 不超过top_k,且按可靠性从高到低排列。descriptors (N, 64):每个点 64 维的 L2 归一化描述符,用于后续匹配;比 SuperPoint 的 256 维短得多,这是它省内存的关键。scores (N,):关键点和可靠性热图分数相乘得到的置信度,分数越低说明模型对该点越没把握,可按需截断。
核心机制:一个网络,三条输出头
XFeat 的编码器先做早期下采样、保持低通道数换高速率,然后在浅层分支上输出三样东西:关键点热图K、稠密描述符图F(64 维)、可靠性热图R。关键点检测被拆成独立分支,用1x1卷积处理8x8分块后的图像,所以检测和描述可以各自独立加速。
要点速览:
- 三条输出头一次前向全部得到,推理时只需一次网络调用。
- 关键点经 NMS 去重后,按分数取 top-k,描述符再从稠密图上双线性插值采样。
match_xfeat是"检测 + 最近邻互验(MNN)"的稀疏匹配,一行调用。match_xfeat_star是半稠密匹配:粗匹配后用一个小型子像素修正模块(fine matcher)把匹配点精修到亚像素级。match_lighterglue调用参数更少的 LighterGlue 做图匹配,精度更接近重型匹配器。
CPU 上各步骤的耗时拆分如下,检测和修正模块的开销都很小:
实战一:稀疏匹配 + 单应性可视化
仓库的assets/目录放了一对示例图,可以直接复现 notebooks/xfeat_matching.ipynb 的完整流程。核心代码:
import cv2 from modules.xfeat import XFeat xfeat = XFeat() # 读取仓库自带的一对示例图像 (H, W, 3) im1 = cv2.imread('assets/ref.png') im2 = cv2.imread('assets/tgt.png') # 稀疏匹配:检测 + MNN 互验一步完成 mkpts_0, mkpts_1 = xfeat.match_xfeat(im1, im2, top_k=4096) print(len(mkpts_0)) # 互验通过的匹配点对数拿到mkpts_0、mkpts_1后,用cv2.findHomography估计单应矩阵、cv2.drawMatches画匹配线即可,参考图对如下:
实战二:换半稠密匹配,匹配点数量翻几倍
如果下游是姿态估计而不是简单的平面配准,把换行里的match_xfeat换成match_xfeat_star就行,它支持批量输入,匹配点会明显变密、且经过亚像素精修:
# 半稠密匹配:coarse-to-fine 两阶段 mkpts_0, mkpts_1 = xfeat.match_xfeat_star(im1, im2, top_k=8000) print(len(mkpts_0)) # 通常比稀疏模式多出几倍匹配点效果对比可以在 notebooks/xfeat_matching.ipynb 里直接看:同一对图上,稀疏模式给出干净的粗配准,半稠密模式则覆盖更均匀。下面是 XFeat 在不同场景下的匹配效果:
想要"摄像头实时看效果"的话,运行 realtime_demo.py:
# 按 s 键指定参考帧,按 q 键退出 python3 realtime_demo.py --method XFeat调参与避坑
top_k按下游需求调:姿态估计、配准类任务建议 2048~4096;纯平面单应 512~1024 就够,点数越多耗时线性增加。detection_threshold控制检出密度:默认 0.05。纹理少的场景(纯白墙、天空)可调低到 0.02 补点,纹理爆炸的场景调到 0.1 去噪。- LighterGlue 匹配记得传
image_size:match_lighterglue要求输入 dict 里带(W, H)字段,漏掉会报尺寸相关的错误;它依赖kornia,缺失时先pip install kornia。 - 没有 GPU 就照跑:
XFeat内部自动选择cuda/cpu;minimal_example.py 里os.environ['CUDA_VISIBLE_DEVICES'] = ''那行是强制 CPU 用的压测代码,GPU 环境可忽略。 - 实时演示的约束:单应模型只适用于平面场景和纯旋转运动,
--max_kpts默认 3000,卡帧时先调小它。
从哪些文件继续往下读
- notebooks/minimal_example.ipynb:最小推理示例
- notebooks/xfeat_matching.ipynb:稀疏 + 半稠密匹配与单应性绘图
- notebooks/xfeat+lg_torch_hub.ipynb:XFeat + LighterGlue 组合用法
- notebooks/XFeat_training_example.ipynb:合成数据训练流程
- modules/eval/:MegaDepth-1500、ScanNet-1500 评测脚本
- weights/:
xfeat.pt与xfeat-lighterglue.pt预训练权重
小结
三条输出头 + top-k 截断的设计,让 XFeat 用最少的算力换到了接近重型方案的匹配质量,CPU 实时只是它的起点而不是终点。把match_xfeat那两行代码贴进你自己的项目,今天就先把第一对匹配图画出来吧;遇到具体问题可以去仓库 issue 区看看,或先翻一遍上面的 notebook。
【免费下载链接】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),仅供参考