使用ZoeDepth生成深度估计图

本文介绍如何使用ZoeDepth生成深度估计图,包括项目下载、依赖安装、代码修改以及模型加载、预测和结果展示。在使用过程中,遇到了加载模型的错误并提供了修正方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前单目深度估计分为两个派系,metric depth estimation(度量深度估计,也称绝对深度估计)和relative depth estimation(相对深度估计)。 ZoeDepth是 第一个结合相对和绝对深度的多模态单目深度估计网络。本博文仅记录使用ZoeDepth生成深度估计图的过程(因为直接按项目说明中进行使用会报错误)
项目地址: https://github.com/isl-org/ZoeDepth
论文地址: https://arxiv.org/pdf/2302.12288.pdf
在这里插入图片描述

1、基本概念

绝对深度估计: 估计物体绝对物理单位的深度,即米。预测绝对深度的优点是在计算机视觉和机器人技术的许多下游应用中具有实用价值,如建图、规划、导航、物体识别、三维重建和图像编辑。然而,绝对深度股即泛化能力(室外、室内)极差。因此,目前的绝对深度估计模型通常在特定的数据集上过拟合,而不能很好地推广到其他数据集。

相对深度估计: 估计每个像素与其它像素的相对深度差异,深度无尺度信息,可以各种类型环境中的估计深度。应用场景有限。

2、使用准备

在https://github.com/isl-org/ZoeDepth中介绍了基于torch hub初始化ZoeDepth模型的方法(不推荐,该操作经常导致报错),需要修改相关部分源码才可以正常加载模型。

2.1 下载项目

使用git下载项目,或者直接到github上下载项目源码并解压。

git clone https://github.com/isl-org/ZoeDepth.git && cd ZoeDepth

2.2 下载依赖

ZoeDepth项目在运行时仍然会调用torch.hub下载其他依赖性,使用python默认下载或许网速较慢。这里列出需要下载的数据,若自己电脑网络环境良好可以不同下载。
Downloading: "https://github.com/intel-isl/MiDaS/zipball/master" to C:\Users\Administrator/.cache\torch\hub\master.zip
Downloading: "https://github.com/isl-org/ZoeDepth/releases/download/v1.0/ZoeD_M12_N.pt" to C:\Users\Administrator/.cache\torch\hub\checkpoints\ZoeD_M12_N.pt
还有k、nk模型,有用到的可以下载,下载页为:https://github.com/isl-org/ZoeDepth/releases

2.3 修改代码

使用默认代码在加载使用模型时,会存在2个报错,需要进行修改。
1、zoedepth/models/model_io.py 第49行,修改为一下代码。这里加载权重时会存在部分key不匹配

 model.load_state_dict(state, strict=False) 

2、C:/Users/Administrator/.cache/torch/hub/intel-isl_MiDaS_master/midas/backbones/beit.py第94行的函数,替换为以下代码。这里是forward时不存在self.drop_path所引发的保存

def block_forward(self, x, resolution, shared_rel_pos_bias: Optional[torch.Tensor] = None):
    """
    Modification of timm.models.beit.py: Block.forward to support arbitrary window sizes.
    """ #HPG change
    if hasattr(self, 'drop_path'):
        if self.gamma_1 is None:
            x = x + self.drop_path(self.attn(self.norm1(x), resolution, shared_rel_pos_bias=shared_rel_pos_bias))
            x = x + self.drop_path(self.mlp(self.norm2(x)))
        else:
            x = x + self.drop_path(self.gamma_1 * self.attn(self.norm1(x), resolution,
                                                            shared_rel_pos_bias=shared_rel_pos_bias))
            x = x + self.drop_path(self.gamma_2 * self.mlp(self.norm2(x)))
    else:
        if self.gamma_1 is None:
            x = x + (self.attn(self.norm1(x), resolution, shared_rel_pos_bias=shared_rel_pos_bias))
            x = x + (self.mlp(self.norm2(x)))
        else:
            x = x + (self.gamma_1 * self.attn(self.norm1(x), resolution,
                                                            shared_rel_pos_bias=shared_rel_pos_bias))
            x = x + (self.gamma_2 * self.mlp(self.norm2(x)))
    return x

3、基本使用

3.1 加载模型

这里只推荐采用以下方式加载模型。注,若遇到模型下载缓慢需要可以按照2.2的步骤下载文件到指定位置

from zoedepth.models.builder import build_model
from zoedepth.utils.config import get_config
import torch
from zoedepth.utils.misc import colorize

# ZoeD_N
conf = get_config("zoedepth", "infer")
model_zoe_n = build_model(conf)

##### sample prediction
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
zoe = model_zoe_n.to(DEVICE)

k模型和nk模型的初始化代码如下

# ZoeD_K
conf = get_config("zoedepth", "infer", config_version="kitti")
model_zoe_k = build_model(conf)

# ZoeD_NK
conf = get_config("zoedepth_nk", "infer")
model_zoe_nk = build_model(conf)

3.2 进行预测

zoe预测图像所返回数据直接进行可视化是一片全黑,使用colorize函数可以将其值域进行拉伸并展示(扩展到0~25)。 其中myimshows函数源自https://hpg123.blog.csdn.net/article/details/124824892 ,将博文中的代码保存为imgutils.py即可。

import numpy as np
from PIL import Image
from imgutils import myimshows
image = Image.open(r"a14.jpg").convert("RGB")  # load
#image = Image.open(r"D:\AI_toolV.13\TouKui_jc/part2_000509.jpg").convert("RGB")  # load
#depth_pil = zoe.infer_pil(image, output_type="pil")  # as 16-bit PIL Image
depth = zoe.infer_pil(image)
colored = colorize(depth)
# save colored output
fpath_colored = "output_colored.png"
colored_img=Image.fromarray(colored)
colored_img.save(fpath_colored)

myimshows([np.array(image),colored],["ori","depth"])

3.3 预测结果

使用ZoeD_K的预测结果如下所示,可以发现当输入平视图时针对图像的上方整体预测效果不好
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### ZoeDepth 推理使用与过程 ZoeDepth 是一种先进的单目深度估计模型,旨在通过单一像输入提供精确的深度输出。该技术利用了最新的卷积神经网络架构来实现高效的在线推理。 #### 在线执行特性 不同于离线训练可能耗费数天甚至数周时间并占用大量资源,在线推理通常能在亚秒级响应时间内完成,并消耗较少资源[^3]。对于像 ZoeDepth 这样的现代深度学习应用而言,这意味着可以快速处理每一帧像数据,从而实现实时性能。 #### 推理流程概述 为了使用 ZoeDepth 执行推理操作,一般遵循以下几个环节: 1. **准备环境** 安装必要的依赖库和框架,确保 GPU 加速支持(如果可用)。这一步骤涉及配置 Python 环境以及安装 PyTorch 或 TensorFlow 等机器学习平台。 2. **加载预训练模型** 下载官方发布的预训练权重文件并将这些参数应用于初始化后的网络结构中。这样做的好处是可以直接利用已经过大规模数据集优化过的模型来进行预测工作。 3. **前向传播计算** 将待测片转换成适合输入给定模型的形式(通常是标准化后的张量),然后传递至已加载好的模型实例内进行正向传播运算。此阶段会生成对应于原始像像素位置处的距离值矩阵——即所谓的“深度”。 4. **后处理与可视化** 对得到的结果做进一步调整,比如裁剪边界区域、平滑噪声点等;最后可选地将其渲染为彩色伪彩像以便直观观察效果。 ```python import torch from zoe_depth.models.zoedepth import ZoeDepth # 初始化设备对象 (CPU/GPU) device = "cuda" if torch.cuda.is_available() else "cpu" # 创建模型实例并加载预训练权值 model = ZoeDepth().to(device) def infer(image_path): # 片读取与预处理... # 转换为PyTorch Tensor格式 img_tensor = preprocess_image(image).unsqueeze(0).to(device) with torch.no_grad(): prediction = model(img_tensor)[0] depth_map = postprocess_prediction(prediction.cpu().numpy()) return depth_map ```
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里鹏程转瞬至

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值