这篇文章作为系列文章 “无人机实战系列” 的一篇番外文章,主要测试了下 Apple 推出的一个基于机器学习的单目图像转深度的工具 ml-depth-pro,这个也是我在找这方面工具时意外发现的一个仓库,后期仍然会以 Depth Anything V2 为主线进行记录。
为了节省大家时间,我可以在文章开头给一个粗略结论:
- 近景效果:Depth Anything V2 > Depth Pro;
- 远景分割:Depth Pro > Depth Anything V2;
- 轮廓细节:Depth Pro > Depth Anything V2;
- 耗时:Depth Pro > Depth Anything V2;
如果你在知道这个情况的前提下仍然对 Apple 的这款产品感兴趣,那么可以继续看下去。
Step1. 拉取远程仓库
拉取仓库:
$ git clone git@github.com:apple/ml-depth-pro.git
安装依赖:
$ pip install -e .
Apple只提供了一个预训练模型,大小大概 1.77 GB,我在我的网盘中上传了这个模型,因此这里有两个方式供你选择:
【方式一】使用官方脚本拉取:
$ source get_pretrained_models.sh
【方式二】从网盘中下载并存放到指定位置:
$ mkdir checkpoints
模型链接: https://pan.baidu.com/s/1LYozaslxRJnmooktPsulTg?pwd=m6jy 提取码: m6jy
Step2. 编写测试代码
这里还是以我自己拍摄的一张餐桌图片为例:
图片链接: https://pan.baidu.com/s/1o67WUCRKuip8A2p6V1pmow?pwd=13ns 提取码: 13ns
当前文件结构如下:
(base) gaohao@Server:~/Desktop/RemoteTools/ml-depth-pro$ tree
.
├── ACKNOWLEDGEMENTS.md
├── checkpoints
│ └── depth_pro.pt
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── data
│ ├── depth-pro-teaser.jpg
│ └── example.jpg
├── demo.py # 示例代码
├── dining-table.jpg # 示例图片
├── get_pretrained_models.sh
├── LICENSE
├── pyproject.toml
├── README.md
└── src
└── depth_pro
示例代码demo.py
:
import cv2
import numpy as np
import torch
from src import depth_pro
from PIL import Image
image_path = "./dining-table.jpg"
# Load model and preprocessing transform
model, transform = depth_pro.create_model_and_transforms()
model.eval()
print("Model eval done.")
# Load and preprocess an image.
image, _, f_px = depth_pro.load_rgb(image_path)
image_pil = image.copy() # Keep a copy of the original image
image = transform(image)
print("Image transform done.")
# Run inference.
prediction = model.infer(image, f_px=f_px)
depth = prediction["depth"] # Depth in [m].
print("model infer done.")
# Convert PIL image to OpenCV format
image_cv = np.array(image_pil)
image_cv = cv2.cvtColor(image_cv, cv2.COLOR_RGB2BGR)
# Convert depth Tensor to NumPy array
if isinstance(depth, torch.Tensor):
depth = depth.cpu().detach().numpy() # Ensure it's a NumPy array
# Normalize depth map for visualization
depth_normalized = 1.0 - (depth - depth.min()) / (depth.max() - depth.min())
depth_colormap = (depth_normalized * 255).astype(np.uint8)
depth_colormap = cv2.applyColorMap(depth_colormap, cv2.COLORMAP_JET)
# Display images using OpenCV
cv2.imshow('Original Image', image_cv)
cv2.imshow('Depth Map', depth_colormap)
cv2.imwrite("./result.png", depth_colormap)
cv2.waitKey(0)
cv2.destroyAllWindows()
Step3. 与Depth-Anything V2 的对比
因为Apple只提供了一个规格的预训练文件,因此在对比时Deep Anything V2的预训练模型也使用等体量的模型 Depth-Anything-V2-Large 1.34 GB
原始图像 | Deep Anything V2 - Large | Apple ML Depth Pro |
---|---|---|
![]() | ![]() | ![]() |
总体上看 Depth-Anything V2
的细节没有 Depth Pro
把控的好,但在近距离的物体上前者鲁棒性更高,后者虽然可以明显分割近景与远景,但近景处理粒度是明显低于前者的。