Depth Anything V2 是由香港大学和腾讯实验室开发的高性能单目深度估计模型。相比第一代版本,V2在深度估计精度和鲁棒性上有显著提升,能够从单张图像中估计出高质量的深度图,可广泛应用于3D重建、自动驾驶、机器人导航等领域。
###硬件
| 项目 | 要求 |
|---|---|
| NPU | 1 x Ascend 910B3 (64 GB HBM each) |
| CPU | ARM |
| 内存 | >= 64 GB |
| 磁盘 | >= 40 GB 可用空间 |
###软件版本
| 组件 | 版本 |
|---|---|
| OS | Linux (aarch64) ,openEuler 24.03 LTS-SP2 |
| Python | 3.11.14 |
| CANN | 8.5.1 |
| Ascend 驱动 | 25.2.0 (V100R001C21SPC006B200) |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0 |
| \ |
git clone https://github.com/DepthAnything/Depth-Anything-V2.git
cd Depth-Anything-V2或直接使用适配后的代码包。
pip3 install numpy opencv-python torch torchvision onnx onnxruntime# 安装torch_npu,参考:https://gitee.com/ascend/pytorch
pip3 install torch_npu说明:如果某些库通过此方式安装失败,可使用 pip3 install 单独进行安装。
Depth Anything V2 模型接收单张RGB图像作为输入,输出对应的深度图。模型支持多种尺寸的ViT backbone(vits/vitb/vitl/vitg),以下以vits为例:
| 输入数据 | 数据类型 | 大小 | 数据排布格式 |
|---|---|---|---|
| image | FLOAT32 | 1 x 3 x 518 x 518 | NCHW |
说明:输入尺寸需为14的倍数,推荐使用518x518。
| 输出数据 | 数据类型 | 大小 | 数据排布格式 |
|---|---|---|---|
| depth | FLOAT32 | 1 x H x W | NCHW |
说明:输出深度图尺寸与输入图像尺寸一致,深度值经过ReLU处理,非负。
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官方提供了四种大小的权重文件: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 ..使用提供的导出脚本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}")
由于部分ONNX算子在昇腾NPU上需要额外的属性,需要对导出的ONNX模型进行修复:
python3 fix_onnx_convtranspose.py该脚本会为 ConvTranspose 节点添加 kernel_shape 属性,输出修复后的模型 depth_anything_v2_vits_fixed.onnx。
在CPU上验证ONNX模型的正确性:
python3 verify_onnx.py或使用 onnx_inference.py 进行完整推理测试:
python3 onnx_inference.py配置环境变量。
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参数说明:
更多参数说明请参考 ATC 参数概览。
首先在CPU上进行PyTorch模型推理验证,确保模型权重和推理逻辑正确:
python3 test_inference.py或批量推理测试:
python3 batch_inference.py推理结果会保存到 output_images 目录。
验证ONNX模型在CPU上的推理结果:
python3 onnx_inference.py推理结果会保存到 output_images_onnx 目录。
对比CPU PyTorch推理与ONNX推理的输出深度图,验证一致性。
使用ACL Python接口进行OM模型推理:
python3 om_inference.py参数说明:
推理结果会保存到 output_images_om 目录。
如果安装了torch_npu,可以使用torch_npu tensor与ACL结合进行推理:
python3 om_offline_inference.py该方式利用torch_npu的tensor管理内存,简化数据传输流程。
在depth_anything_v2/test_images等文件夹
在depth_anything_v2/output_images_om_offline