迈向更高质量的深度估计

题目: 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

你可能感兴趣的:(pytorch,深度估计,深度学习,pytorch,人工智能)