《Probing the 3D Awareness of Visual Foundation Models》论文解析——单图像表面重建

一、论文简介

        论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力,这些模型不仅能够完成训练任务,其中间表示还对其他视觉任务(如检测和分割)有用。研究者们提出了一个问题:这些模型是否能够表示物体的三维结构。他们通过一系列实验,使用特定任务的探针和零样本推理程序来分析这些模型的3D感知能力,并发现当前模型存在一些限制。这个实验旨在评估模型对图像中可见表面表示的能力,具体包括两个任务:深度估计(Monocular Depth Estimation)和表面法线估计(Surface Normal Estimation)。

二、深度估计(Monocular Depth Estimation)

        任务:预测图像中每个像素点的深度。

        数据集:使用NYUv2数据集评估场景级性能,NAVI数据集评估对象级性能。

        输入:单张RGB图像;输出:图像中每个像素点的深度

        网络结构:使用AdaBins的二进制预测结果,在模型的多层特征图基础上,构建一个类似于DPT解码器的多尺度探测器,用于密集预测。通过训练密集探针来预测每个像素点的深度。

        1.预训练模型特征提取

        对于一张待估计深度的图像,使用一个预训练的视觉模型(例如,一个视觉变换器或卷积神经网络)来提取图像的特征。这些特征通常在模型的中间层获得,以捕捉到图像的高层语义信息。

        2.深度预测网络(Dense Probe)

        设计一个密集探针(dense probe)网络,这个网络将从预训练模型中提取的特征映射到深度图。这个探针网络可以是一个简单的全连接层,或者是一个更复杂的网络结构,如多层感知机(MLP)或卷积层。使用AdaBins方法来训练这个探针网络(AdaBins是一种基于分箱的深度预测技术,它将深度范围划分为一系列离散的“bins”,并学习将图像特征映射到这些bins的概率分布),度量预测深度和真实深度之间的差距。

        3. 损失函数和优化

        AdaBins方法使用特定的损失函数来训练网络,这个损失函数同时考虑了深度值的回归和分类任务;使用AdamW优化器进行训练,这是一种带有权重衰减的随机梯度下降变体,有助于防止过拟合并提高训练稳定性;采用线性预热和余弦衰减学习率调度器进行学习率调度,这意味着在训练初期逐步增加学习率,然后在训练后期逐渐减小学习率,以促进模型收敛。

        4.深度图生成

        对于输入图像中的每个像素,探针网络预测一个深度值或一个深度bins的概率分布。并根据预测的概率分布,为每个像素选择最有可能的深度值,或者通过某种方式(如取期望值)从概率分布中得到一个单一的深度估计值。

        5.评估方法

        使用均方根预测误差(RMSE)和不同阈值下的召回率来评估深度估计的准确性,将预测的深度图与真实深度图(第二列)进行比较,以验证模型的性能。

三、表面法线估计(Surface Normal Estimation)

        任务:预测每个像素点的表面法线方向。

        数据集:NYUv2数据集:该数据集提供了与表面法线相关的注释,用于评估室内场景的表面法线估计性能。

        NAVI数据集:该数据集包含了对象实例在多种场景和方向中的表面法线注释,用于评估对象级别的表面法线估计性能。

        输入:单张RGB图像;输出:图像中每个像素点表面法线方向

        1.同深度估计进行预训练模型特征提取

        2.表面法线预测网络(Surface Normal Prediction Network)

        设计一个网络结构,将从预训练模型中提取的特征映射到表面法线的预测。这个网络可以是一个简单的全连接层,或者是一个更复杂的网络结构,如多层感知机(MLP)或卷积层。使用Bae等人提出的不确定性感知的角度损失函数来训练网络,以预测法线的方向。

        3.表面法线图生成

        对于输入图像中的每个像素,网络预测一个表面法线的方向向量。并将预测的法线向量归一化,以确保它们具有单位长度。

        4.评估方法

        使用均方根角度预测误差(RMSE)和不同角度阈值下的召回率来评估表面法线估计的准确性。将预测的表面法线图与真实表面法线图(如果有的话)进行比较,以验证模型的性能。

四、相关代码解析

        1.深度估计

        深度估计是一个复杂的计算机视觉任务,通常涉及到机器学习或深度学习技术。以下是一个简单的示例,使用Python和OpenCV库来从单个RGB图像中估计深度。

        

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from PIL import Image# 定义一个自定义的数据集
class DepthDataset(Dataset):def __init__(self, image_paths, transform=None):self.image_paths = image_pathsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image_path = self.image_paths[idx]image = Image.open(image_path)if self.transform:image = self.transform(image)# 假设我们有一个对应的深度图,这里我们随机生成一个作为示例depth = torch.rand(1, 1, image.size[1], image.size[0])return image, depth# 定义CNN模型
class DepthCNN(nn.Module):def __init__(self):super(DepthCNN, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1)self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)self.fc1 = nn.Linear(64*16*16, 1024)self.fc2 = nn.Linear(1024, 1)  # 假设深度图是单通道的def forward(self, x):x = torch.relu(self.conv1(x))x = torch.relu(self.conv2(x))x = torch.relu(self.conv3(x))x = x.view(x.size(0), -1)  # Flatten the tensorx = torch.relu(self.fc1(x))x = self.fc2(x)return x# 实例化数据集和数据加载器
image_paths = ['path_to_your_image1.jpg', 'path_to_your_image2.jpg']  # 替换为实际图像路径
transform = transforms.Compose([transforms.ToTensor()])
dataset = DepthDataset(image_paths, transform)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)# 实例化模型
model = DepthCNN()# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(10):  # 迭代10个epochfor images, depths in dataloader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, depths)loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')

        在这个示例中,我们定义了一个DepthDataset类来加载图像和对应的深度图。然后,我们定义了一个DepthCNN类来构建CNN模型。模型包含三个卷积层和两个全连接层。我们使用均方误差损失(MSELoss)作为损失函数,并使用Adam优化器来更新模型权重。

        2.表面法线估计

        表面法线分析是计算机视觉中的一个高级任务,通常涉及到从RGB图像中估计表面的法线向量。这通常需要复杂的深度学习模型,比如卷积神经网络(CNN)。以下是一个使用PyTorch框架的简化示例,展示了如何构建一个CNN模型来进行表面法线分析。

        

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from PIL import Image# 定义一个自定义的数据集
class NormalDataset(Dataset):def __init__(self, image_paths, transform=None):self.image_paths = image_pathsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image_path = self.image_paths[idx]image = Image.open(image_path)if self.transform:image = self.transform(image)# 假设我们有一个对应的法线图,这里我们随机生成一个作为示例# 法线图通常有三个通道,分别对应x, y, z坐标normal = torch.rand(3, image.size[1], image.size[0])return image, normal# 定义CNN模型
class NormalCNN(nn.Module):def __init__(self):super(NormalCNN, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1)self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)self.fc1 = nn.Linear(64*16*16, 256)self.fc2 = nn.Linear(256, 3)  # 法线有三个分量def forward(self, x):x = torch.relu(self.conv1(x))x = torch.relu(self.conv2(x))x = torch.relu(self.conv3(x))x = x.view(x.size(0), -1)  # Flatten the tensorx = torch.relu(self.fc1(x))x = self.fc2(x)return x# 实例化数据集和数据加载器
image_paths = ['path_to_your_image1.jpg', 'path_to_your_image2.jpg']  # 替换为实际图像路径
transform = transforms.Compose([transforms.ToTensor()])
dataset = NormalDataset(image_paths, transform)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)# 实例化模型
model = NormalCNN()# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(10):  # 迭代10个epochfor images, normals in dataloader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, normals)loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')

        在这个示例中,我们定义了一个NormalDataset类来加载图像和对应的法线图。然后,我们定义了一个NormalCNN类来构建CNN模型。模型包含三个卷积层和两个全连接层。我们使用均方误差损失(MSELoss)作为损失函数,并使用Adam优化器来更新模型权重。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

P3-4.【结构化程序设计】第四节——知识要点:break、continue和goto辅助循环设计语句

知识要点:break、continue和goto辅助循环设计语句 视频: P3-4.1.【结构化程序设计】第四节——知识要点:break、continue和goto辅助循环设计语句 P3-4.2.【结构化程序设计】第四节——知识要点:break、continue和goto辅助循环设计…

灵神DAY3 KMP算法

具体解释: 1. 真前缀和真后缀的定义 前缀:字符串的起始部分。例如,字符串 s "aabcaa" 的前缀是 ""、"a"、"aa"、"aab"、"aabc"、"aabca"、"aabcaa"。 …

MySQL5.7.37安装配置

1.下载MySQL软件包并解压 2.配置环境变量 3.新建my.ini文件并输入信息 [mysqld] #端口号 port 3306 #mysql-5.7.27-winx64的路径 basedirC:\mysql-5.7.37\mysql-5.7.37-winx64 #mysql-5.7.27-winx64的路径\data datadirC:\mysql-5.7.37\mysql-5.7.37-winx64\data #最大连接数…

基于单片机的手持金属探测仪设计

本设计以STM32F103C8T6单片机为核心,通过金属线圈感应器来判断是否存在金属,控制OLED显示屏显示金属探测仪的灵敏度和参考值,通过电源模块将220V转化为3.3V对单片机进行供电,还可以通过按键对金属探测仪的灵敏度进行设置&#xff…

P1197 星球大战(并查集+逆向思维)

这是今天写的比较有价值的一道题,晚上写了大概一个多小时,主要还是在debug,出得很妙,好题👍 P1197 [JSOI2008] 星球大战 - 洛谷 | 计算机科学教育新生态 思路:如果我们按照顺序一个一个的去计算毁灭一个星…

深度学习驱动的蛋白质设计技术与前沿实践-从基础到尖端应用

RoseTTAFold,作为David Baker教授团队早期开发的蛋白质结构预测工具,在学术界与工业界广受认可。然而,随着时间推移,仅局限于预测已知结构的蛋白质并不能满足生物医药和生物工程领域对创新设计的需求。这促使David Baker教授团队继…

Linux 进程信号初识

目录 0.前言 1.什么是信号 1.1生活中的信号 1.2 OS中的信号 2.认识信号 2.1信号概念 2.2查看信号 2.3 signal函数 2.4代码示例 3. 信号处理方式 3.1 忽略信号 3.2 默认处理 3.3 自定义处理 4.小结 (图像由AI生成) 0.前言 在之前的学习中,我…

SpringBoot(二十五)SpringBoot集成JRebel实现热更新

今天来安装一个IDEA代码热更新的插件,一个神器。 我们之前也为IDEA配置了热更新,使用的是spring-boot-devtools插件。具体请移步《SpringBoot(一)创建项目及配置IDEA热更新》 上边这个热更新对于单模块项目是没有问题的,但是对于多模块项目可能就无能无能为力了,而且,随…

MATLAB中的绘图技巧

MATLAB作为一种强大的科学计算软件,不仅可以进行数据分析和模拟,还具有出色的绘图功能。本文介绍若干在MATLAB中绘图的技巧和方法,帮助使用者更好地呈现数据和结果 文章目录 基本绘图函数高级绘图技巧三维绘图动态绘图绘图工具结语 基本绘图函…

java八股-AQS,Reentrantlock

什么是AQS? 难度:★★★☆☆ 考频:★★★☆☆ 注意这个队列是双向队列,每次有线程释放锁了之后,会有下一个线程来,以及队列头元素,如果设置的是公平锁,那么是等了很久的头元素先获…

python——模块 迭代器 正则

一、python模块 先创建一个 .py 文件,这个文件就称之为 一个模块 Module。 使用模块的优点: 模块化编程,多文件编程 1.2 模块的使用 1.2.1 import语句 想要B.py文件中,使用A.py文件,只需要在B.py文件中使用关键字…

STL之mapset|AVL树

STL之map&set|AVL树 set&map搜索二叉树实现代码 set的使用map的使用set&map的模拟实现(见红黑树篇) AVL树AVL树的模拟实现 set&map 前言:stl库中set和map的底层都是红黑树,一种平衡搜索二叉树,是我下…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享,B 站账号:https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意:因每个人操作顺序可能略有区别,整个部署流程如果出现出入,以…

OceanBase 分区表详解

1、分区表的定义 在OceanBase数据库中,普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中,同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表,而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…

代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结

LeetCode 322.零钱兑换: 文章链接 题目链接:322.零钱兑换 思路: 首先分析题目,每种硬币的数量是无限的,因此为完全背包问题;又要求返回的是最少硬币个数,因此与组合数/排列数无关&#xff0c…

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket?WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景?说明WebSocket的建立连接的过程? 计算机网络WebSocket 什么是WebSocket? WebSocket是一个网络通信协议,提…

在Ubuntu 24.04 LTS上安装飞桨PaddleX

前面我们介绍了《在Windows用远程桌面访问Ubuntu 24.04.1 LTS》本文接着介绍安装飞桨PaddleX。 PaddleX 3.0 是基于飞桨框架构建的一站式全流程开发工具,它集成了众多开箱即用的预训练模型,可以实现模型从训练到推理的全流程开发,支持国内外多…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2:简单的语言模型社会解决复杂推理问题 论文地址:https://aclanthology.org/2024.emnlp-main.920/ 项目地址: https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

(三十三)队列(queue)

文章目录 1. 队列(queue)1.1 定义1.2 函数1.3 习题1.3.1 例题(周末舞会) 2. 双向队列(deque)2.1 定义2.2 函数2.3 题目2.3.1 例题(打BOSS) 1. 队列(queue) 队…

web——upload-labs——第二关

MIME验证 MIME(Multipurpose Internet Mail Extensions)验证是指在互联网传输中,通过检查数据的MIME类型来确保数据格式的正确性和安全性。MIME最初是为了扩展电子邮件的功能,让邮件支持多种格式,如文本、图片、音频等…