Transformers documentation

Pyramid Vision Transformer V2 (PVTv2)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Este modelo foi publicado no HF papers em 2021-06-25 e contribuído para o Hugging Face Transformers em 2024-03-13.

Pyramid Vision Transformer V2 (PVTv2)

Visão geral

O modelo PVTv2 foi proposto em PVT v2: Improved Baselines with Pyramid Vision Transformer por Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo e Ling Shao. Como uma variante aprimorada do PVT, ele dispensa embeddings de posição, dependendo em vez disso de informações posicionais codificadas por meio de zero-padding e embeddings de patch sobrepostos. Essa ausência de dependência de embeddings de posição simplifica a arquitetura e permite executar inferência em qualquer resolução sem a necessidade de interpolá-los.

A estrutura do codificador PVTv2 foi implantada com sucesso para alcançar pontuações de estado da arte no Segformer para segmentação semântica, no GLPN para profundidade monocular e no Panoptic Segformer para segmentação panótica.

O PVTv2 pertence a uma família de modelos chamados transformers hierárquicos, que realizam adaptações nas camadas de transformer para gerar mapas de recursos multiescala. Diferentemente da estrutura colunar do Vision Transformer (ViT), que perde detalhes finos, os mapas de recursos multiescala são conhecidos por preservar esse detalhamento e contribuir para o desempenho em tarefas de predição densa. No caso do PVTv2, isso é alcançado gerando tokens de patches de imagem usando convolução 2D com kernels sobrepostos em cada camada do codificador.

Os recursos multiescala dos transformers hierárquicos permitem que eles sejam facilmente substituídos por modelos de backbone tradicionais de visão computacional, como o ResNet, em arquiteturas maiores. Tanto o Segformer quanto o Panoptic Segformer demonstraram que configurações que utilizam o PVTv2 como backbone superaram consistentemente aquelas com backbones ResNet de tamanho semelhante.

Outro recurso poderoso do PVTv2 é a redução de complexidade nas camadas de autoatenção, chamada Spatial Reduction Attention (SRA), que usa camadas de convolução 2D para projetar os estados ocultos para uma resolução menor antes de aplicá-los às queries, melhorando a O(n2)O(n^2) complexidade da autoatenção para $O(n^2/R)$, com RR sendo a razão de redução espacial (sr_ratio, também conhecida como tamanho do kernel e stride na convolução 2D).

O SRA foi introduzido no PVT e é o método padrão de redução da complexidade da atenção utilizado no PVTv2. No entanto, o PVTv2 também introduziu a opção de usar um mecanismo de autoatenção com complexidade linear relacionada ao tamanho da imagem, que eles chamaram de “Linear SRA”. Este método usa average pooling para reduzir os estados ocultos a um tamanho fixo que é invariante em relação à sua resolução original (embora isso seja inerentemente mais lossy do que o SRA regular). Essa opção pode ser habilitada definindo linear_attention como True no PVTv2Config.

Resumo do artigo

O Transformer tem apresentado recentemente progressos promissores em visão computacional. Neste trabalho, apresentamos novas linhas de base ao melhorar o Pyramid Vision Transformer original (PVT v1) com a adição de três designs, incluindo (1) camada de atenção de complexidade linear, (2) incorporação de patches sobrepostos e (3) rede feed-forward convolucional. Com essas modificações, o PVT v2 reduz a complexidade computacional do PVT v1 para linear e alcança melhorias significativas em tarefas fundamentais de visão, como classificação, detecção e segmentação. Notavelmente, o PVT v2 proposto alcança desempenho comparável ou superior ao de trabalhos recentes, como o Swin Transformer. Esperamos que este trabalho facilite pesquisas de estado da arte em Transformers para visão computacional. O código está disponível em https://github.com/whai362/PVT.

Este modelo foi contribuído por FoamoftheSea. O código original pode ser encontrado aqui.

Dicas de uso

  • PVTv2 é um modelo transformer hierárquico que demonstrou desempenho poderoso em classificação de imagens e em diversas outras tarefas, sendo utilizado como backbone para segmentação semântica em Segformer, estimativa de profundidade monocular em GLPN e segmentação panóptica em Panoptic Segformer, apresentando consistentemente desempenho superior em comparação com configurações semelhantes de ResNet.

  • Transformers hierárquicos, como o PVTv2, alcançam uma eficiência superior em dados e parâmetros em dados de imagem em comparação com arquiteturas puramente baseadas em transformers, ao incorporar elementos de design das redes neurais convolucionais (CNNs) em seus codificadores. Isso cria uma arquitetura que combina o melhor dos dois mundos, infundindo no network os vieses indutivos úteis das CNNs, como a equivariância de translação e a localidade, enquanto ainda aproveita os benefícios da resposta dinâmica aos dados e da modelagem de relações globais fornecidos pelo mecanismo de autoatenção dos transformers.

  • O PVTv2 usa incorporações de patches sobrepostas para criar mapas de recursos multiescala, que são enriquecidos com informações de localização usando zero-padding e convoluções depth-wise.

  • Para reduzir a complexidade nas camadas de atenção, o PVTv2 realiza uma redução espacial nos estados ocultos usando convolução 2D com passo (SRA) ou pooling de média de tamanho fixo (Linear SRA). Embora seja inerentemente mais lossy, o Linear SRA oferece um desempenho impressionante com complexidade linear em relação ao tamanho da imagem. Para usar o Linear SRA nas camadas de autoatenção, defina linear_attention=True no PvtV2Config.

  • PvtV2Model é o codificador transformer hierárquico (que também é frequentemente chamado de Mix Transformer ou MiT na literatura). PvtV2ForImageClassification adiciona uma cabeça de classificador simples no topo para realizar Classificação de Imagens. PvtV2Backbone pode ser usado com o sistema AutoBackbone em arquiteturas maiores, como o Deformable DETR.

  • Os pesos pré-treinados no ImageNet para todos os tamanhos de modelo podem ser encontrados no hub.

    A melhor maneira de começar com o PVTv2 é carregar o checkpoint pré-treinado com o tamanho de sua escolha usando AutoModelForImageClassification:

import requests
import torch
from PIL import Image

from transformers import AutoImageProcessor, AutoModelForImageClassification


model = AutoModelForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0", device_map="auto")
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"]))

Para usar o PVTv2 como backbone para arquiteturas mais complexas, como o DeformableDETR, você pode usar o AutoBackbone (esse modelo precisaria de fine-tuning, pois você está substituindo o backbone no modelo pré-treinado e ele é inicializado com pesos aleatórios):

import requests
import torch
from PIL import Image

from transformers import AutoConfig, AutoImageProcessor, AutoModelForObjectDetection


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"]))

Desempenho do PVTv2 no ImageNet-1K por tamanho de modelo (B0-B5):

MétodoTamanhoAcc@1#Parâmetros (M)
PVT-V2-B022470.53.7
PVT-V2-B122478.714.0
PVT-V2-B2-Linear22482.122.6
PVT-V2-B222482.025.4
PVT-V2-B322483.145.2
PVT-V2-B422483.662.6
PVT-V2-B522483.882.0

PvtV2Config

classe transformers.PvtV2Config

< >

( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Noneimage_size: int | list[int] | tuple[int, int] | dict = 224num_channels: int = 3num_encoder_blocks: int = 4depths: list[int] | tuple[int, ...] = (2, 2, 2, 2)sr_ratios: list[int] | tuple[int, ...] = (8, 4, 2, 1)hidden_sizes: list[int] | tuple[int, ...] = (32, 64, 160, 256)patch_sizes: list[int] | tuple[int, ...] = (7, 3, 3, 3)strides: list[int] | tuple[int, ...] = (4, 2, 2, 2)num_attention_heads: list[int] | tuple[int, ...] = (1, 2, 5, 8)mlp_ratios: list[int] | tuple[int, ...] = (8, 8, 4, 4)hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0initializer_range: float = 0.02drop_path_rate: float | int = 0.0layer_norm_eps: float = 1e-06qkv_bias: bool = Truelinear_attention: bool = False_out_features: list[str] | None = None_out_indices: list[int] | None = None )

Parâmetros

  • image_size (Union[int, list[int], tuple[int, int], dict], opcional, padrão 224) — O tamanho (resolução) de cada imagem.
  • num_channels (int, opcional, padrão 3) — O número de canais de entrada.
  • num_encoder_blocks ([int], opcional, padrão 4) — O número de blocos do codificador (ou seja, os estágios no codificador do Mix Transformer).
  • depths (Union[list[int], tuple[int, ...]], opcional, padrão (2, 2, 2, 2)) — Profundidade de cada camada no Transformer.
  • sr_ratios (list[int], opcional, padrão [8, 4, 2, 1]) — Razões de redução espacial em cada bloco do codificador.
  • hidden_sizes (Union[list[int], tuple[int, ...]], opcional, padrão (32, 64, 160, 256)) — Dimensão (tamanho oculto) em cada etapa do modelo.
  • patch_sizes (list[int], opcional, padrão [7, 3, 3, 3]) — Tamanho do patch para a incorporação de patches sobrepostos antes de cada bloco do codificador.
  • strides (list[int], opcional, padrão [4, 2, 2, 2]) — Passo para a incorporação de patches sobrepostos antes de cada bloco do codificador.
  • num_attention_heads (list[int], opcional, padrão [1, 2, 5, 8]) — Número de cabeças de atenção para cada camada de atenção em cada bloco do codificador do Transformer.
  • mlp_ratios (list[int], opcional, padrão [8, 8, 4, 4]) — Proporção entre o tamanho da camada oculta e o tamanho da camada de entrada dos Mix FFNs nos blocos do codificador.
  • hidden_act (str, opcional, padrão gelu) — A função de ativação não linear (função ou string) no decodificador. Por exemplo, "gelu", "relu", "silu", etc.
  • hidden_dropout_prob (Union[float, int], opcional, padrão 0.0) — A probabilidade de dropout para todas as camadas totalmente conectadas nos embeddings, no encoder e no pooler.
  • attention_probs_dropout_prob (Union[float, int], opcional, padrão 0.0) — A taxa de dropout para as probabilidades de atenção.
  • initializer_range (float, opcional, padrão 0.02) — O desvio padrão do truncated_normal_initializer para inicializar todas as matrizes de pesos.
  • drop_path_rate (Union[float, int], opcional, padrão 0.0) — Taxa de drop path para a fusão de patches.
  • layer_norm_eps (float, opcional, padrão 1e-06) — O epsilon usado pelas camadas de normalização de camada.
  • qkv_bias (bool, opcional, padrão True) — Se deve adicionar um viés às queries, keys e values.
  • linear_attention (bool, opcional, padrão False) — Usa complexidade de atenção linear. Se definido como True, sr_ratio é ignorado e o average pooling é usado para a redução de dimensionalidade nas camadas de atenção, em vez da convolução com passo.

Esta é a classe de configuração para armazenar a configuração de um PvtV2Model. Ela é usada para instanciar um modelo Pvt V2 de acordo com os argumentos especificados, definindo a arquitetura do modelo. Instanciar uma configuração com os padrões resultará em uma configuração semelhante à do OpenGVLab/pvt_v2_b0

Os objetos de configuração herdam de PreTrainedConfig e podem ser usados para controlar as saídas do modelo. Consulte a documentação de PreTrainedConfig para mais informações.

Exemplo:

>>> 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

classe transformers.PvtV2ForImageClassification

< >

( config: PvtV2Config )

Parâmetros

  • config (PvtV2Config) — Classe de configuração do modelo com todos os parâmetros do modelo. A inicialização com um arquivo de configuração não carrega os pesos associados ao modelo, apenas a configuração. Consulte o método from_pretrained() para carregar os pesos do modelo.

Modelo Pvt-v2 transformer com uma cabeça de classificação de imagem no topo (uma camada linear no topo do estado oculto final do token [CLS]), por exemplo, para o ImageNet.

Este modelo herda de PreTrainedModel. Consulte a documentação da classe pai para os métodos genéricos que a biblioteca implementa para todos os seus modelos (como download ou salvamento, redimensionamento dos embeddings de entrada, poda de cabeças, etc.)

Este modelo também é uma subclasse de torch.nn.Module do PyTorch. Use-o como um Módulo PyTorch regular e consulte a documentação do PyTorch para todos os assuntos relacionados ao uso geral e ao comportamento.

forward

< >

( pixel_values: typing.Optional[torch.Tensor]labels: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → ImageClassifierOutput or tuple(torch.FloatTensor)

Parâmetros

  • pixel_values (torch.Tensor de forma (batch_size, num_channels, image_size, image_size), opcional) — Os tensores correspondentes às imagens de entrada. Os valores de pixels podem ser obtidos usando PvtImageProcessor. Consulte PvtImageProcessor.call() para mais detalhes (processor_class usa PvtImageProcessor para processar imagens).
  • labels (torch.LongTensor de forma (batch_size,), opcional) — Rótulos para o cálculo da perda de classificação/regressão de imagem. Os índices devem estar em [0, ..., config.num_labels - 1]. Se config.num_labels == 1, uma perda de regressão é calculada (perda de erro quadrático médio); se config.num_labels > 1, uma perda de classificação é calculada (entropia cruzada).
  • output_attentions (bool, opcional) — Indica se os tensores de atenção de todas as camadas de atenção devem ser retornados. Consulte attentions nos tensores retornados para mais detalhes.
  • output_hidden_states (bool, opcional) — Indica se as hidden states de todas as camadas devem ser retornadas. Consulte hidden_states em tensors retornados para mais detalhes.
  • return_dict (bool, opcional) — Indica se deve retornar um ModelOutput em vez de uma tupla simples.

Retorna

ImageClassifierOutput ou tuple(torch.FloatTensor)

Um ImageClassifierOutput ou uma tupla de torch.FloatTensor (se return_dict=False for passado ou quando config.return_dict=False) contendo vários elementos, dependendo da configuração (PvtV2Config) e das entradas.

O método forward de PvtV2ForImageClassification substitui o método especial __call__.

Embora a receita para a passagem direta precise ser definida dentro desta função, deve-se chamar a instância de Module em seguida, em vez desta, pois a primeira cuida da execução das etapas de pré e pós-processamento, enquanto a segunda as ignora silenciosamente.

  • loss (torch.FloatTensor de forma (1,), opcional, retornado quando labels é fornecido) — Perda de classificação (ou de regressão se config.num_labels==1).

  • logits (torch.FloatTensor de forma (batch_size, config.num_labels)) — Pontuações de classificação (ou regressão, se config.num_labels==1) (antes do SoftMax).

  • hidden_states (tuple(torch.FloatTensor), opcional, retornado quando output_hidden_states=True é passado ou quando config.output_hidden_states=True) — Tupla de torch.FloatTensor (uma para a saída dos embeddings, se o modelo tiver uma camada de embedding, + uma para a saída de cada estágio) de forma (batch_size, sequence_length, hidden_size). Hidden-states (também chamados de feature maps) do modelo na saída de cada estágio.

  • attentions (tuple(torch.FloatTensor), opcional, retornado quando output_attentions=True é passado ou quando config.output_attentions=True) — Tupla de torch.FloatTensor (uma para cada camada) com forma (batch_size, num_heads, patch_size, sequence_length).

    Pesos de atenção após o softmax de atenção, usados para calcular a média ponderada nos cabeçalhos de autoatenção.

Exemplo:

>>> 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

classe transformers.PvtV2Model

< >

( config: PvtV2Config )

Parâmetros

  • config (PvtV2Config) — Classe de configuração do modelo com todos os parâmetros do modelo. A inicialização com um arquivo de configuração não carrega os pesos associados ao modelo, apenas a configuração. Consulte o método from_pretrained() para carregar os pesos do modelo.

O modelo Pvt V2 puro, que produz estados ocultos brutos sem nenhum head específico no topo.

Este modelo herda de PreTrainedModel. Consulte a documentação da classe pai para os métodos genéricos que a biblioteca implementa para todos os seus modelos (como download ou salvamento, redimensionamento dos embeddings de entrada, poda de cabeças, etc.)

Este modelo também é uma subclasse de torch.nn.Module do PyTorch. Use-o como um Módulo PyTorch regular e consulte a documentação do PyTorch para todos os assuntos relacionados ao uso geral e ao comportamento.

forward

< >

( pixel_values: FloatTensoroutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → BaseModelOutput or tuple(torch.FloatTensor)

Parâmetros

  • pixel_values (torch.FloatTensor de forma (batch_size, num_channels, image_size, image_size)) — Os tensores correspondentes às imagens de entrada. Os valores de pixels podem ser obtidos usando PvtImageProcessor. Consulte PvtImageProcessor.call() para detalhes (processor_class usa PvtImageProcessor para processar imagens).
  • output_attentions (bool, opcional) — Indica se os tensores de atenção de todas as camadas de atenção devem ser retornados. Consulte attentions nos tensores retornados para mais detalhes.
  • output_hidden_states (bool, opcional) — Indica se as hidden states de todas as camadas devem ser retornadas. Consulte hidden_states em tensors retornados para mais detalhes.
  • return_dict (bool, opcional) — Indica se deve retornar um ModelOutput em vez de uma tupla simples.

Retorna

BaseModelOutput ou tuple(torch.FloatTensor)

Um BaseModelOutput ou uma tupla de torch.FloatTensor (se return_dict=False for passado ou quando config.return_dict=False) contendo vários elementos, dependendo da configuração (PvtV2Config) e das entradas.

O método forward do PvtV2Model sobrescreve o método especial __call__.

Embora a receita para a passagem direta precise ser definida dentro desta função, deve-se chamar a instância de Module em seguida, em vez desta, pois a primeira cuida da execução das etapas de pré e pós-processamento, enquanto a segunda as ignora silenciosamente.

  • last_hidden_state (torch.FloatTensor de forma (batch_size, sequence_length, hidden_size)) — Sequência de estados ocultos na saída da última camada do modelo.

  • hidden_states (tuple(torch.FloatTensor), opcional, retornado quando output_hidden_states=True é passado ou quando config.output_hidden_states=True) — Tupla de torch.FloatTensor (um para a saída dos embeddings, se o modelo tiver uma camada de embedding, + um para a saída de cada camada) com formato (batch_size, sequence_length, hidden_size).

    Estados ocultos do modelo na saída de cada camada, além das saídas opcionais do embedding inicial.

  • attentions (tuple(torch.FloatTensor), opcional, retornado quando output_attentions=True é passado ou quando config.output_attentions=True) — Tupla de torch.FloatTensor (uma para cada camada) com a forma (batch_size, num_heads, sequence_length, sequence_length).

    Pesos de atenção após o softmax de atenção, usados para calcular a média ponderada nos cabeçalhos de autoatenção.

Update on GitHub