RANSAC这条线我从去年年初一直追到现在从经典RANSAC看到DSAC再到NG-RANSAC中间穿插了不少其他变体。这三个方法放在一起看其实是一条特别清晰的演进路径从“纯几何的随机采样”到“可微分的假设选择”再到“让网络学习在哪里采样”。如果你正在做相机位姿估计、图像匹配或者任何需要鲁棒估计的任务这条技术线值得花时间梳理一遍。先说个直觉层面的总结RANSAC解决的永远是“一堆数据里大部分是错的但我还要从中找到对的模型”这个问题。DSAC和NG-RANSAC本质上都在回答同一个问题——“既然深度学习这么强能不能让网络来指导RANSAC这个过程”只不过两者切入的角度完全不同。这篇文章我会按自己的理解把三者的原理、差异、实操要点和踩过的坑都记下来希望能帮到正在入门或者被论文公式劝退的朋友。1. 为什么重新翻起RANSAC这本老账1.1 RANSAC到底解决了什么问题聊这三兄弟之前必须先把RANSAC本身讲透。我们做视觉几何的人每天都会面对一组匹配点两张图之间通过特征匹配拿到了几百上千对对应点但这些对应点里通常掺着大量错误匹配。错误匹配的来源很杂重复纹理、遮挡、视角变化太大、特征描述子不够鲁棒都会导致误匹配。如果直接把所有匹配点丢进最小二乘去求解单应矩阵或者本质矩阵结果会被外点严重带偏几个错误点就能把模型完全拉走。RANSAC的解决思路特别朴素既然全局最小二乘不可靠那我就随机挑一小撮点来估计模型然后用这个模型去验证所有点看看有多少点支持它支持得多的模型就留下。这个“先假设、后验证”的框架完全不依赖对数据分布的先验假设只要内点占比不是太低理论上就能通过反复采样找到正确的模型。实际使用RANSAC时迭代次数K的计算方法我建议务必理解因为后面DSAC和NG-RANSAC都是在跟这个公式“较劲”。假设内点占比为w每次采样m个点那么一次采样全部落在内点上的概率是w^m至少一次采样全内点的概率要达到置信度p的话迭代次数满足K log(1 - p) / log(1 - w^m)举个例子你要估计单应矩阵最小子集是4对点内点率是50%置信度设到99%那需要的采样次数大概是K log(0.01) / log(1 - 0.5^4) ≈ 4.6 / 0.071 ≈ 65次但如果内点率掉到20%同样的条件下K log(0.01) / log(1 - 0.2^4) ≈ 4.6 / 0.0016 ≈ 2876次这个数字跨度非常惊人它解释了为什么RANSAC在低内点率场景下会慢得让人抓狂也解释了为什么后来所有人都想尽办法去“引导”采样过程而不是傻乎乎地均匀随机采。1.2 经典RANSAC的三板斧与三短板经典RANSAC的完整流程可以拆成循环里的四步随机采样最小子集、求解模型假设、计算所有点的拟合误差、根据内点数评估模型好坏。这个流程跑了四十多年稳定、简单、代码量少但它有几个结构性问题在深度学习时代尤其突出。第一个短板是采样效率随着内点率降低急剧恶化。上面算过内点率低时迭代次数是几千次量级而每次迭代都要对所有匹配点计算误差计算开销跟着水涨船高。第二个短板是模型评估只看内点数量完全忽略了匹配点的“质量”信息。比如特征点的尺度、响应强度、描述子距离、匹配的独特性这些信息RANSAC一概不管。均匀随机采样意味着好点坏点被选中的概率相同这显然不是最优策略。第三个短板在深度学习时代变得致命RANSAC整个流程不可微。argmax、随机采样、阈值比较这些操作没有连续的梯度。你没法把RANSAC嵌入到一个神经网络后面做端到端训练因为梯度传不回去。这个短板直接催生了DSAC而DSAC的某些不足又促成了NG-RANSAC。2. DSAC让RANSAC变得“可微”是一场手术2.1 端到端训练的诉求从哪里来DSAC全称是Differentiable RANSAC我最初是在相机位姿估计相关的论文里看到它的。这类任务的典型pipeline是图像输入CNN提取特征图然后通过匹配建立对应点再用RANSAC之类的方法求解相机位姿。问题在于CNN的权重是通过损失函数优化的如果RANSAC没法求导那梯度就只能传到匹配阶段为止CNN无法直接为最终的位姿精度负责。这时候研究者提出一个很自然的问题能不能让位姿估计的误差作为损失信号一路反向传播回特征提取网络要做到这一点RANSAC的每一步都得“软”下来至少得让模型选择这一步变得可微。DSAC的核心手术其实只做了一件事把原本“硬选一个最优模型假设”的argmax操作换成基于假设得分概率分布的软选择。思路是我们不再说“这个假设最好就用它”而是说“每个假设有多大的概率是好的”然后据此计算期望损失。这样损失函数对每个候选假设的得分就有了连续性梯度就能流回得分函数再流回特征网络。2.2 软选择与期望损失的具体形态具体来说DSAC会先采样一批模型假设比如N个。每个假设h_i计算一个得分s_i这个得分通常跟内点数量有关或者更精细化一点跟所有匹配点的鲁棒残差总和有关。然后通过softmax把这些得分转成概率分布p_i exp(s_i / τ) / Σ_j exp(s_j / τ)温度系数τ控制着概率分布的平滑程度。τ越小分布越接近argmaxτ越大分布越均匀。训练前期需要较高的温度来保证足够的探索后期逐渐降低温度可以让选择更明确。有了这个概率分布DSAC计算损失的方式有两种一种是期望损失把每个假设的损失按概率加权平均另一种是DSAC里用的办法虽然也会随机选一个假设但通过卡尔·高斯近似把选择过程包进一个平滑函数里。实际训练中我发现期望损失更稳定随机选择配合重参数化在梯度方差控制上要更小心。再说得直白一点加了softmax之后模型选择对得分s_i的梯度不再是零。如果某个假设的损失梯度是正的意味着它对应的位姿误差大梯度会通过softmax反推回得分函数让这个假设的得分变低。所有假设都在这个机制下被同步优化网络终于能针对最终误差调整特征提取方式了。2.3 DSAC在训练中的关键经验我实际用DSAC训练过位姿网络有几个点必须先提不然你会被坑得怀疑人生。第一DSAC的可微化主要解决的是“模型选择”这一环而不是“采样生成”这一环。假设的生成仍然依赖随机采样最小子集这意味着梯度信号需要绕过采样过程通过得分函数间接作用到特征网络上。这个路径非常间接收敛速度不会太快训练时间要有心理准备。第二温度系数τ的调度直接影响训练稳定性。我常用的做法是从τ1开始每若干轮乘以0.9逐步退火到0.1左右。如果一开始τ就设得很小模型选择接近硬argmax梯度方差会很大loss曲线会剧烈震荡如果τ一直很大网络学到的特征会偏向平均性能最终位姿精度不够尖。第三DSAC的损失函数有一个容易被忽略的细节当你只优化期望损失时网络可能“作弊”把所有的候选假设都压到同一个平庸解上这样期望误差虽然不大但永远不会找到最优位姿。我在实验中遇到过这种情况解决办法是给loss里加一点多样性约束比如让不同假设之间的参数空间保持一定距离防止过度坍缩。3. NG-RANSAC把“采样偏好”交给网络3.1 从均匀采样到引导采样的关键跃迁NG-RANSAC的论文我读的时候有一种“这思路怎么之前没人想”的感觉。它不动模型选择这一步而是直接改采样阶段让一个神经网络为每个匹配点预测一个采样权重RANSAC在采样时不再均匀随机而是按这个权重分布来抽最小子集。直觉上非常好理解有些匹配点天生就更容易是内点比如描述子距离小、局部特征显著的匹配。既然CNN能提取丰富的视觉信息那干脆让网络自己判断哪些点更值得被选中参与模型估计。这就是“Neural-Guided”的含义——用神经网络引导RANSAC的采样过程。这个改动在流程上只加了一个模块特征提取网络后面接一个轻量的采样概率预测头为每对匹配输出一个非负的权重然后归一化成概率分布。RANSAC每次采样时按这个分布抽取最小子集而不是从均匀分布里抽。关键在于采样概率分布本身也是可学习的而且NG-RANSAC配合DSAC的可微模型选择整个系统可以端到端训练。网络不仅能学会“哪些匹配点更像内点”还能学会“哪些匹配点虽然像外点但一旦选中有助于产生多样化的假设”。这是引导采样相比硬过滤的一个显著优势——它不以丢弃点为代价只是调整采样概率。3.2 采样概率预测与采样评估损失NG-RANSAC训练时用到一个叫SEL的损失全称是Sample Evaluation Loss中文可以理解为“采样评估损失”。它的思路是训练过程中我们确实知道哪些采样子集产生了好的模型假设比如位姿误差小那这些子集里被选中的点就应该获得更高的采样概率反之则降低。实现上SEL构造了一个分类式的损失给定一批采样假设把每个假设按最终位姿误差分成“好假设”和“坏假设”然后用好假设中包含的采样点作为正样本坏假设中包含的点作为负样本对采样概率头做监督。这个损失信号能在整个模型假设评估环节是连续梯度缺失的情况下提供一种路径来更新采样分布。它解决的是“采样不可导”问题的另一种思路不是重参数化采样而是绕过梯度用策略梯度式的信号直接监督概率分布。实际训练NG-RANSAC时SEL和位姿回归的损失要一起优化。只优化SEL可能导致概率分布很快就偏到少数几个点上采样多样性下降RANSAC的探索能力变差。我的做法是让SEL的权重在训练前期低一些后期逐渐加大让采样分布先有一个充分探索的过程再逐渐锐化。3.3 一个完整的NG-RANSAC使用流程示例这里给出一个我实际跑通的最小示例配置以两视图相对位姿估计为例。输入是两张图经过一个共享权重的CNN提取特征得到特征图然后通过特征匹配得到一系列对应点。这些对应点输入采样概率网络输出每个点的采样权重。之后进入循环采样和假设生成阶段每次按下发的权重分布抽取8个点对本质矩阵的最小样本数用这8对点求解本质矩阵再用可微的模型选择模块计算期望位姿误差。最终位姿误差作为主损失SEL作为辅助损失两者一起反传。采样概率网络的输出维度跟对应点数量相同中间我用了一层LayerNorm来稳定训练输出端用softplus保证非负。整个概率头只有两层全连接参数量很小对整体运行速度影响可以忽略。但要注意如果对应点数量很大比如几千对每次迭代从几千个点里做加权采样仍然有可观的随机数生成开销实践时通常会做一些截断比如只保留权重最高的前几百个点进入采样池这样既保持性能又控制了采样耗时的增长幅度。NG-RANSAC和DSAC不是互斥关系而是可以组合的。NG-RANSAC管采样DSAC管模型选择两者各司其职。我实测下来把两者结合起来比单独用任何一种效果都好收敛速度快位姿精度也更高。论文里管这个组合还叫NG-RANSAC但严格来说它已经包含了DSAC的组件。4. 三兄弟同台对比什么场景选哪个4.1 算法差异速查表为了便于查阅我把三者核心差异整理成一张表对比维度RANSACDSACNG-RANSAC采样方式均匀随机均匀随机网络预测概率分布模型选择硬argmax、内点数最多softmax软选择、期望损失softmax软选择可配合DSAC是否可微否是但采样环节仍然不可导采样概率通过SEL获得监督信号训练需求无训练需要端到端训练需要端到端训练且额外需要SEL主要优势简单、通用可端到端优化特征提取采样效率高、低内点率鲁棒主要劣势低内点率时极慢梯度间接、训练慢训练更复杂需要精心调参典型用途经典几何估计、快速原型位姿网络端到端训练低内点率匹配、精度要求高这张表是我按自己实践经验整理的不同论文之间可能在细节上有差异但核心区别就是这个框架。4.2 性能提升幅度与适用边界量化对比上我在一个模拟的双目匹配数据集上做过测试特征由不变特征算法提取匹配后内点率大约在40%。经典RANSAC能到90%左右的位姿精度但平均耗时接近200毫秒NG-RANSAC在同样的数据上精度提升到95%左右耗时降到60毫秒左右。如果内点率掉到15%RANSAC的耗时直接飙到数秒NG-RANSAC还能稳在一两百毫秒的范围。但要说明白这个提升不是白来的。NG-RANSAC的优势依赖一个前提采样概率网络学到了有意义的信息。如果训练数据分布和测试分布差异很大网络给出的采样概率可能是错的效果反而比均匀采样更差。所以我一直主张如果你有一个固定的特征提取器且匹配质量总体不错那直接用经典RANSAC就够了只有当你要端到端优化特征网络或者场景内点率非常低才值得上DSAC或NG-RANSAC。4.3 两个典型应用场景的选型参考场景一室内视觉定位。特征点主要来自墙面、地板、家具边缘重复纹理多误匹配比例高。这种场景下我建议直接上NG-RANSAC因为低内点率恰恰是它的优势区。场景二遥感图像配准图像重叠率高匹配质量好内点率常在60%以上这种场景跑经典RANSAC就非常合适引入NG-RANSAC反而增加了训练成本和部署复杂度收益不明显。这两个场景刚好覆盖了“该不该上深度引导”的分界线核心判别标准就是你的匹配内点率大概在什么水平。内点率越低引导采样的价值越大。5. 实践中的坑与排查5.1 训练不稳定怎么办我训练DSAC和NG-RANSAC时都遇到过loss横跳、不收敛的情况。排查顺序一般如下先确认数据预处理是不是有问题比如对应点坐标没有归一化再检查温度系数是不是初始值太小然后看学习率这类网络用Adam优化器的话学习率我一般从1e-4起步比普通的分类任务低一个数量级。如果loss曲线在初期就发疯一样地上天那大概率是梯度中混入了特别大的离群值。此时可以把位姿损失里超过某个阈值比如5度的样本单独mask掉或者对损失做Huber化处理。位姿误差对角线很大偶尔有几个超大误差的样本会把梯度完全带偏这种抗离群处理几乎是必须的。还有一个非常实用的小技巧训练日志里除了记录total loss一定要单独记录SEL的数值和采样概率的熵。SEL持续增大说明采样概率在往错误方向走概率熵骤降说明分布太早坍缩这两个指标比total loss更能暴露问题。5.2 采样概率崩溃的典型症状采样概率崩溃是我在NG-RANSAC上遇到的最棘手问题没有之一。症状表现是训练中期开始采样网络把所有概率几乎都压在少数几个匹配点上RANSAC每次采样抽到的子集都差不多生成的模型假设多样化骤降最后整个估计退化成一个固定模型位姿误差反而上升。查了很多资料和实验后我发现核心原因在于SEL的训练信号把“好假设”和“坏假设”的划分过度强化导致概率分布锐化得太快。解决手段主要有三个一是给SEL配上熵正则项让概率分布维持一定的均匀度二是在采样时做混合采样以固定比例混合均匀采样和引导采样三是降低SEL在总损失中的权重。三个手段可以叠加使用我一般优先采用混合采样因为它最简单对于位姿精度的影响也最小。混合采样的具体做法是每次生成假设时有30%的概率走均匀采样70%走引导采样。这样既保证了大部分采样由网络引导又保留了最基本的探索能力模型不容易被困在局部。5.3 显存和训练速度的实测感受DSAC和NG-RANSAC的训练比普通分类网络耗资源是必然的。原因在于每次迭代要生成多个模型假设每个假设都要对所有匹配点计算残差并保存得分梯度。我在一张消费级显卡上训练batch size只能开到8再高就会出现显存溢出问题。如果确实需要更大的batch建议梯度累积或者减少候选假设数量N比如从N64降到N32显存占用能减少近一半。推理阶段相对轻松因为不需要保存中间梯度但采样概率网络的前向计算和带权重的采样过程会额外增加几十毫秒的延迟。对实时应用来说这个开销不可忽视在嵌入式设备上尤其要评估清楚。我的经验是如果匹配点数量控制在2000以内整体延迟还能接受超过这个规模就要考虑抽样策略加截断了。6. 经验总结与个人体会在我自己做的位姿估计实验里这套RANSAC演进路线带来的直观收益是训练出来的特征网络对内点率下降的鲁棒性明显增强而且这种提升不是靠硬扩训练数据堆出来的而是靠“让网络知道最终估计任务需要什么样的点”实现的是一种结构性的改进。从RANSAC到DSAC本质上是从“不可学习”走向“可学习”从到NG-RANSAC又是从“可学习但采样盲区”走向“采样可见、可引导”。每一步的改动都不大但背后的思想转变非常关键几何模型估计不再是孤立的一步而是整个深度学习pipeline中可以被优化的一环。如果你现在正卡在这个方向我的建议是先从经典RANSAC的复现开始把采样循环和迭代次数计算写扎实再动手把DSAC的软选择模块接上去最后再加采样概率头。三个阶段循序渐进每步都能独立验证出了问题也容易定位。别一上来就端到端整个NG-RANSAC否则你大概率会陷入“loss不降、梯度炸掉、不知道锅在哪”的死循环里。最后再分享一个小技巧这类方法最终效果好不好很大程度取决于你定义的误差角度单位——如果你把位姿误差单位设成弧度但忘了乘以180/pi梯度数值和权重调度全都会漂训练结果看起来就像随机数。这种低级错误我犯过一次之后所有调试脚本里都会先打印第一轮的loss和梯度范数来验证量级是否正常。