DINOv2
概述
DINOv2 模型由 Maxime Oquab、Timothée Darcet、Théo Moutakanni、Huy Vo、Marc Szafraniec、Vasil Khalidov、Pierre Fernandez、Daniel Haziza、Francisco Massa、Alaaeldin El-Nouby、Mahmoud Assran、Nicolas Ballas、Wojciech Galuba、Russell Howes、Po-Yao Huang、Shang-Wen Li、Ishan Misra、Michael Rabbat、Vasu Sharma、Gabriel Synnaeve、Hu Xu、Hervé Jegou、Julien Mairal、Patrick Labatut、Armand Joulin、Piotr Bojanowski 在 DINOv2: Learning Robust Visual Features without Supervision 中提出。DINOv2 是 DINO 的升级版,DINO 是一种应用于 视觉 Transformer 的自监督方法。这种方法可以实现通用视觉特征,即跨图像分布和任务无需微调即可工作的特征。
论文的摘要如下
自然语言处理领域在大型数据上的模型预训练方面取得的最新突破为计算机视觉中的类似基础模型开辟了道路。这些模型可以通过生成通用视觉特征来极大地简化任何系统中图像的使用,即跨图像分布和任务无需微调即可工作的特征。这项工作表明,如果在来自不同来源的足够丰富的数据上进行训练,现有的预训练方法,尤其是自监督方法,可以生成此类特征。我们重新审视了现有方法,并将不同的技术结合起来,在数据和模型规模方面扩展我们的预训练。大多数技术贡献旨在加速和稳定大规模训练。在数据方面,我们提出了一种自动管道来构建专门的、多样化的、经过整理的图像数据集,而不是像自监督文献中通常所做的那样使用未整理的数据。在模型方面,我们训练了一个拥有 10 亿个参数的 ViT 模型 (Dosovitskiy 等人,2020),并将其提炼成一系列更小的模型,这些模型在图像和像素级别上的大多数基准测试中都超过了目前最好的通用特征,OpenCLIP (Ilharco 等人,2021)。
使用技巧
可以使用 torch.jit.trace
追踪模型,该方法利用 JIT 编译来优化模型,使其运行速度更快。请注意,这仍然会产生一些不匹配的元素,原始模型和追踪模型之间的差异约为 1e-4。
import torch
from transformers import AutoImageProcessor, AutoModel
from PIL import Image
import requests
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
processor = AutoImageProcessor.from_pretrained('facebook/dinov2-base')
model = AutoModel.from_pretrained('facebook/dinov2-base')
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs[0]
# We have to force return_dict=False for tracing
model.config.return_dict = False
with torch.no_grad():
traced_model = torch.jit.trace(model, [inputs.pixel_values])
traced_outputs = traced_model(inputs.pixel_values)
print((last_hidden_states - traced_outputs[0]).abs().max())
资源
以下是一些官方 Hugging Face 和社区(🌎 表示)资源,可以帮助您开始使用 DINOv2。
- DINOv2 的演示笔记本可以从 这里 找到。🌎
- Dinov2ForImageClassification 由 示例脚本 和 笔记本 支持。
- 另请参阅:图像分类任务指南
如果您想提交资源以包含在此处,请随时打开一个 Pull Request,我们将对其进行审查!该资源最好能展示一些新内容,而不是重复现有资源。
Dinov2Config
class transformers.Dinov2Config
< 源代码 >( hidden_size = 768 num_hidden_layers = 12 num_attention_heads = 12 mlp_ratio = 4 hidden_act = 'gelu' hidden_dropout_prob = 0.0 attention_probs_dropout_prob = 0.0 initializer_range = 0.02 layer_norm_eps = 1e-06 image_size = 224 patch_size = 16 num_channels = 3 qkv_bias = True layerscale_value = 1.0 drop_path_rate = 0.0 use_swiglu_ffn = False out_features = None out_indices = None apply_layernorm = True reshape_hidden_states = True **kwargs )
参数
- hidden_size (
int
, 可选, 默认为 768) — 编码器层和池化层的维度。 - num_hidden_layers (
int
, 可选, 默认为 12) — Transformer 编码器中的隐藏层数量。 - num_attention_heads (
int
, 可选, 默认为 12) — Transformer 编码器中每个注意力层的注意力头数量。 - mlp_ratio (
int
, 可选, 默认为 4) — MLPs 的隐藏层大小相对于hidden_size
的比例。 - hidden_act (
str
或function
, 可选, 默认为"gelu"
) — 编码器和池化器中的非线性激活函数 (函数或字符串)。如果为字符串,则支持"gelu"
、"relu"
、"selu"
和"gelu_new"
。 - hidden_dropout_prob (
float
, 可选, 默认为 0.0) — 嵌入、编码器和池化器中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。 - initializer_range (
float
, 可选, 默认为 0.02) — 初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layer_norm_eps (
float
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon。 - image_size (
int
, 可选, 默认为 224) — 每个图像的大小(分辨率)。 - patch_size (
int
, 可选, 默认为 16) — 每个 patch 的大小(分辨率)。 - num_channels (
int
, 可选, 默认为 3) — 输入通道的数量。 - qkv_bias (
bool
, 可选, 默认为True
) — 是否向查询、键和值添加偏差。 - layerscale_value (
float
, 可选, 默认为 1.0) — 用于层缩放的初始值。 - drop_path_rate (
float
, 可选, 默认为 0.0) — 每个样本的随机深度率(当应用于残差层的路径中时)。 - use_swiglu_ffn (
bool
, 可选, 默认为False
) — 是否使用 SwiGLU 前馈神经网络。 - 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
属性中定义的顺序相同。 - apply_layernorm (
bool
, 可选, 默认值:True
) — 如果模型用作骨干,是否将层归一化应用于特征图。 - reshape_hidden_states (
bool
, 可选, 默认值:True
) — 如果模型用作骨干,是否将特征图重塑为形状为(batch_size, hidden_size, height, width)
的 4D 张量。如果为False
,特征图将为形状为(batch_size, seq_len, hidden_size)
的 3D 张量。
这是用于存储 Dinov2Model 配置的配置类。它用于根据指定参数实例化 Dinov2 模型,定义模型架构。使用默认值实例化配置将产生与 Dinov2 google/dinov2-base-patch16-224 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import Dinov2Config, Dinov2Model
>>> # Initializing a Dinov2 dinov2-base-patch16-224 style configuration
>>> configuration = Dinov2Config()
>>> # Initializing a model (with random weights) from the dinov2-base-patch16-224 style configuration
>>> model = Dinov2Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
Dinov2Model
class transformers.Dinov2Model
< 源代码 >( config: Dinov2Config )
参数
- config (Dinov2Config) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只加载配置。查看 from_pretrained() 方法来加载模型权重。
裸 DINOv2 模型转换器,输出原始隐藏状态,没有任何特定头部。此模型是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档了解与通用用法和行为相关的所有事项。
forward
< 源代码 >( pixel_values: Optional = None bool_masked_pos: Optional = None head_mask: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None ) → transformers.modeling_outputs.BaseModelOutputWithPooling or tuple(torch.FloatTensor)
参数
- pixel_values (形状为
(batch_size, num_channels, height, width)
的torch.FloatTensor
) — 像素值。像素值可以通过 AutoImageProcessor 获得。有关详细信息,请参见 BitImageProcessor.preprocess()。 - bool_masked_pos (形状为
(batch_size, sequence_length)
的torch.BoolTensor
) — 布尔掩码位置。指示哪些补丁被掩码 (1) 以及哪些没有 (0)。仅与预训练相关。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.modeling_outputs.BaseModelOutputWithPooling 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.BaseModelOutputWithPooling 或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含根据配置 (Dinov2Config) 和输入而不同的各种元素。
-
last_hidden_state (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层的输出处的隐藏状态序列。 -
pooler_output (
torch.FloatTensor
形状为(batch_size, hidden_size)
) — 序列的第一个标记(分类标记)的最后一层隐藏状态,经过用于辅助预训练任务的层的进一步处理。例如,对于 BERT 系列模型,这将返回分类标记,经过线性层和 tanh 激活函数的处理。线性层权重在预训练期间从下一句预测(分类)目标中训练得到。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(一个用于嵌入的输出,如果模型具有嵌入层,+ 一个用于每一层的输出),形状为(batch_size, sequence_length, hidden_size)
。每一层的模型的隐藏状态加上可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
, 可选,在传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
元组(每一层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
The Dinov2Model forward method, overrides the __call__
special method.
虽然前向传递的配方需要在此函数中定义,但应该之后调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, Dinov2Model
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/dinov2-base")
>>> model = Dinov2Model.from_pretrained("facebook/dinov2-base")
>>> inputs = image_processor(image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 257, 768]
Dinov2ForImageClassification
class transformers.Dinov2ForImageClassification
< 源代码 >( config: Dinov2Config )
参数
- config (Dinov2Config) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
Dinov2 模型转换器,顶部带有图像分类头(在 [CLS] 标记的最终隐藏状态之上有一个线性层),例如用于 ImageNet。
此模型是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
forward
< 源代码 > ( pixel_values: Optional = None head_mask: Optional = None labels: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None ) → transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
形状为(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获取。有关详细信息,请参见 BitImageProcessor.preprocess()。 - 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
, 可选) — 是否返回一个 ModelOutput 而不是一个普通元组。 - labels (
torch.LongTensor
形状为(batch_size,)
, 可选) — 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
中。如果config.num_labels == 1
,则计算回归损失(均方损失),如果config.num_labels > 1
,则计算分类损失(交叉熵)。
返回
transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.ImageClassifierOutput 或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含取决于配置(Dinov2Config)和输入的各种元素。
-
loss (
torch.FloatTensor
形状为(1,)
, 可选, 当提供labels
时返回) — 分类(或如果config.num_labels==1
则为回归)损失。 -
logits (
torch.FloatTensor
形状为(batch_size, config.num_labels)
) — 分类(或如果config.num_labels==1
则为回归)分数(在 SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(一个用于嵌入的输出,如果模型具有嵌入层,+ 一个用于每个阶段的输出)形状为(batch_size, sequence_length, hidden_size)
。模型在每个阶段输出处的隐藏状态(也称为特征图)。 -
attentions (
tuple(torch.FloatTensor)
, 可选, 当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
元组(每层一个)形状为(batch_size, num_heads, patch_size, sequence_length)
。注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
The Dinov2ForImageClassification 正向方法,覆盖 __call__
特殊方法。
虽然前向传递的配方需要在此函数中定义,但应该之后调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, Dinov2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/dinov2-small-imagenet1k-1-layer")
>>> model = Dinov2ForImageClassification.from_pretrained("facebook/dinov2-small-imagenet1k-1-layer")
>>> 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])
tabby, tabby cat