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

이 모델은 2021-06-25에 HF papers에 게시되었으며, 2024-03-13에 Hugging Face Transformers에 기여되었습니다.

Pyramid Vision 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에서 최첨단 점수를 달성하도록 성공적으로 배포되었습니다.

PVTv2은 계층적 트랜스포머 모델 계열에 속하며, 다중 스케일 특징 맵을 생성하기 위해 트랜스포머 레이어에 적응을 가합니다. Vision Transformer(ViT)의 열 구조는 세밀한 세부 정보를 잃어버리는 반면, 다중 스케일 특징 맵은 이러한 세부 정보를 보존하고 밀집 예측 작업의 성능을 높이는 데 도움이 되는 것으로 알려져 있습니다. PVTv2의 경우, 각 인코더 레이어에서 겹치는 커널을 사용한 2D 합성곱을 통해 이미지 패치 토큰을 생성함으로써 이를 구현합니다.

계층적 transformer의 다중 스케일 특징 덕분에, ResNet과 같은 전통적인 컴퓨터 비전 백본 모델을 더 큰 아키텍처에서 쉽게 대체할 수 있습니다. Segformer와 Panoptic Segformer 모두 백본으로 PVTv2를 사용한 구성이 유사한 크기의 ResNet 백본을 사용한 구성보다 일관되게 우수한 성능을 보였음을 입증했습니다.

PVTv2의 또 다른 강력한 기능은 Spatial Reduction Attention(SRA)라고 불리는 셀프 어텐션 레이어의 복잡도 감소입니다. SRA는 2D 컨볼루션 레이어를 사용하여 히든 상태를 더 작은 해상도로 투영한 후 쿼리로 어텐션을 수행하여 O(n2)O(n^2) 셀프 어텐션의 복잡도를 $O(n^2/R)$로 줄여주며, 여기서 RR 는 공간 감소 비율(sr_ratio, 2D 컨볼루션의 커널 크기와 스트라이드와 동일)입니다.

SRA는 PVT에서 도입되었으며, PVTv2에서 기본적으로 사용되는 attention 복잡도 감소 방법입니다. 그러나 PVTv2에서는 이미지 크기에 선형적으로 비례하는 self-attention 메커니즘을 사용할 수 있는 옵션도 도입했는데, 이를 “Linear SRA”라고 부릅니다. 이 방법은 average pooling을 사용하여 hidden states를 원래 해상도에 무관한 고정된 크기로 축소합니다(단, 이는 일반적인 SRA보다 본질적으로 더 많은 정보를 손실합니다). 이 옵션은 PVTv2Config에서 linear_attention을 True로 설정하여 활성화할 수 있습니다.

논문에서 발췌한 초록

Transformer는 최근 컴퓨터 비전 분야에서 고무적인 진전을 보여주고 있습니다. 본 연구에서는 선형 복잡도 어텐션 레이어, 겹치는 패치 임베딩, 합성곱 피드포워드 네트워크라는 세 가지 설계를 추가하여 원래의 Pyramid Vision 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 구성보다 일관되게 높은 성능을 보여줍니다.

  • PVTv2와 같은 계층적 transformer는 convolutional neural network(CNN)의 설계 요소를 인코더에 통합하여, 순수한 transformer 아키텍처에 비해 이미지 데이터에서 우수한 데이터 및 파라미터 효율성을 달성합니다. 이를 통해 번역 등가성(translation equivariance)과 국소성(locality)과 같은 CNN의 유용한 유도 편향(inductive bias)을 네트워크에 주입하면서도, transformers의 self-attention 메커니즘이 제공하는 동적 데이터 응답 및 전역 관계 모델링의 이점을 함께 누리는 양쪽의 장점을 결합한 아키텍처를 구성합니다.

  • PVTv2는 겹치는 패치 임베딩을 사용하여 다중 스케일 특징 맵을 생성하며, 제로 패딩과 깊이별 합성곱을 통해 위치 정보를 주입합니다.

  • attention layer의 복잡도를 줄이기 위해, PVTv2는 strided 2D convolution(SRA) 또는 고정 크기 average pooling(Linear SRA)을 사용하여 hidden states에 spatial reduction을 수행합니다. 본질적으로 더 많은 정보가 손실되지만, Linear SRA는 이미지 크기에 대해 선형 복잡도를 가지며 인상적인 성능을 제공합니다. self-attention layer에서 Linear SRA를 사용하려면 PvtV2Config에서 linear_attention=True를 설정하세요.

  • PvtV2Model은 계층적 transformer 인코더입니다(문헌에서는 Mix Transformer 또는 MiT라고도 자주 불림). PvtV2ForImageClassification은 Image Classification을 수행하기 위해 그 위에 간단한 분류기 헤드를 추가합니다. PvtV2Backbone는 Deformable DETR과 같은 더 큰 아키텍처에서 AutoBackbone 시스템과 함께 사용할 수 있습니다.

  • 모든 모델 크기에 대한 ImageNet 사전 학습 가중치는 hub에서 찾을 수 있습니다.

    PVTv2를 시작하는 가장 좋은 방법은 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"]))

DeformableDETR와 같은 더 복잡한 아키텍처의 백본으로 PVTv2를 사용하려면 AutoBackbone을 사용할 수 있습니다(이 모델은 사전 학습된 모델의 백본을 교체하는 것이므로 미세 조정(fine-tuning)이 필요하며, 무작위 가중치로 초기화됩니다):

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

모델 크기(B0-B5)별 ImageNet-1K에서 PVTv2 성능:

메서드크기Acc@1# 매개변수 (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

클래스 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 )

매개변수

  • image_size (Union[int, list[int], tuple[int, int], dict], 선택 사항, 기본값 224) — 각 이미지의 크기(해상도)입니다.
  • num_channels (int, 선택 사항, 기본값 3) — 입력 채널의 수입니다.
  • num_encoder_blocks ([int], 선택 사항, 기본값 4) — 인코더 블록(즉, Mix Transformer 인코더의 단계)의 개수입니다.
  • depths (Union[list[int], tuple[int, ...]], 선택 사항, 기본값 (2, 2, 2, 2)) — Transformer의 각 레이어 깊이.
  • sr_ratios (list[int], 선택 사항, 기본값 [8, 4, 2, 1]) — 각 인코더 블록의 공간 축소 비율입니다.
  • hidden_sizes (Union[list[int], tuple[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 인코더의 각 블록에 있는 각 attention 레이어의 attention head 수입니다.
  • mlp_ratios (list[int], 선택 사항, 기본값 [8, 8, 4, 4]) — 인코더 블록의 Mix FFNs에서 입력 레이어 크기에 비해 숨겨진 레이어 크기의 비율입니다.
  • hidden_act (str, 선택 사항, 기본값 gelu) — 디코더에서 사용되는 비선형 활성화 함수(함수 또는 문자열)입니다. 예를 들어, "gelu", "relu", "silu" 등이 있습니다.
  • hidden_dropout_prob (Union[float, int], 선택 사항, 기본값 0.0) — 임베딩, 인코더, 풀러의 모든 완전 연결 계층에 적용되는 드롭아웃 확률입니다.
  • attention_probs_dropout_prob (Union[float, int], 선택 사항, 기본값 0.0) — Attention 확률에 적용할 dropout 비율입니다.
  • initializer_range (float, 선택 사항, 기본값 0.02) — 모든 가중치 행렬을 초기화하는 truncated_normal_initializer의 표준 편차입니다.
  • drop_path_rate (Union[float, int], 선택 사항, 기본값 0.0) — 패치 융합에 사용할 드롭 패스 비율입니다.
  • layer_norm_eps (float, 선택 사항, 기본값 1e-06) — 레이어 정규화 레이어에서 사용되는 epsilon 값입니다.
  • qkv_bias (bool, 선택 사항, 기본값 True) — 쿼리, 키, 값에 bias를 추가할지 여부.
  • linear_attention (bool, 선택 사항, 기본값 False) — 선형 attention 복잡도를 사용합니다. True로 설정하면 sr_ratio는 무시되고, attention 레이어의 차원 축소에는 strided convolution 대신 average pooling이 사용됩니다.

이것은 PvtV2Model의 구성을 저장하기 위한 구성 클래스입니다. 지정된 인자에 따라 Pvt V2 모델을 인스턴스화하고 모델 아키텍처를 정의하는 데 사용됩니다. 기본값으로 구성을 인스턴스화하면 OpenGVLab/pvt_v2_b0와 유사한 구성이 생성됩니다.

Configuration 객체는 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 모델은 최종 hidden state의 [CLS] 토큰 위에 선형 레이어를 배치한 이미지 분류 헤드를 포함하며, 예를 들어 ImageNet에 사용됩니다.

이 모델은 PreTrainedModel에서 상속됩니다. 라이브러리가 모든 모델에 대해 구현하는 일반적 메서드(다운로드 또는 저장, 입력 임베딩 크기 조정, 헤드 프루닝 등)에 대한 세부 사항은 상위 클래스 문서를 확인하세요.

이 모델은 또한 PyTorch torch.nn.Module의 하위 클래스입니다. 일반적인 PyTorch Module처럼 사용하며, 일반적인 사용법 및 동작과 관련된 모든 사항은 PyTorch 문서를 참조하세요.

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)

매개변수

  • pixel_values (torch.Tensor, shape (batch_size, num_channels, image_size, image_size), 선택 사항) — 입력 이미지에 해당하는 텐서입니다. 픽셀 값은 PvtImageProcessor를 사용하여 얻을 수 있습니다. 자세한 내용은 PvtImageProcessor.call()를 참조하세요 (processor_class는 이미지 처리에 PvtImageProcessor를 사용합니다).
  • labels (torch.LongTensor, shape (batch_size,), 선택 사항) — 이미지 분류/회귀 손실을 계산하는 데 사용되는 라벨입니다. 인덱스는 [0, ..., config.num_labels - 1] 범위에 있어야 합니다. config.num_labels == 1인 경우 회귀 손실(평균 제곱 오차)이 계산되고, config.num_labels > 1인 경우 분류 손실(교차 엔트로피)이 계산됩니다.
  • output_attentions (bool, 선택 사항) — 모든 attention 레이어의 attentions 텐서를 반환할지 여부. 자세한 내용은 반환 텐서 섹션의 attentions 항목을 참조하세요.
  • output_hidden_states (bool, 선택 사항) — 모든 레이어의 hidden states를 반환할지 여부입니다. 자세한 내용은 반환되는 텐서 중 hidden_states 항목을 참고하세요.
  • return_dict (bool, 선택) — 일반 튜플 대신 ModelOutput를 반환할지 여부.

반환값

ImageClassifierOutput 또는 tuple(torch.Tensor)

torch.Tensor의 튜플 또는 ImageClassifierOutput입니다. return_dict=False가 전달되거나 config.return_dict=False인 경우, 구성(PvtV2Config)과 입력에 따라 다양한 요소를 포함합니다.

PvtV2ForImageClassification의 forward 메서드는 __call__ 특수 메서드를 오버라이드합니다.

이 함수 내에서 forward pass의 레시피를 정의해야 하지만, 이후에는 이 함수 대신 Module 인스턴스를 호출해야 합니다. 전자는 전처리 및 후처리 단계를 실행하는 것을 처리하는 반면, 후자는 이를 조용히 무시하기 때문입니다.

  • loss (torch.Tensor, shape (1,), 선택 사항, labels이 제공될 때 반환됨) — 분류 (또는 config.num_labels==1인 경우 회귀) 손실.

  • logits (torch.Tensor, shape (batch_size, config.num_labels)) — SoftMax 적용 전 분류(또는 config.num_labels==1인 경우 회귀) 점수.

  • hidden_states (tuple(torch.Tensor), 선택 사항, output_hidden_states=True가 전달되었거나 config.output_hidden_states=True인 경우 반환됨) — torch.Tensor의 튜플(모델에 임베딩 레이어가 있는 경우 임베딩의 출력에 대한 것 1개 + 각 단계의 출력에 대한 것 1개)로, 모양은 (batch_size, sequence_length, hidden_size)입니다. 각 단계의 출력에서 모델의 히든 스테이트(피처 맵이라고도 함).

  • attentions (tuple(torch.Tensor), 선택 사항, output_attentions=True가 전달되었거나 config.output_attentions=True인 경우 반환됨) — 각 레이어마다 하나씩 포함된 torch.Tensor의 튜플로, 모양은 (batch_size, num_heads, patch_size, sequence_length)입니다.

    self-attention 헤드에서 가중 평균을 계산하는 데 사용되는 attention softmax 이후의 attention 가중치.

예:

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

클래스 transformers.PvtV2Model

< >

( config: PvtV2Config )

매개변수

  • config (PvtV2Config) — 모델의 모든 매개변수를 포함하는 모델 구성 클래스입니다. 구성 파일로 초기화하는 것은 모델과 연관된 가중치를 로드하지 않으며, 구성 정보만 로드합니다. 모델 가중치를 로드하려면 from_pretrained() 메서드를 확인하세요.

특정 헤드가 위에 없는 상태에서 원시 hidden-states를 출력하는 순수한 Pvt V2 Model입니다.

이 모델은 PreTrainedModel에서 상속됩니다. 라이브러리가 모든 모델에 대해 구현하는 일반적 메서드(다운로드 또는 저장, 입력 임베딩 크기 조정, 헤드 프루닝 등)에 대한 세부 사항은 상위 클래스 문서를 확인하세요.

이 모델은 또한 PyTorch torch.nn.Module의 하위 클래스입니다. 일반적인 PyTorch Module처럼 사용하며, 일반적인 사용법 및 동작과 관련된 모든 사항은 PyTorch 문서를 참조하세요.

forward

< >

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

매개변수

  • pixel_values (torch.Tensor, shape (batch_size, num_channels, image_size, image_size)) — 입력 이미지에 해당하는 텐서입니다. 픽셀 값은 PvtImageProcessor를 사용하여 얻을 수 있습니다. 자세한 내용은 PvtImageProcessor.call()를 참조하세요 (processor_class는 이미지 처리에 PvtImageProcessor를 사용합니다).
  • output_attentions (bool, 선택 사항) — 모든 attention 레이어의 attentions 텐서를 반환할지 여부. 자세한 내용은 반환 텐서 섹션의 attentions 항목을 참조하세요.
  • output_hidden_states (bool, 선택 사항) — 모든 레이어의 hidden states를 반환할지 여부입니다. 자세한 내용은 반환되는 텐서 중 hidden_states 항목을 참고하세요.
  • return_dict (bool, 선택) — 일반 튜플 대신 ModelOutput를 반환할지 여부.

반환값

BaseModelOutput 또는 tuple(torch.Tensor)

torch.Tensor의 튜플 또는 BaseModelOutput (return_dict=False가 전달되었거나 config.return_dict=False인 경우)로, 구성(PvtV2Config)과 입력에 따라 다양한 요소를 포함합니다.

PvtV2Model의 forward 메서드는 __call__ 특수 메서드를 오버라이드합니다.

이 함수 내에서 forward pass의 레시피를 정의해야 하지만, 이후에는 이 함수 대신 Module 인스턴스를 호출해야 합니다. 전자는 전처리 및 후처리 단계를 실행하는 것을 처리하는 반면, 후자는 이를 조용히 무시하기 때문입니다.

  • last_hidden_state (torch.Tensor, shape (batch_size, sequence_length, hidden_size)) — 모델의 마지막 레이어 출력에서 생성된 hidden-state 시퀀스입니다.

  • hidden_states (tuple(torch.Tensor), 선택 사항, output_hidden_states=True가 전달되거나 config.output_hidden_states=True인 경우 반환됨) — torch.Tensor의 튜플(모델에 임베딩 레이어가 있는 경우 임베딩 출력 1개 + 각 레이어의 출력 1개)로, 모양은 (batch_size, sequence_length, hidden_size)입니다.

    각 레이어의 출력에서 모델의 Hidden-states와 선택적 초기 임베딩 출력을 포함합니다.

  • attentions (tuple(torch.Tensor), 선택 사항, output_attentions=True가 전달되었거나 config.output_attentions=True인 경우 반환됨) — 각 레이어마다 하나씩 포함된 torch.Tensor의 튜플로, 모양은 (batch_size, num_heads, sequence_length, sequence_length)입니다.

    self-attention 헤드에서 가중 평균을 계산하는 데 사용되는 attention softmax 이후의 attention 가중치.

Update on GitHub