题目: 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。数据尺度不对,输出结果惨不忍睹。
如果是用单目深度估计,一般来说多少会有的。可以自己统计一下试试,或者打印看看。
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)
三种方法:
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)
受限于镜头矫正,部分模型在边缘的准确率非常差。为了保证模型对比公平,一般会裁切掉边缘的画面。在下游任务使用时也得注意这个问题。
Analysis of NaN Divergence in Training Monocular Depth Estimation Model
https://pytorch.org/docs/stable/generated/torch.var.html