0
点赞
收藏
分享

微信扫一扫

《CamLessMonoDepth:Monocular Depth Estimation with Unknown Camera Parameters》论文笔记

一天清晨 2022-04-03 阅读 80

参考代码:None

1. 概述

PS:文章的方法核心在于位姿估计网络中添加相机内参估计,并添加到整体自监督pipeline中去。这里本人在实际的数据集上进行测试确实也证明了该方案可行性,不过需要注意的是相比内参前期给出的方案,其在训练前期的收敛性是不如内参给定的场景的,不过在相同epoch训练完成之后,自测效果在一些case下更好一点。

2. 方法设计

2.1 整体pipeline

文章方法的整体pipeline见下图所示:
在这里插入图片描述
在上图中展示了文章方法pipeline,其深度估计网络输出inverse的深度和像素重要性权重,位姿估计网络输出相机位姿与相机内参,之后通过光度重构误差最小化完成自监督训练过程。

对于深度估计网络部分文章对其解码器部分中的上采样操作使用学习的方式实现,从而提升深度在细节的表达能力,该方法对应到Pytorch中便是nn.PixelShuffe()操作,可以参考:
TORCH.NN.MODULES.PIXELSHUFFLE
下图展示的是便是pixelshuffle在做超分辨率任务过程中像素重排列的过程:
在这里插入图片描述
ref:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network

此外,对应对应部分网络的初始化也是需要注意的细节,否则会产生较为明显地棋盘格效应,对此在参数初始化的时候需要格外注意,可以采用下面链接中的初始化方式进行缓解:
ICNR
其原理也是比较简单的也就是将之前参数在随机位置处初始化换成了对应超分方格使用同一参数初始化,也就是如下图中的样子:
在这里插入图片描述
ref:Checkerboard artifact free sub-pixel convolution

上述图中的参数初始化过程在numpy环境下可以使用repeat()实现:

kernel_data_np = np.random.random((2, 1, 3, 3))
kernel_data_np_r = np.repeat(kernel_data_np, 2, axis=0)
print(kernel_data_np)
print(kernel_data_np_r)

那么在Pytorch环境下可以使用下面的这个函数实现:
TORCH.REPEAT_INTERLEAVE

2.2 自监督约束

在自监督的过程中为了避免光照问题对自监督过程带来影响,这里通过预测每个像素权重的形式对自监督光度重构误差进行加权,该加权mask可以描述 ∑ t ∈ [ 0 , 1 ] \sum_t\in[0,1] t[0,1],则这里的光度重构误差可以描述为:
L p ( I t , I s ) ∗ = min ⁡ I s L p ( I t , I t ′ ) 2 ∑ t 2 + 1 2 l o g ∑ t + 1.5 L_p(I_t,I_s)^*=\frac{\min_{I_s}L_p(I_t,I_{t^{'}})}{2\sum_t^2}+\frac{1}{2}log\sum_t+1.5 Lp(It,Is)=2t2minIsLp(It,It)+21logt+1.5
对于其它的automask机制、深度平滑约束也是参考MonoDepth2的实现。

则文章的几点改进(相机内参学习、pixelshuffle上采样、像素损失加权)给网络带来的性能影响见下表:
在这里插入图片描述

3. 实验结果

文章的方法在相同分辨率条件下与其它一些方法的性能比较:
在这里插入图片描述
不同分辨率下的性能:
在这里插入图片描述

举报

相关推荐

0 条评论