
上篇聊了3D目标检测的CenterPoint和PointPillars这些都是感知层面的工作。但机器人光看到还不够还得知道自己在哪、往哪走。这就是视觉里程计Visual Odometry, VO要解决的问题——通过相机图像估计机器人的运动轨迹。传统的视觉里程计依赖手工特征ORB、SIFT配合几何约束做位姿估计。这套方案工程上很成熟但在光照变化大、纹理缺失的场景下容易挂掉。深度学习进来之后情况有了很大改变。从传统VO到深度学习VO传统视觉里程计的流程你大概知道提取特征点、匹配相邻帧的特征、用PnP或本质矩阵分解算出相对位姿、做局部BA优化。每一步都是显式的几何计算。这套流程的问题在哪特征提取和匹配环节最脆弱。弱纹理区域白墙、地面提取不到足够的特征点动态物体行人、车辆会产生错误匹配光照突变会让特征描述子失效。深度学习的思路是能不能让网络直接从图像中学到一个好的特征表示甚至直接端到端地回归位姿最早的代表性工作有两个。一个是2017年Imperial College的DeepVO用CNN提取图像特征接LSTM做序列建模直接输出6自由度的位姿。另一个是TUM团队的不定时深度估计网络SfmLearner同时估计深度和相机运动。# DeepVO的核心结构示意 class DeepVO(nn.Module): def __init__(self): self.feature_net FlowNet() # 光流特征提取 self.pose_rnn nn.LSTM( input_size1024, hidden_size128, num_layers2 ) self.regression nn.Linear(128, 6) # 输出tx,ty,tz,r,p,y def forward(self, image_pairs): feats [self.feature_net(pair) for pair in image_pairs] feats torch.stack(feats, dim0) # (seq_len, batch, 1024) _, (h, _) self.pose_rnn(feats) pose self.regression(h[-1]) return poseDeepVO的意义在于证明了端到端VO是可行的。但它的精度其实不如传统方法主要原因是LSTM对长序列的建模能力有限误差会累积。深度估计路线MonoDepth系列视觉里程计有个孪生兄弟叫单目深度估计。如果知道每帧的深度图位姿估计就变成了一个几何问题解法很成熟。MonoDepth2017开创性地用单个CNN从单目图像预测深度。输入一张RGB图输出每个像素的深度值。训练时不需要深度GT而是用相邻帧的图像做自监督——用预测的深度和相机位姿把一帧投影到另一帧最小化投影误差。# 自监督深度估计的核心loss # source: 源帧图像, target: 目标帧图像 # depth: 网络预测的深度, pose: 源帧到目标帧的位姿 def photometric_loss(source, target, depth, pose, K): # 用深度和位姿做warp warped warp_image(source, target, depth, pose, K) # 计算投影误差 loss (warped - target).abs().mean() return lossMonoDepth22019改进了训练策略引入了最小重投影误差和自遮挡掩码效果提升明显。最小重投影误差的意思是对于目标帧的每个像素从所有源帧中取最小的投影误差作为loss这样可以自动处理遮挡区域。自遮挡掩码则是检测哪些像素在运动过程中被遮挡了不计算它们的loss避免产生错误梯度。DepthHint则进一步把稀疏的激光雷达深度作为监督信号精度更高。激光雷达的深度值是精确的虽然很稀疏一个像素可能只有千分之一的概率被激光打到但作为监督信号非常可靠。把自监督loss和稀疏监督loss加权组合网络能学到更准确的绝对深度。这条路线的好处是深度网络训练好后推理时只需要单帧图像就能输出稠密深度图配合PnP就能算位姿。整个过程比端到端方案更可解释也更容易调试。端到端位姿估计TartanVO和DROID-VO近年来端到端VO的精度终于追上甚至超过了传统方法。两个代表性工作是TartanVO和DROID-VO。TartanVO是CMU在2021年的工作。它的关键创新是训练数据——用Unreal Engine在大量虚拟环境中生成训练数据覆盖了各种光照、纹理、天气条件。具体来说他们在Unreal中构建了室内、城市、森林、地下等多种场景随机化光照方向、强度、物体纹理、动态物体运动等参数。总共生成了上百万帧图像和对应的精确位姿GT。网络结构是经典的encoder-decoder输入相邻帧对输出光流场和相机位姿。在多个真实数据集上TartanVO的精度超过了ORB-SLAM和VINS-Mono。DROID-VO2024走得更远。它把传统VO中的相关体correlation volume概念引入了深度学习框架。网络维护一个全局的相关体存储所有帧之间的特征匹配关系然后用GRU迭代更新。这个设计让它能处理长序列而且对动态场景的鲁棒性很好。DROID-VO在多个benchmark上刷新了记录被认为是目前最强的学习型VO之一。它的代码也开源了如果你要做相关研究值得一读。面试中常被问到的点面试官问视觉里程计最常追问的几个方向。第一个是尺度问题。单目VO天生有尺度模糊性——你无法从单目图像中恢复绝对尺度。深度学习方案也没解决这个问题网络输出的位姿是相对尺度的。解决办法是引入额外的尺度信息双目相机、IMU、或者已知尺寸的物体。第二个是漂移问题。VO本质上是增量式估计每一步的误差会累积。长时间运行后轨迹会严重漂移。解决办法是加回环检测Loop Closure检测到曾经到过的地方时做全局优化。这就是从VO到SLAM的升级了。第三个是泛化性。在某个数据集上训练的网络换到另一个场景可能效果很差。比如在城市道路训练的网络放到室内走廊里可能完全不准。这是学习型方法普遍面临的问题。TartanVO用大量虚拟数据做训练就是为了缓解这个问题。第四个是和传统方法的对比。面试时不要一味说深度学习方法好。传统方法ORB-SLAM3在特征丰富的场景下精度仍然很高而且有很好的可解释性和可调试性。深度学习方法的优势主要体现在弱纹理和光照变化场景。实际系统中两种方法融合使用也是常见做法。比如用传统方法做前端跟踪和回环检测用深度网络做特征提取和深度估计的增强两者互补。第五个是实时性。很多学习型VO在论文中报告的推理时间是基于GPU的。但实际机器人平台上可能只有嵌入式GPU比如Jetson Orin算力有限。模型量化和蒸馏是把学习型VO部署到嵌入式平台的关键技术。TartanVO经过INT8量化后在Orin上能跑到30Hz精度损失不到5%。第六个是评估指标。VO的评估通常用ATEAbsolute Trajectory Error和RPERelative Pose Error。ATE是估计轨迹和真实轨迹之间的绝对偏差RPE是相邻帧之间的相对位姿误差。不同数据集用的指标可能不一样KITTI用每百米的误差EuRoC用ATE的RMSE。面试时搞清楚这些指标的含义避免张冠李戴。给你的建议如果你想在这个方向做研究或者写项目经验建议从SfmLearner或者MonoDepth2入手。代码相对简单数据集好准备KITTI就行效果可视化也很直观。跑通基础版本后试着加入IMU数据做融合。视觉-惯性里程计VIO在工业界用得非常多面试时聊这个比纯视觉VO更有说服力。面试时聊VO重点讲清楚你理解不同方案的trade-off。端到端方案精度高但可解释性差几何方案可解释性强但依赖特征质量。能把这些对比讲清楚面试官会觉得你有系统性的思考。上一篇第297篇 点云3D目标检测——CenterPoint与PointPillars下一篇预告第299篇 RNN与LSTM——序列建模的基础