背景

最近一段时间,基于 Transformer 网络结构的视觉大模型出现了爆发式的增长,继 Segment Anything(SAM)之后,Meta AI 再次发布重量级开源项目——DINOv2。DINOv2 可以抽取到强大的图像特征,且在下游任务上不需要微调,这使得它适合作为许多不同的应用中新的 Backbone

与之前发布的 Segment Anything 相比,DINOv2 在应用领域和适用范围上更加广泛,原论文中的实验也涵盖了多个 CV 中经典的下游任务(深度估计、语义分割)

如何实现的自监督学习?

自监督学习为何成立?

自监督学习之所以能成立,是因为它不依赖人工标注的标签,而是巧妙地利用数据本身作为监督信号。它通过设计一些被称为“借口任务”(Pretext Task)的辅助任务,让模型在完成这些任务的过程中,自动学习到数据中更深层次、更通用的特征表示。

你可以把这个过程想象成一个孩子通过玩积木来学习。这个孩子没有老师教他“这是红色积木”“那是蓝色积木”,也没有人告诉他“这是正方体”“那是长方体”。但他通过自己不断地搭建、拆解,会发现红色积木和蓝色积木可以一起搭成一个城堡,而正方体和长方体有着不同的放置方式。在这个过程中,他没有被直接告知任何标签,但他却自己摸索出了积木的颜色、形状等特征,并学会了如何利用这些特征

自监督学习中的“借口任务”就相当于这个孩子玩积木的过程。这些任务本身可能没有实际意义,但为了解决这些任务,模型必须学会数据的内在结构和模式。例如,在计算机视觉领域,常见的借口任务包括:

  • 预测图像旋转角度:给模型一张随机旋转过的图片(例如旋转了90度),让它预测旋转了多少度。为了完成这个任务,模型就必须理解图片中物体的原始姿态,从而学习到物体的形状和结构等特征。
  • 图像修复:遮住图片的一部分,让模型去预测被遮住的内容。这迫使模型理解图片中物体之间的上下文关系。

通过这些任务,模型能够从海量的无标签数据中,学习到高质量的、可泛化的特征表示。这些表示可以作为“基础知识”,被迁移到各种下游任务中,例如图像分类、目标检测等。

Dinov2 的自监督实现

DINOv2(Self-distillation with no labels)是Meta AI推出的一个非常强大的自监督学习模型,它的实现核心是一种被称为**自蒸馏(Self-Distillation)**的机制。

这个模型的核心思想是:让一个模型(学生模型)去学习另一个模型(教师模型)的输出。而这个教师模型,本身就是学生模型的一个历史版本,并且它的参数更新更慢、更平滑。

具体来说,DINOv2的自监督学习过程是这样的:

  1. 数据增强:对同一张原始图片进行不同程度的裁剪和变换,生成多个“视图”(view)。例如,一张图片会被裁剪成一个小区域(小视图)和一个大区域(大视图)。
  2. 教师与学生:将这些“视图”同时输入给学生模型教师模型。学生模型负责学习,而教师模型则提供学习目标。
  3. 预测与蒸馏
    • 学生模型将大视图和小视图都输入到学生模型中,得到其特征表示。
    • 教师模型只将==大视图==输入到教师模型中,得到其特征表示。
    • 蒸馏:让学生模型预测的结果去匹配教师模型的结果。具体来说,就是让学生模型从小视图中提取出的特征,与教师模型从大视图中提取出的特征尽可能地相似。
  4. 模型更新
    • 学生模型:正常地通过梯度下降来更新参数。
    • 教师模型:参数更新非常缓慢,它不是通过梯度下降,而是通过学生模型参数的移动平均(Moving Average)来更新。这意味着教师模型的参数是学生模型历史状态的一个平滑版本。

为什么可以这样做?

这个机制之所以有效,是因为它巧妙地利用了数据增强自蒸馏的结合。

  • 数据增强:不同的视图本质上是同一张图片的“不同视角”。如果模型能识别出这些不同视角下的图片是同一个物体,它就必须学习到物体本身具有不变性(Invariance)的特征,例如物体的形状、纹理,而不是背景或者视角。
  • 自蒸馏:教师模型作为学生模型的“平滑历史版本”,其输出更加稳定和可靠。学生模型通过模仿教师模型的输出,相当于是在学习一个更稳定、更鲁棒的知识。这种“自我模仿”的过程,让模型在没有外部标签的情况下,自己给自己生成了高质量的监督信号

简单来说,DINOv2通过让模型在不同视角下对同一物体进行一致性预测,并利用一个更稳定的历史版本作为学习目标,有效地迫使模型学习到了图像中具有不变性的、强大的视觉特征,从而实现了在无标签数据上的高效训练。


Dinov2 模型结构

DINOv2的模型结构,简单来说,是基于一个名为 Vision Transformer(ViT)的骨干网络,并结合了自监督学习中的自蒸馏(self-distillation)框架。它的核心思想不是设计一个全新的网络架构,而是在一个强大的现有架构(ViT)上,通过一套创新的训练方法,让模型在没有标签的情况下高效学习。

1. Vision Transformer (ViT) 骨干网络

DINOv2的特征提取器是ViT。传统的卷积神经网络(CNN)通过逐层卷积来提取特征,而ViT则借鉴了自然语言处理(NLP)中Transformer的架构,将图像视为一系列“单词”。

ViT的工作流程如下:

  • 分块(Patching):一张输入图片会被切分成许多小的、不重叠的图片块(patch)。例如,一张 224×224的图片会被切成 14×14 个图片块,每个图片块的大小是 16×16 像素。
  • 嵌入(Embedding):每个图片块会被展平(flatten),然后通过一个线性层转换为一个高维的向量,这就是所谓的“嵌入”(embedding)。
  • 位置编码(Positional Encoding):为了让模型知道每个图片块在原始图像中的位置,ViT会给每个嵌入向量加上一个位置编码向量。
  • Transformer编码器:这些带有位置信息的嵌入向量被输入到一个标准的Transformer编码器中。这个编码器由多层自注意力(Self-Attention)机制和前馈神经网络(Feed-Forward Network)组成。
  • 自注意力机制:这是ViT的核心。它允许模型在处理一个图片块时,能够考虑到图像中所有其他图片块的信息,从而捕捉到图片中物体之间的全局关系。

ViT的输出是每个图片块对应的特征向量,这些向量可以用于下游的各种任务,比如分类、分割或深度估计。


2. DINOv2 的双网络框架

DINOv2并没有直接使用一个单独的ViT模型,而是使用了两个ViT网络,它们在结构上完全相同,但参数不同,形成了教师(Teacher)网络学生(Student)网络

  • 学生网络(Student Network):这是一个标准的ViT模型,它的参数会通过梯度下降进行常规更新。它的任务是从各种图像视图(view)中学习特征。
  • 教师网络(Teacher Network):这也是一个ViT模型,但它的参数更新方式非常特殊。它的参数不是通过梯度下降直接优化的,而是通过**学生网络参数的指数移动平均(Exponential Moving Average, EMA)**来更新。这种更新方式让教师网络的参数变化更加平滑、稳定。

这种教师-学生框架的核心思想就是**“知识蒸馏”**(Knowledge Distillation)。学生模型的目标是学习并模仿教师模型的输出,即使它们的输入是图像的不同视图。


下游任务(使用场景)

dinov2 作为 vision encoder,需要结合下游任务才能发挥作用

  • 深度估计 Depth Estimation

  • 语义分割 Semantic Segmentation

  • 实例检索 Instance Retrieval

  • 密集匹配 Dense Matching——DINOv2 patch features can be used to consistently map all parts of an image without supervision.

    image.png

  • 稀疏匹配 Sparse Matching——Compare DINOv2 patch features across two images to match their most similar parts.

    image.png

参考

  1. https://github.com/facebookresearch/dinov2
  2. https://huggingface.co/docs/transformers/main/en/model_doc/dinov2
  3. 基于 AX650N 部署 DINOv2