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.config
PvtForImageClassification
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
例項,而不是直接呼叫此函式,因為前者會處理預處理和後處理步驟,而後者會悄無聲息地忽略它們。