1. 从零开始:为什么选择C++部署XFeat?
如果你正在做图像匹配、视觉定位或者三维重建,那你肯定对特征点提取和匹配不陌生。传统的SIFT、ORB虽然经典,但在复杂光照、视角变化大的场景下,匹配效果和速度常常不尽如人意。最近几年,基于深度学习的特征点模型,比如SuperPoint、LoFTR,还有我们今天要聊的XFeat,开始崭露头角。它们能从图像里提取出更鲁棒、更独特的特征,匹配精度和召回率都上了一个台阶。
但是,模型训练好了,怎么用起来呢?很多朋友习惯在Python里用PyTorch或者TensorFlow跑推理,方便是方便,但真到了要集成到移动端、嵌入式设备或者对延迟要求极高的工业应用里,Python那点性能就有点捉襟见肘了。这时候,C++的优势就体现出来了:运行效率高、内存可控、部署灵活,能真正把模型的潜力榨干。
XFeat这个模型,我之前在项目里用过,它的特点是“又快又好”——既能提取高维度的特征描述子,又有一个轻量级的匹配头(matching head)来做快速的特征匹配。官方提供了PyTorch的代码和预训练模型,但我们要把它搬到C++环境里。怎么搬?我的经验是,ONNX Runtime + OpenCV 这个组合拳是当前最稳妥、最高效的方案。ONNX Runtime负责高性能的模型推理,OpenCV负责图像的前后处理和数据搬运,两者结合,就能在C++里搭建一个既专业又实用的图像匹配流水线。
这篇文章,我就手把手带你走一遍完整的流程。从环境搭建、模型转换,到用C++写一个完整的推理类,最后把匹配结果可视化出来。我会把每一步的坑和技巧都讲清楚,你跟着做,保证能跑通。咱们不搞那些虚头巴脑的理论,直接上代码,看效果。
2. 环境搭建:准备好你的“工具箱”
工欲善其事,必先利其器。在开始写代码之前,我们得先把依赖的环境装好。主要就是两样东西:ONNX Runtime 和 OpenCV。我的建议是,尽量从源码编译,这样你能获得最好的兼容性和性能,尤其是如果你想用GPU加速的话。
2.1 安装与配置ONNX Runtime
ONNX Runtime是微软开源的推理引擎,对ONNX模型格式支持得最好,而且跨平台,CPU、GPU(CUDA)都能跑。我们这里以Linux系统为例,Windows和macOS的思路也差不多。
首先,去ONNX Runtime的GitHub Release页面下载预编译包。为了用上GPU加速,我们选择带CUDA支持的版本。比如,我常用的是 onnxruntime-linux-x64-gpu-1.10.0.tgz。你下载后解压到一个你喜欢的目录,比如 /home/yourname/libs/onnxruntime。
# 假设你下载的压缩包在Downloads文件夹
tar -xzf onnxruntime-linux-x64-gpu-1.10.0.tgz -C ~/libs/
cd ~/libs/
mv onnxruntime-linux-x64-gpu-1.10.0 onnxruntime
解压后,目录里会有 include、lib 等文件夹。include 里是C++的头文件,lib 里是编译好的动态库(比如 libonnxruntime.so.1.10.0)。记住这个路径,等下写CMakeLists.txt的时候要用。
这里有个小坑要注意:一定要确认你的CUDA版本和ONNX Runtime预编译包所依赖的CUDA版本匹配。比如1.10.0的GPU包通常要求CUDA 11.x。如果不匹配,运行时可能会报找不到库的错误。你可以用 nvcc --version 查看自己的CUDA版本。
2.2 编译安装OpenCV
OpenCV我们选择从源码编译安装。为什么不用系统包管理器安装的版本?因为包管理器里的版本可能比较老,或者没有包含我们需要的某些模块(比如nonfree模块,虽然我们这里用不到)。从源码编译可以自己控制编译选项,比如开启CUDA支持、设定安装路径等。
去OpenCV官网下载源码,我写这篇文章时稳定版是4.5.2。下载后解压。
unzip opencv-4.5.2.zip
cd opencv-4.5.2
mkdir build && cd build
接下来是关键的一步:配置CMake。我常用的配置命令如下,它指定了安装目录,并确保编译Release版本。
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_CUDA=OFF \ # 如果你的项目不需要OpenCV的CUDA模块,可以关掉,编译更快
-D BUILD_EXAMPLES=OFF \
-D BUILD_opencv_python3=OFF \
..
这里 CMAKE_INSTALL_PREFIX=/usr/local 表示安装到系统目录,这样其他程序都能找到。如果你没有sudo权限,可以安装到用户目录,比如 ~/local。
配置完成后,就可以编译和安装了。这个过程比较耗时,取决于你的电脑性能。
make -j8 # 使用8个线程并行编译,数字根据你的CPU核心数调整
sudo make install # 如果安装到系统目录需要sudo
安装完成后,可以运行 pkg-config --modversion opencv4 来验证是否安装成功。同时,记住你的 build 目录的完整路径,比如 /home/yourname/opencv-4.5.2/build,后面写CMakeLists时,OpenCV_DIR 变量就要指向这个路径。
3. 获取模型与理解代码结构
环境准备好了,接下来需要模型文件。XFeat模型通常包含两个部分:一个用于特征提取的骨干网络(xfeat),和一个用于特征匹配的轻量级网络(matching)。我们需要它们的ONNX格式文件。
你可以从原论文作者的仓库或者一些开源社区找到转换好的ONNX模型。我用的两个模型文件是 xfeat_dualscale.onnx 和 matching.onnx。把它们下载下来,放到你的项目目录里,比如和你的C++源代码放在一起。
现在,我们来看看整个C++项目需要做什么。核心逻辑其实就三步:
- 加载模型:用ONNX Runtime加载两个ONNX模型,创建推理会话(Session)。
- 特征提取:用OpenCV读入图片,进行预处理(尺寸调整、归一化、BGR转RGB、HWC转CHW等),然后送入
xfeat模型,得到特征点坐标、描述子和置信度分数。 - 特征匹配:将两幅图提取出的特征点、描述子等信息,送入
matching模型,得到最终的匹配点对。
原始文章给了一个完整的 demo.cpp 代码,但其中有些细节可以优化,比如错误处理、内存管理,以及预处理部分其实可以用OpenCV的函数更高效地完成。接下来,我就结合我踩过的坑,带你一步步拆解和实现这个流程。
4. 核心代码拆解:一步步构建XFeat类
一个好的C++项目,结构要清晰。我们把所有与XFeat模型推理相


223

被折叠的 条评论
为什么被折叠?



