介绍
图像深度估计是指确定图像中物体与观察者的距离。这是计算机视觉中的一个重要问题,因为它有助于创建3D模型、增强现实和自动驾驶汽车等技术。过去,人们使用立体视觉或特殊传感器等技术来估计深度。但现在,有一种名为深度预测Transformer(DPTs)的新方法使用深度学习来进行深度估计。
DPTs是一种可以通过观察图像来学习估计深度的模型。在本文中,我们将通过实际编码来了解DPTs的工作原理、它们的用途以及在不同应用中可以做什么。
学习目标
- 了解DPTs(Dense Prediction Transformers)的概念及其在图像深度估计中的作用。
- 探索DPTs的架构,包括视觉Transformer和编码器-解码器框架的组合。
- 使用Hugging Face Transformer库实现DPT任务。
- 认识DPTs在各个领域中的潜在应用。
本文作为Data Science Blogathon的一部分发表。
理解深度预测Transformer
深度预测Transformer(DPTs)是一种独特的深度学习模型,专门用于估计图像中物体的深度。它们利用了一种特殊类型的架构,称为Transformer,最初是为处理语言数据而开发的。然而,DPTs将这种架构进行了调整和应用,以处理视觉数据。DPTs的一个关键优势是它们能够捕捉图像各个部分之间的复杂关系,并对跨越较长距离的模型依赖进行建模。这使得DPTs能够准确地预测图像中物体的深度或距离。
深度预测Transformer的架构
深度预测Transformer(DPTs)通过将视觉Transformer和编码器-解码器框架结合起来,对图像进行深度估计。编码器组件使用自注意机制捕捉和编码特征,增强了对图像不同部分之间关系的理解。这提高了特征分辨率,并允许捕捉细粒度的细节。解码器组件通过将编码特征映射回原始图像空间,利用上采样和卷积层等技术来重建密集的深度预测。DPTs的架构使得模型能够考虑场景的全局上下文和不同图像区域之间的模型依赖关系,从而得出准确的深度预测。
总之,DPTs利用视觉Transformer和编码器-解码器框架对图像进行深度估计。编码器捕捉特征并使用自注意机制对其进行编码,解码器通过将编码特征映射回原始图像空间来重建密集的深度预测。这种架构使得DPTs能够捕捉细粒度的细节、考虑全局上下文并生成准确的深度预测。
使用Hugging Face Transformer实现DPT
我们将使用Hugging Face pipeline来实现DPT的实际应用。在此处找到完整的代码。
步骤1:安装依赖项
我们首先通过以下命令从GitHub代码库安装transformers包:
!pip install -q git+https://github.com/huggingface/transformers.git # 从Hugging Face的GitHub代码库安装transformers包
在Jupyter Notebook或JupyterLab单元格中执行!pip install命令,可以在笔记本环境中直接安装软件包。
步骤2:深度估计模型定义
提供的代码使用Hugging Face Transformers库中的DPT架构定义了一个深度估计模型。
from transformers import DPTFeatureExtractor, DPTForDepthEstimation
# 创建DPT特征提取器
feature_extractor = DPTFeatureExtractor.from_pretrained("Intel/dpt-large")
# 创建DPT深度估计模型
model = DPTForDepthEstimation.from_pretrained("Intel/dpt-large")
代码从Transformers库中导入了所需的类,即DPTFeatureExtractor和DPTForDepthEstimation。然后,我们通过调用DPTFeatureExtractor.from_pretrained()创建了一个DPT特征提取器的实例,并从“Intel/dpt-large”模型加载了预训练的权重。类似地,我们使用DPTForDepthEstimation.from_pretrained()创建了一个DPT深度估计模型的实例,并从同样的“Intel/dpt-large”模型加载了预训练的权重。
步骤 3: 图像加载
现在我们继续提供一种加载和准备图像以进行进一步处理的方法。
from PIL import Image
import requests
# 指定要下载的图像的 URL
url = 'https://img.freepik.com/free-photo/full-length-shot-pretty-healthy-young-lady-walking-morning-park-with-dog_171337-18880.jpg?w=360&t=st=1689213531~exp=1689214131~hmac=67dea8e3a9c9f847575bb27e690c36c3fec45b056e90a04b68a00d5b4ba8990e'
# 使用 PIL 下载并打开图像
image = Image.open(requests.get(url, stream=True).raw)
我们导入了必要的模块(来自 PIL 的 Image 和 requests)来处理图像处理和 HTTP 请求。它指定要下载的图像的 URL,然后使用 requests.get() 来检索图像数据。使用 Image.open() 将下载的图像数据作为 PIL 图像对象打开。
步骤 4: 前向传播
import torch
# 使用 torch.no_grad() 禁用梯度计算
with torch.no_grad():
# 通过模型传递像素值
outputs = model(pixel_values)
# 从输出中获取预测的深度值
predicted_depth = outputs.predicted_depth
上述代码执行模型的前向传播,以获取输入图像的预测深度值。我们使用 torch.no_grad() 作为上下文管理器来禁用梯度计算,在推理过程中减少内存使用。他们使用 model(pixel_values) 将像素值张量 pixel_values 通过模型,并将结果输出存储在 outputs 变量中。接下来,他们从 outputs.predicted_depth 中访问预测的深度值,并将其赋值给 predicted_depth 变量。
步骤 5: 插值和可视化
现在,我们对预测的深度值进行插值,将其转换为图像。
import numpy as np
# 将预测的深度值插值到原始尺寸
prediction = torch.nn.functional.interpolate(
predicted_depth.unsqueeze(1),
size=image.size[::-1],
mode="bicubic",
align_corners=False,
).squeeze()
# 将插值的深度值转换为 numpy 数组
output = prediction.cpu().numpy()
# 缩放和格式化深度值以进行可视化
formatted = (output * 255 / np.max(output)).astype('uint8')
# 从格式化的深度值创建图像
depth = Image.fromarray(formatted)
depth
我们使用 torch.nn.functional.interpolate() 将预测的深度值插值到输入图像的原始尺寸。然后,使用 .cpu().numpy() 将插值的深度值转换为 numpy 数组。接下来,将深度值缩放和格式化为 [0, 255] 范围以进行可视化。最后,使用 Image.fromarray() 从格式化的深度值创建图像。
执行此代码后,`depth` 变量将包含深度图像,我们将其显示为深度图像。
好处和优势
深度预测变换器在图像深度估计方面比传统方法具有多个好处和优势。以下是一些关于深度预测变换器(DPTs)的关键要点:
- 更好的细节关注: DPTs 使用称为编码器的特殊部分来捕捉非常小的细节,并使预测更准确。
- 了解整体情况: DPTs 擅长弄清楚图像的不同部分如何相互连接。这有助于它们理解整个场景并准确估计深度。
- 多样的应用领域: 在许多不同的领域中使用 DPTs,如制作 3D 模型、在增强现实中向真实世界添加物体以及帮助机器人理解周围环境。
- 集成易用性:将DPT与其他计算机视觉工具结合使用,如提取对象或将图像分割成不同部分。这使得深度估算更加准确和精确。
潜在应用
使用深度预测变换器进行图像深度估算在不同领域中有许多有用的应用。以下是一些示例:
- 自主导航:深度估算对于自动驾驶汽车来理解周围环境并安全行驶非常重要。
- 增强现实:深度估算有助于在增强现实应用中将虚拟物体叠加到真实世界中,使其看起来逼真并与环境正确交互。
- 3D重建:深度估算对于从常规2D图像创建对象或场景的3D模型至关重要,使我们能够在三维空间中可视化它们。
- 机器人技术:深度估算对于机器人执行拾取物体、避开障碍物和理解环境布局等任务非常有价值。
结论
使用深度预测变换器进行图像深度估算提供了一种强大而精确的方法,可以从2D图像中估算深度。通过使用变换器架构和编码器-解码器框架,DPT可以有效地捕捉复杂细节,理解图像不同部分之间的关联,并生成准确的深度预测。这项技术在自主导航、增强现实、3D重建和机器人技术等各个领域都有应用潜力,为这些领域的进展提供了令人兴奋的可能性。随着计算机视觉的进步,深度预测变换器将继续在实现准确可靠的深度估算方面发挥关键作用,促进各种应用的改进和突破。
要点
- 使用深度预测变换器(DPTs)进行图像深度估算是一种强大而准确的方法,可以从2D图像中预测深度。
- DPTs利用变换器架构和编码器-解码器框架来捕捉细节、建模长距离依赖关系并生成精确的深度预测。
- DPTs在自主导航、增强现实、3D重建和机器人技术等领域具有潜在应用,为各个领域开辟了新的可能性。
- 随着计算机视觉的进步,深度预测变换器将继续在实现精确可靠的深度估算方面发挥重要作用,促进各种应用的进展。
常见问题
参考链接
- 代码:https://github.com/inuwamobarak/depth-estimation-DPT
- https://www.v7labs.com/blog/vision-transformer-guide
- https://viso.ai/deep-learning/vision-transformer-vit/
- https://paperswithcode.com/method/dense-prediction-transformer
- https://huggingface.co/docs/transformers/main/en/model_doc/dpt
本文中显示的媒体不归Analytics Vidhya所有,仅根据作者的决定使用。