LightGlue ONNX C++推理

引:《三维重建项目V2》 需要使用更精确的特征匹配方法,目前尝试不同的策略加上特征匹配方法都无法实现目标效果,遂尝试深度学习方法。

0 目前方法

当前使用depth image 作mask后对每张图使用传统方法作特征匹配不佳。
Fig 1. DepthImage二值化结果
Fig 2. Depth Mask后Akaze特征匹配效果
Fig 3. 特征匹配前使用自动阈值作二值化

1 何为(Onnx + Runtime)

Onnx是"模型的中间表示格式",Runtime是"跑ONNX的标准引擎"。

用runtime跑onnx模型实现C++推理:模型(python 训练测试得到权重文件)与代码(C++)解耦。

它做了三件事:

  • PyTorch / TF / JAX 的模型

  • 导出成 统一的计算图(.onnx)

  • 与训练框架 完全解耦

可以理解为:ONNX = "深度学习领域的 STL / IR"

使用onnx模型和runtime实现c++模型的推理,让模型"框架无关、部署简单、推理更快、端侧更稳",特别适合 C++ 推理和工程落地。

方案 适合阶段 优点 致命点
PyTorch 研究 / 验证 写得快 端侧难部署
TorchScript 半工程 比 Python 好 依然重
ONNX + ORT 产品 / 端侧 稳、快、轻 导出要规范
TensorRT 极致性能 超快 强耦合 NVIDIA
[Table 1. 各推理方法对比(GPT整理得到)]

2 跑通LightGlueONNX in onnxruntime c++

三维深度学习模型VGGT 中使用lightglue作为特征匹配模块的模型,借鉴它将模型搬到我的项目上,第一步是跨过python->C++的槛。使用ONNX打破壁垒。下面将.onnx解释为"模型"、将runtime解释为"库"

2.1 下载模型和库

https://github.com/OroChippw/LightGlue-OnnxRunner/tree/master -- 源代码及模型链接

https://github.com/microsoft/onnxruntime -- 库链接

下载后解压进入onnx模型文件夹打开CMakeLists.txt,修改对应的库路径-->包含头文件-->链接lib。
Fig 4. CMakeLists.txt相关修改

2.2 Cmake构建配置

2.3 代码中本地路径修改

修改onnx路径(注意模型需要匹配正确,否则后续报错MultiHead...)和图像路径。
Fig 5. 源代码中修改文件路径

2.3 VS(MSVC) build (release)生成exe并添加dll到同文件夹下。完成。

3 报错解决

3.1 加载模型乱码

报错显示的是文件加载路径有问题,检查过确定没有中文和斜杠问题,最后将原utils.h下的宽字节转换函数替换后为下面版本解决报错,本质是取消源代码提供的宽字节转换。

cpp 复制代码
inline wchar_t* multi_Byte_To_Wide_Char(std::string& pKey)
{
    const char* pCStrKey = pKey.c_str();
    size_t pSize = MultiByteToWideChar(CP_UTF8, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0);
    wchar_t* pWCStrKey = new wchar_t[pSize];
    MultiByteToWideChar(CP_UTF8, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize);

    std::cout << "encode finished!" << std::endl;
    return pWCStrKey;
}

3.2 ONNXRuntime environment creted failed: Could not find an implemnetation for MultiHeadAttention(1) node with name ""

原因是错用了onnx模型,需要查阅git确认对应的模型

3.3 kpts vector为空(见鬼!!!)

viz2d.h/plotMatches函数内一直获取不到kpts0的值。在上层打印数据类型显示为cv::Point<float>同时size != 0。后续在上层打印也打印不出,直到使用cv::Point变量接受kpts[i]中的值才解决
Fig 6. 获取不到kpts0的值
Fig 7. 使用变量接受后解决报错

解决以上问题后顺利跑通,但是还有几个问题待解决:LightGlue pytorch源代码学习、onnx模型导出与导入。项目后续:结合mask作特征点标定...

特征匹配模块 使用onnx相对于不使用深度学习方法的效果大大提升。
Fig 8. LightGlue ONNX C++推理结果

相关推荐
每天吃饭的羊21 小时前
UMD和IIfe
开发语言·前端·javascript
gCode Teacher 格码致知21 小时前
Javascript提高:自定义的占位符替换-由Deepseek产生
开发语言·javascript·ecmascript
王老师青少年编程21 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【跳跃与过河问题】:过河问题
c++·算法·贪心·csp·信奥赛·跳跃与过河问题·过河问题
是个西兰花21 小时前
C++11:智能指针
开发语言·c++·智能指针·rall
摇滚侠21 小时前
Java 零基础全套视频教程,面向对象(高级),笔记 105-120
java·开发语言·笔记
CN-Dust1 天前
【C++专题】输出cout例题
开发语言·c++
时空系1 天前
第6篇:多维数据盒——管理大量数据 python中文编程
开发语言·python·ai编程
charlie1145141911 天前
嵌入式Linux驱动开发(7) 从虚拟设备到真实硬件 —— LED驱动硬件基础
linux·开发语言·驱动开发·内核·c
小短腿的代码世界1 天前
QCefView深度解析:Qt应用中嵌入Chromium浏览器的终极方案
开发语言·qt
沉默-_-1 天前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法