题目: Towards High Quality Depoth Estimation
摘要
目前的深度估计从业人员大多follow the settings of specific backbone without thinking about why is that。本文将详细探索从数据(不同类型数据集加载、稳定性、预处理、数据生成),超参数设置(学习率、损失函数)到训练过程的不同技巧。通过在您的pipeline中检查这些设定,可能有助于提升自己训练模型,或是将深度估计用于downstream task的性能。
数据
图像位数问题
使用预训练框架尤其需要注意,先找到预训练数据集的图像格式。检查bit数、通道数等,一般是8bitRGB或者RGBA。使用脚本转换到对应格式后再执行推理,否则会出现推理结果混乱或者空白。这边以前写过文章处理,可以翻上去找找。
归一化问题
注意对输入、输出做归一化。尤其是在downstream task中,注意backbone的数据尺度。不同的backbone需要使用不同的归一化方式。目前已有的方式包括:max min、max、各种非线性映射、百分位数minmax。数据尺度不对,输出结果惨不忍睹。
超参数
训练时
出现NaN Loss
如果是用单目深度估计,一般来说多少会有的。可以自己统计一下试试,或者打印看看。
import torch
loss = torch.tensor([1.0, float('nan'), 2.0, float('nan')])
nan_count = torch.sum(torch.isnan(loss)).item()
print("NaN count:", nan_count)
三种方法:
- 不要用 square root loss
- 不要用 log-sigmoid function
- 更换 variance computation
- 使用更好的权值初始化方式,缩放至比较小的状态
- 计算方差时候指定unbiased为否
import torch
def calculate_variance(x):
if x.numel() == 0:
return torch.tensor(float('nan'))
else:
return torch.var(x, unbiased=True)
x = torch.tensor([1, 2, 3, 4, 5])
variance = calculate_variance(x)
print("Variance:", variance)
验证时
裁切边缘
受限于镜头矫正,部分模型在边缘的准确率非常差。为了保证模型对比公平,一般会裁切掉边缘的画面。在下游任务使用时也得注意这个问题。
Reference
Analysis of NaN Divergence in Training Monocular Depth Estimation Model
https://pytorch.org/docs/stable/generated/torch.var.html