SFVO: Decoupled Confidence-Guided Stereo-Flow Visual Odometry with Bidirectional PnP
Kai Zhang, Guoyang Zhao, Jun Ma
cs.CV, cs.RO
2026-09-18
港科广用预训练UniMatch出视差和光流,再以旋转平移分开的置信度做双向PnP。未见校园UGV序列上ATE 4.91米,立体ORB-SLAM3为12.28米。
学习式视觉里程计大多还是单目。单目有尺度模糊,要靠 IMU 或额外的尺度恢复。双目天生有度量尺度,但端到端建模又贵又绕,深度学习双目 VO 一直比单目少。
与此同时,立体匹配和光流已经能给出很密的对应。视差把像素变成带尺度的三维点,光流把这些点跟下一帧的二维观测连上,本来就是一堆 3D–2D 约束。缺的是:哪些点可信,以及它们该怎么分别贡献旋转和平移。
SFVO 不从图像直接回归位姿。两帧校正后的双目图,用预训练 UniMatch 估左右视差和前向、后向光流,对应只留在原分辨率的 1/8,省显存。视差用焦距和基线换成度量深度。
关键设计是旋转、平移分开的置信度。图像运动里,平移项随深度衰减,旋转项与深度无关;双目深度误差还随距离平方放大。远点对旋转有用、对平移很吵,一个标量置信度没法同时表达这两件事。于是对前向、后向各预测旋转通道和平移通道,共四张图。
位姿用可微的双向 PnP,旋转和平移交替更新。旋转走加权 Wahba 问题,SVD 出 SO(3);平移把点投到视线的垂直平面上,解加权线性系。训练时从单位旋转和零平移起步,测试可用上一帧运动热启动。对应损失用图像重建的 SSIM,位姿用平移 L1 和旋转角误差,置信度有下限 0.15 的单边正则,避免权重全塌到接近 0。
光流和立体网络用公开 UniMatch 权重初始化,在 KITTI 00–08 和 EuRoC 部分序列上各训 5 个 epoch,四张 RTX 4090,学习率 1e-4。
室内外都测了,对照包括单目 DPVO、单目惯导 BotVIO,以及关掉回环的立体 ORB-SLAM3。单目方法做尺度对齐,双目方法只做刚体对齐。
| 序列 | 方法 | ATE (m) | RPEt (m) | RPEr (deg) |
| EuRoC MH02 | SFVO | 0.087 | 0.002 | 0.033 |
| EuRoC MH02 | ORB-SLAM3 | 0.037 | 0.024 | 0.548 |
| KITTI 09 | SFVO | 9.830 | 0.016 | 0.039 |
| KITTI 09 | ORB-SLAM3 | 2.077 | 0.017 | 0.044 |
| 未见 UGV | SFVO | 4.906 | 0.043 | 0.312 |
| 未见 UGV | ORB-SLAM3 | 12.282 | 0.090 | 0.784 |
EuRoC 九项指标里 SFVO 拿下七项最好,三帧到帧的平移、旋转 RPE 全是最低。MH04 上 ATE 0.217,差于 ORB-SLAM3 的 0.112,但 RPE 仍更低,作者把它归因于没有后端优化、误差会累。KITTI 09、10 的平移 RPE 最低,ATE 仍明显差于有局部窗口的 ORB-SLAM3。
未见数据是校园 UGV、工业双目、RTK-GNSS 真值,外观和车速都与 KITTI 不同,且未参与训练。SFVO 的 ATE 相对基线大约低 60%。置信度消融:共享一张置信度时 KITTI 09 的 ATE 是 15.006,分开后 9.830,并且 5 个 epoch 就到最佳,共享版要 40 多个 epoch。可视化上,远处分到更高旋转置信度,近处分到更高平移置信度,行人车辆被压低,这些都没有用深度标签直接监督。
480×640 时峰值显存约 930MB,4090 上端到端约 45ms,4060 Ti 约 130ms。求解器每轮约 1.1ms,训练走 20 轮,推理热启动大约 7 轮。
把已经很强的对应网络当成几何前端,VO 只学「信任谁」和「怎么解位姿」,训练负担小,也更容易换更新的立体或光流骨干。旋转平移分开置信度,是这篇里真正可复用的几何先验:远点保旋转、近点保平移,一个标量做不到。
它仍然是帧到帧。要跟带局部建图和关键帧的 SLAM 比全局轨迹,ATE 会吃亏,KITTI 09 的 9.83 对 2.08 已经说明了。强项在相对运动精度和跨平台迁移,不在无漂移的长轨迹。
没有后端,MH04 这种低 RPE、高 ATE 的组合几乎是设计后果,不是意外。KITTI 只拿 09、10 做测试,训练用了 00–08,和不少 VO 论文同一划分,数字不能当成完全没见过的道路。UGV 只有一条序列,60% 这个数字的方差未知。
对应网络冻在低分辨率,姿态够用,但丢了高分辨率细节。动态物体靠置信度抑制,没有显式语义。代码写「将发布」,复现目前还要等。若目标是闭环级的全局精度,它补的是前端,不是整套 SLAM。