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

Ce modèle a été publié dans HF papers le 2021-06-25 et ajouté à Hugging Face Transformers le 2024-03-13.

Pyramid Vision Transformer V2 (PVTv2)

Aperçu

Le modèle PVTv2 a été proposé dans PVT v2: Improved Baselines with Pyramid Vision Transformer par Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo et Ling Shao. En tant que variante améliorée de PVT, il renonce aux embeddings de position, s'appuyant à la place sur des informations positionnelles encodées par zéro-padding et des embeddings de patch chevauchants. Cette absence de dépendance aux embeddings de position simplifie l'architecture et permet d'exécuter l'inférence à n'importe quelle résolution sans avoir besoin de les interpoler.

La structure de l’encodeur PVTv2 a été déployée avec succès pour atteindre des scores de pointe dans Segformer pour la segmentation sémantique, GLPN pour la profondeur monoculaire et Panoptic Segformer pour la segmentation panoptique.

PVTv2 appartient à une famille de modèles appelés transformers hiérarchiques, qui adaptent les couches de transformer afin de générer des cartes de caractéristiques multi-échelles. Contrairement à la structure en colonnes du Vision Transformer (ViT), qui perd les détails fins, les cartes de caractéristiques multi-échelles sont connues pour préserver ces détails et améliorer les performances sur les tâches de prédiction dense. Dans le cas de PVTv2, cela est réalisé en générant des jetons de patches d'image à l'aide de convolutions 2D avec des noyaux superposés dans chaque couche d'encodeur.

Les caractéristiques multi-échelle des transformeurs hiérarchiques permettent de les substituer facilement aux modèles de tronc d’architecture de vision par ordinateur traditionnels, tels que ResNet, au sein d’architectures plus larges. Segformer et Panoptic Segformer ont tous deux démontré que les configurations utilisant PVTv2 comme tronc d’architecture surpassent systématiquement celles employant des tronc d’architecture ResNet de taille comparable.

Une autre fonctionnalité puissante du PVTv2 est la réduction de la complexité des couches d'auto-attention, appelée Spatial Reduction Attention (SRA), qui utilise des couches de convolution 2D pour projeter les états cachés vers une résolution plus petite avant de les traiter avec les requêtes, améliorant ainsi la O(n2)O(n^2) complexité de l'auto-attention à $O(n^2/R)$, avec RR étant le ratio de réduction spatiale (sr_ratio, aussi appelé taille du noyau et pas dans la convolution 2D).

SRA a été introduit dans PVT et est la méthode de réduction de la complexité de l’attention par défaut utilisée dans PVTv2. Cependant, PVTv2 a également introduit l’option d’utiliser un mécanisme d’auto-attention avec une complexité linéaire liée à la taille de l’image, qu’ils ont appelé « Linear SRA ». Cette méthode utilise le average pooling pour réduire les états cachés à une taille fixe, invariante par rapport à leur résolution d’origine (bien que cela soit intrinsèquement plus destructeur que le SRA classique). Cette option peut être activée en définissant linear_attention sur True dans PVTv2Config.

Résumé de l'article

Le Transformer a récemment montré des progrès encourageants en vision par ordinateur. Dans ce travail, nous présentons de nouvelles références de base en améliorant le Pyramid Vision Transformer (PVT v1) d’origine à l’aide de trois conceptions, à savoir (1) une couche d’attention de complexité linéaire, (2) un encodage de patches superposés et (3) un réseau feed-forward convolutif. Grâce à ces modifications, PVT v2 réduit la complexité computationnelle de PVT v1 à linéaire et obtient des améliorations significatives sur des tâches fondamentales de vision telles que la classification, la détection et la segmentation. Notamment, le PVT v2 proposé atteint des performances comparables ou supérieures à celles de travaux récents tels que Swin Transformer. Nous espérons que ce travail facilitera la recherche de pointe sur les Transformers en vision par ordinateur. Le code est disponible à l’adresse https://github.com/whai362/PVT.

Ce modèle a été contribué par FoamoftheSea. Le code d'origine peut être trouvé ici.

Conseils d'utilisation

  • PVTv2 est un modèle transformer hiérarchique qui a démontré des performances puissantes en classification d’images et dans de nombreuses autres tâches. Il est utilisé comme colonne vertébrale pour la segmentation sémantique dans Segformer, l’estimation de profondeur monoculaire dans GLPN et la segmentation panoptique dans Panoptic Segformer, affichant systématiquement de meilleures performances que des configurations ResNet similaires.

  • Les transformers hiérarchiques comme PVTv2 offrent une meilleure efficacité en données et en paramètres sur les données d’images par rapport aux architectures de transformers pures, en intégrant des éléments de conception des réseaux de neurones convolutifs (CNN) dans leurs encodeurs. Cela crée une architecture qui combine le meilleur des deux mondes, en injectant dans le réseau les biais inductifs utiles des CNN, tels que l’équivariance à la translation et la localité, tout en conservant les avantages de la réponse dynamique aux données et de la modélisation des relations globales offerts par le mécanisme d’auto-attention des transformers.

  • PVTv2 utilise des embeddings de patches superposés pour créer des cartes de caractéristiques multi-échelles, qui sont enrichies d'informations de localisation à l'aide de zéro-padding et de convolutions en profondeur.

  • Pour réduire la complexité des couches d'attention, PVTv2 effectue une réduction spatiale sur les états cachés en utilisant soit une convolution 2D à pas (SRA), soit un pooling moyen de taille fixe (Linear SRA). Bien qu'intrinsèquement plus destructeur, le Linear SRA offre des performances impressionnantes avec une complexité linéaire par rapport à la taille de l'image. Pour utiliser le Linear SRA dans les couches d'auto-attention, définissez linear_attention=True dans PvtV2Config.

  • PvtV2Model est l’encodeur transformer hiérarchique (souvent appelé Mix Transformer ou MiT dans la littérature). PvtV2ForImageClassification ajoute une tête de classification simple au sommet pour effectuer la classification d’images. PvtV2Backbone peut être utilisé avec le système AutoBackbone dans des architectures plus grandes comme Deformable DETR.

  • Les poids pré-entraînés sur ImageNet pour toutes les tailles de modèle sont disponibles sur le hub.

    La meilleure façon de commencer avec PVTv2 est de charger le point de contrôle préentraîné de la taille de votre choix à l’aide de 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"]))

Pour utiliser PVTv2 comme colonne vertébrale pour des architectures plus complexes comme DeformableDETR, vous pouvez utiliser AutoBackbone (ce modèle nécessiterait un fine-tuning, car vous remplacez la colonne vertébrale du modèle pré-entraîné et qu'elle est initialisée avec des poids aléatoires) :

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

PVTv2 : performances sur ImageNet-1K en fonction de la taille du modèle (B0-B5) :

MéthodeTailleAcc@1#Paramètres (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 )

Paramètres

  • image_size (Union[int, list[int], tuple[int, int], dict], facultatif, par défaut 224) — La taille (résolution) de chaque image.
  • num_channels (int, facultatif, par défaut 3) — Le nombre de canaux d'entrée.
  • num_encoder_blocks ([int], facultatif, valeur par défaut 4) — Le nombre de blocs encodeur (c’est-à-dire les étapes de l’encodeur Mix Transformer).
  • depths (Union[list[int], tuple[int, ...]], facultatif, par défaut (2, 2, 2, 2)) — Profondeur de chaque couche du Transformer.
  • sr_ratios (list[int], facultatif, par défaut [8, 4, 2, 1]) — Ratios de réduction spatiale dans chaque bloc encodeur.
  • hidden_sizes (Union[list[int], tuple[int, ...]], facultatif, par défaut (32, 64, 160, 256)) — Dimension (taille cachée) à chaque étape du modèle.
  • patch_sizes (list[int], facultatif, par défaut [7, 3, 3, 3]) — Taille des patches pour l'incorporation de patches superposés avant chaque bloc encodeur.
  • strides (list[int], facultatif, par défaut [4, 2, 2, 2]) — Pas pour l'incorporation de tuiles superposées avant chaque bloc d'encodeur.
  • num_attention_heads (list[int], facultatif, par défaut [1, 2, 5, 8]) — Nombre de têtes d'attention pour chaque couche d'attention dans chaque bloc de l'encodeur Transformer.
  • mlp_ratios (list[int], facultatif, par défaut [8, 8, 4, 4]) — Ratio de la taille de la couche cachée par rapport à la taille de la couche d'entrée des Mix FFNs dans les blocs encodeur.
  • hidden_act (str, facultatif, par défaut gelu) — La fonction d'activation non linéaire (fonction ou chaîne de caractères) du décodeur. Par exemple, "gelu", "relu", "silu", etc.
  • hidden_dropout_prob (Union[float, int], facultatif, par défaut 0.0) — La probabilité de dropout pour toutes les couches entièrement connectées des embeddings, de l'encodeur et du pooler.
  • attention_probs_dropout_prob (Union[float, int], facultatif, par défaut 0.0) — Le taux de dropout appliqué aux probabilités d'attention.
  • initializer_range (float, facultatif, par défaut 0.02) — L'écart-type de la truncated_normal_initializer utilisé pour initialiser toutes les matrices de poids.
  • drop_path_rate (Union[float, int], facultatif, par défaut 0.0) — Taux de drop path pour la fusion des patches.
  • layer_norm_eps (float, facultatif, valeur par défaut 1e-06) — L'épsilon utilisé par les couches de normalisation de couche.
  • qkv_bias (bool, facultatif, par défaut True) — Indique s'il faut ajouter un biais aux requêtes, clés et valeurs.
  • linear_attention (bool, facultatif, par défaut False) — Utilise une complexité d'attention linéaire. Si défini sur True, sr_ratio est ignoré et un average pooling est utilisé pour la réduction de dimensionnalité dans les couches d'attention plutôt qu'une convolution à pas.

Ceci est la classe de configuration destinée à stocker la configuration d'un PvtV2Model. Elle est utilisée pour instancier un modèle Pvt V2 en fonction des arguments spécifiés, définissant ainsi l'architecture du modèle. L'instanciation d'une configuration avec les valeurs par défaut produira une configuration similaire à celle de OpenGVLab/pvt_v2_b0

Les objets de configuration héritent de PreTrainedConfig et peuvent être utilisés pour contrôler les sorties du modèle. Consultez la documentation de PreTrainedConfig pour plus d’informations.

Exemple :

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

Paramètres

  • config (PvtV2Config) — Classe de configuration du modèle contenant tous les paramètres du modèle. L’initialisation à partir d’un fichier de configuration ne charge pas les poids associés au modèle, uniquement la configuration. Consultez la méthode from_pretrained() pour charger les poids du modèle.

Modèle Pvt-v2 avec une tête de classification d'images au sommet (une couche linéaire au-dessus de l'état caché final du jeton [CLS]), par exemple pour ImageNet.

Ce modèle hérite de PreTrainedModel. Consultez la documentation de la classe parente pour les méthodes génériques que la bibliothèque implémente pour tous ses modèles (tels que le téléchargement ou l'enregistrement, le redimensionnement des embeddings d'entrée, la taille des têtes, etc.)

Ce modèle est également une sous-classe de torch.nn.Module de PyTorch. Utilisez-le comme un module PyTorch standard et consultez la documentation de PyTorch pour tout ce qui concerne l'utilisation et le comportement généraux.

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.Tensor)

Paramètres

  • pixel_values (torch.Tensor de forme (batch_size, num_channels, image_size, image_size), facultatif) — Les tenseurs correspondant aux images d’entrée. Les valeurs de pixels peuvent être obtenues à l’aide de PvtImageProcessor. Voir PvtImageProcessor.call() pour plus de détails (processor_class utilise PvtImageProcessor pour le traitement des images).
  • labels (torch.LongTensor de forme (batch_size,), facultatif) — Étiquettes pour le calcul de la perte de classification/régression d'image. Les indices doivent être dans [0, ..., config.num_labels - 1]. Si config.num_labels == 1, une perte de régression est calculée (perte du carré moyen). Si config.num_labels > 1, une perte de classification est calculée (entropie croisée).
  • output_attentions (bool, facultatif) — Indique s'il faut ou non retourner les tenseurs d'attention de toutes les couches d'attention. Consultez attentions sous les tenseurs retournés pour plus de détails.
  • output_hidden_states (bool, facultatif) — Indique s'il faut retourner les états cachés de toutes les couches. Voir hidden_states sous les tenseurs retournés pour plus de détails.
  • return_dict (bool, facultatif) — Indique s'il faut retourner un ModelOutput plutôt qu'un simple tuple.

Retourne

ImageClassifierOutput ou tuple(torch.Tensor)

Un ImageClassifierOutput ou un tuple de torch.Tensor (si return_dict=False est passé ou lorsque config.return_dict=False) comprenant divers éléments en fonction de la configuration (PvtV2Config) et des entrées.

La méthode forward de PvtV2ForImageClassification redéfinit la méthode spéciale __call__.

Bien que la recette de la passe avant doive être définie dans cette fonction, il faut ensuite appeler l'instance Module plutôt que celle-ci, car la première gère l'exécution des étapes de prétraitement et de post-traitement, tandis que la seconde les ignore silencieusement.

  • loss (torch.Tensor de forme (1,), facultatif, renvoyé lorsque labels est fourni) — Perte de classification (ou de régression si config.num_labels==1).

  • logits (torch.Tensor de forme (batch_size, config.num_labels)) — Scores de classification (ou de régression si config.num_labels==1) (avant SoftMax).

  • hidden_states (tuple(torch.Tensor), facultatif, renvoyé lorsque output_hidden_states=True est passé ou lorsque config.output_hidden_states=True) — Tuple de torch.Tensor (un pour la sortie des embeddings, si le modèle possède une couche d’embedding, + un pour la sortie de chaque étape) de forme (batch_size, sequence_length, hidden_size). États cachés (également appelés cartes de caractéristiques) du modèle à la sortie de chaque étape.

  • attentions (tuple(torch.Tensor), facultatif, renvoyé lorsque output_attentions=True est passé ou lorsque config.output_attentions=True) — Tuple de torch.Tensor (un par couche) de forme (batch_size, num_heads, patch_size, sequence_length).

    Poids des attentions après le softmax d'attention, utilisés pour calculer la moyenne pondérée dans les têtes d'auto-attention.

Exemple :

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

Paramètres

  • config (PvtV2Config) — Classe de configuration du modèle contenant tous les paramètres du modèle. L’initialisation à partir d’un fichier de configuration ne charge pas les poids associés au modèle, uniquement la configuration. Consultez la méthode from_pretrained() pour charger les poids du modèle.

Le modèle Pvt V2 brut, qui produit des états cachés bruts sans aucune tête spécifique au sommet.

Ce modèle hérite de PreTrainedModel. Consultez la documentation de la classe parente pour les méthodes génériques que la bibliothèque implémente pour tous ses modèles (tels que le téléchargement ou l'enregistrement, le redimensionnement des embeddings d'entrée, la taille des têtes, etc.)

Ce modèle est également une sous-classe de torch.nn.Module de PyTorch. Utilisez-le comme un module PyTorch standard et consultez la documentation de PyTorch pour tout ce qui concerne l'utilisation et le comportement généraux.

forward

< >

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

Paramètres

  • pixel_values (torch.Tensor de forme (batch_size, num_channels, image_size, image_size)) — Les tenseurs correspondant aux images d’entrée. Les valeurs de pixels peuvent être obtenues à l’aide de PvtImageProcessor. Voir PvtImageProcessor.call() pour plus de détails (processor_class utilise PvtImageProcessor pour le traitement des images).
  • output_attentions (bool, facultatif) — Indique s'il faut ou non retourner les tenseurs d'attention de toutes les couches d'attention. Consultez attentions sous les tenseurs retournés pour plus de détails.
  • output_hidden_states (bool, facultatif) — Indique s'il faut retourner les états cachés de toutes les couches. Voir hidden_states sous les tenseurs retournés pour plus de détails.
  • return_dict (bool, facultatif) — Indique s'il faut retourner un ModelOutput plutôt qu'un simple tuple.

Retourne

BaseModelOutput ou tuple(torch.Tensor)

Un BaseModelOutput ou un tuple de torch.Tensor (si return_dict=False est passé ou lorsque config.return_dict=False) comprenant divers éléments en fonction de la configuration (PvtV2Config) et des entrées.

La méthode forward du modèle PvtV2Model redéfinit la méthode spéciale __call__.

Bien que la recette de la passe avant doive être définie dans cette fonction, il faut ensuite appeler l'instance Module plutôt que celle-ci, car la première gère l'exécution des étapes de prétraitement et de post-traitement, tandis que la seconde les ignore silencieusement.

  • last_hidden_state (torch.Tensor de forme (batch_size, sequence_length, hidden_size)) — Séquence d'états cachés à la sortie de la dernière couche du modèle.

  • hidden_states (tuple(torch.Tensor), facultatif, renvoyé lorsque output_hidden_states=True est passé ou lorsque config.output_hidden_states=True) — Tuple de torch.Tensor (un pour la sortie des embeddings, si le modèle possède une couche d’embedding, + un pour la sortie de chaque couche) de forme (batch_size, sequence_length, hidden_size).

    États cachés du modèle à la sortie de chaque couche, ainsi que les sorties d'incorporation initiales facultatives.

  • attentions (tuple(torch.Tensor), facultatif, renvoyé lorsque output_attentions=True est passé ou lorsque config.output_attentions=True) — Tuple de torch.Tensor (un par couche) de forme (batch_size, num_heads, sequence_length, sequence_length).

    Poids des attentions après le softmax d'attention, utilisés pour calculer la moyenne pondérée dans les têtes d'auto-attention.

Update on GitHub