Transformers 文档
Pyramid Vision Transformer V2 (PVTv2)
并获得增强的文档体验
开始使用
Pyramid Vision 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, 和 Ling Shao。作为 PVT 的改进变体,它避开了位置嵌入,而是依赖于通过零填充和重叠 patch 嵌入编码的位置信息。这种不依赖位置嵌入的方式简化了架构,并能够在任何分辨率下运行推理,而无需插值它们。
PVTv2 编码器结构已成功部署,在 Segformer 中用于语义分割,GLPN 中用于单目深度估计,以及 Panoptic Segformer 中用于全景分割,均取得了最先进的分数。
PVTv2 属于 分层 Transformer 模型系列,这些模型对 Transformer 层进行了调整,以生成多尺度特征图。与 Vision Transformer (ViT) 丢失细粒度细节的纵向结构不同,多尺度特征图以保留此细节而闻名,并有助于密集预测任务的性能。在 PVTv2 的情况下,这是通过在每个编码器层中使用具有重叠核的 2D 卷积生成图像 patch 标记来实现的。
分层 Transformer 的多尺度特征使其可以轻松地替换为传统的主力计算机视觉骨干模型,如 ResNet,在更大的架构中。Segformer 和 Panoptic Segformer 都证明,使用 PVTv2 作为骨干的配置始终优于具有类似大小 ResNet 骨干的配置。
PVTv2 的另一个强大功能是自注意力层中的复杂度降低,称为空间缩减注意力 (SRA),它使用 2D 卷积层将隐藏状态投影到较小的分辨率,然后再使用查询来关注它们,从而将自注意力的 $O(n^2)$ 复杂度提高到 $O(n^2/R)$,其中 $R$ 是空间缩减率 (sr_ratio
,也称为 2D 卷积中的核大小和步幅)。
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 的有用归纳偏置(如平移等变性和局部性)注入到网络中,同时仍然享受 transformers 的自注意力机制提供的动态数据响应和全局关系建模的好处。
PVTv2 使用重叠的 patch 嵌入来创建多尺度特征图,这些特征图使用零填充和深度可分离卷积注入位置信息。
为了降低注意力层的复杂度,PVTv2 使用步幅 2D 卷积 (SRA) 或固定大小平均池化 (Linear SRA) 对隐藏状态执行空间缩减。虽然线性 SRA 本质上损失更多,但它提供了令人印象深刻的性能,其线性复杂度与图像大小有关。要在自注意力层中使用线性 SRA,请在
PvtV2Config
中设置linear_attention=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"),
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
< source >( image_size: typing.Union[int, typing.Tuple[int, int]] = 224 num_channels: int = 3 num_encoder_blocks: int = 4 depths: typing.List[int] = [2, 2, 2, 2] sr_ratios: typing.List[int] = [8, 4, 2, 1] hidden_sizes: typing.List[int] = [32, 64, 160, 256] patch_sizes: typing.List[int] = [7, 3, 3, 3] strides: typing.List[int] = [4, 2, 2, 2] num_attention_heads: typing.List[int] = [1, 2, 5, 8] mlp_ratios: typing.List[int] = [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 值;对于 (高度, 宽度) 的图像,传递元组。 - 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]
) — 每个编码器模块前重叠 patch 嵌入的 patch 大小。 - strides (
List[int]
, 可选, 默认为[4, 2, 2, 2]
) — 每个编码器模块前重叠 patch 嵌入的步幅。 - 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 编码器块中使用的随机深度 dropout 概率。 - layer_norm_eps (
float
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。 - qkv_bias (
bool
, 可选, 默认为True
) — 是否向 queries、keys 和 values 添加可学习的偏置。 - linear_attention (
bool
, 可选, 默认为False
) — 使用线性注意力复杂度。如果设置为 True,则忽略sr_ratio
,并且注意力层中的降维使用平均池化而不是步幅卷积。 - out_features (
List[str]
, 可选) — 如果用作骨干网络,则输出的特征列表。可以是"stem"
,"stage1"
,"stage2"
等(取决于模型有多少个阶段)。如果未设置且设置了out_indices
,则默认设置为相应的阶段。如果未设置out_indices
也未设置out_features
,则默认设置为最后一个阶段。 - out_indices (
List[int]
, 可选) — 如果用作骨干网络,则输出的特征索引列表。可以是 0, 1, 2 等(取决于模型有多少个阶段)。如果未设置且设置了out_features
,则默认设置为相应的阶段。如果未设置out_indices
也未设置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.config
PvtForImageClassification
class transformers.PvtV2ForImageClassification
< 源代码 >( config: PvtV2Config )
参数
- config (~PvtV2Config) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
带有图像分类头的 Pvt-v2 Model transformer 模型(在 [CLS] token 的最终隐藏状态之上添加一个线性层),例如用于 ImageNet 。
此模型是 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.FloatTensor
,形状为(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅 PvtImageProcessor.call()。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。 有关更多详细信息,请参见返回张量下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。 - labels (
torch.LongTensor
,形状为(batch_size,)
, 可选) — 用于计算图像分类/回归损失的标签。索引应为[0, ..., config.num_labels - 1]
。如果config.num_labels == 1
,则计算回归损失(均方误差损失);如果config.num_labels > 1
,则计算分类损失(交叉熵损失)。
返回值
transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.ImageClassifierOutput 或一个 torch.FloatTensor
的元组 (如果传递了 return_dict=False
或者当 config.return_dict=False
时),包含各种元素,具体取决于配置 (PvtV2Config) 和输入。
-
loss (
torch.FloatTensor
,形状为(1,)
,可选,当提供labels
时返回) — 分类(或回归,如果 config.num_labels==1)损失。 -
logits (
torch.FloatTensor
,形状为(batch_size, config.num_labels)
) — 分类(或回归,如果 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__
特殊方法。
尽管 forward 传递的配方需要在该函数内定义,但应该在此之后调用 Module
实例,而不是直接调用此函数,因为前者会处理预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, PvtV2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> 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])
LABEL_281
PvtModel
class transformers.PvtV2Model
< source >( config: PvtV2Config )
参数
- config (~PvtV2Config) — 带有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
裸 Pvt-v2 编码器输出原始隐藏状态,顶部没有任何特定的 head。此模型是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解所有与通用用法和行为相关的事项。
forward (前向传播)
< source >( 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, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获得。有关详细信息,请参阅 PvtImageProcessor.call()。 - 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 的 forward 方法,覆盖了 __call__
特殊方法。
尽管 forward 传递的配方需要在该函数内定义,但应该在此之后调用 Module
实例,而不是直接调用此函数,因为前者会处理预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, PvtV2Model
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> model = PvtV2Model.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> inputs = image_processor(image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 256, 7, 7]