当前位置: 首页 > news >正文

【计算机视觉】单目深度估计模型-Depth Anything-V2

概述

本篇将简单介绍Depth Anything V2单目深度估计模型,该模型旨在解决现有的深度估计模型在处理复杂场景、透明或反射物体时的性能限制。与前一代模型相比,V2版本通过采用合成图像训练、增加教师模型容量,并利用大规模伪标签现实数据进行学生模型教学,显著提高了预测精度和效率。

项目地址:Depth Anything V2 论文地址:https://arxiv.org/abs/2406.09414 代码地址:https://github.com/DepthAnything/Depth-Anything-V2/tree/main

微信截图_20241024151920.png

一、模型改进

将所有标记的真实图像替换为合成图像。

微信截图_20241024155319.png

 在Depth Anything V2的研究中,研究团队提出了一种创新的方法,即使用完全合成的图像来替代所有带有标签的真实图像,以训练单目深度估计模型。这一决策背后的原因有几个关键点:

  • 标签精度:研究发现,真实图像中的标签存在粗略的情况,这会导致模型学习到错误的深度信息。特别是在处理细粒度的深度预测时,真实标签的粗糙性会对最终的预测结果造成负面影响。
  • 领域转移问题:虽然合成图像可以提供高质量的深度标签,但它们与真实世界的图像之间存在分布上的差异。为了解决这一问题,研究团队采取了两方面的策略:一是通过增加合成数据的规模来提高其多样性;二是引入了大规模未标记的真实图像,并利用强大的教师模型为这些图像生成伪标签,以作为学生模型训练的数据来源。

通过完全使用合成图像来训练教师模型,并借助教师模型生成的伪标签来训练学生模型,研究团队成功地提高了单目深度估计模型的性能,尤其是在处理细粒度深度信息方面取得了显著进步。这种方法不仅克服了传统使用真实标记图像所带来的问题,也为未来的研究提供了一条可行的路径

扩大教师模型的容量。

微信截图_20241024161224.png

通过训练更大规模的模型来捕捉更丰富的特征表示,进而提高模型的学习能力。论文中采取了以下做法:

  • 教师模型的选择:选择DINOv2-G作为教师模型。DINOv2-G是一个强大的模型,其本身已经在大规模图像上进行了预训练,具备很强的特征提取能力。
  • 利用合成数据训练:使用了五个高精度的合成数据集(共包含595K张图像)来训练这个教师模型。而上一节中用到的合成数据,其好处是可以获得非常精确的深度标签,有助于教师模型学习到高质量的特征表示。
  • 伪标签生成:经过训练后的强大教师模型能够在未标注的真实图像上生成高质量的伪标签。这些伪标签随后被用来训练学生模型,帮助学生模型学习到更接近真实世界的深度预测。

扩大教师模型容量的目的就是为了使其能够更好地捕捉到输入图像中的细微特征,并且这些特征可以通过知识蒸馏的方式传递给学生模型,从而帮助学生模型在较小的规模下也能保持较高的预测精度。

通过大规模伪标记真实图像的桥梁来教授学生模型

微信截图_20241024161050.png

利用上述利用生成的伪标签,团队训练了四个不同规模的学生模型(small, base, large, giant)。学生模型通过模仿教师模型的行为,学习到了如何在真实图像上做出准确的深度预测。这种方法的主要优点是:

  • 增强场景覆盖范围:通过引入大量的未标注真实图像,可以覆盖更多的实际场景,从而增强模型的零样本深度估计能力。
  • 知识转移:通过伪标签,学生模型可以从教师模型那里“继承”到高质量的预测能力,类似于知识蒸馏,但不是在特征层面,而是在标签层面。
  • 安全性:这种方法在标签层面进行知识转移,比在特征或logit级别进行蒸馏更为安全可靠,特别是在教师与学生模型规模差距较大的情况下。

二、使用体验

我们可以在huggingface中在线体验该模型的强大,网址如下:https://huggingface.co/spaces/depth-anything/Depth-Anything-V2

微信截图_20241024161414.png

我们可以上传自己的照片,或者点击下方的示例图片,滑动右边箭头可以对比原图与深度图

微信截图_20241024161518.png

三、代码示例

1、准备工作

首先克隆项目到本地并且安装项目所需的所有 Python 依赖项

git clone https://github.com/DepthAnything/Depth-Anything-V2
cd Depth-Anything-V2
pip install -r requirements.txt
2、模型选择

根据需求,以及硬件选择合适的模型大小,下载下来并且放在checkpoints文件夹下

链接如下(giant尚未发布):

Depth-Anything-V2-Small

Depth-Anything-V2-Base

Depth-Anything-V2-Large

微信截图_20241129144350.png

3、简单示例代码

首先导入相关库

import cv2
import torchfrom depth_anything_v2.dpt import DepthAnythingV2DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'

这里定义了不同的模型配置,您可以根据需要选择不同的配置。

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]}
}encoder = 'vitl' # or 'vits', 'vitb', 'vitg'

创建了一个 DepthAnythingV2 实例,加载了预训练的权重,并将模型移到了之前确定的设备上,并设置为评估模式...

点击【计算机视觉】单目深度估计模型-Depth Anything-V2查看全文。

相关文章:

【计算机视觉】单目深度估计模型-Depth Anything-V2

概述 本篇将简单介绍Depth Anything V2单目深度估计模型,该模型旨在解决现有的深度估计模型在处理复杂场景、透明或反射物体时的性能限制。与前一代模型相比,V2版本通过采用合成图像训练、增加教师模型容量,并利用大规模伪标签现实数据进行学…...

Servlet 和 Spring MVC:区别与联系

前言 在 Java Web 开发中,Servlet 和 Spring MVC 是两个重要的技术。Servlet 是 Java Web 的基础组件,而 Spring MVC 是一个高级 Web 框架,建立在 Servlet 的基础之上,提供了强大的功能和易用性。这篇文章将从定义、原理、功能对…...

【期末复习】三、内存管理

1.物理内存管理 空闲内存管理方式主要分为:等长划分和不等长划分。 内存管理方式 单一连续分区 基本思想:一段时间内只有一个进程在内存。 特点:简单,内存利用率低, 有三种不同的布局: 固定分区 把内存空间分割成若干区域, 称为分区。 每个分区的大小可以相同也可…...

Microsoft Azure Cosmos DB:全球分布式、多模型数据库服务

目录 前言1. Azure Cosmos DB 简介1.1 什么是 Azure Cosmos DB?1.2 核心技术特点 2. 数据模型与 API 支持2.1 文档存储(Document Store)2.2 图数据库(Graph DBMS)2.3 键值存储(Key-Value Store)…...

【Docker】安装registry本地镜像库,开启Https功能

下载镜像 docker pull registry:2 需要启动https功能,就要生成服务端的自签名的证书和私钥,以及在docker客户端安装这个经过签名的证书。 第一步:生成公私钥信息,第二步,制作证书签名申请文件, 第三步&…...

JUC--线程池

线程池 七、线程池7.1线程池的概述7.2线程池的构建与参数ThreadPoolExecutor 的构造方法核心参数线程池的工作原理 Executors构造方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool(int corePoolSize) 为什么不推荐使用内置线程池&…...

后端Java开发:第十一天

第十一天:方法重载 - 理解与应用 今天我们继续深入 Java 的世界,讨论 Java 中的 方法重载(Method Overloading)。你可能会想,什么是方法重载?简单来说,方法重载允许你在一个类中定义多个同名方…...

基于 GEE 的长时间序列 Landsat 5 影像下载

目录 1 完整代码 2 运行结果 1 完整代码 var LT5 ee.ImageCollection("LANDSAT/LT05/C01/T1"),imageVisParam {"opacity":1,"bands":["B4","B3","B2"],"gamma":1},roi ee.FeatureCollection(&quo…...

Unity-Mirror网络框架从入门到精通之Attributes属性介绍

前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进…...

软考证书邮寄步骤

一、点击网址 https://www.ruankao.org.cn/ 复制上述网址,粘贴至浏览器中。点击 “报名入口” 。 二、点击入口 选择考试批次。点击你所在考试地点的入口并进入。 三、登录 输入手机号和密码。进行验证。 四、点击基本信息 点击右上角。进入 “基本信息” 。 五、…...

计算机网络 (29)网络地址转换NAT

前言 网络地址转换(Network Address Translation,NAT)是计算机网络中的一种重要协议,它主要用于将私有IP地址转换为公共IP地址,以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网(LAN&…...

nlp培训重点-2

1. 贝叶斯公式 import math import jieba import re import os import json from collections import defaultdictjieba.initialize()""" 贝叶斯分类实践P(A|B) (P(A) * P(B|A)) / P(B) 事件A:文本属于类别x1。文本属于类别x的概率,记做…...

设计模式(1)——面向对象和面向过程,封装、继承和多态

文章目录 一、day11. 什么是面向对象2. 面向对象的三要素:继承、封装和多态2.1 封装**2.1.1 封装的概念****2.1.2 如何实现封装****2.1.3 封装的底层实现**2.1.4 为什么使用封装?(好处)**2.1.5 封装只有类能做吗?结构体…...

培训机构Day24

今天讲了一些javaee比较过时的技术,虽然已经过时,该学的还得学学。 知识点: http://localhost:8080/demo01/demo1?a1&b2&c3 pattern: /demo1 上下文路径:ContextPath,/demo01,不包含请求参数。 …...

1/7 C++

练习&#xff1a;要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数&#xff0c;并在主程序中完成测试 要求使用new #include <iostream>using namespace std; double *addr_new() {double …...

C语言初阶习题【23】输出数组的前5项之和

1. 题目描述 求Snaaaaaaaaaaaaaaa的前5项之和&#xff0c;其中a是一个数字&#xff0c; 例如&#xff1a;222222222222222 2.思路 分析下&#xff0c;222222222222222&#xff0c;怎么把它每一项算出来 2 210222 22102222 2221022222 我们的多项式就是a a*102&#xff0c;…...

Android audio(1)-音频模块概述

Audio模块是Android系统的重要组成部分,在 Android 中负责音频路由,数据处理,音频控制,音频设备管理/切换。 下面的内容大多翻译自android官网,读者可跳过阅读后面的博客。 一、系统架构 下图说明了音频模块的组成,并指出各组成部分所涉及的相关源代码。所谓架构就是说模…...

园林与消防工程:选择正确工程项目管理软件的重要性

在园林与消防工程领域&#xff0c;选择正确的工程项目管理软件对于提高项目效率、优化资源配置以及确保项目质量至关重要。以下是对园林与消防工程中选择正确工程项目管理软件重要性的详细分析&#xff1a; 1.提升项目管理效率 实时监控与跟踪&#xff1a;工程项目管理软件能够…...

分布式环境下定时任务扫描时间段模板创建可预订时间段

&#x1f3af; 本文详细介绍了场馆预定系统中时间段生成的实现方案。通过设计场馆表、时间段模板表和时间段表&#xff0c;系统能够根据场馆的提前预定天数生成未来可预定的时间段。为了确保任务执行的唯一性和高效性&#xff0c;系统采用分布式锁机制和定时任务&#xff0c;避…...

SQL刷题笔记——高级条件语句

目录 1题目&#xff1a;SQL149 根据指定记录是否存在输出不同情况 2 作答解析 3 知识点 3.1 count函数 3.2 内连接与左连接 1题目&#xff1a;SQL149 根据指定记录是否存在输出不同情况 2 作答解析 #正确答案 select uid, incomplete_cnt, incomplete_rate from (select …...

2. 手写数字预测 gui版

2. 手写数字预测 gui版 背景1.界面绘制2.处理图片3. 加载模型4. 预测5.结果6.一点小问题 背景 做了手写数字预测的模型&#xff0c;但是老是跑模型太无聊了&#xff0c;就配合pyqt做了一个可视化界面出来玩一下 源代码可以去这里https://github.com/Leezed525/pytorch_toy拿 …...

vBulletin未认证API方法调用漏洞(CVE-2025-48827)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

Nest全栈到失业(一):Nest基础知识扫盲

Nest 是什么? 问你一个问题,node是不是把js拉出来浏览器环境运行了?当然,他使用了v8引擎加上自己的底层模块从而实现了,在外部编辑处理文件等;然后它使用很多方式来发送请求是吧,你知道的什么http.request 或 https.request; 我们浏览器中,使用AJAX以及封装AJAX和http的Axios…...

【Java笔记】Spring IoC DI

目录 Spring IoC & DI1. IoC1.1 Bean的存储1.1.1 类注解1.1.2 方法注解 Bean1.1.3 重命名1.1.4 Spring扫描路径 2. DI Spring IoC & DI Spring两个核心思想&#xff1a;IoC & AOP Spring相当于一个容器&#xff0c;IoC就是把对象存放在Spring容器中&#xff0c;让…...

Redis--缓存工具封装

经过前面的学习&#xff0c;发现缓存中的问题&#xff0c;无论是缓存穿透&#xff0c;缓存雪崩&#xff0c;还是缓存击穿&#xff0c;这些问题的解决方案业务代码逻辑都很复杂&#xff0c;我们也不应该每次都来重写这些逻辑&#xff0c;我们可以将其封装成工具。而在封装的时候…...

算力卡上部署OCR文本识别服务与测试

使用modelscope上的图像文本行检测和文本识别模型进行本地部署并转为API服务。 本地部署时把代码中的检测和识别模型路径改为本地模型的路径。 关于模型和代码原理可以参见modelscope上这两个模型相关的页面&#xff1a; iic/cv_resnet18_ocr-detection-db-line-level_damo iic…...

PS裁剪后像素未删除?5步解决“删除裁剪像素”失效问题

在Photoshop中遇到“删除裁剪的像素”功能失效的问题时&#xff0c;可能涉及软件设置、版本兼容性或操作流程错误。以下是具体原因和解决方案&#xff1a; 一、常见原因分析 未正确勾选“删除裁剪的像素”选项 在裁剪工具属性栏中&#xff0c;需手动勾选该选项才能永久删除裁剪…...

Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案

找到宏 创建 并粘贴 使用 Sub 全选所有表格() Dim t As Table an MsgBox("即将选择选区内所有表格&#xff0c;若无选区&#xff0c;则选择全文表格。", vbYesNo, "reboot提醒您!") If an - 6 Then Exit Sub Set rg IIf(Selection.Type wdSelectionIP, …...

Splunk Validated Architecture (SVA):构建企业级可观测性与安全的基石

Splunk Validated Architecture (SVA) 是 Splunk 官方提供的一套经过严格测试、性能验证和最佳实践指导的参考架构蓝图。它并非单一固定方案&#xff0c;而是根据企业数据规模、性能需求、高可用性目标和合规要求&#xff0c;提供一系列可落地的部署模型。SVA 的核心价值在于为…...

【数据结构】——二叉树--链式结构

一、实现链式结构二叉树 二叉树的链式结构&#xff0c;那么从名字上我们就知道我们这个二叉树的底层是使用链表来实现的&#xff0c;前面我们的二叉树是通过数组来实现的&#xff0c;那么在其是完全二叉树的情况下&#xff0c;此时我们使用数组来实现就会使得其空间浪费较少&a…...