使用ZoeDepth生成深度估计图

2023-09-20 22:10:07

目前单目深度估计分为两个派系,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的预测结果如下所示,可以发现当输入平视图时针对图像的上方整体预测效果不好
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

更多推荐

Linux--信号

对于linux来说,信号是软中断。许多重要的程序都需要处理信号。信号,为linux提供了一种处理异步事件的方法。比如,终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序。一、信号概述:1、信号的名字和编号:每个信号都有一个名字和编号,名字都以SIG开头。信号定义在signal.h,头文件中,信号名都定义为

java微服务项目整合skywalking链路追踪框架

skywalking官网网址:ApacheSkyWalking目录1、安装skywalking2、微服务接入skywalking3、skywalking数据持久化1、安装skywalking下载skywalking,本篇文章使用的skywalking版本是8.5.0Indexof/dist/skywalkinghttp

阿里云国际站服务器设置自动开关机的攻略

关于需求在特定时间段内主动发动服务器的用户来说非常有用,比如在夜间或周末主动封闭服务器以节约资源。阿里云服务器主动开关机设置方法如下:1.登录阿里云操控台,进入云服务器ECS实例办理页面。2.在实例列表中找到需求设置主动开关机的服务器,点击“办理”按钮。3.在弹出的办理页面中,找到“主动发动”选项,点击“修改”。4.在

阿里云国际站云服务器数据备份方法有哪些?

阿里云国际站云服务器是一种根据云计算技术的虚拟服务器,它能够经过互联网提供计算资源和服务。在运用云服务器的过程中,数据备份是非常重要的一个环节。本文将介绍云服务器数据备份的办法,包含手动备份、主动备份和数据同步。一、手动备份手动备份是将数据复制到另一台服务器或外部存储设备的过程。这种办法适用于数据量较小的场景,能够手动

如何在微信上制作自己的小程序卖东西

在当今的数字化时代,微信小程序已成为电商行业的重要平台。本文将详细解析电商微信小程序的制作流程,帮助你了解从零到上线的过程。一、前期准备1.确定商城定位和目标群体:在制作电商微信小程序前,你需要明确商城的定位,如销售什么产品、面向哪些用户群体等。同时,了解目标群体的需求和习惯,以便进行针对性设计。二、制作流程1.登录乔

基于微信小程序的个人健康管理系统的设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

文章目录问题描述功能展示技术细节小结问题描述本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。功能展示提示:这里可以添加技术名词解释技术细节直接上代码usingUnityEngine;publicclassCameraController:MonoBehaviour{publ

mybati缓存了解

title:“mybati缓存了解”createTime:2021-12-08T12:19:57+08:00updateTime:2021-12-08T12:19:57+08:00draft:falseauthor:“ggball”tags:[“mybatis”]categories:[“java”]descripti

软键盘控制cesium相机移动旋转

1.有航向类似于控制飞机飞行<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=devi

刷题笔记25——图论课程表

为了最终理解你所不理解的,你必须经历一条愚昧无知的道路。为了占有你从未占有的东西,你必须经历被剥夺的道路。为了达到你现在所不在的名位,你必须经历那条你不在其中的道路。——艾略特797.所有可能的路径(已经告知:是有向无环图,所以不需要设置visited)非常奇妙,我最初的错误是如下,在找到目标节点后直接加入到res中,

混合应用比原生应用优越在哪里?

随着移动应用和桌面应用市场的不断发展,开发者们一直在寻找一种能够在多个平台上快速构建应用的方法。传统上,原生应用开发被视为性能最佳的选择,纯粹的原生应用通常是一种依赖于平台的GUI程序,它使用特定操作系统的本地开发语言和GUI框架。但近年来,跨平台混合应用的崭露头角,逐渐取代了性能优先的原生应用。本文将深入探讨这一趋势

热文推荐