Ascend-SACT/depth_anything_v2
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Depth Anything V2-模型推理适配指导

概述

Depth Anything V2 是由香港大学和腾讯实验室开发的高性能单目深度估计模型。相比第一代版本,V2在深度估计精度和鲁棒性上有显著提升,能够从单张图像中估计出高质量的深度图,可广泛应用于3D重建、自动驾驶、机器人导航等领域。

环境准备

###硬件

项目要求
NPU1 x Ascend 910B3 (64 GB HBM each)
CPUARM
内存>= 64 GB
磁盘>= 40 GB 可用空间

###软件版本

组件版本
OSLinux (aarch64) ,openEuler 24.03 LTS-SP2
Python3.11.14
CANN8.5.1
Ascend 驱动25.2.0 (V100R001C21SPC006B200)
PyTorch2.9.0
torch_npu2.9.0
\

快速上手

1. 获取源码

git clone https://github.com/DepthAnything/Depth-Anything-V2.git
cd Depth-Anything-V2

或直接使用适配后的代码包。

2. 安装依赖

  • 安装基础环境。
pip3 install numpy opencv-python torch torchvision onnx onnxruntime
  • 安装昇腾专用包(如需NPU推理)。
# 安装torch_npu,参考:https://gitee.com/ascend/pytorch
pip3 install torch_npu

说明:如果某些库通过此方式安装失败,可使用 pip3 install 单独进行安装。

3. 输入输出数据描述

Depth Anything V2 模型接收单张RGB图像作为输入,输出对应的深度图。模型支持多种尺寸的ViT backbone(vits/vitb/vitl/vitg),以下以vits为例:

  • 输入数据
输入数据数据类型大小数据排布格式
imageFLOAT321 x 3 x 518 x 518NCHW

说明:输入尺寸需为14的倍数,推荐使用518x518。

  • 输出数据
输出数据数据类型大小数据排布格式
depthFLOAT321 x H x WNCHW

说明:输出深度图尺寸与输入图像尺寸一致,深度值经过ReLU处理,非负。

4. 准备数据集

  • 准备测试图片。
mkdir test_images
# 放置测试图片到test_images目录
# 支持jpg、png、jpeg格式
  • 或使用仓库中的示例图片。
wget -O test_images/demo.jpg https://raw.githubusercontent.com/DepthAnything/Depth-Anything-V2/main/assets/example.jpg

5. 模型转换

5.1 获取权重文件

官方提供了四种大小的权重文件:vits、vitb、vitl、vitg。这里以 vits 为例。

mkdir models
cd models
wget https://huggingface.co/depth-anything/Depth-Anything-V2-Small/resolve/main/depth_anything_v2_vits.pth
cd ..

5.2 导出 ONNX 模型

使用提供的导出脚本python3 export_onnx.py:

import torch
import numpy as np
from dpt import DepthAnythingV2

# 配置
MODEL_SIZE = 'vits'
MODEL_PATH = './depth_anything_v2_vits.pth'
ONNX_PATH = './depth_anything_v2_vits.onnx'
DEVICE = 'cpu'
INPUT_SIZE = 518

# 初始化模型
model_configs = {
    'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
    'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
    'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
    'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}

print(f"Loading Depth-Anything-V2 ({MODEL_SIZE})...")
model = DepthAnythingV2(**model_configs[MODEL_SIZE])
model.load_state_dict(torch.load(MODEL_PATH, map_location='cpu'))
model = model.to(DEVICE).eval()
print(f"Model loaded: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M parameters")

# 创建示例输入 (1, 3, H, W) - 需要是14的倍数
H, W = 518, 518
dummy_input = torch.randn(1, 3, H, W, device=DEVICE)

print(f"\nExporting to ONNX...")
print(f"Input shape: {dummy_input.shape}")

# 导出为 ONNX (固定形状,不使用 dynamic_axes)
torch.onnx.export(
    model,
    dummy_input,
    ONNX_PATH,
    export_params=True,
    opset_version=18,
    do_constant_folding=True,
    input_names=['input'],
    output_names=['depth']
    # 不使用 dynamic_axes,保持固定形状以便 ATC 转换
)

print(f"ONNX model saved to: {os.path.abspath(ONNX_PATH)}")

# 验证 ONNX 模型
try:
    import onnx
    print(f"\nValidating ONNX model...")
    onnx_model = onnx.load(ONNX_PATH)
    onnx.checker.check_model(onnx_model)
    print("ONNX model validation passed!")
    
    # 打印模型信息
    print(f"\nModel info:")
    print(f"  Inputs: {[i.name for i in onnx_model.graph.input]}")
    print(f"  Outputs: {[o.name for o in onnx_model.graph.output]}")
except ImportError:
    print("\nonnx package not installed, skipping validation")
except Exception as e:
    print(f"\nONNX validation failed: {e}")

5.3 修复 ONNX 模型 ConvTranspose 节点

由于部分ONNX算子在昇腾NPU上需要额外的属性,需要对导出的ONNX模型进行修复:

python3 fix_onnx_convtranspose.py

该脚本会为 ConvTranspose 节点添加 kernel_shape 属性,输出修复后的模型 depth_anything_v2_vits_fixed.onnx。

5.4 验证 ONNX 模型

在CPU上验证ONNX模型的正确性:

python3 verify_onnx.py

或使用 onnx_inference.py 进行完整推理测试:

python3 onnx_inference.py

5.5 使用 ATC 工具将 ONNX 模型转为 OM 模型

  • 配置环境变量。

    source /usr/local/Ascend/ascend-toolkit/set_env.sh

    说明: 该脚本中环境变量仅供参考,请以实际安装环境配置环境变量。详细介绍请参见《CANN 开发辅助工具指南》。

  • 执行命令查看芯片名称(${chip_name})。

    npu-smi info
    # 该设备芯片名为Ascend310P3 (自行替换)
    回显如下:
    +-------------------+-----------------+------------------------------------------------------+
    | NPU     Name      | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
    | Chip    Device    | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
    +===================+=================+======================================================+
    | 0       310P3     | OK              | 15.8         42                0    / 0              |
    | 0       0         | 0000:82:00.0    | 0            1074 / 21534                            |
    +===================+=================+======================================================+
  • 执行 atc 命令。

    对于310P推理卡:

    atc \
      --framework 5 \
      --model depth_anything_v2_vits_fixed.onnx \
      --output depth_anything_v2_vits \
      --input_shape "input:1,3,518,518" \
      --soc_version Ascend310P3 \
      --op_select_implmode high_performance

    对于910B训练卡(推理模式):

    atc \
      --framework 5 \
      --model depth_anything_v2_vits_fixed.onnx \
      --output depth_anything_v2_vits \
      --input_shape "input:1,3,518,518" \
      --soc_version Ascend910B2 \
      --op_select_implmode high_performance

    参数说明:

    • framework:原始框架类型,5表示ONNX。
    • model:原始模型文件路径。
    • output:转换后OM模型的输出路径。
    • input_shape:模型输入数据的shape。
    • soc_version:芯片版本,根据实际硬件选择。
    • op_select_implmode:算子实现模式选择,high_performance表示高性能模式。

    更多参数说明请参考 ATC 参数概览。

6. 推理验证

6.1 CPU推理验证

首先在CPU上进行PyTorch模型推理验证,确保模型权重和推理逻辑正确:

python3 test_inference.py

或批量推理测试:

python3 batch_inference.py

推理结果会保存到 output_images 目录。

6.2 ONNX推理验证

验证ONNX模型在CPU上的推理结果:

python3 onnx_inference.py

推理结果会保存到 output_images_onnx 目录。

对比CPU PyTorch推理与ONNX推理的输出深度图,验证一致性。

6.3 OM模型推理验证(ACL方式)

使用ACL Python接口进行OM模型推理:

python3 om_inference.py

参数说明:

  • OM_PATH:OM模型路径
  • TEST_DIR:测试图片目录
  • OUTPUT_DIR:输出目录
  • DEVICE_ID:NPU设备ID

推理结果会保存到 output_images_om 目录。

6.4 OM模型推理验证(torch_npu方式)

如果安装了torch_npu,可以使用torch_npu tensor与ACL结合进行推理:

python3 om_offline_inference.py

该方式利用torch_npu的tensor管理内存,简化数据传输流程。

7. 推理结果的示例图片

7.1 原图

在depth_anything_v2/test_images等文件夹

7.2 推理后的深度图

在depth_anything_v2/output_images_om_offline