Transformers documentation
Pyramid Vision Transformer V2 (PVTv2)
Este modelo se publicó en HF papers el 25-06-2021 y se contribuyó a Hugging Face Transformers el 13-03-2024.
Pyramid Vision Transformer V2 (PVTv2)
Resumen
El modelo PVTv2 se propuso en PVT v2: Improved Baselines with Pyramid Vision Transformer de Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo y Ling Shao. Como una variante mejorada de PVT, evita los embeddings de posición, apoyándose en cambio en la información posicional codificada mediante relleno con ceros y embeddings de parches superpuestos. Esta falta de dependencia de los embeddings de posición simplifica la arquitectura y permite ejecutar la inferencia a cualquier resolución sin necesidad de interpolarlos.
La estructura del codificador PVTv2 se ha implementado con éxito para lograr puntuaciones de vanguardia en Segformer para segmentación semántica, GLPN para profundidad monocular y Panoptic Segformer para segmentación panóptica.
PVTv2 pertenece a una familia de modelos denominados transformers jerárquicos, que realizan adaptaciones en las capas de transformer para generar mapas de características multiescala. A diferencia de la estructura columnal de Vision Transformer (ViT), que pierde el detalle fino, los mapas de características multiescala se conocen por preservar este detalle y mejorar el rendimiento en tareas de predicción densa. En el caso de PVTv2, esto se logra generando tokens de parches de imagen mediante convolución 2D con núcleos superpuestos en cada capa del codificador.
Las características multiescala de los transformers jerárquicos permiten reemplazarlos fácilmente por los modelos de backbone de visión por computadora tradicionales, como ResNet, en arquitecturas más grandes. Tanto Segformer como Panoptic Segformer demostraron que las configuraciones que utilizan PVTv2 como backbone superaron consistentemente a las que emplean backbones de ResNet de tamaño similar.
Otra característica potente de PVTv2 es la reducción de la complejidad en las capas de autoatención, denominada Spatial Reduction Attention (SRA), que utiliza capas de convolución 2D para proyectar los estados ocultos a una resolución más pequeña antes de aplicarles las consultas, mejorando la complejidad de la autoatención a $O(n^2/R)$, donde es la proporción de reducción espacial (sr_ratio, también conocida como tamaño del kernel y stride en la convolución 2D).
SRA se introdujo en PVT y es el método de reducción de la complejidad de la atención predeterminado utilizado en PVTv2. Sin embargo, PVTv2 también introdujo la opción de utilizar un mecanismo de autoatención con complejidad lineal relacionada con el tamaño de la imagen, al que llamaron “Linear SRA”. Este método utiliza el promedio de agrupación (average pooling) para reducir los estados ocultos a un tamaño fijo que es invariante a su resolución original (aunque esto es inherentemente más pérdida que el SRA regular). Esta opción se puede habilitar estableciendo linear_attention en True en PVTv2Config.
Resumen del artículo
Recientemente, los Transformers han mostrado avances prometedores en visión por computadora. En este trabajo, presentamos nuevas líneas base mejorando el Pyramid Vision Transformer original (PVT v1) mediante la adición de tres diseños, que incluyen (1) una capa de atención de complejidad lineal, (2) incrustación de parches superpuestos y (3) una red feed-forward convolucional. Con estas modificaciones, PVT v2 reduce la complejidad computacional de PVT v1 a lineal y logra mejoras significativas en tareas fundamentales de visión, como clasificación, detección y segmentación. Cabe destacar que el PVT v2 propuesto logra un rendimiento comparable o superior al de trabajos recientes como Swin Transformer. Esperamos que este trabajo facilite la investigación de vanguardia en Transformers para visión por computadora. El código está disponible en https://github.com/whai362/PVT.
Este modelo fue aportado por FoamoftheSea. El código original se puede encontrar aquí.
Consejos de uso
PVTv2 es un modelo transformer jerárquico que ha demostrado un rendimiento potente en la clasificación de imágenes y en otras múltiples tareas, y se utiliza como columna vertebral para la segmentación semántica en Segformer, la estimación de profundidad monocular en GLPN y la segmentación panóptica en Panoptic Segformer, mostrando de forma consistente un rendimiento superior al de configuraciones similares de ResNet.
Los transformers jerárquicos como PVTv2 logran una eficiencia superior en datos y parámetros con datos de imagen en comparación con las arquitecturas puramente transformer, al incorporar elementos de diseño de las redes neuronales convolucionales (CNN) en sus codificadores. Esto crea una arquitectura que combina lo mejor de ambos mundos, infundiendo en la red los sesgos inductivos útiles de las CNN, como la equivalencia a la traslación y la localidad, mientras se aprovechan los beneficios de la respuesta dinámica a los datos y la modelización de relaciones globales proporcionados por el mecanismo de autoatención de los transformers.
PVTv2 utiliza embeddings de parches superpuestos para crear mapas de características multiescala, que se enriquecen con información de ubicación mediante relleno con ceros y convoluciones por profundidad.
Para reducir la complejidad en las capas de atención, PVTv2 realiza una reducción espacial en los estados ocultos mediante una convolución 2D con paso (SRA) o un promedio de tamaño fijo (Linear SRA). Aunque es inherentemente más pérdida, Linear SRA ofrece un rendimiento impresionante con una complejidad lineal con respecto al tamaño de la imagen. Para usar Linear SRA en las capas de autoatención, establezca
linear_attention=TrueenPvtV2Config.PvtV2Model es el codificador jerárquico de transformadores (también conocido frecuentemente como Mix Transformer o MiT en la literatura). PvtV2ForImageClassification añade una cabeza de clasificador simple en la parte superior para realizar clasificación de imágenes.
PvtV2Backbonese puede utilizar con el sistema AutoBackbone en arquitecturas más grandes como Deformable DETR.Los pesos preentrenados en ImageNet para todos los tamaños de modelo se pueden encontrar en el hub.
La mejor manera de empezar con PVTv2 es cargar el punto de control preentrenado con el tamaño que elijas 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 PVTv2 como columna vertebral para arquitecturas más complejas como DeformableDETR, puede usar AutoBackbone (este modelo necesitaría ajuste fino, ya que está reemplazando la columna vertebral en el modelo preentrenado y se inicializa con pesos aleatorios):
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"]))Rendimiento de PVTv2 en ImageNet-1K según el tamaño del modelo (B0-B5):
| Método | Tamaño | Acc@1 | #Parámetros (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
clase transformers.PvtV2Config
< source >( 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, valor predeterminado224) — El tamaño (resolución) de cada imagen. - num_channels (
int, opcional, valor predeterminado3) — El número de canales de entrada. - num_encoder_blocks (
[int], opcional, valor predeterminado 4) — El número de bloques del codificador (es decir, las etapas en el codificador del Mix Transformer). - depths (
Union[list[int], tuple[int, ...]], opcional, por defecto(2, 2, 2, 2)) — Profundidad de cada capa en el Transformer. - sr_ratios (
list[int], opcional, valor predeterminado[8, 4, 2, 1]) — Ratios de reducción espacial en cada bloque del codificador. - hidden_sizes (
Union[list[int], tuple[int, ...]], opcional, valor predeterminado(32, 64, 160, 256)) — Dimensionalidad (tamaño oculto) en cada etapa del modelo. - patch_sizes (
list[int], opcional, valor predeterminado[7, 3, 3, 3]) — Tamaño de parche para la incrustación de parches superpuestos antes de cada bloque codificador. - strides (
list[int], opcional, valor predeterminado[4, 2, 2, 2]) — Paso para la incrustación de parches superpuestos antes de cada bloque codificador. - num_attention_heads (
list[int], opcional, valor predeterminado[1, 2, 5, 8]) — Número de cabezas de atención para cada capa de atención en cada bloque del codificador Transformer. - mlp_ratios (
list[int], opcional, valor predeterminado[8, 8, 4, 4]) — Proporción del tamaño de la capa oculta en comparación con el tamaño de la capa de entrada de los Mix FFNs en los bloques del codificador. - hidden_act (
str, opcional, valor predeterminadogelu) — La función de activación no lineal (función o cadena) en el decodificador. Por ejemplo,"gelu","relu","silu", etc. - hidden_dropout_prob (
Union[float, int], opcional, valor predeterminado0.0) — La probabilidad de dropout para todas las capas totalmente conectadas en las incrustaciones, el codificador y el pooler. - attention_probs_dropout_prob (
Union[float, int], opcional, valor predeterminado0.0) — La proporción de dropout para las probabilidades de atención. - initializer_range (
float, opcional, valor predeterminado0.02) — La desviación estándar del truncated_normal_initializer para inicializar todas las matrices de pesos. - drop_path_rate (
Union[float, int], opcional, valor predeterminado0.0) — Tasa de drop path para la fusión de parches. - layer_norm_eps (
float, opcional, valor predeterminado1e-06) — La epsilon utilizada por las capas de normalización de capa. - qkv_bias (
bool, opcional, valor predeterminadoTrue) — Si se debe añadir un sesgo a las consultas, claves y valores. - linear_attention (
bool, opcional, valor predeterminadoFalse) — Usa una complejidad de atención lineal. Si se establece en True,sr_ratiose ignora y se utiliza average pooling para la reducción de dimensionalidad en las capas de atención en lugar de convolución con paso.
Esta es la clase de configuración para almacenar la configuración de un PvtV2Model. Se utiliza para instanciar un modelo Pvt V2 según los argumentos especificados, definiendo la arquitectura del modelo. Instanciar una configuración con los valores predeterminados producirá una configuración similar a la de OpenGVLab/pvt_v2_b0
Los objetos de configuración heredan de PreTrainedConfig y se pueden usar para controlar las salidas del modelo. Lea la documentación de PreTrainedConfig para obtener más información.
Ejemplo:
>>> 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
clase transformers.PvtV2ForImageClassification
< source >( config: PvtV2Config )
Parámetros
- config (PvtV2Config) — Clase de configuración del modelo con todos los parámetros del modelo. Inicializar con un archivo de configuración no carga los pesos asociados con el modelo, solo la configuración. Consulte el método from_pretrained() para cargar los pesos del modelo.
Modelo Pvt-v2 transformer con una cabeza de clasificación de imágenes en la parte superior (una capa lineal sobre el estado oculto final del token [CLS]), por ejemplo, para ImageNet.
Este modelo hereda de PreTrainedModel. Consulta la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos sus modelos (como la descarga o el guardado, el redimensionamiento de las incrustaciones de entrada, la poda de cabezas, etc.).
Este modelo también es una subclase de torch.nn.Module de PyTorch. Úsalo como un módulo de PyTorch regular y consulta la documentación de PyTorch para todo lo relacionado con el uso y el comportamiento generales.
forward
< source >( 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)
Parámetros
- pixel_values (
torch.Tensorde forma(batch_size, num_channels, image_size, image_size), opcional) — Los tensores correspondientes a las imágenes de entrada. Los valores de píxeles se pueden obtener utilizando PvtImageProcessor. Consulte PvtImageProcessor.call() para más detalles (processor_classutiliza PvtImageProcessor para procesar las imágenes). - labels (
torch.LongTensorde forma(batch_size,), opcional) — Etiquetas para calcular la pérdida de clasificación/regresión de imágenes. Los índices deben estar en[0, ..., config.num_labels - 1]. Siconfig.num_labels == 1se calcula una pérdida de regresión (pérdida de error cuadrático medio), siconfig.num_labels > 1se calcula una pérdida de clasificación (entropía cruzada). - output_attentions (
bool, opcional) — Indica si se deben devolver los tensores de atención de todas las capas de atención. Consulteattentionsen los tensores devueltos para obtener más detalles. - output_hidden_states (
bool, opcional) — Indica si se deben devolver los estados ocultos de todas las capas. Consultehidden_statesen los tensores devueltos para obtener más detalles. - return_dict (
bool, opcional) — Indica si se debe devolver un ModelOutput en lugar de una tupla simple.
Devuelve
ImageClassifierOutput o tuple(torch.Tensor)
Un ImageClassifierOutput o una tupla de
torch.Tensor (si se pasa return_dict=False o cuando config.return_dict=False) que comprende varios
elementos según la configuración (PvtV2Config) y las entradas.
El método forward de PvtV2ForImageClassification sobrescribe el método especial __call__.
Aunque la receta para la pasada hacia adelante debe definirse dentro de esta función, se debe llamar a la instancia de
Moduledespués en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de pre y postprocesamiento, mientras que la segunda los ignora silenciosamente.
loss (
torch.Tensorde forma(1,), opcional, se devuelve cuando se proporcionalabels) — Pérdida de clasificación (o de regresión si config.num_labels==1).logits (
torch.Tensorde forma(batch_size, config.num_labels)) — Puntuaciones de clasificación (o de regresión si config.num_labels==1) (antes de SoftMax).hidden_states (
tuple(torch.Tensor), opcional, devuelto cuando se pasaoutput_hidden_states=Trueo cuandoconfig.output_hidden_states=True) — Tupla detorch.Tensor(una para la salida de las incrustaciones, si el modelo tiene una capa de incrustación, + una para la salida de cada etapa) de forma(batch_size, sequence_length, hidden_size). Estados ocultos (también llamados mapas de características) del modelo en la salida de cada etapa.attentions (
tuple(torch.Tensor), opcional, se devuelve cuando se pasaoutput_attentions=Trueo cuandoconfig.output_attentions=True) — Tupla detorch.Tensor(una por cada capa) de forma(batch_size, num_heads, patch_size, sequence_length).Pesos de atención tras el softmax de atención, utilizados para calcular la media ponderada en las cabezas de autoatención.
Ejemplo:
>>> 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
clase transformers.PvtV2Model
< source >( config: PvtV2Config )
Parámetros
- config (PvtV2Config) — Clase de configuración del modelo con todos los parámetros del modelo. Inicializar con un archivo de configuración no carga los pesos asociados con el modelo, solo la configuración. Consulte el método from_pretrained() para cargar los pesos del modelo.
El modelo Pvt V2 básico que genera estados ocultos sin ninguna cabeza específica en la parte superior.
Este modelo hereda de PreTrainedModel. Consulta la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos sus modelos (como la descarga o el guardado, el redimensionamiento de las incrustaciones de entrada, la poda de cabezas, etc.).
Este modelo también es una subclase de torch.nn.Module de PyTorch. Úsalo como un módulo de PyTorch regular y consulta la documentación de PyTorch para todo lo relacionado con el uso y el comportamiento generales.
forward
< source >( pixel_values: Tensoroutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → BaseModelOutput or tuple(torch.Tensor)
Parámetros
- pixel_values (
torch.Tensorde forma(batch_size, num_channels, image_size, image_size)) — Los tensores correspondientes a las imágenes de entrada. Los valores de píxeles se pueden obtener utilizando PvtImageProcessor. Consulte PvtImageProcessor.call() para más detalles (processor_classutiliza PvtImageProcessor para procesar las imágenes). - output_attentions (
bool, opcional) — Indica si se deben devolver los tensores de atención de todas las capas de atención. Consulteattentionsen los tensores devueltos para obtener más detalles. - output_hidden_states (
bool, opcional) — Indica si se deben devolver los estados ocultos de todas las capas. Consultehidden_statesen los tensores devueltos para obtener más detalles. - return_dict (
bool, opcional) — Indica si se debe devolver un ModelOutput en lugar de una tupla simple.
Devuelve
BaseModelOutput o tuple(torch.Tensor)
Un BaseModelOutput o una tupla de
torch.Tensor (si se pasa return_dict=False o cuando config.return_dict=False) que comprende varios
elementos según la configuración (PvtV2Config) y las entradas.
El método forward de PvtV2Model sobrescribe el método especial __call__.
Aunque la receta para la pasada hacia adelante debe definirse dentro de esta función, se debe llamar a la instancia de
Moduledespués en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de pre y postprocesamiento, mientras que la segunda los ignora silenciosamente.
last_hidden_state (
torch.Tensorde forma(batch_size, sequence_length, hidden_size)) — Secuencia de estados ocultos en la salida de la última capa del modelo.hidden_states (
tuple(torch.Tensor), opcional, devuelto cuando se pasaoutput_hidden_states=Trueo cuandoconfig.output_hidden_states=True) — Tupla detorch.Tensor(una para la salida de las incrustaciones, si el modelo tiene una capa de incrustaciones, + una para la salida de cada capa) de forma(batch_size, sequence_length, hidden_size).Estados ocultos del modelo en la salida de cada capa más las salidas opcionales de la incrustación inicial.
attentions (
tuple(torch.Tensor), opcional, se devuelve cuando se pasaoutput_attentions=Trueo cuandoconfig.output_attentions=True) — Tupla detorch.Tensor(una por cada capa) de forma(batch_size, num_heads, sequence_length, sequence_length).Pesos de atención tras el softmax de atención, utilizados para calcular la media ponderada en las cabezas de autoatención.