ViTDet模型由Yanghao Li、Hanzi Mao、Ross Girshick和Kaiming He在《探索用于物体检测的普通视觉Transformer主干》一文中提出,该文发表于arXiv。ViTDet利用普通视觉Transformer来执行物体检测任务。
论文的摘要如下
我们探索将平面、非层次化的视觉转换器(ViT)作为目标检测的主干网络。此设计使原始的ViT架构能够在不重新设计用于预训练的层次化主干的情况下进行微调。通过最小化的微调调整,我们的平面主干检测器可以取得具有竞争力的结果。令人惊讶的是,我们发现:(i)仅从单尺度特征图构建简单的特征金字塔(无需常见的FPN设计)就足够了;(ii)仅使用窗口注意力(无需位移)和极少数跨窗口传播模块就足够了。我们将以掩码自编码器(MAE)预先训练的平面ViT主干命名为ViTDet检测器,它与基于层次化主干的先前领先方法相媲美,在COCO数据集上仅使用ImageNet-1K预训练达到了最高61.3 AP_box。我们希望我们的研究能引起对平面主干检测器研究的关注。
提示
- 目前,只有主干可用。
VitDetConfig
类 transformers.VitDetConfig
< 源代码 >( 隐藏层大小 = 768 隐藏层数量 = 12 注意力头数量 = 12 多层感知器比率 = 4 隐藏层激活函数 = 'gelu' dropout 概率 = 0.0 初始化范围 = 0.02 层归一化容差 = 1e-06 图像大小 = 224 预训练图像大小 = 224 补丁大小 = 16 通道数量 = 3 qkv 偏置 = True drop_path 率 = 0.0 窗口块索引 = [] 残差块索引 = [] 使用绝对位置编码 = True 使用相对位置编码 = False 窗口大小 = 0 输出特征 = None 输出索引 = None **kwargs )
参数
- hidden_size (
int
, 可选, 默认值 768) — 编码层和池化层的维度。 - num_hidden_layers (
int
, 可选, 默认值 12) — Transformer 编码器中的隐藏层数量。 - num_attention_heads (
int
, 可选, 默认值 12) — Transformer 编码器中每个注意力层的注意力头数量。 - mlp_ratio (
int
, 可选, 默认为 4) — mlp 隐藏维度和嵌入维度之比。 - hidden_act (
str
或function
, 可选, 默认为"gelu"
) — 编码器和池器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"
,"relu"
,"selu"
和"gelu_new"
。 - dropout_prob (
float
, 可选, 默认为 0.0) — 嵌入、编码器和池器中所有全连接层的 dropout 概率。 - initializer_range (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的截断正态分布初始化器的标准差。 - layer_norm_eps (
float
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。 - image_size (
int
, 可选, 默认为 224) — 每个图像的大小(分辨率)。 - pretrain_image_size (
int
, 可选, 默认为 224) — 预训练过程中每个图像的大小(分辨率)。 - patch_size (
int
, 可选, 默认为 16) — 每个补丁的大小(分辨率)。 - num_channels (
int
, 可选, 默认为 3) — 输入通道数。 - qkv_bias (
bool
, 可选, 默认为True
) — 是否向查询、键和值添加偏差。 - drop_path_rate (
float
, 可选, 默认为 0.0) — 随机深度率。 - window_block_indices (
List[int]
, 可选, 默认为[]
) — 应具有窗口注意力而不是常规全局自我注意力的块索引列表。 - residual_block_indices (
List[int]
, 可选, 默认为[]
) — 添加到 MLP 后应该具有额外残差块的块的索引列表。 - use_absolute_position_embeddings (
bool
, 可选, 默认为True
) — 是否将绝对位置嵌入添加到补丁嵌入中。 - use_relative_position_embeddings (
bool
, 可选, 默认为False
) — 是否将相对位置嵌入添加到注意力图中。 -
window_size ( int
, 可选, 默认为0) — 注意力窗口的大小。 -
out_features ( List[str]
, 可选) — 作为骨干使用时,输出特征的列表。可以是"stem"
、"stage1"
、"stage2"
等等(根据模型有多少个阶段而定)。如果未设置且设置了out_indices
,将默认为对应阶段。如果未设置且out_indices
未设置,将默认为最后一个阶段。必须按照stage_names
属性定义的顺序排列。 -
out_indices ( List[int]
, 可选) — 作为骨干使用时,输出特征索引的列表。可以是 0、1、2 等等(根据模型有多少个阶段而定)。如果未设置且设置了out_features
,将默认为对应阶段。如果未设置且out_features
未设置,将默认为最后一个阶段。必须按照stage_names
属性定义的顺序排列。
这是用于存储 VitDetModel 配置的配置类。它用于根据指定的参数实例化 VitDet 模型,定义模型架构。使用默认值实例化配置会产生与 VitDet google/vitdet-base-patch16-224 架构相似的配置。
配置对象继承自 PretrainedConfig,可以用于控制模型输出。有关更多信息,请阅读关于PretrainedConfig的文档。
示例
>>> from transformers import VitDetConfig, VitDetModel
>>> # Initializing a VitDet configuration
>>> configuration = VitDetConfig()
>>> # Initializing a model (with random weights) from the configuration
>>> model = VitDetModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
VitDetModel
class transformers.VitDetModel
< source >( config: VitDetConfig )
参数
- config (VitDetConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化并不会加载模型相关的权重,只加载配置。请查看from_pretrained()方法来加载模型权重。
这是一个仅输出原始隐藏状态而没有顶部任何特定层的裸VitDet Transformer模型。这是一个PyTorch torch.nn.Module的子类。将其用作常规PyTorch模块,并查阅PyTorch文档以获取所有与通用使用和行为相关的信息。
forward
< 源代码 >( pixel_values: 可选 = None head_mask: 可选 = None output_attentions: 可选 = None output_hidden_states: 可选 = None return_dict: 可选 = None ) → transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
of shape(batch_size, num_channels, height, width)
) — 像素值。通过 AutoImageProcessor 获取像素值。有关详细信息,请参阅 ViTImageProcessor.call() 。 - head_mask (
torch.FloatTensor
形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于屏蔽自注意力模块选择的头的掩码。掩码值在[0, 1]
范围内选择:- 1 表示该头未屏蔽;
- 0 表示该头已被屏蔽。
- output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。更多详细信息请参阅返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。更多详细信息请参阅返回张量下的hidden_states
。 - return_dict (
bool
, optional) — 是否返回ModelOutput,而不是普通元组。
返回值
transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
一个transformers.modeling_outputs.BaseModelOutput对象或一个元组,包含各种元素,这些元素取决于配置(VitDetConfig)和输入,前提是return_dict=False
被传入或者当config.return_dict=False
。
-
last_hidden_state (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出处的隐藏状态序列。 -
hidden_states (
tuple(torch.FloatTensor)
, optional, returned whenoutput_hidden_states=True
is passed or whenconfig.output_hidden_states=True
) — 一个包含torch.FloatTensor
的元组,代表嵌入层输出和每个层的输出(如果模型有嵌入层的话),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出处的隐藏状态加上可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
, optional, returned whenoutput_attentions=True
is passed or whenconfig.output_attentions=True
) — 包含每个层的torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力权重复合后,用于计算每个自注意力头中的加权平均。
VitDetModel的前向方法覆盖了__call__
特殊方法。
尽管前向传代的配方需要定义在这个函数中,但应调用该函数之后的Module
实例,而不是这个函数,因为这个函数执行预先和后处理步骤,而后者默默地忽略它们。
示例
>>> from transformers import VitDetConfig, VitDetModel
>>> import torch
>>> config = VitDetConfig()
>>> model = VitDetModel(config)
>>> pixel_values = torch.randn(1, 3, 224, 224)
>>> with torch.no_grad():
... outputs = model(pixel_values)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 768, 14, 14]