Transformers 文档
金字塔视觉Transformer V2 (PVTv2)
并获得增强的文档体验
开始使用
金字塔视觉Transformer V2 (PVTv2)
概述
PVTv2 模型由 Wenhai Wang、Enze Xie、Xiang Li、Deng-Ping Fan、Kaitao Song、Ding Liang、Tong Lu、Ping Luo 和 Ling Shao 在PVT v2: Improved Baselines with Pyramid Vision Transformer中提出。作为 PVT 的改进变体,它摒弃了位置编码,而是依赖通过零填充和重叠补丁嵌入编码的位置信息。这种不依赖位置编码的特性简化了架构,并能够在任何分辨率下运行推理而无需插值。
PVTv2 编码器结构已成功部署,在语义分割的Segformer、单目深度估计的GLPN和全景分割的Panoptic Segformer中取得了最先进的SOTA分数。
PVTv2 属于一类称为分层 Transformer的模型,它们对 Transformer 层进行了修改以生成多尺度特征图。与视觉 Transformer (ViT) 的柱状结构会丢失细粒度细节不同,多尺度特征图能够保留这些细节并有助于在密集预测任务中提高性能。在 PVTv2 的例子中,这是通过在每个编码器层中使用带有重叠核的 2D 卷积生成图像补丁标记来实现的。
分层 Transformer 的多尺度特征使其能够轻松替换传统的主力计算机视觉骨干模型(如 ResNet)到更大的架构中。Segformer 和 Panoptic Segformer 都表明,使用 PVTv2 作为骨干的配置始终优于使用类似大小的 ResNet 骨干的配置。
PVTv2 的另一个强大特性是自注意力层中的复杂度降低,称为空间缩减注意力(Spatial Reduction Attention,SRA),它使用 2D 卷积层将隐藏状态投影到更小的分辨率,然后用查询对其进行注意,将自注意力的 $O(n^2)$ 复杂度改进到 $O(n^2/R)$,其中 $R$ 是空间缩减比(sr_ratio,即 2D 卷积中的核大小和步幅)。
SRA 在 PVT 中引入,是 PVTv2 中使用的默认注意力复杂度降低方法。然而,PVTv2 还引入了使用与图像大小相关的线性复杂度的自注意力机制的选项,他们称之为“线性 SRA”。此方法使用平均池化将隐藏状态缩减为固定大小,该大小与其原始分辨率无关(尽管这本质上比常规 SRA 损失更多)。通过在 PVTv2Config 中将 linear_attention 设置为 True 可以启用此选项。
论文摘要:
Transformer 最近在计算机视觉领域取得了令人鼓舞的进展。在这项工作中,我们通过增加三项设计,包括 (1) 线性复杂度注意力层,(2) 重叠补丁嵌入,以及 (3) 卷积前馈网络,改进了原始的金字塔视觉 Transformer (PVT v1),从而提出了新的基线。通过这些修改,PVT v2 将 PVT v1 的计算复杂度降低到线性,并在分类、检测和分割等基本视觉任务上取得了显著的改进。值得注意的是,所提出的 PVT v2 取得了与最近的工作(如 Swin Transformer)相当或更好的性能。我们希望这项工作能促进计算机视觉领域最先进的 Transformer 研究。代码可在 https://github.com/whai362/PVT 获取。
此模型由FoamoftheSea贡献。原始代码可在此处找到。
使用技巧
PVTv2 是一种分层 Transformer 模型,在图像分类和多项其他任务中展现出强大的性能,在 Segformer 中用作语义分割的骨干,在 GLPN 中用于单目深度估计,在 Panoptic Segformer 中用于全景分割,始终显示出比类似 ResNet 配置更高的性能。
与纯 Transformer 架构相比,像 PVTv2 这样的分层 Transformer 通过在其编码器中结合卷积神经网络(CNN)的设计元素,在图像数据上实现了卓越的数据和参数效率。这创造了一种两全其美的架构,将 CNN 的有用归纳偏置(如平移等变性和局部性)注入网络,同时仍享有 Transformer 的自注意力机制所提供的动态数据响应和全局关系建模的优势。
PVTv2 使用重叠的补丁嵌入来创建多尺度特征图,并通过零填充和深度可分离卷积注入位置信息。
为了降低注意力层的复杂度,PVTv2 使用步幅为 2D 卷积(SRA)或固定大小的平均池化(线性 SRA)对隐藏状态进行空间缩减。尽管线性 SRA 本质上损失更多,但它在图像大小方面具有线性复杂度,表现令人印象深刻。要在自注意力层中使用线性 SRA,请在
PvtV2Config中设置linear_attention=True。PvtV2Model 是分层 Transformer 编码器(在文献中也常被称为 Mix Transformer 或 MiT)。PvtV2ForImageClassification 在其顶部添加了一个简单的分类器头,用于执行图像分类。
PvtV2Backbone可用于更大架构(如 Deformable DETR)中的 AutoBackbone 系统。所有模型尺寸的 ImageNet 预训练权重可在 hub 上找到。
开始使用 PVTv2 的最佳方法是使用
AutoModelForImageClassification加载您选择的尺寸的预训练检查点
import requests
import torch
from transformers import AutoModelForImageClassification, AutoImageProcessor
from PIL import Image
model = AutoModelForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0")
image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))要将 PVTv2 用作 DeformableDETR 等更复杂架构的骨干,您可以使用 AutoBackbone(此模型需要微调,因为您正在替换预训练模型中的骨干)
import requests
import torch
from transformers import AutoConfig, AutoModelForObjectDetection, AutoImageProcessor
from PIL import Image
model = AutoModelForObjectDetection.from_config(
config=AutoConfig.from_pretrained(
"SenseTime/deformable-detr",
backbone_config=AutoConfig.from_pretrained("OpenGVLab/pvt_v2_b5"),
use_timm_backbone=False
),
)
image_processor = AutoImageProcessor.from_pretrained("SenseTime/deformable-detr")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))PVTv2 在 ImageNet-1K 上的性能按模型大小(B0-B5)排列
| 方法 | 大小 | Acc@1 | #参数 (M) |
|---|---|---|---|
| PVT-V2-B0 | 224 | 70.5 | 3.7 |
| PVT-V2-B1 | 224 | 78.7 | 14.0 |
| PVT-V2-B2-Linear | 224 | 82.1 | 22.6 |
| PVT-V2-B2 | 224 | 82.0 | 25.4 |
| PVT-V2-B3 | 224 | 83.1 | 45.2 |
| PVT-V2-B4 | 224 | 83.6 | 62.6 |
| PVT-V2-B5 | 224 | 83.8 | 82.0 |
PvtV2Config
class transformers.PvtV2Config
< 源 >( image_size: typing.Union[int, tuple[int, int]] = 224 num_channels: int = 3 num_encoder_blocks: int = 4 depths: list = [2, 2, 2, 2] sr_ratios: list = [8, 4, 2, 1] hidden_sizes: list = [32, 64, 160, 256] patch_sizes: list = [7, 3, 3, 3] strides: list = [4, 2, 2, 2] num_attention_heads: list = [1, 2, 5, 8] mlp_ratios: list = [8, 8, 4, 4] hidden_act: typing.Union[str, typing.Callable] = 'gelu' hidden_dropout_prob: float = 0.0 attention_probs_dropout_prob: float = 0.0 initializer_range: float = 0.02 drop_path_rate: float = 0.0 layer_norm_eps: float = 1e-06 qkv_bias: bool = True linear_attention: bool = False out_features = None out_indices = None **kwargs )
参数
- image_size (
Union[int, tuple[int, int]], 可选, 默认为 224) — 输入图像大小。正方形图像传入 int 值,或 (height, width) 的元组。 - num_channels (
int, 可选, 默认为 3) — 输入通道数。 - num_encoder_blocks (
[int], 可选, 默认为 4) — 编码器块的数量(即 Mix Transformer 编码器中的阶段数)。 - depths (
list[int], 可选, 默认为[2, 2, 2, 2]) — 每个编码器块中的层数。 - sr_ratios (
list[int], 可选, 默认为[8, 4, 2, 1]) — 每个编码器块中的空间缩减比。 - hidden_sizes (
list[int], 可选, 默认为[32, 64, 160, 256]) — 每个编码器块的维度。 - patch_sizes (
list[int], 可选, 默认为[7, 3, 3, 3]) — 每个编码器块前的重叠补丁嵌入的补丁大小。 - strides (
list[int], 可选, 默认为[4, 2, 2, 2]) — 每个编码器块前的重叠补丁嵌入的步幅。 - num_attention_heads (
list[int], 可选, 默认为[1, 2, 5, 8]) — Transformer 编码器每个块中每个注意力层的注意力头数量。 - mlp_ratios (
list[int], 可选, 默认为[8, 8, 4, 4]) — 编码器块中 Mix FFN 的隐藏层大小与输入层大小的比率。 - hidden_act (
str或Callable, 可选, 默认为"gelu") — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"、"relu"、"selu"和"gelu_new"。 - hidden_dropout_prob (
float, 可选, 默认为 0.0) — 嵌入、编码器和池化器中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
float, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。 - initializer_range (
float, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - drop_path_rate (
float, 可选, 默认为 0.0) — Transformer 编码器块中随机深度(stochastic depth)的 dropout 概率。 - layer_norm_eps (
float, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。 - qkv_bias (
bool, 可选, 默认为True) — 是否应为查询、键和值添加可学习的偏置。 - linear_attention (
bool, 可选, 默认为False) — 使用线性注意力复杂度。如果设置为 True,则sr_ratio将被忽略,并且注意力层中将使用平均池化而不是步进卷积进行降维。 - out_features (
list[str], 可选) — 如果用作骨干,则输出特征的列表。可以是"stem"、"stage1"、"stage2"等(取决于模型有多少个阶段)。如果未设置且out_indices已设置,则默认为相应的阶段。如果两者都未设置,则默认为最后一个阶段。 - out_indices (
list[int], 可选) — 如果用作骨干,则输出特征索引的列表。可以是 0、1、2 等(取决于模型有多少个阶段)。如果未设置且out_features已设置,则默认为相应的阶段。如果两者都未设置,则默认为最后一个阶段。
这是用于存储 PvtV2Model 配置的配置类。它用于根据指定的参数实例化 Pvt V2 模型,定义模型架构。使用默认值实例化配置将产生与 Pvt V2 B0 OpenGVLab/pvt_v2_b0 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。
示例
>>> from transformers import PvtV2Model, PvtV2Config
>>> # Initializing a pvt_v2_b0 style configuration
>>> configuration = PvtV2Config()
>>> # Initializing a model from the OpenGVLab/pvt_v2_b0 style configuration
>>> model = PvtV2Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configPvtForImageClassification
class transformers.PvtV2ForImageClassification
< 源 >( config: PvtV2Config )
参数
- config (PvtV2Config) — 包含模型所有参数的模型配置类。用配置文件初始化并不会加载模型相关权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
Pvt-v2 模型 Transformer 在其顶部带有一个图像分类头([CLS] 标记最终隐藏状态顶部的一个线性层),例如用于 ImageNet。
此模型继承自 PreTrainedModel。查阅父类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
此模型也是 PyTorch torch.nn.Module 子类。将其作为常规 PyTorch 模块使用,并参考 PyTorch 文档中所有与一般使用和行为相关的事项。
forward
< 源 >( pixel_values: typing.Optional[torch.Tensor] labels: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.Tensor形状为(batch_size, num_channels, image_size, image_size), 可选) — 对应于输入图像的张量。像素值可以使用{image_processor_class}获取。有关详细信息,请参阅{image_processor_class}.__call__({processor_class}使用{image_processor_class}处理图像)。 - labels (
torch.LongTensor形状为(batch_size,), 可选) — 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]范围内。如果config.num_labels == 1,则计算回归损失(均方损失),如果config.num_labels > 1,则计算分类损失(交叉熵损失)。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。更多详情请参阅返回张量中的attentions。 - output_hidden_states (
bool, 可选) — 是否返回所有层的隐藏状态。更多详情请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.ImageClassifierOutput 或一个 torch.FloatTensor 的元组(如果传入 return_dict=False 或 config.return_dict=False),包含根据配置 (PvtV2Config) 和输入的不同元素。
-
loss (形状为
(1,)的torch.FloatTensor,可选,当提供labels时返回) — 分类损失(如果 config.num_labels==1,则为回归损失)。 -
logits (形状为
(batch_size, config.num_labels)的torch.FloatTensor) — 分类(如果 config.num_labels==1,则为回归)分数(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor), 可选, 当传入output_hidden_states=True或config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 一个用于每个阶段的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个阶段输出的隐藏状态(也称为特征图)。 -
attentions (
tuple(torch.FloatTensor), 可选, 当传入output_attentions=True或config.output_attentions=True时返回) —torch.FloatTensor的元组(每层一个),形状为(batch_size, num_heads, patch_size, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
PvtV2ForImageClassification 的 forward 方法,重写了 __call__ 特殊方法。
虽然前向传播的实现需要在函数内部定义,但之后应该调用 Module 实例,而不是直接调用此函数,因为前者会处理预处理和后处理步骤,而后者会悄无声息地忽略它们。
示例
>>> from transformers import AutoImageProcessor, PvtV2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> model = PvtV2ForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> inputs = image_processor(image, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
...PvtModel
class transformers.PvtV2Model
< 源 >( config: PvtV2Config )
参数
- config (PvtV2Config) — 包含模型所有参数的模型配置类。用配置文件初始化并不会加载模型相关权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
裸 Pvt V2 模型输出原始隐藏状态,顶部没有任何特定头部。
此模型继承自 PreTrainedModel。查阅父类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
此模型也是 PyTorch torch.nn.Module 子类。将其作为常规 PyTorch 模块使用,并参考 PyTorch 文档中所有与一般使用和行为相关的事项。
forward
< 源代码 >( pixel_values: FloatTensor output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor, 形状为(batch_size, num_channels, image_size, image_size)) — 对应于输入图像的张量。像素值可以使用{image_processor_class}获取。有关详细信息,请参见{image_processor_class}.__call__({processor_class}使用{image_processor_class}处理图像)。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量下的attentions。 - output_hidden_states (
bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通的元组。
返回
transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
transformers.modeling_outputs.BaseModelOutput 或一个 torch.FloatTensor 元组(如果传入 return_dict=False 或 config.return_dict=False),包含取决于配置 (PvtV2Config) 和输入的不同元素。
-
last_hidden_state (
torch.FloatTensor, 形状为(batch_size, sequence_length, hidden_size)) — 模型最后一层输出的隐藏状态序列。 -
hidden_states (
tuple(torch.FloatTensor), 可选, 当传入output_hidden_states=True或config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层输出,如果模型有嵌入层,加上每个层输出一个),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), 可选, 当传入output_attentions=True或config.output_attentions=True时返回) —torch.FloatTensor的元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
PvtV2Model 的前向方法,覆盖了 __call__ 特殊方法。
虽然前向传播的实现需要在函数内部定义,但之后应该调用 Module 实例,而不是直接调用此函数,因为前者会处理预处理和后处理步骤,而后者会悄无声息地忽略它们。