首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
动态环境下的视觉SLAM与SfM:干扰源分类与处理策略
📅 2026/10/16 23:52:57
✍️ 爱科研究院
👁 阅读 3,247
动态环境四个字出现在综述标题里听起来像一句套话但真正跑过一版视觉SLAM的人都知道一个在走廊里来回走动的人就足以让原本稳定的位姿估计在十几秒内现出原形。运动恢复结构Structure from Motion也一样街景里出现行人和车辆时离线重建出来的点云会长出一片“幽灵点”。Visual SLAM与SfM在静态场景下拥有成熟的理论框架工程上也有很多可复用的工具一旦环境变动态问题就从“怎么解方程”切换成“怎么先知道哪些方程不能信”。这篇综述把视觉SLAM、基于运动恢复结构的离线重建以及多视图几何统一到同一条“动态环境”主线下。上篇先交代问题定义、干扰源分类、主流处理策略和评估逻辑。对准备做动态场景实验的算法开发者来说这一半内容基本决定了你后面能不能看懂各种新方法的出发动机对刚接触三维视觉的新手而言它也是一张很合适的地图。下面是我读上篇时整理的笔记带着自己的理解讲不负责逐句转述原文。1. 动态环境为何是SLAM与SfM的“照妖镜”1.1 静态假设是两套算法共同的地基视觉SLAM通常按时间顺序处理图像实时估计相机自身位姿同时增量维护一张地图SfM则拿到一段图像序列或一组照片离线恢复相机轨迹和三维稀疏点云。两者在实现细节上差得很远但共享同一套几何前提场景主体是静止的图像之间观察到的是同一个刚体世界在不同视角下的投影相机的运动是引起图像变化的唯一主要因素。这个“静态假设”平时不太会被察觉因为大多数公开测试序列都干干净净。可它几乎是两套算法的地基。特征点的匹配依赖它本质矩阵和基础矩阵的估计依赖它光束法平差BA构建的误差项也依赖它。一旦场景里出现真正的运动物体这些计算环节里就会混入“按静物来处理”的误匹配。综述里反复强调一个点动态问题不是某个模块的缺陷而是数学框架自身边界之外的东西。你可以在特征提取阶段换更鲁棒的描述子也可以在位姿优化阶段加更强的核函数但只要模型假设仍然是“世界静止”运动物体就永远是一个需要单独处理的例外。所以动态SLAM的研究重点从来不是把某个基础算法改得更好而是先教会系统分辨哪些观测属于例外。1.2 动态目标在四个核心环节上“拆台”读综述时我习惯把动态干扰拆到具体环节里看。上篇虽然没有用“四个环节”这种说法但对照原文描述动态目标主要冲击的是特征匹配、鲁棒位姿估计、局部地图维护和全局优化。特征匹配阶段运动目标自身往往纹理丰富。比如一件带条纹的衣服一辆反光的车身它们的特征点数量可能比背景墙还要密集。前后帧里这些点在图像坐标系下确实可以从一个位置移动到另一个位置但它们对应的三维世界点其实并不固定。于是常规最近邻匹配会给出一个“看起来正确、实际物理错误”的对应关系。鲁棒位姿估计阶段常用RANSAC一类方法从匹配点里筛外点。动态目标通常只占画面一部分少量外点混在内点里RANSAC还有可能扛得住但如果运动物体占据画面比例很高或者纹理极强外点甚至可能形成伪内点把正确运动模型往错误方向拉。这是很多算法在动态环境下精度骤降的直接原因。局部地图维护和全局优化就更隐蔽。动态点的特征一旦被误插入地图后续帧就会反复往那个错误的三维位置投影形成持续的误差源。BA阶段为了“让所有点都舒服”会不自觉地调整相机位姿去迁就那几颗动态点最终表现为轨迹缓慢漂移、重投影误差居高不下。这也是为什么很多纯SLAM系统在动态走廊里跑一分钟没事跑十分钟就开始飘。1.3 综述把“动态”的范围划得比我预想更宽我原本以为动态环境指的就是行人和汽车结果上篇给的定义要宽得多。除了物体本身的位移它还包含物体的形态变化、遮挡造成的外观突变以及由物体运动引起的阴影和反光变化。用一句话来概括凡是让同一世界点的图像投影在时间上不稳定的因素都可以算进动态环境的考察范围。这个边界有一个很实际的意义。很多工程文档里把动态物体检测等同于“人车识别”可真正影响视觉定位的往往还包括移动的树影、玻璃幕墙上的反射、被风吹动的衣摆以及一段墙壁上忽明忽暗的光照。这些因素不改变三维几何位置却改变光度信息特征是同一个特征点但描述子可能完全变了。当然综述也画了一条红线相机自身的运动不被视为环境动态因为那是需要求解的量不是干扰。这个区分看似多余实际上非常必要——如果不先定义清楚后续分类就会把“场景运动”和“观测运动”混在一起。动态估计的第一步不是识别什么在动而是明确什么不可以动。2. 干扰源分类先把“动态”拆成一张表2.1 按运动性质划分刚性、非刚性、微动上篇对动态干扰源的分类第一条主线是按物体的运动性质拆成刚性、非刚性和微动。刚性运动最好处理。人体躯干、车辆、箱子它们整体做三维刚体变换依然满足刚性几何约束。算法只需要判断“这个三维点簇是否经历了同一个刚体变换”就能大概率把动态区域筛出来。这也是早期动态SLAM大多数从几何方法入手的原因成本低、不依赖预训练模型。非刚性运动就麻烦得多。人的四肢、飘动的旗子、弯曲的布料它们的局部仍然刚体但整体不再满足任何单一三维变换。基础矩阵或本质矩阵只能约束点在极线上的位置不能约束它必须是某个刚体上的点。于是对极几何能给出一个“弱否定”却很难给出“强确认”。微动又是另一个极端比如树叶在风中抖动、水面波纹、远处草地的轻微摆动。这些运动幅度小、像素位移浅在特征点层面很难和噪声分开。它们通常不会让SLAM崩溃却会让局部地图区域持续抖动最终表现为中等程度的漂移和模糊。综述把这三类分开列出是为了提醒读者没有一种单一判定方法能同时覆盖它们。2.2 按时间尺度划分短暂遮挡、长期占用、反复经过第二种分类角度是时间尺度这个角度在工程里特别重要。短暂遮挡指行人从镜头前一闪而过或者车辆快速穿越视野。它造成的最大问题是特征跟踪中断相机瞬间失去一小片区域的匹配点。对视觉SLAM来说短暂遮挡最危险的时候正是平移或旋转剧烈的时候系统失去定位锚点容易产生位姿跳变。长期占用更棘手比如一辆停在路边的车或者靠在墙边不动的人。它们在几何上是“静止”的常规几何方法会判定为静态点并插入地图。等到物体启动开走地图里就会出现一块残留的“幻影结构”不仅污染建图结果还会在后续定位时诱导位姿估计。上篇特别强调这类物体属于“潜在动态”而不是“当前动态”需要语义先验来提前识别。反复经过则体现为同一位置不断出现、消失的动态占用比如商场出入口、地铁闸机旁边。它既不形成稳定的地图点也不制造明显的幻影却会不断打断局部区域的匹配连续性。长期跑下来系统在这一带的关键帧质量会明显下降。三种时间尺度对应的问题不一样这也为后面章节选择“几何先验还是语义先验”提供了依据。2.3 光照和反射动态环境里最常见的“隐形干扰”读到这里我才意识到之前自己调试建图系统踩过的大坑其实被这张分类表覆盖得很清楚。某个用玻璃幕墙建筑的场景白天和下午各跑一遍重建出来的墙面点云完全不同不是几何错了是描述子在反射区域的匹配对不上。这类现象在综述里被归为“光度动态”并在上篇里被单独列出来提醒。阴影是最典型的例子。一棵树在阳光下移动阴影地面本身的几何结构没动但在图像上阴影边界处的像素灰度发生剧烈跳变。特征点提取器可能在阴影边界附近找到大量关键点而前后帧这些点的描述子差异巨大。匹配失败还是轻的更麻烦的是它可能把位姿估计往错误方向拽。反光和透明材质同样麻烦。水面波纹、汽车漆面、玻璃窗户都会让原本应该一致的光度模型失真。综述指出这类“光度动态”通常不能用几何约束来解决因为投影位置的几何关系没有错只是观测量不可信。它们需要额外的先验比如已知类别属性、多曝光融合、或者把特征提取器设计得对灰度变化更钝感。2.4 一张表把干扰源收拢起来我读综述时做了一张最小化的汇总表方便对照后续方法分别解决哪个问题。这张表不是原文原样的章节结构而是我把上篇内容按自己的理解整理出来的。干扰类型典型样例主要破坏环节几何方法效果语义方法效果刚性运动行人、车辆、推车误匹配、地图幻影较好较好非刚性形变四肢摆动、布料、旗帜匹配、位姿优化较弱中等微动树叶、水面、草丛局部地图抖动几乎无效无效长期占用路边停靠车辆、静止人地图幻影、定位漂移无效好光度动态阴影、反光、光照突变特征描述、匹配无效部分有效这张表直接决定了你选方法时的优先级。以后看到某个算法声称“在动态场景下效果好”我会先去查它解决了表格里哪一行而不是直接去看精度曲线。3. 上篇方法主线如何给特征点打上“动态标签”3.1 几何路径对极几何和多视图一致性上篇梳理的方法最早的一支以几何约束为主核心思路是“用静态框架反推谁不符合静态框架”。输入是对应点证据输出是动态点的概率或硬标签整个流程不依赖语义类别信息。基础矩阵和本质矩阵是这套路线的核心工具。理想静态场景下所有正确匹配都严格落在极线上。一旦某个点对应一个动态物体它就会明显偏离极线约束在RANSAC循环里被当成外点。单目双帧几何约束就能提供不错的初筛多视图一致性则更稳因为同一个动态点会在多帧之间反复呈现不一致置信度可以累计。几何方法的优点是泛化性好。你不需要知道“那个东西是人还是车”也能判断它有问题。它的缺点同样明显。对微小运动不敏感对非刚性形变约束偏弱对“潜在动态”完全无能为力。一个静止站在路边的人几何方法一定会把它的特征纳入静态地图直到它起身才后知后觉地开始处理。综述说得很直接几何是必要手段但不是充分手段。3.2 语义路径把“会动的东西”提前列进黑名单语义先验是动态SLAM在深度学习流行后的大分支。目标检测或实例分割网络在跟踪线程之外每帧跑一次把行人、车辆、骑车人等类别对应的像素区域找出来直接禁止这些区域的特征点进入位姿估计。有些方法更进一步把这些区域的特征点标记为“动态候选”在后续几何校验里再确认一遍。这种路径最大的好处是能处理长期占用。车停在路边不动几何方法看不出问题语义方法却能提前把它认出是“可运动的物体”主动从地图构建里排除。人在门口站着不动也一样系统知道它不是一个“固定的雕塑”迟早会移动于是干脆不把它计入地图。但语义路径也有自己的坑。分类器永远长着一双“它认识的眼睛”只识别训练集里见过的类别。公园里的滑板少年、商场里的清洁机器人、工地上的吊臂凡是没进过训练集的新物体都会被当成静态背景。真实动态环境永远有新类别上线这是我在工程里对语义方法保持谨慎的根本原因。上篇也承认纯语义方案的召回率上限受模型类别覆盖度限制。3.3 时序路径让系统从“历史的动静里”学习时序先验走的是另一条路通过连续多帧的变化模式来识别动态区域。最简单的做法是看光流和背景模型是否一致。静止背景的光流场会随着相机运动呈现整体平滑的模式而动态物体上会叠加快速且独立的光流分量。把这种“不一致”提取出来就给动态区域打了标签。这类方法对完全未知的动态物体有效因为它不依赖类别表。只要物体在画面里产生独立于背景的运动时序模型就能捕捉。它也很适合在线SLAM场景因为跟踪线程本来就要计算帧间特征匹配额外统计光流一致性成本可控。时序方法的短板是响应速度。它必须观察到连续若干帧后才敢判定“这里有动态”在物体第一次进入画面的短时间内系统仍然会把这些点视为正常点。遇到快速穿过镜头的物体等标签打上时它已经给位姿估计贡献了至少一两帧的误差。所以时序先验适合做“确认”不太适合做“预测”。很多综述里提到的混合做法其实就是让语义负责预测、时序负责确认、几何负责兜底。3.4 三种先验怎么配合才是上篇真正想讲的事把三种路径分开看都不复杂难的是组合。动态SLAM里常见的一条流水线是先让语义分割网络给出“疑似动态区域”再用极线约束检查这些区域的特征点在几何上是不是真的违背了静态模型最后用帧间时序信息做平滑防止单帧误检造成标签抖动。这个顺序背后有一套逻辑。语义先验回答“它可能动”因为人、车天然具备运动能力。几何先验回答“它正在动”因为一旦运动确实发生它必然违反多视图几何一致性。时序先验回答“它一直在动”用来过滤单帧噪声、填补几何方法暴露的盲区。三个答案重叠得越多动态标签的置信度就越高。这套组合逻辑在综述里不算新但让我印象深刻的是它对“失败模式”的描述。如果只用语义会把静止的车辆排除掉地图稀疏对定位精度不利。如果只用几何会漏掉潜伏的动态物体。如果只用时序会产生检测延迟。各自的失败模式几乎互补所以上篇总结出的方向不是挑选某一种而是设计一套“谁先发表意见、谁最后拍板”的流程。4. 动态场景下的评测逻辑不能只看轨迹误差4.1 动态序列评测ATE高不代表动态处理得好看到这里有一个容易踩的坑评测SLAM在动态场景下的表现不能只报绝对轨迹误差ATE。ATR衡量的是相机位姿和真值轨迹的偏差但它不区分误差来源于动态干扰还是来源于普通累积漂移。一个系统可能因为没有把动态物体剔除干净而恰好产生了“抵消性误差”ATE数值反而好看。更麻烦的是动态场景本身的真值就很有讲究。真值轨迹通常由一个外部定位系统提供比如运动捕捉设备。但这个真值只描述相机运动不描述场景里行人的位置。于是同一个序列、同一个位姿真值有人在评测时把动态物体全部手动标注出来有人在评测时完全不管。两套标准跑出来的指标根本没有可比性。综述在上篇建议评测至少应该分两层看底层看追踪连续性也就是有没有明显跳变和跟踪丢失上层看地图质量包括动态区域有没有被错误插入静态地图、静态背景有没有被误删。只报一个ATE数字等于把所有问题都压到一条曲线里信息量太低了。4.2 SLAM与SfM对动态物体的“期望”并不一致视觉SLAM和SfM虽然共享很多几何原理但它们的输出目标不同导致动态处理的评价标准也不一样。SLAM在线运行每一帧都要给出相机位姿它最关心的是动态干扰会不会造成位姿跳变和地图污染。所以动态物体能不能被“临时屏蔽”比它能不能被“准确重建”更重要。SfM离线运行目标是重建整个场景的三维结构。它更关心动态物体是否产生了错误的三角化点。对街景重建项目来说行人和车辆是纯粹的噪声重建系统希望把它们彻底滤掉甚至连痕迹都不要留。但在另外一些应用里比如影视制作的动作捕捉动态物体的结构重建本身就是目标。同一条几何流程前者把动态当垃圾扔掉后者把动态当宝贝取出评测标准自然不能共用。这也解释了为什么综述上篇会反复强调“预留分类任务”。用同一套SLAM系统去处理动态环境你先得定义好自己的产品要“剔除动态”还是“重建动态”方法路线会完全不同。我见过不少项目在方案讨论阶段争论用哪种检测网络实际上应该先争论产品到底要哪个结果。4.3 公开数据集能说明问题但不能说明全部问题动态SLAM领域有几种常见的数据集形态室内运动捕捉序列包含大量行人活动的视觉惯性序列以及自动驾驶场景的影像数据集。它们各有优势也各有软肋。室内场景真值精确、动态目标可控但环境外观单一行人数量最多也就十几个无法覆盖长期占用和光度动态。自动驾驶序列场景丰富但真值计算成本极高还会引入传感器坐标系对齐误差。最重要的这些数据集都默认有固定语义类别车辆、行人、骑行者。如果一个算法的动态处理能力完全依赖语义分割的质量换个没有“滑板车”类别的环境效果马上跳水。综述上篇提到的一个通用建议是把算法拿到没有训练分布的重叠的序列上做压力测试。动态区域占比从5%逐步增加到40%看系统在哪个区间开始失效。这个压力测试思路很适合工程团队复制因为它能直接画出一条“动态鲁棒性曲线”比单个数据集上的百分之零点几的精度差异有说服力得多。4.4 我发现的最关键“评测变量”动态比和动态速度如果让我从评测逻辑里抽出两个最关键的变量我会选动态比和动态速度。动态比是指动态区域占画面面积的比例。比例很低的场景鲁棒估计本身就能处理不需要动态模块比例超过一定值后内点数量不够即使完美剔除动态也会造成退化。动态速度则是像素层面的运动速度。慢速目标容易被时序方法忽略快速目标容易形成大位移导致光流失败。这两种变量在真实环境里彼此独立一辆车慢慢驶过路口可以占大面积一支笔快速挥动可以占小面积。上篇虽然没有给出某个统一公式但它对评测条件的强调已经暗示理想场景应该覆盖“高/低比例”和“高/低速度”的笛卡尔积。5. 读过上篇之后我更倾向记住的五条判断5.1 静态点越充足动态处理越要保守很多人误以为动态处理的责任是把所有运动物体都标出来其实不是。关键目标是保证静态点数量足够且干净位姿估计才能稳定。如果某个疑似动态区域只占画面很小一部分即使把它漏掉RANSAC也能用大量静态内点把外点压住。这时候强行开启动态检测反而可能把静态点误删降低内点数量。我自己的建议是动态模块的输出不要做成二值标签而是做成“信任程度”。低于阈值的位置不参与位姿估计不代表它们不能保留在地图维护的候选区里。这样即使标签出了错系统损失的也只是一部分信息而不是直接丧失一片区域的跟踪能力。5.2 语义模型的“未知类别”问题比精度更致命语义路径表现出的最终性能往往不取决于模型在公开数据集上的mAP而取决于它能不能对未知物体保持“不知道自己不知道”的谦逊。在工程现场新动态物体是常态一只飞过的鸟、一个倾倒的纸箱、一台自动导引车都可能不属于任何预设类别。追求更高的分割精度边际收益有限真正有用的设计是让语义模块输出“未知动态候选”的置信度交给几何时序模块去确认。5.3 几何校验永远不要省哪怕你有最贵重的语义模型因为语义模型再强它也会遇到训练分布之外的区域。几何校验是唯一不依赖类别的“物理安检”你不需要知道物体是什么只需要确认它是否符合刚体世界的基本规则。把语义检测框里的特征点全部跳过而不做几何确认等于把系统命运完全交给训练集的覆盖率。做过一次真实实验就会明白训练集之外的动态物体往往最容易让纯语义方案现出原形。5.4 时序平滑模块不是锦上添花是必须的特征点动态标签如果单靠单帧判定一定会在连续帧间来回抖动。同一面墙这一帧被误判为动态下一帧恢复静态就会导致地图点被反复插入、删除对BA和地图维护的影响非常大。加上时序平滑后标签更新会考虑历史状态误检的杂波被抑制系统整体稳定度显著提升。代价只是少数帧的理解延迟在大部分场景里可以接受。5.5 面对真实项目先测量“动态场景分布”再选方案最后一个判断偏工程。无论是做扫地机器人、园区巡检还是AR定位第一步都不是选模型而是先测量产品看到的到底属于哪种动态干扰。是人物反复穿行还是车辆长期停靠还是阳光造成的阴影迁移对照上篇那张干扰源分类表每种分布对应的最优方法几乎都不一样。先花一周统计真实数据里的动态占比、动态速度和动态类别比试十个开源方案都管用。如果把上篇浓缩成一个动作我会把它想象成给每一帧画面建立一张“哪些位置暂时不值得相信”的信任地图。静态与动态的分离从来不是把所有运动物体扔出画面而是让系统在每一个时刻都知道该把信任放在哪里。对我个人来说读完上篇收获最大的不是多记了几种方法名而是学会了先看问题分类再决定用什么工具。这篇笔记的下半部分再接着整理语义几何融合、稠密重建和实时性之间的取舍。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/16 23:52:57
关联规则实战:从Apriori到FP-树频集算法的选型与落地
2026/10/16 23:52:57
DeepSeek-R1本地部署三端落地:Ollama 0.3.12精准适配指南
2026/10/16 23:52:57
海康VM视觉平台:图形化搭建工业视觉检测方案
2026/10/17 0:48:33
雨花区语文辅导中心,赏识培训:语文提分,关键是“精批精改”
2026/10/17 0:48:33
PCA主成分分析:从二维点云中提取主方向与臂展长度
2026/10/17 0:48:33
运动反应训练设备价格多少?2026年一套报价与选型要点全解析
2026/10/17 0:48:33
Octop聚合监控面板:从数据采集到终端渲染的工程实践
2026/10/17 0:48:33
Audacity 资源包实战:降噪、压缩、均衡与批量处理全指南
2026/10/17 0:43:33
DS5100B光纤交换机运维指南:Zone配置、环境搭建与故障排查
2026/10/17 0:02:58
NetSpot 实战:用信道分析与频宽优化解决 Wi-Fi 卡顿
2026/10/17 0:02:58
C++ split() 字符串分割的五种实现与性能实测
2026/10/17 0:02:58
R语言坐标轴范围设置:从xlim/ylim到coord_cartesian的完整指南
2026/10/16 1:17:36
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/16 1:17:35
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/16 1:17:35
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/16 1:17:35
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/16 18:46:48
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/16 18:46:46
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)