上交KLTNet替换经典KLT,TUM-VI轨迹误差降49%

KLTNet: Learning Sparse Feature Tracking for Robust and Accurate Monocular Visual-Inertial Odometry

Renbiao Jin, Danping Zou, Wenxian Yu

cs.CV

2026-08-25

上海交通大学提出可插拔稀疏追踪器KLTNet,用低分辨率稠密光流和三联图像块精修替换KLT,接入VINS-Mono后EuRoC平均ATE降34%、TUM-VI降49%。

这篇在解决什么

VINS-Mono、OpenVINS 这类轻量视觉惯性里程计(VIO)前端,默认用的是经典 KLT(Kanade–Lucas–Tomasi)追踪器:在相邻帧的局部图像块上对齐稀疏点,算得快,帧间定位也准。问题出在它几乎只看局部。走廊白墙、快速转头这类场景里,局部纹理不够,KLT 会跟丢或者漂;一旦漂了,后端状态估计会把误差吃进去。

把 RAFT、SEA-RAFT 这类稠密光流网络的全图流场直接采样成稀疏点,看起来能补上全局运动线索。上海交通大学这组实验说明,这样做并不稳:成对光流沿轨迹递归串起来,小误差会累积。端到端的 DROID-SLAM、DPVO、DVI-SLAM 能压时间漂移,但前端和后端绑死,没法当插件塞进现成的 KLT 式 VIO。

KLTNet 做的事更窄:保留「每条特征一条轨迹」的接口,把追踪器本身换成可学习、可插拔的模块。

方法

两段式,粗到细、稠到稀。

CoarseFlowNet 把相邻两帧缩到原分辨率的 1/4,骨架改自 SEA-RAFT,用 4 次 RNN 迭代估低分辨率稠密光流,再在上一帧特征位置双线性采样,得到当前帧的粗位置。分辨率故意压低,因为这一步只要把点送进局部精修的捕获范围,不求像素级精度,也避开代价随分辨率平方涨的相关体。

TriPatchRefiner 负责精修。特征第一次被检出时,在参考帧抠一块固定的 31×31 图像块 X0,整条轨迹寿命内不再更新。当前帧用粗位置抠块 Xj,再配上上一帧的 Xj-1,三块一起编码。相关编码器看 (X0, Xj-1) 和 (X0, Xj) 两份相关体,再拼上当前块的外观上下文、粗光流和历史位移先验,两个 MLP 分别吐出亚像素偏移和 2×2 各向异性置信权重。最终位置等于粗位置加偏移。

固定 X0 的理由很具体:VIO 默认跟的是静物,参考块应当是锚,不该像目标跟踪那样随外观更新。帧间匹配看不到的累积漂移,对照初始外观就能看见。

置信权重不是事后拟合的不确定度。训练时把一条轨迹上的观测送进可微多视图三角化:先用 Direct Linear Transform 给 3D 点初值,再做两步带权 Gauss-Newton。权重矩阵写成尺度乘旋转乘 diag(β, 1-β),允许两个图像方向权重不同;阻尼 λ 固定为 0.1,全局尺度因此可辨识。三角化损失回传到位置和权重两边,逼网络按多视图几何给观测分配相对权重。接到 VINS-Mono 时,权重去缩放归一化平面上的视觉重投影残差;接到 OpenVINS 时只用它做观测剔除,噪声模型不动。

训练分两阶段,都在 TartanAir 上。先训 CoarseFlowNet,再冻住它,用约 130 万条有效轨迹训精修器,序列 24 帧。前向按时间递归传播,反向每步断开上一帧预测,避免把整条时间链拉进反传。偏移用 L1,三角化损失权重 λtri=320。

结果

追踪质量在 Replica 上测:8 个室内场景切成 200 帧子序列,共 5273 条真值轨迹。KLTNet 在 1–3 像素阈值上精度最高。去掉参考块 X0,短区间(0–40 帧)中位误差从 0.25 像素升到 0.83,长区间(160–200 帧)从 0.59 升到 1.22。稠密流采样基线 RAFT-Sparse、SEA-RAFT-Sparse 在宽松阈值上更抗大误差,但低阈值精度不如 KLT,更不如 KLTNet。

接到现成 VIO 后(闭环全关,ATE 取五次平均 RMSE):

系统数据集KLTSEA-RAFT-SparseKLTNet
VINS-MonoEuRoC 平均 ATE (m)0.1870.1660.123
OpenVINSEuRoC 平均 ATE (m)0.1490.1940.099
VINS-MonoTUM-VI 平均 ATE (m)0.0970.0720.049
OpenVINSTUM-VI 平均 ATE (m)0.0720.0950.057

相对经典 KLT,VINS-Mono 在 EuRoC 降 34%、TUM-VI 降 49%;OpenVINS 在 EuRoC 降 33%、TUM-VI 大约 20%。EuRoC 上 OpenVINS+KLTNet 平均 0.099 米,和端到端稠密方法 DVI-SLAM 的 0.098 米持平。RAFT-Sparse 在 OpenVINS 上把平均 ATE 从 0.149 拉到 0.219,「更鲁棒的稠密流」直接当追踪器,对滤波式后端不友好。

消融(VINS-Mono, EuRoC 11 条平均):只开 CoarseFlowNet 是 0.317 米;加上 TriPatchRefiner、仍用固定各向同性权重降到 0.153;可微三角化监督的各向异性权重再降到 0.123。重投影负对数似然监督几乎吃不到各向异性的好处(各向同性 0.139,各向异性 0.140)。点少到每帧 25 个,系统还能跑,ATE 0.206 米。

室外 KITTI-360 上,KLTNet 的相对平移误差在 8 条序列全部最低,相对 KLT 的平均 trel 降 27.8%。光照突变的 UMA-VI 五条序列,起终点误差也全部最低,其中 conference-csc1 从 KLT 的 4.50 米降到 1.93 米。自采白墙走廊上,DM-VIO 在带俯仰滚转的 seq2 跟丢,KLT-VINS-Mono 和 DPVO 在蛇形急转的 seq3 漂得厉害,KLTNet-VINS-Mono 三条都稳住。嵌入式 Jetson AGX Orin 上两个子网络走 TensorRT,论文称实时;PC 端是 LibTorch、没开 TensorRT。图里给了 25/50/100/150 个点的吞吐对比,正文没有写出具体 FPS。

为什么重要

这是给已经在跑 VINS-Mono / OpenVINS 的人准备的前端补丁,不是又一个要推倒重来的端到端 SLAM。接口还是「点 + 轨迹」,后端几乎不用改;VINS-Mono 只换残差权重,OpenVINS 连噪声模型都保留。走廊、快速旋转、光照跳变这些经典 KLT 翻车的场景,收益最明显。

换追踪器比换整套 SLAM 便宜,但不是免费午餐:CoarseFlowNet 要 GPU,经典 KLT 在 CPU 上就能跑。论文展示了 Orin 上能实时,没给出和 CPU-KLT 的功耗、延迟对照,部署前得自己测。

消融把贡献拆开了:单独稠密流初始化不够精,单独学个方差也不够,固定参考块才是压长时间漂移的关键。想跟进,优先复现「粗流 + 固定 X0 精修」这一段,权重监督是后面那一截增益。

局限与存疑

作者自己写了两条硬限制。粗到细依赖粗流把点送进局部精修的捕获范围,粗流一旦偏出这块窗口,精修救不回来。当前公式默认场景点基本静止,动态物体不在设计里。

另外几处论文没补上。Replica 追踪精度曲线没有给出每个阈值的精确百分比,只能读出「1–3 像素上最高」。自采低纹理数据的 ATE 只出现在柱状图里,正文没有数字。Orin 上「实时」没有对应的帧率和分辨率表。置信权重被明确说成相对观测权重,不是度量标定过的协方差,OpenVINS 只用它做剔除,说明这套权重还不能当标准不确定度用。训练只在 TartanAir,室外 KITTI-360 能泛化,但没有跨相机内参、运动模糊、rolling shutter 的专项压力测试。闭环全程关闭,报的是纯里程计误差,不能直接当建图系统的成绩单。

术语

原文与代码

社区讨论

相关论文

全部论文解读