前言
近年来,许多学者将SLAM与深度学习结合起来,用深度学习处理SLAM中的一个子问题,比如前端的特征点或描述子提取,帧间估计,处理光照、季节变化等给场景识别/回环检测带来的影响,语义SLAM,动态场景等,甚至还有end-to-end的方案,直接输出里程计结果。
论文:Unsupervised Learning of Monocular Depth Estimation and Visual Odometry with Deep Feature Reconstruction
Github:https://github.com/Huangying-Zhan/Depth-VO-Feat
这篇论文提出了一种无监督学习框架,使用双目数据进行训练,用于单目深度估计和视觉里程计。
这里的里程计仅仅是两帧之间(two-frame),还不能与state-of-the-art SLAM系统相媲美。
训练实例示例:
要求
此代码使用 Caffe 在 Python 2.7,CUDA 8.0 和 Ubuntu 14.04 上进行了测试。
Caffe:将./caffe
中所需的 layers 添加到您自己的 Caffe 中。记住在 Caffe 配置中启用Python Layers。
大多数需要的模型,训练的模型和结果都可以从这里下载。以下说明还包括项目的特定链接。
下载数据集和模型
该项目中使用的主要数据集是KITTI Driving Dataset。请按照./data/README.md
中的说明准备所需的数据集。
对于我们训练的模型和预先要求(pre-requested)的模型,请访问此处下载模型并将模型放入目录./models
。
深度
本部分介绍了立体对单视深度估计网络的训练。光度损失(Photometric Loss)用作主要监督信号。在该实验中仅使用立体对(stereo pairs:双目?)。
1.在./experiments/depth/train.sh
中更新$YOUR_CAFFE_DIR
。
2.运行bash ./expriments/depth/train.sh
。
训练的模型保存在./snapshots/depth
中
深度和里程计
在这一部分中,介绍了深度估计网络和视觉里程计网络的联合训练。空间对和时间对的光度损失用作主要监督信号。在该实验中使用空间(双目)对和时间对(即双目序列)。
为了便于训练,在深度实验中训练的模型用作初始化。
1.在./experiments/depth odometry / train.sh
中更新$YOUR CAFFE_DIR
。
2.运行bash ./experiments/depth_odometry/train.sh
。
训练的模型保存在./snapshots/depth_odometry
中。
深度特征重建损失(Feature Reconstruction Loss for Depth)
本部分介绍了立体对单视深度估计网络的训练。光度损失和特征重建损失都用作主要监督信号。在该实验中仅使用立体对。我们为此实验尝试了几个功能。目前,只有使用KITTI Feat的例子在这里显示。稍后将更新使用其他功能的更多详细信息。
为了便于训练,在深度实验中训练的模型用作初始化。
1.在./experiments/depth_feature/train.sh
中更新$YOUR_CAFFE_DIR
。
2.运行bash ./expriments/depth_feature/train.sh
。
训练的模型保存在./snapshots/depth_feature
中。
深度,里程计和特征
在这一部分中,我们展示了包括特征重建损失的训练。在该实验中使用立体序列。
利用Weerasekera等人提出的特征提取器,可以使用我们提出的深度特征重建损失来微调训练的深度模型和/或里程计模型。
1.在./experiments/depth_odometry_feature/train.sh
中更新$YOUR_CAFFE_DIR
。
2.运行bash ./expriments/depth_odometry_feature/train.sh
。
**注意:**下载Weerasekera et.al中提出的特征提取器的链接即将发布。
结果评估
请注意,此处提供的评估脚本使用不同的图像插值来调整输入图像的大小(即python的插值 v.s. Caffe的插值),因此定量结果可能与发布的结果略有不同。
深度估计
在Eigen Split中使用测试集(来自28个场景的697个图像 - 深度对)是评估深度估计结果的常用协议。
我们基本上使用monodepth提供的评估脚本来评估深度估计结果。
为了运行评估,需要npy
文件来存储预测的深度。然后运行脚本来评估性能。
1.在./tools/evaluation_tools.py
中更新caffe_root
2.生成深度预测并将其保存在npy
文件中。
python ./tools/evaluation_tools.py --func generate_depth_npy --dataset kitti_eigen --depth_net_def ./experiments/networks/depth_deploy.prototxt --model models/trained_models/eigen_split/Baseline.caffemodel --npy_dir ./result/depth/inv_depths_baseline.npy
3.评估预测
python ./tools/eval_depth.py --split eigen --predicted_inv_depth_path ./result/depth/inv_depths_baseline.npy --gt_path data/kitti_raw_data/ --min_depth 1 --max_depth 50 --garg_crop
我们发布了一些结果(逆深度),可以从这里下载。
视觉里程计
KITTI Odometry基准包含22个立体序列,其中11个序列具有真实值。11个序列用于视觉里程计的评估或训练。
1.在./tools/evaluation_tools.py
中更新caffe_root
2.要生成里程计预测(相对摄像机运动),请运行以下脚本。
python ./tools/evaluation_tools.py --func generate_odom_result --model models/trained_models/odometry_split/Temporal.caffemodel --odom_net_def ./experiments/networks/odometry_deploy.prototxt --odom_result_dir ./result/odom_result
3.在得到里程计预测之后,我们可以通过与真实位姿进行比较来评估性能。
python ./tools/evaluation_tools.py --func eval_odom --odom_result_dir ./result/odom_result
我们的里程计结果已发布,可从此处下载。