第一步: Depth Anything V2介绍

        本文介绍了 Depth Anything V2。在不追求复杂技术的前提下,我们旨在揭示一些关键发现,为构建强大的单目深度估计模型铺平道路。与 V1 [89] 相比,本版本通过三项关键实践产生了更精细且更鲁棒的深度预测:1)用合成图像替代所有标注的真实图像;2)扩大教师模型的容量;3)通过大规模伪标签真实图像的桥梁来训练学生模型。与基于稳定扩散(Stable Diffusion)构建的最新模型 [31] 相比,我们的模型在效率上显著更高(速度提升超过 10 倍),且更为准确。我们提供了不同规模的模型(参数量从 2500 万到 13 亿不等),以支持广泛的应用场景。得益于其强大的泛化能力,我们对其进行了度量深度标签的微调,以获得我们的度量深度模型。除了我们的模型外,考虑到当前测试集的多样性有限且常常存在噪声,我们构建了一个多功能评估基准,具有精确的标注和多样的场景,以促进未来的研究。

第二步:Depth Anything V2模型框架

     训练 Depth Anything V2 的模型流程包括三个主要步骤:

  • 在高质量合成图像上训练基于 DINOv2-G 编码器的教师模型。
  • 在大规模未标记的真实图像上生成准确的伪深度。
  • 在伪标记的真实图像上训练最终的学生模型,以实现稳健的泛化。

以下是 Depth Anything V2 训练过程的更简单说明:

第三步:模型代码展示

import cv2
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.transforms import Composefrom .dinov2 import DINOv2
from .util.blocks import FeatureFusionBlock, _make_scratch
from .util.transform import Resize, NormalizeImage, PrepareForNetdef _make_fusion_block(features, use_bn, size=None):return FeatureFusionBlock(features,nn.ReLU(False),deconv=False,bn=use_bn,expand=False,align_corners=True,size=size,)class ConvBlock(nn.Module):def __init__(self, in_feature, out_feature):super().__init__()self.conv_block = nn.Sequential(nn.Conv2d(in_feature, out_feature, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(out_feature),nn.ReLU(True))def forward(self, x):return self.conv_block(x)class DPTHead(nn.Module):def __init__(self, in_channels, features=256, use_bn=False, out_channels=[256, 512, 1024, 1024], use_clstoken=False):super(DPTHead, self).__init__()self.use_clstoken = use_clstokenself.projects = nn.ModuleList([nn.Conv2d(in_channels=in_channels,out_channels=out_channel,kernel_size=1,stride=1,padding=0,) for out_channel in out_channels])self.resize_layers = nn.ModuleList([nn.ConvTranspose2d(in_channels=out_channels[0],out_channels=out_channels[0],kernel_size=4,stride=4,padding=0),nn.ConvTranspose2d(in_channels=out_channels[1],out_channels=out_channels[1],kernel_size=2,stride=2,padding=0),nn.Identity(),nn.Conv2d(in_channels=out_channels[3],out_channels=out_channels[3],kernel_size=3,stride=2,padding=1)])if use_clstoken:self.readout_projects = nn.ModuleList()for _ in range(len(self.projects)):self.readout_projects.append(nn.Sequential(nn.Linear(2 * in_channels, in_channels),nn.GELU()))self.scratch = _make_scratch(out_channels,features,groups=1,expand=False,)self.scratch.stem_transpose = Noneself.scratch.refinenet1 = _make_fusion_block(features, use_bn)self.scratch.refinenet2 = _make_fusion_block(features, use_bn)self.scratch.refinenet3 = _make_fusion_block(features, use_bn)self.scratch.refinenet4 = _make_fusion_block(features, use_bn)head_features_1 = featureshead_features_2 = 32self.scratch.output_conv1 = nn.Conv2d(head_features_1, head_features_1 // 2, kernel_size=3, stride=1, padding=1)self.scratch.output_conv2 = nn.Sequential(nn.Conv2d(head_features_1 // 2, head_features_2, kernel_size=3, stride=1, padding=1),nn.ReLU(True),nn.Conv2d(head_features_2, 1, kernel_size=1, stride=1, padding=0),nn.ReLU(True),nn.Identity(),)def forward(self, out_features, patch_h, patch_w):out = []for i, x in enumerate(out_features):if self.use_clstoken:x, cls_token = x[0], x[1]readout = cls_token.unsqueeze(1).expand_as(x)x = self.readout_projects[i](torch.cat((x, readout), -1))else:x = x[0]x = x.permute(0, 2, 1).reshape((x.shape[0], x.shape[-1], patch_h, patch_w))x = self.projects[i](x)x = self.resize_layers[i](x)out.append(x)layer_1, layer_2, layer_3, layer_4 = outlayer_1_rn = self.scratch.layer1_rn(layer_1)layer_2_rn = self.scratch.layer2_rn(layer_2)layer_3_rn = self.scratch.layer3_rn(layer_3)layer_4_rn = self.scratch.layer4_rn(layer_4)path_4 = self.scratch.refinenet4(layer_4_rn, size=layer_3_rn.shape[2:])        path_3 = self.scratch.refinenet3(path_4, layer_3_rn, size=layer_2_rn.shape[2:])path_2 = self.scratch.refinenet2(path_3, layer_2_rn, size=layer_1_rn.shape[2:])path_1 = self.scratch.refinenet1(path_2, layer_1_rn)out = self.scratch.output_conv1(path_1)out = F.interpolate(out, (int(patch_h * 14), int(patch_w * 14)), mode="bilinear", align_corners=True)out = self.scratch.output_conv2(out)return outclass DepthAnythingV2(nn.Module):def __init__(self, encoder='vitl', features=256, out_channels=[256, 512, 1024, 1024], use_bn=False, use_clstoken=False):super(DepthAnythingV2, self).__init__()self.intermediate_layer_idx = {'vits': [2, 5, 8, 11],'vitb': [2, 5, 8, 11], 'vitl': [4, 11, 17, 23], 'vitg': [9, 19, 29, 39]}self.encoder = encoderself.pretrained = DINOv2(model_name=encoder)self.depth_head = DPTHead(self.pretrained.embed_dim, features, use_bn, out_channels=out_channels, use_clstoken=use_clstoken)def forward(self, x):patch_h, patch_w = x.shape[-2] // 14, x.shape[-1] // 14features = self.pretrained.get_intermediate_layers(x, self.intermediate_layer_idx[self.encoder], return_class_token=True)depth = self.depth_head(features, patch_h, patch_w)depth = F.relu(depth)return depth.squeeze(1)@torch.no_grad()def infer_image(self, raw_image, input_size=518):image, (h, w) = self.image2tensor(raw_image, input_size)depth = self.forward(image)depth = F.interpolate(depth[:, None], (h, w), mode="bilinear", align_corners=True)[0, 0]return depth.cpu().numpy()def image2tensor(self, raw_image, input_size=518):        transform = Compose([Resize(width=input_size,height=input_size,resize_target=False,keep_aspect_ratio=True,ensure_multiple_of=14,resize_method='lower_bound',image_interpolation_method=cv2.INTER_CUBIC,),NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),PrepareForNet(),])h, w = raw_image.shape[:2]image = cv2.cvtColor(raw_image, cv2.COLOR_BGR2RGB) / 255.0image = transform({'image': image})['image']image = torch.from_numpy(image).unsqueeze(0)DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'image = image.to(DEVICE)return image, (h, w)

第四步:运行交互代码

第五步:整个工程的内容

项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

深度学习Depth Anything V2神经网络实现单目深度估计系统源码_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89739.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89739.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89739.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手向:基于 Python 的简易视频剪辑工具

在数字媒体时代,视频创作已成为大众表达的重要形式,从个人vlog制作到企业宣传视频,视频内容的需求呈现爆发式增长。传统专业软件如Adobe Premiere Pro虽功能强大,提供完整的非线性编辑系统,但存在学习曲线陡峭&#xf…

如何在PyCharm中删除虚拟环境

1、进入Python Interpreters具体方法:Settings-->Project:自己命名的项目-->Python Interpreters-Python Interpreter下拉栏-->show all,具体步骤见下图。2、 选择需要删除的python环境,具体下图所示。选择需要删除的环境-->点击…

QML 动画效果详解

属性动画(PropertyAnimation)PropertyAnimation是QML中最基础、最常用的动画类型,它可以对任何基于数字或颜色的属性进行动画化处理,实现平滑的过渡效果。核心属性与用法PropertyAnimation的主要属性如下表所示:属性类型描述默认值targetQtOb…

LangGraph教程9:LangGraph检查点和Send机制

文章目录 检查点 send机制 检查点 检查点是每个超级步骤保存的图状态的快照,并由StateSnapshot对象表示,具有以下关键属性: config:与此检查点相关的配置。 metadata:与此检查点相关的元数据。 values:此时状态通道的值。 next:将要在图中执行的下一个节点名称的元组。…

面试高频题 力扣 130. 被围绕的区域 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

目录零、题目描述一、为什么这道题值得你花时间掌握?二、题目拆解:提取核心关键点三、解题思路:从边界入手,反向标记四、算法实现:深度优先遍历(DFS) 两次遍历五、C代码实现:一步步拆…

QA:多品牌多架构私有云的数据备份及恢复有哪些最佳实践?

一、跨平台备份架构设计​1、统一管理平台选型选择支持多品牌接口的备份软件,通过抽象层适配不同私有云API。例如,备份软件可同时对接VMware、OpenStack、ZStack等平台,实现策略集中配置与任务调度。​2、数据抽象与格式标准化采用中间数据层…

LeetCode Hot100 【1.两数之和、2.两数相加、3.无重复字符的最长子串】

1. 两数之和 自己做 分析 解法1&#xff1a;暴力解 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int num1 0; //下标int num2 0;vector<int> s; //保存结果for(vector<int>::iterator it1 nums.…

AI一键“瘦身”,拯救巨卡无比的图

有没有碰到过那种巨卡无比的AI&#xff08;Illustrator&#xff09;文件&#xff1f;从素材网站下的&#xff0c;或者自己“图像描摹”出来的&#xff0c;上面密密麻麻全是锚点&#xff0c;动一下卡半天&#xff01;我是在海外工作了10年的职业设计师&#xff5e;这些年最大的心…

MySQL基础教程:SELECT语句详解

MySQL基础教程&#xff1a;SELECT语句详解一、SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL分类二、SQL语言的规则与规范2.1 基本规则2.2 大小写规范2.3 注释2.4 命名规则2.5 数据导入三、基本的SELECT语句3.0 最简单的SELECT3.1 SELECT...FROM3.2 列的别名3.3 去除重复行3…

云原生环境下的安全控制框架设计

在这个容器满天飞、微服务遍地跑的时代&#xff0c;安全问题就像打地鼠游戏一样&#xff0c;刚按下一个又冒出三个。今天我们来聊聊如何在云原生环境中构建一套靠谱的安全控制框架。 &#x1f4d6; 文章目录 引言&#xff1a;云原生时代的安全新挑战云原生安全面临的核心挑战安…

Python关于numpy的基础知识

一.首先先安装numpy windowsr 输入cmd 然后像我这样输入进去&#xff0c;加一句后面的https&#xff1a;.....可以放其他他的镜像地址比如 清华大学镜像源&#xff1a;Simple Index阿里云镜像源&#xff1a;Simple Index中国科学技术大学镜像源&#xff1a;Verifying - USTC …

生成式人工智能实战 | 自回归模型详解与实现

生成式人工智能实战 | 自回归模型详解与实现 0. 前言 1. 文本生成模型分析 2. 数据处理 2.1 数据预处理 2.2 创建训练数据批次 3. 模型构建与训练 3.1 构建 LSTM 模型 3.2 训练 LSTM 模型 4. 生成文本 4.1 通过预测下一个 token 生成文本 4.2 控制文本生成的创意性 0. 前言 本…

路由器SDH POS接口

SDH POS 可看作“用 SDH 光纤专线给路由器当超级宽带网线”。 1️⃣ 拆名字 SDH 同步数字体系&#xff08;Synchronous Digital Hierarchy&#xff09;&#xff0c;运营商的骨干光传输标准&#xff0c;颗粒 STM-1/4/16/64…&#xff08;155 M/622 M/2.5 G/10 G&#xff09;。P…

响应式单位rpx及搭配使用UI产品工具

&#x1f3a8;✨ 欢迎来到RPX与即时设计的前端探索之旅 &#x1f680;&#x1f4bb; 亲爱的开发者朋友们&#xff1a; &#x1f44b; 大家好&#xff01;很高兴能在CSDN这个技术分享的平台上与各位相遇&#xff01;&#x1f31f; 作为一名长期奋战在前端开发一线的工程师&#…

MC0463四大名著-水浒签到

码蹄集OJ-四大名著-水浒签到 一、题目背景 本问题以《水浒传》为故事经纬&#xff0c;讲述史进对数列数字奥秘的探索。小码妹向其讲解特殊数列求和规则&#xff0c;我们需依据规则&#xff0c;对给定长度 n 的数列&#xff0c;按奇偶分组方式计算奇数组和与偶数组和的运算结果…

前缀和 HASH

前缀和 & HASH 个人模板 560. 和为 K 的子数组 class Solution {public int subarraySum(int[] nums, int k) {// 滑动窗口前缀和int n nums.length;int[] prevSum new int[n 1];for (int i 1; i < n 1; i) {prevSum[i] prevSum[i - 1] nums[i - 1];}int ans …

周末总结(2024/07/19)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利益冲突是直接质疑&am…

若依框架开启注册功能全流程指南

在若依&#xff08;RuoYi&#xff09;框架中&#xff0c;用户注册功能并非默认开启&#xff0c;需要通过后端配置、前端调整以及必要的角色分配设置来实现。本文将详细介绍开启注册功能的完整步骤&#xff0c;帮助开发者快速完成配置。一、后端配置&#xff1a;开启注册功能开关…

STM32单片机_3

第十章IIC通信协议规定, 起始之后主机必须先发送一个字节: 从机地址读写位, 进行寻址然后接收一下应答位, 然后再发送一个字节, 写入从机寄存器地址 之后就可以进行数据的收发了注意: 在 主机的接收应答的时候, 立刻释放SDA 然后这时候从机会立刻做出反应, 即拉低SDA, 也就是置…

SpringAI_Chat模型_DeepSeek模型--基础对话

一、前言 Spring AI 提供跨 AI 供应商&#xff08;如 OpenAI、Hugging Face 等&#xff09;的一致性 API, 通过分装的ChatModel或ChatClient即可轻松调动LLM进行流式或非流式对话。 本专栏主要围绕着通过OpenAI方式调用各种大语言模型展开学习&#xff08;因为95%以上模型都…