2023图像匹配挑战冠军方案|无需提取特征点也能进行弱纹理三维重建!

本文主要是介绍2023图像匹配挑战冠军方案|无需提取特征点也能进行弱纹理三维重建!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3DCV有幸邀请到顶会作者Xingyi He, Jiaming Sun, Yifan Wang与大家一起分享他们的最新文章,如果您有相关工作需要分享,文末可以联系我们!

在公众号「3D视觉工坊」后台,回复「原论文」即可获取pdf或代码。

添加微信:dddvisiona,备注:三维点云,拉你入群。文末附行业细分群。

0. 笔者个人体会

SfM是指给定一组无序图像,恢复出相机位姿以及场景点云。通用场景下的SfM效果已经很好,而且COLMAP这类框架也很好用。但是弱纹理和无纹理场景下的SfM却很麻烦,主要目前主流的SfM框架都是先提取图像中的特征点,然后进行特征匹配。但是在无纹理条件下,很难提取稳定且重复的特征点,这就导致SfM恢复出的位姿和三维点云非常杂乱。

很直接的一个想法就是,如果不提取特征点,直接进行匹配呢?

最近,浙江大学就基于这种思想提出了一种弱纹理场景下的SfM框架,主要流程是首先基于LoFTR这类Detector-Free图像匹配算法获得粗糙位姿和点云,然后使用Transformer多视图匹配算法优化特征点坐标,利用BA和TA进一步优化位姿和点云。这个算法获得了2023 IMC的冠军,整体性能很好。今天笔者就将带领大家一起阅读一下这项工作,当然笔者水平有限,如果有理解不当的地方欢迎大家一起讨论。

1. 效果展示

先来看一下传统基于特征点的SfM在弱纹理场景下的表现:

aa177beef24aa5987ea879c0d47145d6.png

可以发现由于特征点提取的重复性差,匹配性能不好,进一步导致位姿和点云估计的结果很差。那么再来看看Detector-Free SfM这项工作,其主要目的是实现弱纹理场景下的SfM,可以发现在典型场景下运行良好,甚至海底、月球表面这种场景都可以进行定位和重建!推荐学习3D视觉工坊近期开设的课程:国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程

27d4fd87c83e054dfad1aa4f3e330faa.png 0586820868643889c6268ff2342b569c.png

有了精确的位姿和点云,就可以进行很多SfM的下游任务,例如新视点合成和稠密重建:

d1255bf1e82b31933d42e94004258049.png

不幸的是,这个算法暂时还没有开源,感兴趣的小伙伴可以追踪一下Github。下面来看一下论文的具体信息。

我们提出了一个新的SfM框架来从无序的图像中恢复精确的相机姿态和点云。传统的SfM系统通常依赖于跨多个视图的可重复特征点的成功检测,这对于弱纹理的场景来说是困难的,并且较差的特征点检测可能会破坏整个SfM系统。受益于最近无检测器匹配器的成功,我们提出了一种新的无检测器SfM框架,避免了早期特征点的确定,同时解决了无检测器匹配器的多视图不一致问题。具体来说,我们的框架首先从量化的无检测器匹配中重建一个粗略的SfM模型。然后,它通过一个新颖的迭代优化管道对模型进行细化,该管道在基于注意力的多视图匹配模块和几何优化模块之间进行迭代,以提高重建精度。实验表明,所提框架在通用基准数据集上优于现有的基于检测器的SfM系统。我们还收集了一个弱纹理的SfM数据集,以展示我们的框架重建弱纹理场景的能力。

2. 算法解析

算法的Pipeline非常直观,输入是一组无序图像,输出是相机位姿、内参和点云。具体的流程是一个两阶段由粗到精的策略,首先使用一个Detector-Free的特征匹配器(LoFTR)来直接进行图像对的稠密匹配,以此来消除特征点的低重复性带来的影响。然后量化特征位置到粗网格来提高一致性,并重建粗SfM模型,为后续优化提供初始的相机位姿和场景结构。之后,使用轨迹优化和几何优化交替进行的联合迭代优化pipeline,以提高位姿和点云精度。

095cbd93eadaca41785c311d6998cbd7.png

Detector-Free匹配器一般也都采用由粗到精的策略,首先在下采样特征图的粗网格上进行稠密匹配,然后在一幅图像上固定粗匹配的特征位置,而在另一幅图像上用精细的特征图搜索它们的亚像素对应关系。理论上这种思想是可以直接应用到SfM上的,但这里有个问题,也就是在一幅图像中产生的特征位置依赖于另一幅图像,这样在多个视图进行匹配时,特征轨迹就很容易中断!

5161014ddcf17f72a6de4c8e861c1177.png

作者的具体做法是,将匹配的2D位置量化为一个网格⌊x / r⌉(r是网格大小),直接令多个相近的子像素合并为同一网格节点。实际上是以牺牲精度为代价,换取了一致性。

后续的迭代优化过程很有意思,优化的对象就是匹配点的2D坐标,主要思想还是对所有视图中的特征点位置进行局部调整,使其特征之间的相关性最大化

怎么做呢?直接计算所有的关联视图吗?那样计算量就太大了。

作者这里用了一个trick,就是选择一个参考视图,提取参考视图中特征点处的特征,并将其与其他视图(查询视图)中特征点周围大小为p × p的局部特征图进行关联,得到一组p × p的热图,相当于特征点位置的分布。另一方面,还要计算每个热图上的期望和方差,方差之和也就是优化的目标函数。

e79492815c1e38144da31fde68063ac8.png

还有个问题,就是这个参考视图怎么选择呢?这里的准则其实是最小化参考视图和查询视图之间的特征点尺度差异。具体来说,就是根据当前恢复的位姿和点云计算特征点的深度值,然后选择中位数做为参考视图。

还有个细节,就是如何提取以2D特征点为中心的局部特征块?这里是将以每个关键点为中心的p × p个图像块输入到CNN中,得到一组特征块,然后再利用Transformer的自注意力和交叉注意力得到最终的特征图。

ff5ec161a955f99dd6af0862ecfff834.png

最后还有一个级联的BA和TA(Topology Adjustment)优化的过程,来细化位姿和点云。由于经过了Transformer优化和BA,这时候整体的场景已经比较准确了,因此TA优化过程中还加入了之前未能配准的2D点。整个优化过程,也就是不停的交替进行BA和TA,再把优化后的点云投影到图像上来更新2D位置,再进行下一次迭代优化。

3. 实验

整个模型需要训练的地方就是Detector-Free匹配器还有多视图特征提取Transformer,训练是再MegaDepth数据集进行,训练思路就是最小化优化轨迹和真实轨迹之间特征点位置上的平均l2损失。对比方案还是挺全的,有SIFT这种手工特征点,也有R2D2、SuperPoint这类深度学习特征点,数据方面使用了Image Matching Challenge (IMC)、ETH3D还有他们自己采集的Texture-Poor SfM数据集。

结果显示,这个算法搭配LoFTR可以实现比较好的性能(读者也可尝试和其他的匹配算法结合)。值得注意的是,SuperPoint + SuperGlue + PixSfM这个组合的性能也非常棒,也说明SP+SG在很多情况下都是通用的。

b1bd37edfeaba10d45a71e4168522961.png

定性的对比就更直观了,红框代表Ground Truth,显然在低纹理场景下这篇文章提出的算法性能更优,甚至好几个场合SP+SG的组合直接挂掉了。

213d2dac143f90d5111e5441e0edc909.png

再来看看三角化的结果,可以进一步证明位姿和内参估计的准确性。同样是基于LoFTR的组合取得了更高的精度,这里AspanTrans的配置牺牲了一点精度,但是完整性更好。

9764d6093d664c211c7f8cce3fdf04dc.png

下面是一个验证优化模块影响的实验,做的是热力图的比较,O和X分别表示粗糙和精细的特征点位置。结果显示引入优化后,热力图的对比更明显。而且优化后的点云也更精确。

766c427d65fff777c4c501ca3b203329.png

然后是一个消融实验,分别测试的量化比值、迭代次数、视图数量以及各部分模块的消融实验。主要还是通过这组实验确定模型和迭代的最优参数。推荐学习3D视觉工坊近期开设的课程:国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程

384ef751c9c860a6efb95790842f35c2.png

想必大家一定很关心运行的效率和耗时,作者最后做了一个在处理大规模场景时,模型的3D点数、优化时间、内存开销的一个对比。内存占用没有多大,这是因为算法是先进行多视图匹配,再进行几何优化,因此BA不需要像PixSfM那样存储每个2D点的特征块或代价图。

b2933d80c5659e2225562d124996eca5.png

4. 总结

这项工作是针对弱纹理这一特定场景设计的,整体的设计思路很通顺,效果也非常棒。如果要说问题,那就是计算效率了,毕竟LoFTR匹配本身就非常耗时。但本身SfM就不像SLAM那样追求实时性,所以计算效率倒也不是什么大问题,可以尝试通过一些并行BA的方法来优化。另一方面,作者提到可以和深度图、IMU等多模态数据进行融合,也是很不错的研究方向。

—END—

高效学习3D视觉三部曲

第一步 加入行业交流群,保持技术的先进性

目前工坊已经建立了3D视觉方向多个社群,包括SLAM、工业3D视觉、自动驾驶方向,细分群包括:[工业方向]三维点云、结构光、机械臂、缺陷检测、三维测量、TOF、相机标定、综合群;[SLAM方向]多传感器融合、ORB-SLAM、激光SLAM、机器人导航、RTK|GPS|UWB等传感器交流群、SLAM综合讨论群;[自动驾驶方向]深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器讨论群、多传感器标定、自动驾驶综合群等。[三维重建方向]NeRF、colmap、OpenMVS等。除了这些,还有求职、硬件选型、视觉产品落地等交流群。大家可以添加小助理微信: dddvisiona,备注:加群+方向+学校|公司, 小助理会拉你入群。

04166883c0cde5f82e9955ec268784f6.jpeg
添加小助理微信:cv3d007, 拉你入群
第二步 加入知识星球,问题及时得到解答

针对3D视觉领域的视频课程(三维重建、三维点云、结构光、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业、项目对接为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:「3D视觉从入门到精通」

学习3D视觉核心技术,扫描查看,3天内无条件退款f03632cf65ea69f12b1e405e44119997.jpeg

高质量教程资料、答疑解惑、助你高效解决问题
第三步 系统学习3D视觉,对模块知识体系,深刻理解并运行

如果大家对3D视觉某一个细分方向想系统学习[从理论、代码到实战],推荐3D视觉精品课程学习网址:www.3dcver.com

基础课程:

[1]面向三维视觉算法的C++重要模块精讲:从零基础入门到进阶

[2]面向三维视觉的Linux嵌入式系统教程[理论+代码+实战]

[3]如何学习相机模型与标定?(代码+实战)

[4]ROS2从入门到精通:理论与实战

[5]彻底理解dToF雷达系统设计[理论+代码+实战]

工业3D视觉方向课程:

[1](第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]

[2]保姆级线结构光(单目&双目)三维重建系统教程

[3]机械臂抓取从入门到实战课程(理论+源码)

[4]三维点云处理:算法与实战汇总

[5]彻底搞懂基于Open3D的点云处理教程!

[6]3D视觉缺陷检测教程:理论与实战!

SLAM方向课程:

[1]深度剖析面向机器人领域的3D激光SLAM技术原理、代码与实战

[1]彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战

[2](第二期)彻底搞懂基于LOAM框架的3D激光SLAM:源码剖析到算法优化

[3]彻底搞懂视觉-惯性SLAM:VINS-Fusion原理精讲与源码剖析

[4]彻底剖析室内、室外激光SLAM关键算法和实战(cartographer+LOAM+LIO-SAM)

[5](第二期)ORB-SLAM3理论讲解与代码精析

视觉三维重建

[1]彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进)

自动驾驶方向课程:

[1] 深度剖析面向自动驾驶领域的车载传感器空间同步(标定)

[2] 国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程

[3]单目深度估计方法:算法梳理与代码实现

[4]面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)

[5]如何将深度学习模型部署到实际工程中?(分类+检测+分割)

最后

1、3D视觉文章投稿作者招募

2、3D视觉课程(自动驾驶、SLAM和工业3D视觉)主讲老师招募

3、顶会论文分享与3D视觉传感器行业直播邀请

这篇关于2023图像匹配挑战冠军方案|无需提取特征点也能进行弱纹理三维重建!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253997

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详