新闻中心
Monodepth2-基于自监督学习的单目深度估计模型
Monodepth2是ICCV2019发表的自监督单目深度估计方法,为Monodepth升级版。其结合双目图像与单目序列自监督方法,含深度预测和位姿变换预测网络,引入多种优化策略获当时SOTA。本文介绍其复现过程,用KITTI数据集,经640x192训练及1024x320微调,abs_rel达0.104,还含数据集、代码结构等信息。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

1. 简介
Monodepth2是通过自监督学习进行单目深度估计的一种方法,发表于ICCV2019,是发表于CVPR2017的Monodepth的升级版。Monodepth基于标定过的双目图像,通过预测中间变量disparity(视差)来对一侧图像进行变换重构另一侧图像,并以重构损失进行训练,有关Monodepth的复现可以参考我的另一个项目。

Monodepth2在此基础上加入了比较流行的单目序列自监督方法,即通过预测单目相邻帧之间的位姿变换与深度图来重构相邻帧。Monodepth2将两种训练方式统一到了基于一个位姿变换的框架下,上图为其的框架结构及针对部分问题的改进。框架中包含两个网络,一个是深度预测网络,给定一张图片,预测深度图,这个也是我们最后想得到的网络;另一个是位姿变换预测网络,给定一对图片,预测两者之间的位姿变换,一般给定的是相邻的前后两帧,此网络用于辅助训练;训练时选取左相机某一帧作为基准,计算深度图,其前后两帧及右相机同帧图像进行作为参考,计算位姿变换(右相机位姿变换为常数,不需要进行预测),利用预测得到的深度图将基准图像变换为点云、进行位姿变换、再重投影得到重构图像计算重构损失。
除此之外,Monodepth2引入了一些新trick来提升性能:
- 使用resnet预训练模型,极为显著地提升性能。
- 对于每个像素点,计算由不同视角进行重构所产生误差的最小值作为loss,使得loss对于受遮挡的物体更加鲁棒。
- 将不同尺度的视差图resize到原始尺寸对原图进行,显著降低了深度图中不合理的纹理特性。
- 自动mask掉会动的物体,使得收到监督的像素都满足静态场景的假设。
综合这些trick,Monodepth2得到了当时自监督深度估计的SOTA效果,但仍然与监督方法有着一定差距。
以下为本项目模型在KITTI测试图像上的预测结果:


论文: Digging Into Self-Supervised Monocular Depth Estimation
美图云修
商业级AI影像处理工具
50
查看详情
参考repo: monodepth2
2. 数据集
KITTI是一个自动驾驶领域常用的数据集,其由配置了传感器的汽车于德国卡尔斯鲁厄采集,数据中包含了双目彩色图像、深度图像、雷达点云等传感数据,并提供目标检测、实例分割等常见CV任务的标签。本项目使用AI Studio上的KITTI压缩数据集,全部数据可从此处下载。在训练过程中只需要双目图像,所以只解压jpg_images.tar.*即可。
KITTI数据集存在两种划分,一种是官方标准划分,称为KITTI划分,另一种是Eigen et. al.提出的Eigen划分方式。领域内更常用Eigen划分进行评估。由于在评估时需要点云数据来计算深度图的groundtruth,解压全部点云数据集占用硬盘空间过大,我们对Eigen划分的测试集进行了单独的打包,可在此处下载。
3. 复现精度
首先训练输入分辨率为640x192的模型:加载resnet18预训练模型,batch size 12,epoch 20,优化器Adam,初始学习率1e-4,15个epoch后减小为1e-5。原文和仓库并没有提供最优模型的选择方法,我们保存验证集loss最低的模型为最优模型。此时得到的最优模型abs_rel为0.109,未达到验收精度。
之后将以640x192为输入分辨率的最优模型在1024x320的输入分辨率上进行finetune,batch size 4,epoch 2,优化器Adam,学习率5e-5。得到的模型abs_rel为0.104,达到验收标准。
注意:为了固定数据增强的随机性,项目中使用setup_seed对Dataloader中的所有worker进行了初始化,这就导致了结果是和worker的数量相关的,想要完全复现项目中的结果,第一部分训练的num_workers=16,第二部分训练的num_workers=4。
| abs_rel | sq_rel | rms | log_rms | a1 | a2 | a3 | |
|---|---|---|---|---|---|---|---|
| 640 x 192 原文精度 | 0.106 | 0.818 | 4.750 | 0.196 | 0.874 | 0.957 | 0.979 |
| 1024 x 320 原文精度 | 0.106 | 0.806 | 4.630 | 0.193 | 0.876 | 0.958 | 0.980 |
| 640 x 192 复现精度 | 0.109 | 0.880 | 4.903 | 0.200 | 0.868 | 0.955 | 0.979 |
| 1024 x 320 复现精度 | 0.104 | 0.798 | 4.619 | 0.192 | 0.879 | 0.958 | 0.980 |
训练日志链接: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!pyIn [11]thon 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
!python evaluate_depth.py --load_weights_folder weights/best_1024x320/ --eval_stereo --data_path ~/data/eigen --num_workers 4In [ ]
!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的反向传播存在Bug,当grid.stop_gradient=False时,x.stop_gradient必须为False,否则会报错,已提交PaddlePaddle issue。
- Paddle Hub中的Resnet预训练参数与PyTorch Hub的不同,使用Paddle的预训练参数在640x192上训练最好只能达到0.113,加载PyTorch的预训练模型可达到0.109。
以上就是Monodepth2-基于自监督学习的单目深度估计模型的详细内容,更多请关注其它相关文章!
# ai
# qq钓鱼网站建设
# 天津抖音seo关键词排名技术
# 电器网站建设管理
# 湖南整合营销网络推广seo
# 进行了
# 官网
# 升级版
# 发表于
# 两种
# 最优
# 美图
# 一言
# 中文网
# 重构
# udio
# python
# 灵寿个人网站推广哪家好
# 常德网站搜索优化多少钱
# 淘宝客还能网站做推广码
# 东莞广告网站推广策划
# seo优化价格为0
# 融安县seo优化服务
相关栏目:
【
行业资讯67740 】
【
技术百科0 】
【
网络运营39195 】
相关推荐:
如何自己加装固态硬盘
市盈率300是什么意思
汽车的type-c接口是什么
win7怎么关闭360壁纸屏保
如何把一个命令后台运行
如何修改cad中的命令
夸克是什么用途
苹果16系统有哪些问题
如何给电脑加装固态硬盘
电动车power灯亮是什么意思
如果公司ttm市盈率为负数是什么意思
苹果16有哪些系统
ssd固态硬盘如何选择
sofa是什么意思
夸克的答案为什么不对
春运抢票何时开始抢票的
typescript有什么作用
单片机怎么定义字符长度
5G手机导航怎么旋转
为什么都做折叠屏手机呢
什么是泛域名解析
win10系统如何打开cmd命令
如何辨别固态硬盘坏块
折叠屏手机为什么有黑点
如何4k对齐固态硬盘
如何增加固态硬盘
苹果16要升级哪些功能
如何在命令行执行一个jar
ka是什么意思
笔记本如何使用固态硬盘
mac如何使用vi命令行
为什么进行域名解析
vs怎么编写typescript
路由器上的power按钮是什么意思
j*a二数组怎么创建
1kb等于多少字节
1s等于多少ms
命令行如何启动应用程序
为什么都用typescript
awful是什么意思
忐忑不安是什么意思
学typescript需要什么基础么
excel中datediff函数怎么用
typescript哪个最好
什么是typescript
typescript多久能学完
bored是什么意思
ts什么意思
苹果16有哪些改善
单片机蓝牙怎么开启设备


2025-07-22
浏览次数:次
返回列表
thon 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