Monodepth2-基于自监督学习的单目深度估计模型

来源:游家吧
爱情和生活模拟rpg手机版

体育竞技 / 87.5mb

查看

Monodepth2是ICCV2019发表的自监督单目深度估计方法,为Monodepth升级版。其结合双目图像与单目序列自监督方法,含深度预测和位姿变换预测网络,引入多种优化策略获当时SOTA。本文介绍其复现过程,用KITTI数据集,经640x192训练及1024x320微调,abs_rel达0.104,还含数据集、代码结构等信息。

1. 简介

Monodepth一种通过自监督学习实现单目深度估计的技术,首次发表于ICCV 。它改进了的Monodepth方法。Monodepth使用标定过的双目图像,预测中间变量disparity(视差),然后用重构损失进行训练,以重建另一侧图像。有关Monodepth的实现细节,建议参考我的另一个项目。

在这个背景下,我们将Monodepth一步发展并引入了流行的一种单目序列自监督方法:通过预测单个相邻帧之间的位姿变换与深度图来进行重建。具体来说,我们试图通过一种单一的框架来整合这两种训练方式,即在同一个位姿变化框架内处理深度和位姿。在这个统一的框架中,有两个关键网络参与其中:一个是深度预测网络,该网络输入一张图片并输出相应的深度图,这是我们最终希望得到的结果;另一个是位姿变换预测网络,它输入一对图像,预测两者之间的位姿变化。通常情况下,我们选择左相机的一帧作为基准,并计算其前后两帧及右相机同帧图像之间的参考来训练。在训练过程中,我们选取了左相机中的一帧作为基准,然后通过深度图对这个基准帧进行变换(点云化),再根据预测的位姿变化将这幅基准图像转换为具有精确结构位置的三维点云。接着通过重投影的方式重建出整个场景,以此来评估模型的效果。总的来说,我们把Monodepth其他自监督方法结合起来,通过统一框架处理深度和位姿信息,进一步提高了模型的训练效果。这种方法不仅简单而且有效,能够在保持现有技术优点的同时,大大提升了对单目视觉任务的理解能力。

此外,Monodepth入了多种创新技术以增强其性能: 使用预训练ResNet模型:这种方法极大地提升了整体性能。 重构误差最小化损失函数:通过对不同视角计算重构误差并取最小值作为损失函数,使得对于受遮挡的物体更加鲁棒。 尺度适应深度图:通过将不同尺度的视差图重新缩放到原始尺寸,显著减少了深度图中的不合理的纹理特性。 自动移动目标剔除:通过自动识别并剔除运动物体,确保在监督的像素中都符合静态场景假设。这些改进技术共同作用,使得Monodepth够提供更加高效和准确的深度估计能力。

综合这些trick,Monodepth2得到了当时自监督深度估计的SOTA效果,但仍然与监督方法有着一定差距。

以下为本项目模型在KITTI测试图像上的预测结果:

论文:Digging Into Self-Supervised Monocular Depth Estimation

参考repo:monodepth2

2. 数据集

想象一下,在一个名为KITTI的数据集的世界里,无人驾驶技术正以前所未有的速度发展着。这是一个由模拟传感器驱动的车辆收集德国卡尔斯鲁厄环境中的数据的地方,它包含了双目彩色图像、深度图像、雷达点云等多样的感知信息,并且提供了常见的目标检测和实例分割任务所需标签。这个项目使用AI Studio上的KITTI压缩数据集,确保你只需下载jpg_images.tar.*即可访问所有原始数据。在训练期间,只用到双目图像,所以无需解压其他文件。通过这样的简化操作,你可以快速开始你的自动驾驶研究之旅!

KITTI数据集分为两种划分方式:官方标准,称为KITTI划分;另一种则是由Eigen等人提出的Eigen划分方法。在领域内,Eigen划分更为常见于评估过程。然而,解压整个数据集可能占用大量硬盘空间,因此我们对Eigen划分的测试集进行单独打包,并提供下载服务,以方便用户更高效地使用和分析数据。

3. 复现精度

首先训练输入分辨率为模型:加载预训练的ResNet型,使用批次大小为训练时长为,并采用Adam优化器,初始学习率设为-epoch后降为-在验证集上获得的最优模型实现了绝对误差比(abs_rel)为成绩,未能达到验收精度的标准。

随后,我们将使用在辨率上的最优模型,在入分辨率上进行finetune操作,采用batch size epoch数为Adam优化器,并设置学习率为-经过训练后,得到的模型abs_rel指标达到了我们的验收标准,即

请注意:为了保持数据增强过程的随机一致性,我们项目中对Dataloader的所有worker进行了预初始化处理,这导致了实验结果与worker的数量相关。因此,若要完全复现原始项目的实验成果,第一阶段应设置为worker,第二阶段则调整为worker。

训练日志链接:640x192 train log,1024x320 finetune log,640x192 test log,1024x320 test log

权重文件链接:pytorch resent18 pretrained weight,our best 640x192 weights,our best 1024x320 weights

4. 快速开始

Step 1:准备数据

In [1]

!cat ~/data/data15348/jpg_images.tar.* | tar -x -C ~/data/ !rm ~/data/data15348/jpg_images.tar.*登录后复制 In [2]

!tar -xzf ~/data/data124009/eigen_test.tgz -C ~/data登录后复制

Step 2:配置环境

In [3]

%cd /home/aistudio/work/monodepth2-paddle !pip install -r requirements.txt登录后复制

Step 3:训练

In []

# train the model at resolution of 640 x 192 !python train.py --model_name mono+stereo_model_640x192 --frame_ids 0 -1 1 --use_stereo --data_path ~/data/kitti --log_dir logs --num_workers 4 --weights_init weights/resnet18-pytorch登录后复制 In [7]

# finetune the best 640 x 192 model at resolution of 1024 x 320!python train.py --model_name mono+stereo_model_1024x320 --frame_ids 0 -1 1 --use_stereo --data_path ~/data/kitti --height 320 --width 1024 --load_weights_folder weights/best_640x192/ --log_dir logs --num_workers 4 --batch_size 4 --num_epochs 2 --learning_rate 5e-5登录后复制 In [11]

!python evaluate_depth.py --load_weights_folder weights/best_1024x320/ --eval_stereo --data_path ~/data/eigen --num_workers 4登录后复制 In []

!python demo.py --image_path assets/test_image.jpg --load_weights_folder weights/best_1024x320/登录后复制

5. 代码结构

├── assets # demo图像├── datasets # 数据集定义├── logs # 日志文件夹├── network # 网络定义├── splits # 数据集数据划分文件├── weights # 存放权重文件├── LICENSE ├── README.md ├── demo.py # 单张图像深度估计脚本├── evalute_depth.py # 测试脚本├── export_gt_depth.py # 计算groundtruth├── kitti_utils.py # 与KITTI数据集相关的功能函数├── layers.py # 基础模块定义├── options.py # 超参数定义├── trainer.py # 训练方式定义├── train.py # 训练入口脚本├── requirements.txt # 依赖包└── utils.py # 功能函数登录后复制

6. 复现心得

经过测试发现,如果在`paddle.grid_sample`函数中启用`grid.stop_gradient=False`,则需要同时设置`x.stop_gradient=False`才能避免错误发生。此问题已报告给PaddlePaddle官方。此外,相较于PyTorch的预训练参数,在使用PaddleHub中的Resnet进行寸图像的训练时,虽然效果不如PyTorch Hub显著,但PyTorch的模型在相同的条件下表现更好,能够达到准确率。

以上就是Monodepth2-基于自监督学习的单目深度估计模型的详细内容,更多请关注其它相关文章!

精品推荐