技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

GitHub 仓库深度分析:AIDajiangtang/Superpoint-LightGlue-Image-Stiching

项目背景与痛点

在计算机视觉领域,图像拼接是将多张图片合成一张全景图像或提升图像质量的重要步骤。传统的基于特征点的拼接方法存在性能瓶颈,尤其是在实时性和覆盖大型场景时。而深度学习模型则在特征点检测和匹配方面展现出巨大的潜力。但是,如何集成前沿的深度学习特征点检测与匹配模型到图像拼接的流程中,提升拼接质量和效率,一直是业界关注的重点。AIDajiangtang/Superpoint-LightGlue-Image-Stiching 项目正是为了应对这一核心问题而打造,它无缝集成了 SuperPoint 和 LightGlue 模型,以期在图像拼接中提供更为准确和高效的解决方案。

核心技术揭秘

该项目的核心技术主要体现在如何高效整合 SuperPoint 和 LightGlue 到 OpenCV 图像拼接流程中。从设计思想来看,数据流是整个系统的核心。我们从输入图像的接收,到特征点的提取,再到匹配所采用的深度学习架构,整体技术栈设计集中在以下几个核心模块:

  1. 图像输入与预处理
  2. 特征点检测,SuperPoint 模型
  3. 特征点匹配,LightGlue 模型
  4. 图像拼接,OpenCV

为此,我们可以深入剖析一下它的内部工作流:

graph TD A[输入图像] --> B("预处理") B --> C[SuperPoint特征点检测] C --> D("特征点坐标提取") D --> E("LightGlue特征点匹配") E --> F{"匹配成功?"} F -->|"是"| G[OpenCV图像拼接] F -->|"否"| H[错误处理,异常终止] G --> I[输出全景图]

从上述架构图中可以看出,该项目具有非常清晰的模块化设计思想。关键反例在这个架构图中都得到了妥善的避免,例如直接罗列节点而无箭头连结、节点标签使用单引号导致解析错误等行为。

功能亮点与差异

在与其他开源图像拼接工具相比,该项目独特的亮点在于深度学习特征点模型的集成。SuperPoint 提供了更为鲁棒的特征提取能力,而 LightGlue 则在匹配速度和准确性上均有提升。在这方面,其独特设计体现在算法的结合点和优化处理,确保在速度与准确性之间取得平衡。

应用场景与落地建议

在生产环境中使用该项目时的注意事项主要包括性能与资源消耗的合理分配。数据量大时,内存和计算资源的分配需谨慎考虑。考虑到图像拼接涉及复杂的计算过程,运行时可能需要较高的计算资源。该项目特别适合需要高质量全景图生成的应用场景,如实时监控系统中的全景拼接,或者需要大量图像数据快速处理的卫星图处理等。

综合评价

优点:

  • 集成了 SuperPoint 和 LightGlue 两大先进特征点模型,实现在实时性与准确性的良好平衡。
  • 项目设计模块化,代码可读性高,便于扩展与维护。
  • 适用于大数据量的图像拼接任务,提供了高效的解决方案。

缺点:

  • 深度学习模型的引入增加了对计算资源的需求。
  • 配置和调优过程对用户要求较高,需要一定的计算机视觉与深度学习基础知识。

综上所述,AIDajiangtang/Superpoint-LightGlue-Image-Stiching 项目在解决图像拼接领域的瓶颈问题上展现了出色的性能与设计,值得社区成员深入探索与实践。

简要分析

热度分
266
价值分
132
活跃状态
活跃

语言占比

C
C#
C++
CMake

Release

贡献者

README

简体中文 | English

DeepLearning-based-Feature-extraction-and-matching

将深度学习预训练模型 SuperPoint 和 LightGlue 集成到OpenCV拼接算法中。

OpenCV拼接流水线

图像特征提取与匹配是许多高级计算机视觉任务的基础,例如图像配准,图像拼接,相机矫正,SLAM,深度估计等等。 今天我们就以图像拼接为切入点,来看一下特征提取与匹配的重要性。

OpenCV中提供了封装程度非常高的Stitcher类,通过下面几行代码就能实现图像拼接。
Mat pano;
Ptr stitcher = Stitcher::create(mode);
Stitcher::Status status = stitcher->stitch(imgs, pano);

但图像拼接整个过程非常复杂。
用文字总结一下拼接算法的主要流程:
特征提取->特征匹配->评估相机参数->生成融合图像

其中特征提取最为重要,特征点和特征描述符的质量好坏决定了最终的拼接效果。

目前OpenCV中提供了SIFT,SURF,ORB等特征提取器。
目前OpenCV中提供了Brute-Force,FLANN,KNN等特征匹配器。

然后,通过下面代码将选择的特征提取和匹配算法设置到拼接流水线中。

if (feature_type == FeatureType::SURF)
stitcher->setFeaturesFinder(xfeatures2d::SURF::create());
else if (feature_type == FeatureType::SIFT)
stitcher->setFeaturesFinder(SIFT::create());
else
stitcher->setFeaturesFinder(ORB::create());

stitcher->setFeaturesMatcher(makePtrdetail::BestOf2NearestMatcher( false));
stitcher->setFeaturesMatcher(makePtrdetail::BestOf2NearestRangeMatcher( false));
stitcher->setFeaturesMatcher(makePtrdetail::AffineBestOf2NearestMatcher(true, false));

这要感谢C++面向对象编程的思想,通过继承与多态来实现不同特征提取和匹配算法的扩展。

深度学习特征检测匹配算法

说到这里该我们的主角出场了,我们要为OpenCV追加一种深度学习特征提取算法:SuperPoint,以及深度学习特征匹配算法:LightGlue。
SuperPoint:​
[Paper] [源码]

​ LightGlue:
[Paper] [源码]

根据OpenCV中类继承体系,特征提取类的基类为Feature2D,特征匹配的基类为FeaturesMatcher,我们以此为基类新增两个类:SuperPoint和LightGlue,并重新实现基类的虚方法。
superpoint
lightglue

如何编译

目前仅在Windows 11,Visualstudio2019,Cmake3.26.4中测试成功
1.微信公众号回复【sl】获取预训练模型 ,模型路径通过参数传递给程序
微信公众号:人工智能大讲堂

后台回复【sl】获取上面的预训练模型和第三方依赖库。
2.微信公众号回复【sl】获取第三方库:OpenCV和ONNXRuntime,然后将其解压到源码目录,OPenCV是我用Visual Studio2019编译的。ONNXRuntime不需要自己编译,下载官网编译好的即可
最终的项目结构如下:
project_root/
|- common.h
|- superpoint.h
|- superpoint.cpp
|- lightglue.h
|- lightglue.cpp
|- cppDemo.cpp
|- opencv/
|- onnxruntime-win-x64-1.15.1/
|- CMakeLists.txt

3.打开Cmake,输入源码路径和编译输出路径,然后以此点积Config->Generate->Open Project

集成到OpenCV中

然后将新增加的类设置到拼接流水线中。
CPPDemo
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring sp = converter.from_bytes(superPointPath);
std::wstring lh = converter.from_bytes(lightGluePath);

Mat pano;
Ptr stitcher = Stitcher::create(mode);
Ptr superpointp = makePtr<SuperPoint>(sp);
Ptr lightglue = makePtr<LightGlue>(lh, mode);
stitcher->setPanoConfidenceThresh(0.1f);
stitcher->setFeaturesFinder(superpointp);//SpuerPoint feature extraction
stitcher->setFeaturesMatcher(lightglue);//LightGlue feature matching
Stitcher::Status status = stitcher->stitch(imgs, pano);

1.将onnxruntime.dll和opencv_world455.dll(opencv_world455d.dll debug模式)hdf5.dll,zlib.dll放到exe路径下
2.运行cppDemo.exe,并设置参数,例如–mode panorama --lg D:\superpoint_lightglue.onnx --sp --mthresh 0.25 D:\superpoint.onnx D:\1.jpg D:\2.jpg

拼接支持两种变换模型,仿射变换和透视变换,由–mode (panorama|scans)指定,panorama表示透视变换模型,scans代表仿射变换模型
–sp 指定superpoint onnx格式模型路径
–lg 指定lightflue onnx格式模型路径
–mthresh 指定匹配阈值
D:\1.jpg D:\2.jpg为拼接输入图像

拼接结果

特征匹配

拼接结果

特征匹配

拼接结果

特征匹配

对于不熟悉C++的,我还提供了C#Demo
CSharpDemo

GPU推理

对于推理性能有要求的,同时具备GPU硬件环境的,可以切换到GPU推理模式,方法如下:
1.根据GPU型号安装驱动。
2.下载onnxruntime GPU连接库
https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x64-gpu-1.15.1.zip
2.按照CPU推理目录结构解压链接库压缩包。
3.重新编译源代码。
4.由于onnxruntime依赖cuda,可以安装cuda tookit,也可以只将cuda运行时dll拷贝到exe所在目录。
5.由于onnxruntime依赖cudnn,将cudnn dll拷贝到exe所在目录。 根据onnxruntime和cuda,cudnn版本对照表。
https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html
cunda运行时dll,cudnn dll我已经为大家准备好了,关注微信公众号:人工智能大讲堂,后台回复og获取。

评论

暂无评论