Transformers 文档
金字塔视觉Transformer V2 (PVTv2)
并获得增强的文档体验
开始使用
该模型于 2021-06-25 发布,并于 2024-03-13 添加到 Hugging Face Transformers。
金字塔视觉Transformer V2 (PVTv2)
概述
PVTv2模型在 PVT v2: Improved Baselines with Pyramid Vision Transformer 中提出,作者为 Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo, and Ling Shao。作为 PVT 的改进版本,它省略了位置嵌入,而是依赖于通过零填充和重叠的patch嵌入来编码的位置信息。这种不依赖位置嵌入的设计简化了架构,并允许在任何分辨率下运行推理,而无需对它们进行插值。
PVTv2 编码器结构已成功应用于语义分割的 Segformer、单目深度估计的 GLPN 和全景分割的 Panoptic Segformer 中,并取得了最先进的分数。
PVTv2 属于 分层 Transformer 模型系列,该系列对 Transformer 层进行调整以生成多尺度特征图。与会丢失细节的 Vision Transformer (ViT) 的列状结构不同,多尺度特征图能够保留这些细节并有助于密集预测任务的性能。对于 PVTv2,这是通过在每个编码器层中使用具有重叠卷积核的二维卷积来生成图像patch token来实现的。
分层 Transformer 的多尺度特征允许它们轻松地替换大型架构中的传统主力计算机视觉骨干模型,如 ResNet。Segformer 和 Panoptic Segformer 都证明了使用 PVTv2 作为骨干的配置始终优于使用类似大小的 ResNet 骨干的配置。
PVTv2 的另一个强大功能是降低自注意力层复杂度的 空间缩减注意力 (SRA),它使用二维卷积层将隐藏状态投影到更小的分辨率,然后再用查询对其进行注意力计算,从而提高了自注意力的复杂度降低到 $O(n^2/R)$,其中是空间缩减率(sr_ratio,即二维卷积中的核大小和步长)。
SRA 在 PVT 中引入,并且是 PVTv2 中默认使用的注意力复杂度降低方法。然而,PVTv2 还引入了一种使用与图像大小相关的线性复杂度的自注意力机制,他们称之为“线性 SRA”。该方法使用平均池化将隐藏状态减少到与原始分辨率无关的固定大小(尽管这本质上比常规 SRA 损失更大)。可以通过在 PVTv2Config 中将 linear_attention 设置为 True 来启用此选项。
论文摘要
Transformer 近期在计算机视觉领域取得了令人鼓舞的进展。在这项工作中,我们通过改进原始的 Pyramid Vision Transformer (PVT v1),引入三个设计,包括(1)线性复杂度注意力层,(2)重叠 patch 嵌入,和(3)卷积前馈网络,提出了新的基线。通过这些修改,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 的自注意力机制所提供的动态数据响应和全局关系建模的好处(transformers)。
PVTv2 使用重叠的 patch 嵌入来创建多尺度特征图,这些特征图通过零填充和深度卷积来注入位置信息。
为了降低注意力层的复杂度,PVTv2 使用步长为 2D 卷积(SRA)或固定大小的平均池化(Linear SRA)对隐藏状态进行空间缩减。尽管线性 SRA 本质上损失更大,但它以与图像大小相关的线性复杂度提供了令人印象深刻的性能。要在自注意力层中使用线性 SRA,请在
PvtV2Config中将linear_attention=True设置为 True。PvtV2Model 是分层 Transformer 编码器(在文献中也常被称为 Mix Transformer 或 MiT)。PvtV2ForImageClassification 在其之上添加了一个简单的分类头,用于执行图像分类。
PvtV2Backbone可以与 AutoBackbone 系统一起用于 Deformable DETR 等大型架构中。所有模型大小的 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"),
),
)
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 | #Params (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
< source >( image_size: 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: str | collections.abc.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]], optional, defaults to 224) — 输入图像大小。对于正方形图像,传入 int 值;对于 (height, width) 元组。 - num_channels (
int, optional, defaults to 3) — 输入通道数。 - num_encoder_blocks (
[int], optional, defaults to 4) — 编码器块的数量(即 Mix Transformer 编码器中的阶段)。 - depths (
list[int], optional, defaults to[2, 2, 2, 2]) — 每个编码器块中的层数。 - sr_ratios (
list[int], optional, defaults to[8, 4, 2, 1]) — 每个编码器块中的空间缩减率。 - hidden_sizes (
list[int], optional, defaults to[32, 64, 160, 256]) — 每个编码器块的维度。 - patch_sizes (
list[int], optional, defaults to[7, 3, 3, 3]) — 在每个编码器块之前的重叠 patch 嵌入的 patch 大小。 - strides (
list[int], optional, defaults to[4, 2, 2, 2]) — 在每个编码器块之前的重叠 patch 嵌入的步长。 - num_attention_heads (
list[int], 可选, 默认为[1, 2, 5, 8]) — Transformer编码器中每个块的每个注意力层的注意力头数量。 - mlp_ratios (
list[int], 可选, 默认为[8, 8, 4, 4]) — 编码器块中混合前馈网络(Mix FFNs)的隐藏层大小与输入层大小的比例。 - 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) — 随机深度使用的 dropout 概率,在 Transformer 编码器块中使用。 - 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,则默认为最后一个阶段。 - out_indices (
list[int], 可选) — 如果用作骨干网络,则输出特征的索引列表。可以是 0, 1, 2 等(取决于模型有多少个阶段)。如果未设置且设置了out_features,则默认为相应的阶段。如果未设置且未设置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
< source >( config: PvtV2Config )
参数
- config (PvtV2Config) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。
Pvt-v2 模型转换器,顶部带有图像分类头(在 [CLS] token 的最终隐藏状态之上一个线性层),例如用于 ImageNet。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< source >( pixel_values: torch.Tensor | None labels: torch.Tensor | None = None output_attentions: bool | None = None output_hidden_states: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (形状为
(batch_size, num_channels, image_size, image_size)的torch.Tensor, 可选) — 对应于输入图像的张量。像素值可以使用 PvtImageProcessorFast 获取。有关详细信息,请参阅 PvtImageProcessorFast.call()(processor_class使用 PvtImageProcessorFast 来处理图像)。 - labels (形状为
(batch_size,)的torch.LongTensor, 可选) — 用于计算图像分类/回归损失的标签。索引应在[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)
根据配置(PvtV2Config)和输入,一个 transformers.modeling_outputs.ImageClassifierOutput 或一个 torch.FloatTensor 的元组(如果传入 return_dict=False 或当 config.return_dict=False 时),包含各种元素。
-
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), optional, 当传入output_hidden_states=True或当config.output_hidden_states=True时返回) — 形状为(batch_size, sequence_length, hidden_size)的torch.FloatTensor元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 每个阶段的输出)。模型在每个阶段输出的隐藏状态(也称为特征图)。 -
attentions (
tuple(torch.FloatTensor), optional, 当传入output_attentions=True或当config.output_attentions=True时返回) — 形状为(batch_size, num_heads, patch_size, sequence_length)的torch.FloatTensor元组(每个层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
PvtV2ForImageClassification 的 forward 方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
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
< source >( config: PvtV2Config )
参数
- config (PvtV2Config) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。
Pvt V2 模型输出原始的隐藏状态,没有任何特定的头部。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源代码 >( pixel_values: FloatTensor output_attentions: bool | None = None output_hidden_states: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor,形状为(batch_size, num_channels, image_size, image_size)) — 对应输入图像的张量。像素值可以通过 PvtImageProcessorFast 获取。有关详细信息,请参阅 PvtImageProcessorFast.call() (processor_class使用 PvtImageProcessorFast 处理图像)。 - 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), optional, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层;+一个用于每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), optional, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
PvtV2Model 的 forward 方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。