尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RIAV-MVS:不对称体积与循环索引实现高效多视图立体匹配
做多视图立体匹配Multi-View Stereo的人十有八九都被成本卷的显存支配过。输入图640×512、深度假设192层、视图数三五张随便一个3D CNN正则化头的中间特征就能吃掉十几GB显存。所以这几年MVS论文的主旋律基本可以概括成两件事把体积造得更省或者把网络改得更聪明。今天要聊的这篇CVPR 2023论文RIAV-MVS: Recurrent-Indexing an Asymmetric Volume for Multi-View Stereo走的是另一条路——它既不迷信大体积也不迷信重型3D正则化而是设计了一个空间分辨率与深度分辨率刻意不对等的Asymmetric Volume不对称体再用一个Recurrent-Indexing循环索引模块像RAFT迭代光流那样把深度图一点点磨出来。这篇文章适合谁读如果你正在做基于学习的MVS或者你只是好奇迭代优化式深度估计这条路在2023年之后到底长什么样这篇paper都值得从头到尾过一遍。我自己做三维重建落地最关心的是它在精度、显存、速度三者之间怎么取舍所以这篇简述会把重点放在方法设计的动机和细节上指标只做辅助参考不堆数字。1. 先定位RIAV-MVS在MVS赛道里处于什么位置1.1 三条主流路线走到2023年的格局MVS任务一句话介绍给定一组带相机位姿的多视图图像恢复参考视图的深度图再融合成稠密三维点云。基于深度学习的方法演化到今天大致有三条路线。第一条是成本体积加3D CNN正则化代表是MVSNet、CasMVSNet、TransMVSNet这一脉。把每个源视图的特征通过可微单应性变换投到参考视图的一组深度假设上做方差之类的匹配度量得到一个D×H×W×C的成本卷再用3D卷积网络做正则化最后soft-argmin回归深度。这条路线在DTU等数据集上刷分最稳但显存和计算量随着深度层数、分辨率、视图数增长得非常快。第二条是Patchmatch迭代路线代表是PatchmatchNet。它不显式构建完整成本卷而是用可微Patchmatch做深度假设的传播和随机扰动用低分辨率代价引导高分辨率深度细化。显存是省下来了但训练稳定性对超参很敏感高分辨率细节也容易丢。第三条是迭代优化路线RIAV-MVS是其中的代表。它把光流估计里RAFT的那套多轮迭代更新搬到MVS上维护一个随迭代更新的深度状态每轮从匹配信息里抽取当前误差信号用ConvGRU之类的小网络输出深度残差。这条路计算开销可预期迭代轮数还能任意调节天然适合做精度和速度的权衡。RIAV-MVS是第三条路的代表性工作但它不是简单地把RAFT套到MVS上。它真正的特点在于为了在MVS的多视图高维空间里让RAFT式迭代跑得动它把卷怎么存、怎么访问这个底层问题重新设计了一遍——这就是标题里的Asymmetric Volume。路线代表方法显存占用精度表现推理可调性成本卷 3D CNNMVSNet、CasMVSNet、TransMVSNet高高低结构固定Patchmatch迭代PatchmatchNet低中高中受传播轮数影响迭代优化RIAV-MVS中低高高迭代轮数自由调节1.2 成本卷的显存墙到底是怎么来的这里稍微展开一点基础方便没做过MVS的读者理解。MVSNet式流程中每个源视图的特征图会经过单应性变换投影到参考视图的一组深度假设平面上得到N个warped feature volume然后对N个源视图取方差得到D×H×W×C的三维成本卷。问题就在这个卷的尺寸上。我随手算一笔账输入640×512特征图按1/4分辨率就是160×128深度假设取128层特征通道取32这个成本卷就是128×160×128×32约8388万个数单精度浮点占336MB。这还只是原始材料3D CNN正则化网络中间的feature map通道数往往更大实际占用要翻好几倍。所以MVSNet那一代方法8GB显卡基本是起步线输入分辨率稍微提一点就爆显存。CasMVSNet、CVP-MVSNet这些级联方法想出的办法是化整为零先在低分辨率上用全深度范围估个大概再在高分辨率上围绕估计值缩小深度窗口重新建卷。这个思路有效但每一级都要配一个独立的3D CNN正则化器参数量和计算量并不小。更麻烦的是级联是硬串行的——上一级深度范围估偏了下一级只能在错误的小窗口里打转没有自我纠正能力。RIAV-MVS瞄准的正是这个容量与可纠正性的矛盾。它不搞串行级联而是把两种不同采样策略的卷同时摆在桌面上再让一个循环更新器自己决定去哪个卷上取信息、取多少。这个设计思路如果你熟悉RAFT会觉得很自然但要在MVS这个场景里落地难点全在下面要讲的不对称体上。2. Asymmetric Volume的核心把空间分辨率和深度分辨率解耦2.1 为什么统一采样的成本卷是一种浪费常规成本卷是一个三维栅格在深度方向、图像高度、宽度方向都用同样的间隔去采样。但是仔细想这三个方向对采样密度的需求完全不同。深度方向关心的是覆盖范围。室外大场景、无人机航拍、室内扫描深度范围动辄跨两三个数量级深度假设层太少量化误差就直接变成重建误差。空间方向关心的是细节。物体边缘、细杆、孔洞这些高频结构对空间分辨率极其敏感空间分辨率一降边缘立刻糊成一团。如果按三个方向都够用的方式去建一个均匀体积内存立刻爆炸。RIAV-MVS的关键洞察就在这里深度方向和空间方向根本不需要用同一个精细度。它可以建一个深度方向密集、空间方向稀疏的全球体再配一个空间方向密集、深度方向稀疏的局部体两者合起来就叫不对称体。用大白话说一个负责看全局尺度一个负责抠局部细节。2.2 两个分支各自的设计与职责按论文描述的大致框架具体配置可以这样理解。全球体分支使用低分辨率的特征图在完整深度范围上均匀采样足够多的深度假设构造一个深度覆盖全、空间分辨率低的成本卷。它的职责是让网络先搞清楚这个像素的深度量级大概在哪。因为是低分辨率所以即使深度层数多一些内存也不会失控。局部体分支使用高分辨率特征图但只在一个围绕当前深度估计的窄窗口里采样少数深度假设构造一个深度层数少、空间分辨率高的成本卷。它的职责是给细节修正提供放大镜级别的纹理和匹配信息。这两个分支不是拼接成一个超大体积再塞给3D CNN——那样就前功尽弃了。它们各自保持独立由后面的循环索引模块在每次迭代时分别查询。这样无论深度范围多宽、分辨率多高真正参与计算的是查询时取出来的那一点点特征而不是整个体积。分支空间采样密度深度采样方式核心职责全球体分支稀疏低分辨率全深度范围、密集假设确定深度量级提供全局视野局部体分支密集高分辨率当前估计附近的窄窗口修正边缘与细节提升精度2.3 逐像素索引比固定窗口级联灵活在哪级联方法里细级深度窗口一旦根据上一级结果固定下来所有像素共享同一个深度范围。如果某个像素的粗估计恰好偏了细级窗口里根本没有真值所在的深度层这个错误就永远纠正不回来。RIAV-MVS的索引是逐像素进行的。当前深度图上每个像素都有一个自己的深度值索引操作就是拿着这个深度值到体积的深度方向上做双线性采样取出所在深度切片上的特征。不同像素的深度值不同采样到的深度层也就不同。这种每个像素各自查自己的深度层的机制本质上是一个逐像素自适应寻优过程比固定窗口灵活得多。边缘像素和平面区域像素可以在不同迭代轮次被分别修正而互不干扰。3. Recurrent-Indexing循环索引如何把深度图一步一步磨出来3.1 一次迭代内部发生了什么循环索引模块的整体流程可以概括为四步。初始化一个深度图D_0最朴素的来源可以是对全球体直接做soft-argmin回归的结果。在每一轮迭代t用当前的D_t分别在全球体、局部体上做索引取到各自的深度切片特征拼接起来。把拼接特征连同当前深度图、以及可能的上下文特征一起送入ConvGRU单元GRU输出一个深度残差ΔD。更新D_{t1} D_t ΔD进入下一轮。注意这里GRU维护的隐状态是整个序列的信息通道。它不只是在当前估计上做局部修正还隐式记忆了前几轮学到的场景结构这让多轮更新是连贯的、有方向的而不是每轮从头硬猜。3.2 循环更新到底替代了3D CNN正则化的什么功能MVSNet那套流程里3D CNN的作用是在整个成本卷上做平滑、去噪、抑制匹配歧义最后把D维压成一个深度概率分布。这个方法有效但本质上是一种把所有深度假设都认真地看一遍再说的做法代价很高。循环索引的思路是把这件事完全反过来不把所有深度假设都看一遍而是先根据当前估计把注意力集中在最可能的深度层附近看这里的匹配代价长什么样然后估计一个修正量。用一个不太严谨的类比3D CNN是枚举后排除RIAV-MVS是先猜再改改了再猜。后者每一步的计算量小而且容错性强初始估计差一点没关系只要每次索引都能取到有效信号多迭代几轮总能修正回来。这也是循环方案训练好之后的爽点推理时想要更高的精度就多加几轮想要更快的速度就少加几轮同一个权重文件不需要重新训练。这个特性在工程落地时非常实用。3.3 MVS场景下做RAFT式迭代比双目立体难在哪看到Recurrent-Indexing和ConvGRU做过光流或立体匹配的读者肯定会说这不就是RAFT吗确实RIAV-MVS继承了迭代更新范式但MVS有一个双目没有的麻烦多个源视图带来的高维匹配信息。双目立体可以构建一个D×H×W的三维correlation volume尺寸可控。MVS有N个源视图每个视图都能贡献一份匹配代价如果全部塞进一个体积维度就爆炸了。RIAV-MVS的解法是用2D特征提取先把多视图信息压缩再通过不对称体把存储和查询解耦。全球体回答深度在哪一层局部体回答细节怎么修。所以它不是把RAFT简单搬过来而是为了这套框架能在MVS的显存预算下跑起来把volume设计整个重想了一遍。这个取舍恰恰是论文最值得琢磨的地方。4. 训练设置、损失函数和推理配置里的门道4.1 对每一轮深度输出都做监督RIAV-MVS的输出是整个深度图序列D_0, D_1, ..., D_T如果只监督最后一轮中间几轮就没有直接的优化压力GRU隐状态的训练也会变得不稳定。论文采用的是RAFT式的序列损失对每轮输出都计算L1损失并按迭代次序加权L Σ_{t1..T} γ^(T-t) * ||D_t - D_gt||_1γ一般取0.8或0.9越接近最后输出的项权重越高具体权重设置以原文为准。这样设计有两个好处一是强迫早期迭代也给出合理的估计保证如果我只跑两轮迭代精度也不会太差二是给梯度一个平滑的路径让GRU在每一轮都能收到针对性的反馈。实测下来这种损失设计比只监督最后几轮收敛明显更快。4.2 深度真值掩码是复现成败的关键在DTU这类数据集上深度真值并不是每个像素都有效。无效像素主要包括两种一是超出相机有效范围的区域二是多视图间存在遮挡或反光导致匹配本身无意义的区域。训练时一般按真值是否在设定深度范围内判断有效性生成valid mask在计算损失时先把无效像素的梯度抹掉。这个步骤看起来稀松平常但很多复现翻车都翻在这里。mask没处理好无效区域的错误梯度会稀释有效区域的信号尤其在自监督或半监督设置里这个问题会被放大好几倍。做相关实验的朋友建议先把mask的可视化做好确认mask边缘和物体边界对得上再开始训。4.3 数据集协议与泛化真相标准流程是在DTU上训练和测试在Tanks and Temples上做跨域泛化测试。Tanks是真正的照妖镜在DTU这种室内小物体、固定光照、密集视角的数据上训练出来的模型一到室外大场景、强光照变化、稀疏纹理和弱纹理区域很多方法会现出原形。RIAV-MVS在Tanks上的表现能稳住一定程度上说明循环修正范式对域偏移更鲁棒。原因也好理解GRU做的是残差式修正它更关注当前估计附近匹配代价的局部形状对特征的绝对尺度变化没那么敏感。反倒是那种一次回归出深度的方法对特征分布的细微变化都很敏感跨域时容易系统性偏移。4.4 推理时迭代轮数的实用建议论文里应该有不同迭代轮数下的精度和速度对照。我的建议是复现时先固定4到6轮把全流程跑通拿到一个稳定基线再单独做轮数减半的实验找到自己业务场景的拐点。很多实际应用里3轮迭代的深度图已经足够用来融合点云为了指标上那零点几个百分点去翻倍推理时间在落地上是不划算的。5. 实验结果应该怎么看指标的含金量5.1 DTU上的整体水平DTU的评价指标是Acc精度、Comp完整度和Overall两者平均。RIAV-MVS发表时在这三项上处于当时的最优区间尤其是整体误差控制得很好。不过说实话DTU上各家方法的差距已经很小了零点零几的差异肉眼基本看不出来真正拉开差距的是定性结果里的细节。5.2 定性结果里值得盯的三类区域看定性结果图我建议重点盯三类区域细杆和镂空结构、物体边缘、弱纹理大平面。细杆和镂空结构是MVS的经典难题因为它们在多个视点下经常被遮挡匹配特征本来就不稳定。RIAV-MVS的处理从论文可视化来看是干净利落的这要归功于局部体分支的高分辨率特征加循环迭代的逐像素修正。物体边缘方面因为深度跳变剧烈成本卷在边缘附近往往有两个峰值容易把前后景深度混在一起RIAV-MVS的迭代方式让修正可以跨迭代完成边缘的锐利度会好一些。弱纹理大平面则是另一个极端匹配代价本身平坦GRU在这种区域更依赖上下文和隐状态里的先验信息能保证平面不破碎、不波浪。5.3 消融实验透露的设计真相论文的消融实验一般会回答这样几个问题去掉局部体分支全球体还能不能撑住精度去掉循环更新换成单次回归会掉多少把全球体也提到高分辨率显存涨多少、精度又涨多少从公开发表的同类工作来看这类消融的结论通常是不对称体和循环索引是耦合设计缺一个另一个的优势也会大打折扣。没有局部体的高分辨率信号循环索引做得再好也只能在低分辨率上打转没有循环索引不对称体造出来也没人会用还得回到3D CNN的老路上去。这算是这篇论文在方法论上最自洽的地方。6. 读完这篇论文我的一些延伸思考6.1 体积设计与求解策略解耦是它最值得借鉴的地方很多MVS工作习惯把造一个更好的体积和用一个更强的网络绑在一起考虑好像体积越精致、网络越深结果就必然越好。RIAV-MVS提供了一个更优雅的视角体积只是检索材料求解器只是检索加修正。二者之间的接口就是索引这个操作。一旦这样解耦你会发现体积可以按应用场景随意裁剪求解器的轮数也可以按算力预算调节整个系统的可定制性变得非常高。这套思路不仅属于MVS。SDF回归、多视角法向估计、动态场景深度估计凡是存在先存储一个高维张量、再从中做决策的任务都可以借不对称存储循环索引的套路。这也是我读完这篇论文收获最大的地方。6.2 复现和落地时容易踩的坑结合我自己做类似迭代式深度估计的经验提醒几个容易被忽略的坑。第一索引采样的边界问题。当深度估计接近采样范围的上限或下限时索引采样的梯度信号会明显变弱甚至变成查无此层。所以在设置深度范围时一定要留一点余量宁可多覆盖一点无效区域也不要把真值卡在边界上。第二多视图数量和迭代轮数的取舍。全球体分支的显存随视图数线性增长而迭代轮数只影响速度、基本不影响显存。显存紧张时优先加迭代轮数想要更好质量时先确认迭代轮数带来的收益饱和了再考虑加视图。从经验来看视图从3张加到5张带来的提升往往不如迭代轮数从4轮加到8轮来得稳。第三下游融合阶段的不确定性利用。RIAV-MVS输出的是逐像素深度但循环迭代天然会在迭代过程中留下每轮深度的变化轨迹。这个轨迹是非常好的不确定性信号——某像素的深度在多轮迭代中一直剧烈跳动说明这里匹配不自信。建议在做点云融合时把这个信息接进来比单纯用置信度图可靠得多。6.3 我自己的一个使用体会最后说点私人的体会。我一直觉得MVS走到今天靠堆体积、堆3D CNN的老路已经快到瓶颈了RIAV-MVS这种把体积做轻、把求解做重的思路很可能是接下来几年MVS的一个主流方向。如果你也想做相关的实验我建议别一上来就想着复现完整的SOTA配置先把不对称体的最小版本搭起来比如全球体用1/8分辨率、局部体用1/4分辨率、迭代4轮跑通一次完整流程再逐个去加复杂度。这样你对每个模块的贡献会有非常直观的感受而不是对着一个黑盒调参。
RELATED

相关推荐

C++在实时操作系统中的高效实践与优化技巧

C++在实时操作系统中的高效实践与优化技巧

1. 实时操作系统与C的化学反应我第一次在VxWorks上尝试用C开发实时控制程序时,意外发现这个组合比想象中更强大。传统观念认为实时系统应该用C语言开发,但现代C的特性正在改变这一格局。实时操作系统(RTOS)对时间确定性有严苛要求…

📅 2026/9/13 10:34:41
Backstage v1.6.0 版本深度解读:React Router v6 兼容、CLI 现代化与搜索能力全面增强

Backstage v1.6.0 版本深度解读:React Router v6 兼容、CLI 现代化与搜索能力全面增强

Backstage v1.6.0 版本深度解读:React Router v6 兼容、CLI 现代化与搜索能力全面增强 【免费下载链接】backstage Backstage is an open framework for building developer portals 项目地址: https://gitcode.com/GitHub_Trending/ba/backstage 导读 Back…

📅 2026/9/13 10:34:41
Xiaomi Home Integration for Home Assistant 深度指南:从云端/本地控制架构到 MIoT-Spec-V2 实体映射

Xiaomi Home Integration for Home Assistant 深度指南:从云端/本地控制架构到 MIoT-Spec-V2 实体映射

Xiaomi Home Integration for Home Assistant 深度指南:从云端/本地控制架构到 MIoT-Spec-V2 实体映射 【免费下载链接】ha_xiaomi_home Xiaomi Home Integration for Home Assistant 项目地址: https://gitcode.com/GitHub_Trending/ha/ha_xiaomi_home Xiao…

📅 2026/9/13 10:34:41
MORE NEWS

更多资讯

📰

Proteus电子秤仿真:HX711传感器建模与LCD1602驱动实战

简介:本资源是一套面向电子设计初学者与嵌入式开发爱好者的电子秤全流程实践资料,聚焦硬件仿真验证与软件协同调试,解决从原理图设计到固件实现的学习断层问题。压缩包共53个文件,涵盖Proteus仿真工程(.dsn、.dbk&…

📰

Java日志框架底层原理与生产调优实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

基于EKF的路面附着系数估计与Simulink实现

1. 项目背景与核心价值在车辆动力学控制和自动驾驶领域,路面附着系数估计一直是个关键技术难题。这个参数直接影响着车辆的制动性能、转向稳定性和驱动效率。传统基于查表法或简单滑移率计算的方法在复杂路况下往往表现不佳,而基于扩展卡尔曼滤波&#x…

📰

Windows指纹识别SDK实战:SLK20M模块驱动安装与特征比对全解析

简介:面向Windows平台的ZKFPModule SLK20M指纹识别模块SDK开发包,专为需要在服务端或桌面应用中实现指纹采集、验证与比对的开发者设计。压缩包共90个文件,大小约43.44MB,涵盖头文件、动态链接库、静态库、设备驱动、示例源码及PD…

📰

STM32F4 IIC复位与状态机深度解析

简介:本资源是一份面向STM32F4系列嵌入式开发者的IC(IIC)底层驱动代码包,聚焦解决MCU与温湿度传感器、EEPROM、陀螺仪等IC外设通信的工程落地问题,适用于具备C语言基础和STM32标准库/HAL库使用经验的中级开发者。压缩包…

📰

实测VeapAI:开源RAG知识库全链路平台搭建指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬