介绍
本文将介绍一种计算机视觉技术——图像语义分割。虽然听起来很复杂,但我们会一步一步解析它,并介绍一种使用密集预测变换器(DPTs)实现的图像语义分割概念,这是从Hugging Face的集合中选择的。使用DPTs引入了一个具有非同寻常能力的新阶段。
学习目标
- DPTs相对于传统对远程连接的理解的比较。
- 使用Python实现使用DPT进行深度预测的语义分割。
- 探索DPT设计,理解它们独特的特点。
本文是数据科学博文马拉松的一部分。
什么是图像语义分割?
想象一下,你有一张图像,并希望根据图像中每个像素的表示对其进行标注。这就是图像语义分割的概念。它可以用于计算机视觉,区分汽车和树木,或者分离图像的不同部分;这一切都是为了智能地标记像素。然而,真正的挑战在于理解对象之间的上下文和关系。让我们将其与处理图像的旧方法进行比较。
卷积神经网络(CNNs)
第一个突破是使用卷积神经网络来处理涉及图像的任务。然而,CNNs有一些限制,尤其是在捕捉图像中的长距离连接方面。想象一下,如果你试图理解图像中不同元素在长距离上是如何相互作用的,传统的CNNs会遇到困难。这就是我们赞美DPT的地方。这些模型基于强大的变换器架构,具备捕捉关联的能力。我们将在接下来看到DPTs。
什么是密集预测变换器(DPTs)?
要理解这个概念,想象一下将我们之前在NLP任务中使用的变换器的强大能力与图像分析相结合。这就是密集预测变换器背后的概念。它们就像图像世界中的超级侦探一样。它们不仅能够标记图像中的每个像素,还可以预测每个像素的深度——这在某种程度上提供了有关每个对象与图像之间的距离的信息。我们将在下面看到这一点。
DPT架构工具箱
DPTs有不同类型,每种类型都有其“编码器”和“解码器”层。让我们在这里看一下两种流行的类型:
- DPT-Swin-Transformer:将其想象为具有10个编码器层和5个解码器层的超级变换器。它擅长理解图像中不同级别的元素之间的关系。
- DPT-ResNet:这个类型就像是一个聪明的侦探,具有18个编码器层和5个解码器层。它善于发现远距离对象之间的联系,同时保持图像的空间结构完整性。
关键特点
以下是关于DPTs如何使用一些关键特点的更详细说明:
- 分层特征提取:就像传统的卷积神经网络(CNNs)一样,DPTs从输入图像中提取特征。然而,它们采用一种分层的方法,将图像分为不同层次的细节。正是这种层次结构有助于捕捉局部和全局上下文,使模型能够理解不同尺度上对象之间的关系。
- 自注意机制:这是DPTs的核心,受原始变换器架构启发,使模型能够捕捉图像内的长程依赖关系,并学习像素之间的复杂关系。每个像素都考虑来自所有其他像素的信息,使模型对图像有整体的理解。
使用DPTs进行图像语义分割的Python演示
我们将在下面看到DPTs的实现。首先,让我们通过安装Colab上未预安装的库来设置环境。您可以在这里或https://github.com/inuwamobarak/semantic-segmentation找到此代码。
首先,我们安装并设置环境。
!pip install -q git+https://github.com/huggingface/transformers.git
接下来,我们准备训练模型。
## 定义模型# 从Transformers库导入DPTForSemanticSegmentationfrom transformers import DPTForSemanticSegmentation# 创建DPTForSemanticSegmentation模型并加载预训练权重# "Intel/dpt-large-ade"模型是在ADE20K数据集上训练的大规模模型model = DPTForSemanticSegmentation.from_pretrained("Intel/dpt-large-ade")
现在我们加载并准备要用于分割的图像。
# 从PIL(Python Imaging Library)模块导入Image类from PIL import Imageimport requests# 要下载的图像的URLurl = 'https://img.freepik.com/free-photo/happy-lady-hugging-her-white-friendly-dog-while-walking-park_171337-19281.jpg?w=740&t=st=1689214254~exp=1689214854~hmac=a8de6eb251268aec16ed61da3f0ffb02a6137935a571a4a0eabfc959536b03dd'# `stream=True`参数确保响应不会立即下载,而是保存在内存中response = requests.get(url, stream=True)# 创建Image类image = Image.open(response.raw)# 显示图像image
from torchvision.transforms import Compose, Resize, ToTensor, Normalize# 设置输入图像的期望高度和宽度net_h = net_w = 480# 定义一系列图像变换transform = Compose([ # 调整图像大小 Resize((net_h, net_w)), # 将图像转换为PyTorch张量 ToTensor(), # 标准化图像 Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]), ])
下一步是对图像应用一些转换。
# 转换输入图像pixel_values = transform(image)pixel_values = pixel_values.unsqueeze(0)
接下来进行前向传递。
import torch# 禁用梯度计算with torch.no_grad(): # 通过模型执行前向传递 outputs = model(pixel_values) # 从输出中获取逻辑(原始预测) logits = outputs.logits
现在,我们将图像打印为一堆数组。接下来,我们将将其转换为具有语义预测的图像。
import torch# 将逻辑插值到原始图像大小prediction = torch.nn.functional.interpolate( logits, size=image.size[::-1], # 反转原始图像的大小(宽度,高度) mode="bicubic", align_corners=False)# 将逻辑转换为类别预测prediction = torch.argmax(prediction, dim=1) + 1# 压缩预测张量以去除维度prediction = prediction.squeeze()# 将预测张量移动到CPU并将其转换为numpy数组prediction = prediction.cpu().numpy()
现在我们进行语义预测。
from PIL import Image# 将预测数组转换为图像predicted_seg = Image.fromarray(prediction.squeeze().astype('uint8'))# 将颜色映射应用于预测的分割图像predicted_seg.putpalette(adepallete)# 将原始图像和预测的分割图像进行混合out = Image.blend(image, predicted_seg.convert("RGB"), alpha=0.5)
这是我们预测的语义图像。你可以尝试使用自己的图像进行实验。现在让我们看看应用于DPT的一些评估。
DPT的性能评估
DPT已在各种研究工作和论文中进行了测试,并且已在Cityscapes、PASCAL VOC和ADE20K数据集等不同的图像场景上使用,并且其表现优于传统的CNN模型。有关该数据集和研究论文的链接将在下面的链接部分提供。
在Cityscapes上,DPT-Swin-Transformer在平均交并比(mIoU)度量上取得了79.1%的分数。在PASCAL VOC上,DPT-ResNet取得了82.8%的mIoU,创造了新的基准。这些分数证明了DPT对图像深度的理解能力。
DPT的未来和前景
DPT是图像理解的新时代。DPT研究正在改变我们看待和与图像交互的方式,并带来新的可能性。简而言之,使用DPT进行图像语义分割是一种突破,它正在改变我们解码图像的方式,并且在未来肯定会产生更多影响。从像素标签到深度理解,DPT是计算机视觉领域的可能性。让我们深入探讨一下。
准确的深度估计
DPT的最重要贡献之一是从图像中预测深度信息。这种进步具有三维场景重建、增强现实和物体操控等应用。这将为场景中物体的空间布局提供重要的理解。
同时进行语义分割和深度预测
DPT可以在统一的框架中提供语义分割和深度预测。这使得对图像的整体理解成为可能,可以实现对语义信息和深度知识的应用。例如,在自动驾驶中,这种组合对安全导航至关重要。
降低数据收集工作量
DPT有潜力减轻对深度数据的大量手动标注的需求。使用附带深度图的训练图像可以学习预测深度,而无需像素级深度注释。这极大地减少了与数据收集相关的成本和工作量。
场景理解
它们使机器能够以三维方式理解其环境,这对于机器人的导航和有效交互至关重要。在制造业和物流等行业中,DPT可以通过让机器人更深入地理解空间关系来实现自动化。
密集预测变换正在通过提供准确的深度信息以及对图像的语义理解来重塑计算机视觉领域。然而,解决与细粒度深度估计、泛化、不确定性估计、偏差缓解和实时优化相关的挑战将至关重要,以充分实现DPT在未来的变革影响。
结论
使用Dense Prediction Transformers进行图像语义分割是将像素标注与空间洞察力结合的旅程。DPT与图像语义分割的结合为计算机视觉研究开辟了一条令人兴奋的途径。本文试图揭示DPT的基本复杂性,从其架构到性能和前景的潜力,以重塑计算机视觉中语义分割的未来。
主要观点
- DPT不仅仅关注像素,还理解空间上下文并预测深度。
- DPT在捕捉距离和三维洞察力方面优于传统的图像识别。
- DPT重新定义了对图像的感知,实现了对对象和关系的深入理解。
常见问题
链接:
- 文章GitHub仓库:https://github.com/inuwamobarak/semantic-segmentation
- https://huggingface.co/docs/transformers/main/model_doc/dpt
- https://huggingface.co/docs/transformers/main/tasks/semantic_segmentation
- Ranftl, R., Bochkovskiy, A., & Koltun, V. (2021). Vision Transformers for Dense Prediction. ArXiv. /abs/2103.13413
- https://paperswithcode.com/dataset/ade20k
- https://huggingface.co/docs/transformers/main/model_doc/vit
- https://arxiv.org/abs/2103.13413
- https://huggingface.co/nielsr
本文中显示的媒体不归Analytics Vidhya所有,仅供作者自行决定。