单目深度估计 | Real-Time Monocular Depth Estimation using Synthetic Data 学习笔记

本文介绍基于学习的单目深度估计方法,利用合成数据训练模型可解决依赖大量标定数据等问题,但存在信号 - 偏差。研究分单目深度估计模型和风格迁移域自适应两阶段,通过Pytorch训练。实验表明该方法比现有技术效果好,不过光照和饱和度突变时效果欠佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


会议:CVPR 2018

标题:《Real-Time Monocular Depth Estimation using Synthetic Data with Domain Adaptation via Image Style Transfer》

论文链接: http://openaccess.thecvf.com/content_cvpr_2018/papers/Atapour-Abarghouei_Real-Time_Monocular_Depth_CVPR_2018_paper.pdf

本文仅作为个人学习笔记分享,图片来自于论文,如有侵权,请联系删除。

1. 摘要

基于学习的方法预测单目相机的深度,这些年逐渐的呈上升趋势。然而这些方法要么依赖于大量已标定的深度数据,或者使用二次监控信号预测差距作为中间步骤,会导致模糊和伪影等其他现象。 利用完美像素点的合成数据训练一个深度预测模型能够解决这些问题但是会引入信号-偏差的问题。这就是为什么不能将基于合成数据训练的模型运用到实际情况。 随着图像风格迁移的发展以及它和领域适应(domain adaptation)间的联系,我们利用的风格迁移和对抗训练经过在大量生成数据上训练模型,之后从单张真实世界的彩色图片预测图片每个像素点的深度。实验结果表明,我们的方法比当今最先进的技术效果更好。

2. 创新点和局限性

论文的创新点主要为:

    1. synthetic depth prediction, 一个具有跳跃连接的轻量级网络直接监督训练的模型,可以根据高质量的合成的综合深度训练数据来预测深度。
    1. domain adaptation via style transfer,通过风格迁移进行域自适应。通过样式转换来解决域偏差问题。
    1. efficacy, 一种新的高效的估计像素深度的单眼相机深度估计方法。
    1. reproducibility,再现性。基于公开易获取的数据集,算法简单高效。

局限性:
光照突然变化和风格迁移的饱和度突然变化时,效果不太好。

相关工作包括单目深度估计,域自适应 和 图像风格迁移三个方面

在这里插入图片描述

3 研究

我们的研究包括两个阶段,分别为两个同时训练的独立的模型。

3.1 阶段1-单目深度估计模型。

基于为游戏应用程序设计的图形化城市环境图片合成数据集训练深度估计模型。

3.1.1 损失函数

在这里插入图片描述

重建损失函数,生产优化模糊平均所有可能的值,为不是选择一个锐度。

在这里插入图片描述

3.1.2 训练细节

通过Pytorch上实现训练,参数为(momentum β1 = 0.5, β2 = 0.999, initial learning rate α = 0.0002),联合损失系数公式中λ = 0.99。

3.2 阶段2-通过风格迁移的域自适应

3.2.1 损失函数

在这里插入图片描述
在这里插入图片描述

3.2.2 训练细节

此网络由两个卷积层,9个残差模块和两个up卷积将图像变换到原始的输入尺寸。
通过Pytorch上实现训练了,参数为(momentum β1 = 0.5, β2 = 0.999, and initial learning rate α = 0.0001),联合损失系数从公式7中得到。这里λ = 10。

在这里插入图片描述

在这里插入图片描述

4 实验结果

实验环境:GeForce GTX 1080 Ti, 耗时22.7ms, 帧率约为44fps

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

图7 模型结合后,使用在本地城市环境中捕获的数据,我们在不进行任何数据训练的情况下生成了清晰、连贯、可信的视觉深度图。

在这里插入图片描述

在这里插入图片描述
Table3 是将我们的模型与目前最先进的几个基于Make3D数据集进行训练的单目深度估计模型对比,我们的方法在数值上不占优势。

图8,我们训练好的模型在Make3D数据集上测试结果。尽管这个数据集和我们训练所用的数据集不同,但效果还是很好的。

在这里插入图片描述
图9 失败的例子,大多是因为曝光过强和阴影区,说明光照突然变化和风格迁移的饱和度突然变化时,效果不太好。

5 结论

我们曾经提出了一种基于学习的单目深度估计方法。利用为游戏应用程序设计的图形化城市环境图片合成数据,以监督的方式训练出一个高效的深度估计模型。然而,由于这两组数据所属的域分布大不相同,这个模型不能很好的预测真实场景。依靠风格迁移和分布之间的距离这些新的理论,我们提出了一种基于GAN风格迁移的算法,调整我们的真实数据来适合深度估计模型中生成器近似的分布。虽然一些孤立的问题仍然存在,实验结果证明我们的方法在处理同一问题上比目前最先进的方法效果更好。

深度估计系列文章:

单目深度估计 | Learning Depth from Monocular Videos using Direct Methods

单目深度估计 | Real-Time Monocular Depth Estimation using Synthetic Data with Domain Adaptation via Image

单目深度估计 | Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unknown Cameras

### 关于Self-Supervised Monocular Depth Estimation论文的复现方法与代码 #### 复现方法概述 为了成功复现Self-Supervised Monocular Depth Estimation的相关工作,通常需要遵循以下几个方面的要求: 1. **数据准备** 自监督单目深度估计的核心在于利用未标注的数据进行训练。例如,《PackNet:3D Packing for Self-Supervised Monocular Depth Estimation》提到使用视频序列和相机运动信息作为输入[^2]。因此,可以选择公开可用的数据集如KITTI、Cityscapes或DDAD(如果适用),并确保数据预处理阶段能够提取连续帧及其对应的相机姿态。 2. **网络架构设计** 不同的论文采用了不同的网络结构来提升深度估计的效果。例如: - DIFFNet引入了高分辨率编码器,并通过注意力机制优化跳接连接[^1]。 - HR-Depth则专注于增强 shortcut 连接的质量以及采用 fSE 特征融合算子以更好地保留语义和空间信息[^4]。 在实际复现时,可以根据目标需求选择合适的网络结构或者尝试结合多种技术特点。 3. **损失函数定义** 损失函数的设计对于自监督学习至关重要。常见的做法包括但不限于光度一致性损失 (photometric consistency loss),几何正则化项等。特别值得注意的是,《Digging Into Self-Supervised Monocular Depth Estimation》一文中提到了几种改进措施——最小重投影损失、自适应遮罩损失及全分辨率多尺度采样方法,这些都可以显著改善最终结果[^3]。 4. **实验环境配置** 确保开发环境中安装有必要的依赖库版本匹配(比如PyTorch/TensorFlow)。同时也要注意硬件资源是否满足大规模神经网络训练的需求。 #### 示例代码片段 以下是基于PyTorch框架的一个简单示例,展示如何构建基础版的自监督单目深度估计流程的一部分: ```python import torch import torch.nn as nn from torchvision import models class Encoder(nn.Module): def __init__(self): super(Encoder, self).__init__() resnet = models.resnet18(pretrained=True) layers = list(resnet.children())[:8] self.encoder = nn.Sequential(*layers) def forward(self, x): return self.encoder(x) class Decoder(nn.Module): def __init__(self): super(Decoder, self).__init__() # Define decoder architecture here... def forward(self, x): pass # Implement decoding logic def photometric_loss(img1_warped, img2): """Compute photometric reconstruction error.""" l1_loss = torch.abs(img1_warped - img2).mean() ssim_loss = SSIM()(img1_warped, img2).mean() # Assume an implemented SSIM function exists. total_loss = 0.85 * ssim_loss + 0.15 * l1_loss return total_loss # Instantiate encoder & decoder... encoder = Encoder().cuda() decoder = Decoder().cuda() # Example usage during training loop: for batch_data in dataloader: imgs, poses = batch_data['imgs'], batch_data['poses'] features = encoder(imgs.cuda()) depths_pred = decoder(features) # Predicted inverse depth maps. warped_img = warp_image(depths_pred, poses) # Function to perform warping based on predicted depths and camera poses. loss_value = photometric_loss(warped_img, target_img) optimizer.zero_grad() loss_value.backward() optimizer.step() ``` 上述代码仅为示意性质,具体实现还需参照原论文中的详细算法描述调整参数设定与功能模块。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值