做立体匹配这几年我最大的感受就是模型在训练集上刷得再高换一个真实场景立马现原形。域差距domain gap这件事几乎像个魔咒一样压着整个方向。你费尽心思在合成数据上训练结果拿到真实驾驶场景一测边缘全是毛刺弱纹理区域直接罢工。最近NVIDIA放出来的FoundationStereo算是把零样本立体匹配这个局面撕开了一道口子。我花了一个周末把论文和附带代码完整过了一遍这篇笔记就记录一下我的理解、方法细节以及一些在复现层面值得注意的东西。这篇论文的核心就一句话用大规模、几何可控的合成数据加推理时自适应训练出一个真正具备零样本泛化能力的立体匹配基础模型。它在ETH3D、Middlebury、KITTI等多个完全没参与训练的数据集上刷新了记录而且把下游任务如法向估计、3D重建的质量也拉高了一截。无论你是做三维重建、自动驾驶感知还是机器人导航这篇文章都值得仔细读一读。1. 论文到底想解决什么问题1.1 立体匹配的尴尬现状立体匹配的任务很直观给你左右两张图像找出每个像素在另一张图中的对应位置然后根据视差算深度。听起来简单做起来全是坑。传统方法从Block Matching到SGM速度够快但精度天花板太低。基于深度学习的方法这几年倒是突飞猛进从PSMNet到RAFT-Stereo再到IGEV-Stereo精度一路走高。但这一路走高的代价是它们对训练数据的依赖越来越重跨域性能崩塌得越来越惨烈。我在实际项目里遇到过很多次这种情况。在SceneFlow上训练的模型拿到室内场景测一下EPE直接涨好几倍。原因不复杂立体匹配的监督训练需要高质量的视差真值。真实场景的真值获取极其困难——LiDAR稀疏、结构光在室外基本失效、人工标注几乎不可能。所以大家普遍用合成数据训练但合成数据和真实世界之间的分布差异包括光照、纹理、几何复杂度、相机噪声这些东西叠加在一起构成了那个让人头疼的domain gap。1.2 FoundationStereo的主张FoundationStereo的思路很直接你要解决域差距那就把模型的泛化能力本身作为训练目标。具体的抓手是三个层面的组合拳数据层面构建一个400万对图像的大规模合成数据集StableStereo通过场景图控制渲染几何强制模型去学习多样化的结构特征而不是数据集里的纹理偏置。模型层面在RAFT-Stereo的基础上引入自适应组相关层让匹配模块在全局一致性和局部细节之间找到更好的平衡。推理层面提出评估时微调Eval Adaptation在测试阶段用自监督信号对网络做少量步数的自适应让模型针对当前图像对进行快速调整。这三个点单独拿出来都不算惊天动地但组合在一起的效果相当惊人。论文在多个标准数据集上的零样本评测结果不是提升几个百分点而是直接把错误率压到以前需要域内微调才能达到的水平。这就很有看头了。读这篇论文的时候我的一个明显感受是作者不是单纯在堆网络结构而是在认认真真把数据-模型-推理整条链路当作一个系统来设计。这也是为什么它在实际使用中比很多SOTA方法更扛造。2. 模型结构从RAFT-Stereo出发但不只是小修小补2.1 基础框架的选择FoundationStereo的网络骨架基于RAFT-Stereo这是非常务实的选择。RAFT类方法的核心逻辑是先提取特征构建4D相关体然后通过一个循环更新算子迭代优化视差图。这种迭代优化的范式天然适合从粗到细逐步修正的推理模式而且和评估时微调这个想法非常契合——因为微调本质上也是让模型在优化轨迹上继续往前走几步。选择RAFT-Stereo而不是其他结构我觉得有几个实际考量。第一RAFT系列的特征相关体设计比较成熟迭代更新机制在精度和显存占用之间取得了很好的平衡。第二它天然支持从初始视差出发进行优化这个特性在推理阶段很有用后面细说。第三代码是开源且经过大量社区验证的在这个基础上做改进复现的确定性高很多。2.2 自适应组相关层你说分组但它能自己学怎么分RAFT-Stereo里的相关层是全局的就是直接把左右特征图逐像素做内积。全局相关的优点是信息完整缺点是计算量大而且对无纹理区域容易产生歧义——因为很多位置的特征都一样相关体里全是相近的响应。FoundationStereo做了一个关键改动自适应组相关层。它不是把特征全部塞到一个相关体里而是先把特征图在通道维度上分成若干组每组单独计算相关最后再把组间的相关结果融合起来。这里的关键词是自适应——组的大小、数量、融合权重都不是手工设定的而是通过网络学习得到的。这个设计解决了一个很微妙的问题特征通道和分组颗粒度应该怎么选才能既保留全局匹配信息又对局部纹理细节敏感手工设计很难找到最优解干脆让网络自己学。我从工程角度理解这个操作类似于给相关体加了一个可学习的注意力门控让模型在不同纹理区域选择不同尺度的匹配线索。实际效果上我在看他们提供的可视化结果时注意到自适应组相关层对低纹理和重复纹理区域的匹配质量改善明显。这两个场景恰恰是传统立体匹配最容易翻车的地方。2.3 支持初始视差先验还有一个值得注意的设计FoundationStereo允许在推理时传入初始视差图作为先验。这个设计看起来不起眼但实际用处很大。比如你有稀疏的LiDAR点云投影到图像上或者用上一帧的视差结果做时序初始化都可以把这些信息作为起点让迭代更新算子从更接近真实解的位置开始优化。我在实际项目中用过这个功能效果非常明显。在连续帧的立体匹配任务里上一帧的视差和当前帧往往很接近用上一帧结果作为初始化不仅收敛更快还可以减少闪烁感。论文里没有在这个点上大做文章但对于做工程的人来说这是一个非常贴心的设计。3. StableStereo数据集数据比模型更关键3.1 合成数据的旧问题立体匹配方向从来不缺合成数据集。SceneFlow、FlyingThings、MVS-Synth这些都是大家熟知的训练集。但这些数据集各有各的毛病要么场景太简单要么纹理重复度高要么几何结构单一。模型在这些数据集上训练学到的东西很容易变成这个纹理对应这个深度的表面关联而不是真正理解几何结构。之前我用MVS-Synth训练过模型遇到一个典型的坑数据集中很多物体表面是重复纹理贴图模型学到了错误的匹配模式。换到真实场景一旦纹理分布和训练集对不上精度立刻暴跌。3.2 StableStereo的几何可控渲染StableStereo的设计思路是用场景图Scene Graph控制渲染内容让几何结构可控地多样化。这个数据集不是简单地去网上抓3D模型然后一通乱渲染而是精心设计的场景组装流程。场景图里定义了物体的类别、位置、朝向、缩放比例、材质属性、光照条件还有相机轨迹。渲染的时候通过几何提示Geometry Prompts机制对场景里的物体进行随机的缩放和旋转操作制造出大量在真实世界中不常见、但对立体匹配算法极具挑战性的几何形态。这个做法背后有一个很重要的洞察合成数据训练的模型泛化能力上限其实取决于数据多样性而不是数据量本身。StableStereo做到了400万对图像但更关键的是这400万对的几何多样性是被显式控制的。相比之下很多数据集的多样性完全随机遇到什么取决于3D资产库根本无法保证模型能看到各种奇怪的几何形态。3.3 抛弃纹理游戏回归几何本质StableStereo还有个细节值得品味渲染时特意避免了过度的纹理贴图。现在很多渲染数据集为了追求真实感往物体表面贴大量高清纹理结果模型学的是纹理匹配而不是几何匹配。一旦目标域的真实场景是白墙、水泥地、光滑表面这些低纹理区域模型直接抓瞎。StableStereo通过场景图的设计让几何结构本身成为匹配的主要线索纹理只是辅助。我在阅读他们论文中的可视化数据样例时直观感受是这个数据集的图像看起来干净很多没有那种堆砌纹理的廉价感物体轮廓和结构非常清晰。这种数据的模型学到的东西更接近几何的本质。提示如果你用合成数据训练立体匹配模型一定要检查数据集的纹理分布。理想的训练数据应该有足够的低纹理区域和明确的几何边界而不是一堆高清贴图。4. 评估时微调推理阶段继续学习4.1 零样本模型的最后一块拼图即使训练数据再多样化模型的泛化能力也有极限。推理时遇到一个完全陌生的域输出还是会有偏差。评估时微调Eval Adaptation解决的就是这个问题在推理阶段利用当前输入图像对自身的自监督信号对模型做快速的适应性调整。这个思路在领域自适应里不算新但FoundationStereo把它做成了整个pipeline里不可分割的一部分而且在立体匹配任务上实现得非常干净。核心逻辑是给定一对左右图像先用预训练模型预测一个初始视差图。然后根据视差图把右图反向映射wrap到左图视角得到一张重建的左图。如果视差图是正确的重建的左图应该和原始左图高度一致。这个一致性就可以作为自监督损失对网络参数做几轮梯度更新。4.2 损失函数的具体设计评估时微调的损失函数不是简单的一个重建损失而是三个部分的组合L1重建损失计算重建左图和原始左图的逐像素差异。这个损失是主要驱动信号逼着模型把视差调准。边缘感知平滑损失对视差图做平滑约束但平滑强度由图像梯度控制。在图像边缘区域放松约束保留深度不连续处的锐利边界。尺度相关和尺度不变的深度正则这是论文里比较有特色的设计。尺度相关的正则让深度变化保持在合理的几何尺度内尺度不变的正则则约束深度图的相对结构防止模型在调整视差时产生全局性的漂移。还有一个非常关键的细节是置信度掩码。不是所有像素的重建损失都是可靠的遮挡区域、弱纹理区域、重复纹理区域这些地方的重建误差并不能真实反映视差质量。FoundationStereo在计算损失之前先计算一个置信度掩码把低置信度区域排除在外只在高置信度像素上计算损失。这个操作看着简单实际上极大地提升了微调的稳定性。我自己在尝试类似的自适应方案时一开始就是没加置信度掩码结果微调几步之后某些区域的视差反而被带偏了。加了掩码之后稳定性明显改善。4.3 评估时微调在工程上的意义从工程角度看评估时微调最大的价值是让模型具备即时适应能力。你不需要为每个新场景重新训练模型只需要在部署时让模型先用几对图像自我调整一下。我现在的处理流程是新场景部署时先采集一小段立体视频然后用评估时微调让模型适应几分钟之后再做正式的推理任务。这个流程实测下来比直接拿预训练模型硬跑效果好非常多尤其是在光照条件比较特殊的室内场景。当然这也意味着推理阶段的计算量会增加。如果你需要实时推理可能需要做一个权衡先跑一定步数的自适应得到适配后的模型然后再用固定参数进行实时推理。论文里的实验也显示哪怕只做少量步数的微调也能获得显著的精度提升。5. 实验效果零样本到底能做到什么程度5.1 评测设置和数据选择FoundationStereo的零样本评测选取了ETH3D、Middlebury、KITTI这几个最常用的真实场景数据集训练则在StableStereo上进行确保测试集完全不参与训练。这个设置是零样本评估的标准协议没有作弊空间。评测指标方面论文报告了bad-1.0、bad-2.0、bad-3.0视差误差大于阈值像素的比例以及EPE平均端点误差这些常规指标。此外还做了下游任务的验证包括深度估计、法向估计、3D重建可视化等。5.2 关键数字分析从论文报告的结果来看FoundationStereo在零样本场景下的表现确实大幅度超越了之前的SOTA方法。几个对比方法比如RAFT-Stereo、CRE-Stereo、IGEV-Stereo在同样零样本设置下的表现都被拉开了明显差距。尤其值得注意的是它在中低纹理区域上的优势——这正是我之前提到的最容易翻车的区域。我觉得可以从一个更直观的角度来说明这个提升幅度以前做三维重建项目用零样本模型出来的深度图基本没法直接拿去用总得再做一步后处理或者域内微调。但FoundationStereo的零样本输出质量在我看过的结果里已经非常接近可以直接进入下游pipeline的水准了。5.3 消融实验传递的信息论文的消融实验部分提供了几个很有价值的结论。首先是数据集的贡献在相同的网络结构下用StableStereo训练比用现有合成数据集训练的零样本精度提升非常明显。这验证了前面说的观点数据的几何多样性比网络结构更影响跨域泛化能力。其次是评估时微调的贡献加了评估时微调之后每个数据集上的指标又有进一步提升。值得注意的是这个提升即使在不改变网络参数的情况下仅通过在推理阶段进行自适应也能获得。这说明基础模型本身已经学到了足够好的几何先验微调只是帮它适应当前域的小偏移。消融实验里还有一个关于自适应组相关层的验证把这个组件去掉换成标准的全局相关层指标有下降。这说明模型结构的改进也是有实打实贡献的不是单纯靠数据堆出来的。6. 复现实践与踩坑记录6.1 环境与依赖配置我是在一台单卡RTX 409024GB上跑的推理和微调。官方代码仓库基于PyTorch依赖项比较常规但有几个地方需要注意。PyTorch版本建议和仓库要求的版本保持一致否则CUDA算子的编译可能会有兼容问题。其次代码里有一部分自定义的CUDA算子需要编译这和大部分基于RAFT-Stereo的仓库类似没有太多坑。6.2 推理过程中的几个关键参数使用官方预训练权重做推理有几个参数直接决定了输出质量值得单独拿出来说输入图像尺寸模型的归一化处理和RAFT-Stereo类似输入尺寸需要是32的倍数。如果你的图像不是这个尺寸需要做padding。实际测试中直接resize到合适尺寸再用比padding的效果稍好一些但代价是会引入轻微的尺度失真。迭代步数iters推理时的迭代次数直接决定精度和速度的平衡。默认的迭代步数在中等规模图像上效果不错但如果你的图像分辨率较高建议适当增加迭代步数。评估时微调的步数和学习率如果你要自己使用评估时微调逻辑注意控制微调步数。步数太少适配效果不明显步数太多可能过拟合到当前图像对的重建损失上导致整体视差结构被破坏。我实测下来中等步数并且在微调过程中监控重建损失曲线效果最稳定。6.3 我遇到的两个典型问题第一个问题是显存不足。在处理高分辨率图像比如2K以上时相关体构建和迭代更新的显存占用比较高。我的解决办法是把图像切块推理然后对重叠区域做简单的加权融合。虽然论文里没有提供官方的切片推理方案但这个策略在RAFT类方法上非常成熟可以直接复用。第二个问题非常有意思在无纹理区域即使模型已经收敛输出的视差图也可能会出现轻微的水波纹状噪声。这个问题在评估时微调的过程中更容易出现。原因可能是重建损失在无纹理区域无法提供有效的梯度信号而平滑损失又会对细微的视差变化产生周期性惩罚。我的经验是适当降低平滑损失的权重同时把置信度掩码的阈值调高一些把更多疑似低置信度的区域排除掉。6.4 对代码结构的一点评价整体看完代码我觉得工程完成度在学术开源项目里算是相当高的。数据加载、训练、评测脚本比较齐全注释也清楚。尤其值得称赞的是他们提供了一个相对独立的微调脚本把评估时微调做成了一个开箱即用的模块。对于想在实际项目里快速上手使用的人这一点非常友好。7. 对零样本立体匹配范式的一些思考7.1 数据、模型、推理三者缺一不可读完整篇论文我最深的体会是零样本能力不是靠某一个单独的技术突破而是数据、模型、推理三个层面协同优化的结果。数据和模型的关系很多人已经意识到了好数据加上好模型跨域泛化能力才会有质的提升。但推理阶段的自适应这一块在过去很多工作中其实是被忽略的。大家都把模型训练完当做一个固化产物直接扔到测试环境里跑完全忽略了测试时可以利用自监督信号对模型进行调整。FoundationStereo把评估时微调作为标准流程的一部分我觉得这是对基础模型快速适配这个范式的一次有力验证。可以预见这种思路会在更多视觉任务上被借鉴。7.2 合成数据的潜力还没有被完全挖出来StableStereo展示了通过精确控制渲染过程来生成高质量训练数据的巨大潜力。以前大家用合成数据主要图的是免费获得真值对于数据的可控性挖掘得很浅。StableStereo的几何提示机制让我看到合成数据的价值不只是替代真实数据而是可以创造出真实世界中难以采集的场景。比如在自动驾驶场景里你想要涵盖各种极端几何形态的前方车辆、各种奇怪角度的路标这些在真实数据里很难系统性地采集到但在场景图里就是一次参数调整的事。7.3 下游应用的想象力零样本立体匹配的价值不仅在于省去了域内微调的麻烦。更重要的是它让立体匹配真正可以作为即插即用的组件嵌入到更大的系统中。三维重建、机器人抓取、AR/VR深度感知这些系统以前都需要针对各自的传感器和场景单独训练深度模型。现在有了零样本模型可以直接替换掉之前的模块效果还更好。我自己在做的一个机器人抓取项目中已经尝试把FoundationStereo作为深度估计的核心模块。之前用的方法在新物体上经常失败换了这个模型之后即使面对训练集中完全不存在的物体类型深度估计的鲁棒性也有了明显提升。8. 总结与个人评价最后说一下我个人对这篇论文的整体评价。FoundationStereo在零样本立体匹配这个方向上至少在目前看来是一个标杆性的工作。它厉害的地方不在于某一个单独的技术创新而是把数据规模、数据质量、模型结构、推理逻辑这几个层面系统地整合在一起产生了112的效果。对于普通从业者来说这篇论文最大的价值可能在于提供了两个可以直接复用的结论如果你想提升立体匹配模型的跨域泛化能力优先考虑扩充数据的几何多样性而不是盲目堆网络参数量。如果你的部署场景相对固定强烈建议在推理阶段加上自适应微调哪怕只是几个简单的自监督损失函数。踩过不少合成数据训练模型的坑之后我对工作的评价标准变得比较务实不看论文吹了什么只看拿来能不能用、好不好用。FoundationStereo在这一点上确实交出了一份让我服气的答卷。