Transformers documentation
Pyramid Vision Transformer V2 (PVTv2)
Эта модель была опубликована в HF papers 25.06.2021 и добавлена в Hugging Face Transformers 13.03.2024.
Pyramid Vision Transformer V2 (PVTv2)
Обзор
Модель PVTv2 была предложена в статье PVT v2: Improved Baselines with Pyramid Vision Transformer авторами Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo и Ling Shao. Являясь улучшенным вариантом PVT, она отказывается от позиционных эмбеддингов, полагаясь вместо этого на позиционную информацию, закодированную с помощью нулевого дополнения и перекрывающихся эмбеддингов патчей. Отсутствие зависимости от позиционных эмбеддингов упрощает архитектуру и позволяет выполнять инференс при любом разрешении без необходимости их интерполяции.
Структура энкодера PVTv2 была успешно внедрена для достижения передовых результатов в задачах семантической сегментации в Segformer, монокулярной оценки глубины в GLPN и паноптической сегментации в Panoptic Segformer.
PVTv2 относится к семейству моделей, называемых иерархическими трансформерами, которые вносят изменения в слои трансформера для генерации многомасштабных карт признаков. В отличие от столбчатой структуры Vision Transformer (ViT), которая теряет детализацию, многомасштабные карты признаков сохраняют эти детали и способствуют повышению качества работы в задачах плотного предсказания. В случае PVTv2 это достигается путём генерации токенов патчей изображения с помощью 2D-свёртки с перекрывающимися ядрами на каждом слое кодировщика.
Масштабируемые признаки иерархических трансформеров позволяют легко заменять ими традиционные базовые модели компьютерного зрения, такие как ResNet, в более крупных архитектурах. И Segformer, и Panoptic Segformer показали, что конфигурации с использованием PVTv2 в качестве базовой модели стабильно превосходят конфигурации с базовыми моделями ResNet сопоставимого размера.
Ещё одна мощная особенность PVTv2 — это снижение сложности в слоях само-внимания, называемое Spatial Reduction Attention (SRA), которое использует 2D-свёрточные слои для проекции скрытых состояний в меньшее разрешение перед применением к ним запросов, что улучшает сложность само-внимания до $O(n^2/R)$, где является коэффициентом пространственного сокращения (sr_ratio, также известным как размер ядра и шаг в 2D-свёртке).
Метод SRA был предложен в PVT и является способом по умолчанию для снижения сложности внимания в PVTv2. Однако в PVTv2 также была добавлена возможность использования механизма само-внимания с линейной сложностью, зависящей от размера изображения, который авторы назвали «Linear SRA». Этот метод использует усредняющую пуллинг-операцию для приведения скрытых состояний к фиксированному размеру, не зависящему от их исходного разрешения (хотя по своей природе это приводит к большим потерям информации, чем обычный SRA). Эта опция может быть включена путём установки значения linear_attention в True в PVTv2Config.
Аннотация из статьи
Недавно трансформеры продемонстрировали впечатляющий прогресс в области компьютерного зрения. В данной работе мы предлагаем новые базовые модели, улучшив исходный Pyramid Vision Transformer (PVT v1) за счёт добавления трёх элементов: (1) слоя внимания с линейной сложностью, (2) перекрывающегося встраивания патчей и (3) свёрточной сети с прямой передачей. Благодаря этим модификациям PVT v2 снижает вычислительную сложность PVT v1 до линейной и обеспечивает значительное улучшение результатов на фундаментальных задачах компьютерного зрения, таких как классификация, обнаружение и сегментация. Примечательно, что предложенный PVT v2 демонстрирует сопоставимые или лучшие результаты по сравнению с недавними работами, такими как Swin Transformer. Мы надеемся, что эта работа содействует развитию передовых исследований трансформеров в области компьютерного зрения. Код доступен по адресу https://github.com/whai362/PVT.
Эта модель была предоставлена FoamoftheSea. Исходный код можно найти здесь.
Советы по использованию
PVTv2 — это иерархическая трансформерная модель, демонстрирующая высокую производительность в задачах классификации изображений и ряде других задач. Она используется в качестве базовой архитектуры для семантической сегментации в Segformer, монокулярной оценки глубины в GLPN и паноптической сегментации в Panoptic Segformer, стабильно показывая результаты, превосходящие аналогичные конфигурации на базе ResNet.
Иерархические трансформеры, такие как PVTv2, обеспечивают более высокую эффективность по данным и параметрам на изображенческих данных по сравнению с чистыми трансформерными архитектурами, поскольку в их энкодеры включены элементы проектирования свёрточных нейронных сетей (CNN). Это создаёт архитектуру, сочетающую преимущества обоих подходов: в сеть внедряются полезные индуктивные смещения CNN, такие как эквивариантность к сдвигу и локальность, при этом сохраняются преимущества динамического отклика на данные и моделирования глобальных связей, обеспечиваемые механизмом само-внимания transformers.
PVTv2 использует перекрывающиеся эмбеддинги патчей для создания многомасштабных карт признаков, которые обогащаются информацией о расположении с помощью нулевой дополняемости и поглубинных свёрток.
Для снижения сложности в слоях внимания PVTv2 выполняет пространственное сокращение скрытых состояний с помощью либо стридового 2D-свёртывания (SRA), либо усредняющего пулинга фиксированного размера (Linear SRA). Хотя Linear SRA по своей природе более разрушителен, он обеспечивает впечатляющие результаты при линейной сложности относительно размера изображения. Чтобы использовать Linear SRA в слоях само-внимания, установите
linear_attention=TrueвPvtV2Config.PvtV2Model — это иерархический трансформер-энкодер (в литературе его также часто называют Mix Transformer или MiT). PvtV2ForImageClassification добавляет простой классификатор для выполнения задачи классификации изображений.
PvtV2Backboneможно использовать с системой AutoBackbone в более крупных архитектурах, таких как Deformable DETR.Предобученные веса ImageNet для всех размеров моделей можно найти на хабе.
Лучший способ начать работу с 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"]))Чтобы использовать PVTv2 в качестве базовой сети для более сложных архитектур, таких как DeformableDETR, можно воспользоваться AutoBackbone (эта модель потребует дообучения, так как вы заменяете базовую сеть в предобученной модели, и она инициализируется случайными весами):
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 на ImageNet-1K в зависимости от размера модели (B0-B5):
| Метод | Размер | Acc@1 | #Параметры (млн) |
|---|---|---|---|
| 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
класс 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 )
Параметры
- 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]) — Количество attention-голов в каждом слое внимания каждого блока Transformer-энкодера. - mlp_ratios (
list[int], необязательный, по умолчанию[8, 8, 4, 4]) — Соотношение размера скрытого слоя к размеру входного слоя Mix FFN в блоках энкодера. - hidden_act (
str, необязательный, по умолчаниюgelu) — Нелинейная функция активации (функция или строка) в декодере. Например,"gelu","relu","silu"и т. д. - hidden_dropout_prob (
Union[float, int], необязательный, по умолчанию0.0) — Вероятность dropout для всех полносвязных слоёв в блоках эмбеддингов, энкодера и пуллера. - attention_probs_dropout_prob (
Union[float, int], необязательный, по умолчанию0.0) — Коэффициент dropout для вероятностей внимания. - initializer_range (
float, необязательный, по умолчанию0.02) — Стандартное отклонение truncated_normal_initializer, используемое для инициализации всех матриц весов. - drop_path_rate (
Union[float, int], необязательный, по умолчанию0.0) — Коэффициент drop path для слияния патчей. - layer_norm_eps (
float, необязательный, по умолчанию1e-06) — Значение epsilon, используемое слоями нормализации. - qkv_bias (
bool, необязательный, по умолчаниюTrue) — Добавлять ли смещение к запросам, ключам и значениям. - linear_attention (
bool, необязательный, по умолчаниюFalse) — Использовать линейную сложность внимания. Если установлено в True,sr_ratioигнорируется, а для снижения размерности в слоях внимания используется усредняющая пуллинг вместо стробированной свёртки.
Это класс конфигурации для хранения конфигурации PvtV2Model. Он используется для создания модели Pvt V2 в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации 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.configPvtForImageClassification
класс transformers.PvtV2ForImageClassification
< source >( config: PvtV2Config )
Параметры
- config (PvtV2Config) — Класс конфигурации модели, содержащий все параметры модели. Инициализация по файлу конфигурации не загружает веса, связанные с моделью, только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().
Модель Pvt-v2: трансформер с головной частью для классификации изображений (линейный слой поверх финального скрытого состояния токена [CLS]), например, для ImageNet.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
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)
Параметры
- pixel_values (
torch.Tensorформы(batch_size, num_channels, image_size, image_size), необязательный) — Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью PvtImageProcessor. Подробности см. в PvtImageProcessor.call() (processor_classиспользует PvtImageProcessor для обработки изображений). - 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 вместо обычного кортежа.
Возвращает
ImageClassifierOutput или tuple(torch.Tensor)
Объект ImageClassifierOutput или кортеж из
torch.Tensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (PvtV2Config) и входных данных.
Метод forward класса PvtV2ForImageClassification переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
loss (
torch.Tensorформы(1,), необязательный, возвращается, если заданlabels) — Потери классификации (или регрессии, если config.num_labels==1).logits (
torch.Tensorформы(batch_size, config.num_labels)) — Оценки для классификации (или регрессии, если config.num_labels==1) до применения SoftMax.hidden_states (
tuple(torch.Tensor), optional, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — Кортеж изtorch.Tensor(один для вывода слоя встраиваний, если модель имеет слой встраиваний, + один для вывода каждого этапа) формы(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).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
Пример:
>>> 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
< source >( config: PvtV2Config )
Параметры
- config (PvtV2Config) — Класс конфигурации модели, содержащий все параметры модели. Инициализация по файлу конфигурации не загружает веса, связанные с моделью, только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().
Модель Pvt V2 без дополнительных компонентов, выводящая необработанные скрытые состояния без какого-либо специализированного слоя.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( 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формы(batch_size, num_channels, image_size, image_size)) — Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью PvtImageProcessor. Подробности см. в PvtImageProcessor.call() (processor_classиспользует PvtImageProcessor для обработки изображений). - output_attentions (
bool, необязательный) — Указывает, следует ли возвращать тензоры внимания всех слоев внимания. Подробности см. в описанииattentionsв разделе возвращаемых тензоров. - output_hidden_states (
bool, необязательный) — Указывает, следует ли возвращать скрытые состояния всех слоев. Подробности см. в описанииhidden_statesсреди возвращаемых тензоров. - return_dict (
bool, необязательный) — Указывает, следует ли возвращать ModelOutput вместо обычного кортежа.
Возвращает
BaseModelOutput или tuple(torch.Tensor)
Объект BaseModelOutput или кортеж из
torch.Tensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (PvtV2Config) и входных данных.
Метод forward модели PvtV2Model переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
last_hidden_state (
torch.Tensorформы(batch_size, sequence_length, hidden_size)) — Последовательность скрытых состояний на выходе последнего слоя модели.hidden_states (
tuple(torch.Tensor), optional, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — кортеж изtorch.Tensor(один для вывода слоя встраиваний, если модель имеет слой встраиваний, + один для вывода каждого слоя) формы(batch_size, sequence_length, hidden_size).Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
attentions (
tuple(torch.Tensor), необязательный, возвращается при передачеoutput_attentions=Trueили приconfig.output_attentions=True) — Кортежtorch.Tensor(по одному на каждый слой) формы(batch_size, num_heads, sequence_length, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.