Skip to content

近距离场景下深度补全时遇到的问题以及一些优化思路 #38

Description

@Nightnight4u

首先感谢各位学者的付出与成果,在项目中使用的低精度具身深度相机上的补全效果十分突出。
不过在模型推理验证过程中发现了一个问题,就是模型对近距离(20cm左右)拍摄的深度还原精度较差,更微观(5cm~10cm)的误差更是暴增,后采用相机标定的方式验证出在20cm左右处的深度还原平均有10mm左右的误差,在10cm以内的深度还原误差达到了100mm左右,而将同样标定数据放置在中距离50cm左右处拍摄的精度明显提高,平均误差均在5mm左右,这样的精度在机器人处理小尺度工作时呈现出明显区别。
研读过模型的所有相关文件都没有明确看到有标明近距离尺度下的误差突变的情况,对模型全部架构了解之后发现可能是两点可以优化的地方:1、数据集方面,了解到模型的数据集采用的是mdm_depth 3M张公开数据集中绝大部分的数据尺度都在米级尺度下,中距离为主,很少有近距离的训练场景,查阅到目前有公开的D405-hand-surface-depth数据集是在5-50cm场景下的图片深度对,可以将其纳入训练数据集当中从而填补原先近距离场景的确实;2、损失函数方面,模型采用的线性L1,这使得相同的误差在10cm的尺度下和100cm的尺度下对loss的贡献值相同,模型的训练梯度不会因为近距离相对误差大而改变训练权重,于是建议改成加权L1从而让模型在近距离下相对损失加权,从而改变模型后续的训练策略,下面是一份损失函数处理的伪代码

def depth_weight(d):
    """
    30cm 以内按 0.3/d 放大(30cm 处权重恰为 1,与远距离连续),
    越近权重越大,上限 8 保证梯度有界;30cm 以上权重为 1(不干扰中远距离精度)。
    """
    return torch.where(d < 0.3,
                       (0.3 / d.clamp(min=0.0375)).clamp(max=8.0),
                       torch.ones_like(d))

def depth_loss(pred, gt):
    mask = (gt > 0.01) & (gt < 20.0)          
    pred, gt = pred[mask], gt[mask]
    w = depth_weight(gt)
    loss = (w * (pred - gt).abs()).mean()
    return loss

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions