
1. DINOv2在计算机视觉领域预训练模型一直是推动技术进步的核心动力。从早期的 ImageNet 监督预训练到后来 BERT、GPT 等自监督模型在 NLP 领域大放异彩视觉领域也一直在探索属于自己的「BERT 时刻」。而 DINOv2 正是这一探索道路上的重要里程碑。DINOv2 由 Meta AIFacebook AI Research于 2023 年发布它通过自监督学习的方式从海量未标注图像中学习到强大的视觉特征表示。与传统的监督学习不同DINOv2 不需要任何人工标注却能学习到比肩甚至超越监督预训练模型的特征质量。本文将深入介绍 DINOv2 的核心原理、技术架构、与 ViT 的关系以及它的实际应用场景。2. 从 ViT 说起视觉 Transformer 基础要理解 DINOv2首先需要了解它的骨干网络——Vision TransformerViT。2.1 ViT 的核心思想ViT 将 Transformer 架构从 NLP 领域迁移到视觉领域。它的核心思想非常直观把图像切分成固定大小的 patch图像块然后将这些 patch 线性映射为 token 序列送入标准的 Transformer 编码器进行处理。具体来说一张224 × 224 224 \times 224224×224的图片如果 patch 大小为16 × 16 16 \times 1616×16就会被切分成14 × 14 196 14 \times 14 19614×14196个 patch。每个 patch 经过线性投影后变成一个向量再加上位置编码positional embedding就构成了 Transformer 的输入序列。2.2 ViT 的架构特点ViT 的架构与 NLP 中的 Transformer Encoder 基本一致包含多头自注意力Multi-Head Self-Attention、前馈网络Feed-Forward Network、层归一化LayerNorm和残差连接等核心组件。importtorchimporttorch.nnasnnfromtimmimportcreate_model# 使用 timm 库创建 ViT 模型modelcreate_model(vit_base_patch16_224,pretrainedFalse)print(model)ViT 相比 CNN 的优势在于全局感受野自注意力机制天然具备全局建模能力能捕捉图像中远距离像素之间的关系。可扩展性Transformer 架构在大规模数据上表现出优异的扩展性模型越大、数据越多性能提升越明显。统一架构与 NLP 模型共享相同的架构为多模态统一建模提供了可能。3. DINOv2 的核心原理DINOv2 的全称是DIstillation with NO labels它是在前代 DINO 和 iBOT 等工作基础上发展而来的自监督学习方法。3.1 自监督学习范式DINOv2 采用自监督学习范式即不需要任何人工标注数据。它的核心思想是让模型从图像自身学习到有意义的特征表示。自监督学习的通用框架是「预训练 微调」预训练阶段在海量无标注图像上学习通用视觉特征。微调阶段在特定任务的小规模标注数据上进行微调适配下游任务。3.2 DINOv2 的训练目标DINOv2 的训练目标可以概括为让模型对同一图像的不同视角view产生一致的特征表示。具体来说训练过程如下输入图像全局视角 Global Views局部视角 Local ViewsTeacher 网络Student 网络特征输出特征输出交叉熵损失蒸馏目标梯度更新 StudentEMA 更新 TeacherTeacher 网络参数通过 Student 网络的指数移动平均EMA更新不直接参与梯度计算。Student 网络接收局部视角局部裁剪的图像块学习预测 Teacher 网络对全局视角的输出。损失函数使用交叉熵损失让 Student 对局部视角的特征预测与 Teacher 对全局视角的特征保持一致。3.3 与 DINO 的区别DINOv2 相比前代 DINO 的主要改进包括特性DINODINOv2训练数据ImageNet-1K128万张LVD-142M1.42亿张数据来源单一数据集多源网络图像数据清洗无去重、去噪、过滤训练目标知识蒸馏蒸馏 掩码图像建模特征质量良好显著提升DINOv2 引入了iBOT 的掩码图像建模Masked Image Modeling目标让模型同时学习全局语义和局部细节从而获得更全面的特征表示。4. DINOv2 的技术细节4.1 大规模数据收集与清洗DINOv2 的成功离不开其大规模、高质量的训练数据。Meta 构建了LVD-142M数据集包含 1.42 亿张图像来源包括ImageNet-22kGoogle Landmarks网络爬取的图像数据数据清洗流程包括去重使用近似重复检测算法去除相似图像。质量过滤通过自监督检索去除低质量、不相关图像。数据平衡确保各类别、各场景的数据分布合理。4.2 模型架构DINOv2 提供多种规模的 ViT 模型模型参数量Patch 大小输入分辨率ViT-S/142100 万14×14518×518ViT-B/148600 万14×14518×518ViT-L/143 亿14×14518×518ViT-g/1411 亿14×14518×518所有模型均使用patch size 14输入分辨率提升到 518×518相比 ViT 常用的 224×224 能保留更多细节信息。4.3 训练策略DINOv2 的训练采用多阶段策略第一阶段在低分辨率224×224上训练学习基础特征。第二阶段提高分辨率322×322微调模型适应更高分辨率输入。第三阶段进一步提升分辨率518×518增强细粒度特征提取能力。这种渐进式训练策略能有效降低训练成本同时提升模型对高分辨率输入的适应性。5. DINOv2 的代码实践5.1 环境准备首先安装必要的依赖pipinstalltorch torchvision pipinstallgithttps://github.com/facebookresearch/dinov2.git5.2 加载预训练模型importtorchimporttorchvision.transformsastransformsfromPILimportImagefromdinov2.models.vision_transformerimportDinoVisionTransformer# 加载 DINOv2 ViT-B/14 预训练模型modelDinoVisionTransformer(img_size518,patch_size14,embed_dim768,depth12,num_heads12,)state_dicttorch.hub.load_state_dict_from_url(https://dl.fbaipublicfiles.com/dinov2/dinov2_vitb14/dinov2_vitb14_pretrain.pth)model.load_state_dict(state_dict)model.eval()5.3 提取图像特征# 图像预处理transformtransforms.Compose([transforms.Resize((518,518)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225]),])# 加载并预处理图像imageImage.open(example.jpg).convert(RGB)input_tensortransform(image).unsqueeze(0)# 提取特征withtorch.no_grad():featuresmodel.forward_features(input_tensor)# features 包含 [CLS] token 和所有 patch tokencls_tokenfeatures[:,0]# 全局特征patch_tokensfeatures[:,1:]# 局部特征print(f全局特征维度:{cls_token.shape})print(f局部特征维度:{patch_tokens.shape})5.4 使用 Hugging Face 加载更简便的方式是使用 Hugging Face 的 transformers 库fromtransformersimportAutoImageProcessor,AutoModel# 加载 DINOv2 模型和处理器processorAutoImageProcessor.from_pretrained(facebook/dinov2-base)modelAutoModel.from_pretrained(facebook/dinov2-base)# 处理图像inputsprocessor(imagesimage,return_tensorspt)withtorch.no_grad():outputsmodel(**inputs)# outputs.last_hidden_state 包含所有 token 的特征cls_featuresoutputs.last_hidden_state[:,0]# 全局特征6. DINOv2 的应用场景6.1 图像分类DINOv2 提取的特征可以直接用于线性分类在 ImageNet 上取得了优异的性能ViT-g/14 在 ImageNet-1K 上达到86.5%的 top-1 准确率线性探测。仅需少量标注数据即可获得不错的分类效果。6.2 语义分割DINOv2 的 patch token 保留了丰富的空间信息非常适合语义分割任务# 使用 DINOv2 特征进行语义分割的简化示例importtorch.nnasnnclassSegmentationHead(nn.Module):def__init__(self,embed_dim768,num_classes21):super().__init__()self.conv1nn.Conv2d(embed_dim,256,kernel_size1)self.conv2nn.Conv2d(256,num_classes,kernel_size1)defforward(self,patch_tokens,grid_size(37,37)):# 将 patch tokens 重塑为特征图B,N,Cpatch_tokens.shape xpatch_tokens.permute(0,2,1).reshape(B,C,grid_size[0],grid_size[1])xself.conv1(x)xself.conv2(x)returnx6.3 深度估计DINOv2 在单目深度估计任务上也表现出色其学习到的特征包含丰富的几何信息。6.4 图像检索与匹配DINOv2 的全局特征具有很好的判别性可用于以图搜图图像相似度计算视觉定位6.5 视频理解DINOv2 的特征可以扩展到视频领域用于动作识别、视频检索等任务。7. DINOv2 的优势与局限7.1 核心优势无需标注完全自监督摆脱了对人工标注的依赖。特征通用性强一个预训练模型可适配多种下游任务。小样本学习能力强仅需少量标注数据即可达到不错的效果。特征可解释性好注意力图能清晰展示模型关注的区域。7.2 局限性训练成本高1.42 亿张图像、11 亿参数的训练需要大量算力。数据依赖特征质量高度依赖预训练数据的质量和多样性。推理开销大模型ViT-g/14推理速度较慢不适合实时场景。领域迁移在医学影像、卫星图像等特殊领域可能需要额外微调。8. 总结与展望DINOv2 代表了自监督视觉预训练的最新进展它证明了大规模自监督学习能够学习到比肩甚至超越监督学习的视觉特征。DINOv2 的成功为视觉领域带来了新的范式从「标注驱动」到「数据驱动」不再依赖昂贵的人工标注。从「任务专用」到「通用基础」一个模型服务多种任务。从「单模态」到「多模态」为视觉-语言统一建模奠定基础。未来随着数据规模的进一步扩大和模型架构的持续演进我们有理由期待更强大的视觉基础模型出现。DINOv2 不仅是一个模型更代表了一种新的研究思路和发展方向。9. 参考资料DINOv2 论文DINOv2: Learning Robust Visual Features without Supervision官方代码仓库facebookresearch/dinov2Hugging Face 模型库facebook/dinov2